plan-gates: per-item confirmation states its reason, not an incident ID (s03 M4)

'VAS-449' meant nothing to the model and reached the user in the >5-items
warning. The rule now gives the reason (a blanket confirmation lets the user
click through without opening any file / lets unchecked items pass as
verified). The per-item confirmation rule is unchanged.

W7a pin: test/ship-plan-completion-invariants.test.ts:122 toMatch(/VAS-449/)
removed (cosmetic incident-ID pin); the per-item rule and blanket-confirm ban
checks on the same test stay. expected red until the regeneration commit
This commit is contained in:
garrytan committed 2026-10-03 00:14:15 +00:00
1 parent 5a2be1a795
commit a4c649f282
2 files changed
+2 -3

No files matched your search

+2 -2
View File
@@ -368,7 +368,7 @@ The parent evaluates the completion checklist in priority order, including after
2. **Any UNVERIFIABLE items** (silent gaps — the diff cannot prove them either way). Only fires after NOT DONE is resolved or absent.
**Per-item confirmation is mandatory.** Do NOT use a single AskUserQuestion to blanket-confirm all UNVERIFIABLE items. Blanket confirmation is the failure mode that surfaced in VAS-449 (user clicks A without opening any file). Instead:
**Per-item confirmation is mandatory.** Do NOT use a single AskUserQuestion to blanket-confirm all UNVERIFIABLE items: a blanket confirmation lets the user click through without opening any file. Instead:
- Loop through UNVERIFIABLE items one at a time.
- For each item, use AskUserQuestion with the item's *specific* manual check (e.g., "Confirm: does \`~/Development/domain-hq/docs/dashboard.md\` exist?", not "Have you checked all items?").
@@ -382,7 +382,7 @@ The parent evaluates the completion checklist in priority order, including after
- Any N: STOP and report that item as NOT DONE. Resume only after its required work is verified; no second deferral choice.
- All Y or D: Continue. Embed \`## Plan Completion — Manual Verifications\` section in PR body listing each Y'd item with the user's free-text evidence and each D'd item with "intentionally dropped".
**Cap.** If there are more than 5 UNVERIFIABLE items, present them as a numbered list first and ask whether the user wants to (1) confirm each individually, (2) stop and reduce scope, or (3) explicitly accept blanket-confirmation with the warning that this is the VAS-449 failure shape. Default and recommended option is (1).
**Cap.** If there are more than 5 UNVERIFIABLE items, present them as a numbered list first and ask whether the user wants to (1) confirm each individually, (2) stop and reduce scope, or (3) explicitly accept blanket-confirmation with the warning that it lets unchecked items pass as verified. Default and recommended option is (1).
3. **Only PARTIAL items (no NOT DONE, no UNVERIFIABLE):** Continue with a note in the PR body. Not blocking.
@@ -119,7 +119,6 @@ describe('ship/SKILL.md — Plan Completion gate invariants (VAS-449 remediation
test('Per-item UNVERIFIABLE confirmation: blanket-confirm is forbidden', () => {
expect(skill).toContain('**Per-item confirmation is mandatory.**');
expect(skill).toMatch(/Do NOT use a single AskUserQuestion to blanket-confirm/);
expect(skill).toMatch(/VAS-449/);
});
test('Subagent failure: fail-closed, not silent fail-open', () => {