Repository navigation
ISS-13947: Check PR body claims and comment leftovers - #419
Merged
Merged
Conversation
- pr-preflight refuses a body that names a commit other than the pushed head or an ancestor equal to it on the changed paths, a check claimed for a package with no such script, a promised follow-up ticket with no slug, and E2E statements the session's lane receipts do not back - story-typecheck.mjs typechecks changed stories whose package has no typecheck script, failing only on errors on added lines; pre-pr-lanes selects it when the diff needs it - comment-rules.mjs adds the excuse-comment and guarded-constant diff rules and prints citation and removed-name candidates for the guardrails reviewer, whose leftovers check now covers removals - env-ctl pr takes an optional --draft - vibe 1.1.74 Testing: node --test on every plugin test file run alone, uv run pytest plugins/, ruff, pyright, vibe-bench typecheck, test and validate; each new check run against PR #9732's real body, diff and tsc output Risks: a preflight claim check could refuse a body phrasing it did not anticipate; every refusal names the line and the fix
This was referenced Nov 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Purpose
ISS-13947. This PR adds prevention for the five mistake classes the engineer takeover review of symphony-alpha PR #9732 (ISS-13897, head daaf94eff8) found after vibe's own checks passed. The PR adds the strongest check that fits each class, and shows each one failing on PR #9732's real body, diff or tsc output. Class 5 follows the team lead's 2026-11-10 ruling, recorded in ticket version 2. A ready PR with a not-run E2E lane stays allowed (ISS-13321), and the not-run reason wording is unchanged. Only honest reporting is enforced.
Changes
pr-preflight.mjs(classes 1, 2, 3 and 5). With--worktreeit now checks four body claims:pre-pr-lanes.mjsreceipt at the current source, a not-run lane is never described as passed, and every not-run lane is named as not run.--worktreeno longer needs--base, soenv-ctl.mjs pr-updateruns these checks too.story-typecheck.mjsplus apre-pr-lanes.mjslane (class 2). A changed story whose package has no typecheck script now selects a lane. The lane runstsc --noEmitin that package and fails on errors on lines the diff adds. It only counts errors elsewhere: symphony-alpha's storybook tsconfig already reports about 150 on main, so a whole-package verdict could never pass, and recorded as main-preexisting it would hide the new error.comment-rules.mjs, wired intodiff-rules.mjs(classes 3 and 4).excuse-comment(blocking): an added comment that excuses a deviation with words such as "pre-existing", "defect", "on main", "workaround" or "known issue" must cite a ticket.guarded-constant(blocking): a value used only underC ?orC &&that reads!Citself.comment-rules.mjsrun whose candidates the reviewer judges.env-ctl.mjs pr --draft. Optional, never the default.Affected:
plugins/vibe/skills/vibe/scripts/{pr-preflight,story-typecheck,pre-pr-lanes,env-ctl}.mjsand their tests,plugins/vibe/skills/handoff/scripts/{comment-rules,diff-rules}.mjs,comment-rules.test.mjs,plugins/vibe/agents/{vibe-guardrails-reviewer,vibe-environment-worker}.md,CHANGELOG.md, and the version sites. Untouched, by coordination: ISS-13846's files (PR #422, now merged: pr-facts, pr-evidence-*, handoff-inventory, test-integrity, e2e-tier, handoff/SKILL.md, references/guardrails.md),plugins/vibe-core(PR #418, now merged),pr-body-claims.mjs,handoff-gate.mjsandcriteria-audit.mjs(ISS-13944, PR #421, now merged).Validation
Head 1ef1868 merges origin/main 00e62e6 (vibe 1.1.77 and vibe-core 1.0.2, after #418 ISS-13869, #422 ISS-13846, #420 ISS-13899 and #421 ISS-13944/ISS-13949) into 4320540. vibe moves to 1.1.78 per the merge order #420, #421, #419, #423. vibe-core is untouched by this PR.
pr-preflight.mjsand its test loadtested-head.mjsthroughvibeCore, since its vibe path is now a command wrapper with no exports. None of #421's changes imports or changes a module this PR changes; its only shared dependency issession-record.mjs.On 1ef1868, on this laptop (targeted only; the full suites run in CI):
node --test, one file at a time: pr-preflight (9), pre-pr-lanes (11), diff-rules (41), comment-rules (5), env-ctl (23), story-typecheck (3); 92 of 92 pass.pyteston test_pr_takeover_skill_contract.py and test_vibe_ws8_load_contract.py: 30 passed. vibe-bench reply-checker.test.ts: 4 of 4.tools/vibe-workersnpm run build: dist unchanged from the merged bundles.instruction-words.mjs --base origin/main --changelog CHANGELOG.md --version 1.1.78: added 341, removed 148, net 193; matches the CHANGELOG.On 4320540, before the merge:
uv run pytest plugins/ -q2768 passed, 3 skipped; 178 of 180 node test files pass, the other two (docker-disk-admission.test.mjs,e2e-lock.test.mjs) failing the same way on origin/main because this machine's Docker probe fails;tools/vibe-bench198 of 198.Failing first, against PR #9732's real artifacts:
pr-preflight.mjs --worktree <PR #9732 checkout> --base 6f7018c8b3on the PR's real body: main's script returns{"ok":true,"problems":[]}. This branch returns three problems: commit e8696cbc10 cannot be resolved,storybookhas no typecheck script, and the follow-up ticket promise names no slug. Citing the PR's own ancestor ea180edef3 instead reports the 6 changed paths the merge commits altered.story-typecheck.mjson PR #9732's head tsc output reports exactly the shipped TS2345 atv2-issue-detail.stories.tsx:522and counts the 155 other diagnostics without failing. The newpre-pr-lanestest fails on main'spre-pr-lanes.mjs, which selects no story lane.comment-ruleson the PR #9732 diff (6f7018c8b3 to daaf94eff8) blocks the excuse comment atv2-issue-detail.stories.tsx:431and the constantreadOnlyatdocument-artifact-canvas.tsx:117, and lists the DI-13 citation candidate atissue-v2-canvas.tsx:51(lines 51 and 93). Removing thediff-rules.mjscall fails the wiring test. Both blocking rules fired on none of 80 recent symphony-alpha main commits.Prevention