From 655d4554662eb87e028b2c4cff768d82e4d63618 Mon Sep 17 00:00:00 2001 From: j2h4u <39818683+j2h4u@users.noreply.github.com> Date: Sat, 28 Mar 2026 01:16:43 +0500 Subject: [PATCH] fix(verifier): enforce human_needed status when human verification items exist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The verifier agent could set status: passed even when the report contained a non-empty "Human Verification Required" section. This bypassed the human_needed → HUMAN-UAT.md → user approval gate, allowing phases to be marked complete without human testing. Replace the advisory status descriptions with an ordered decision tree (most restrictive first): gaps_found → human_needed → passed. The passed status is now only valid when zero human verification items exist. Synced the same decision tree in the verify-phase workflow. Co-Authored-By: Claude Opus 4.6 (1M context) --- agents/gsd-verifier.md | 16 +++++++++++++--- get-shit-done/workflows/verify-phase.md | 13 ++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/agents/gsd-verifier.md b/agents/gsd-verifier.md index a2fc9d280..3f980e756 100644 --- a/agents/gsd-verifier.md +++ b/agents/gsd-verifier.md @@ -442,16 +442,26 @@ npm test -- --grep "$PHASE_TEST_PATTERN" 2>&1 | grep -q "passing" ## Step 9: Determine Overall Status -**Status: passed** — All truths VERIFIED, all artifacts pass levels 1-3, all key links WIRED, no blocker anti-patterns. +Classify status using this decision tree IN ORDER (most restrictive first): -**Status: gaps_found** — One or more truths FAILED, artifacts MISSING/STUB, key links NOT_WIRED, or blocker anti-patterns found. +1. IF any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker anti-pattern found: + → **status: gaps_found** -**Status: human_needed** — All automated checks pass but items flagged for human verification. +2. IF Step 8 produced ANY human verification items (section is non-empty): + → **status: human_needed** + (Even if all truths are VERIFIED and score is N/N — human items take priority) + +3. IF all truths VERIFIED, all artifacts pass, all links WIRED, no blockers, AND no human verification items: + → **status: passed** + +**passed is ONLY valid when the human verification section is empty.** If you identified items requiring human testing in Step 8, status MUST be human_needed. **Score:** `verified_truths / total_truths` ## Step 10: Structure Gap Output (If Gaps Found) +Before writing VERIFICATION.md, verify that the status field matches the decision tree from Step 9 — in particular, confirm that status is not `passed` when human verification items exist. + Structure gaps in YAML frontmatter for `/gsd:plan-phase --gaps`: ```yaml diff --git a/get-shit-done/workflows/verify-phase.md b/get-shit-done/workflows/verify-phase.md index fa9ddf64e..7889e23af 100644 --- a/get-shit-done/workflows/verify-phase.md +++ b/get-shit-done/workflows/verify-phase.md @@ -199,11 +199,18 @@ Format each as: Test Name → What to do → Expected result → Why can't verif -**passed:** All truths VERIFIED, all artifacts pass levels 1-3, all key links WIRED, no blocker anti-patterns. +Classify status using this decision tree IN ORDER (most restrictive first): -**gaps_found:** Any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker found. +1. IF any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker found: + → **gaps_found** -**human_needed:** All automated checks pass but human verification items remain. +2. IF the previous step produced ANY human verification items: + → **human_needed** (even if all truths VERIFIED and score is N/N) + +3. IF all checks pass AND no human verification items: + → **passed** + +**passed is ONLY valid when no human verification items exist.** **Score:** `verified_truths / total_truths`