The gsd-verifier was reporting false-positive gaps for items explicitly scheduled in later phases of the milestone (e.g., reporting a Phase 5 item as a gap during Phase 1 verification). This adds Step 9b to cross-reference gaps against later phases using `roadmap analyze` and move matched items to a `deferred` list that does not affect status. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -461,6 +461,33 @@ Classify status using this decision tree IN ORDER (most restrictive first):
|
||||
|
||||
**Score:** `verified_truths / total_truths`
|
||||
|
||||
## Step 9b: Filter Deferred Items
|
||||
|
||||
Before reporting gaps, check if any identified gaps are explicitly addressed in later phases of the current milestone. This prevents false-positive gap reports for items intentionally scheduled for future work.
|
||||
|
||||
**Load the full milestone roadmap:**
|
||||
|
||||
```bash
|
||||
ROADMAP_DATA=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" roadmap analyze --raw)
|
||||
```
|
||||
|
||||
Parse the JSON to extract all phases. Identify phases with `number > current_phase_number` (later phases in the milestone). For each later phase, extract its `goal` and `success_criteria`.
|
||||
|
||||
**For each potential gap identified in Step 9:**
|
||||
|
||||
1. Check if the gap's failed truth or missing item is covered by a later phase's goal or success criteria
|
||||
2. **Match criteria:** The gap's concern appears in a later phase's goal text, success criteria text, or the later phase's name clearly suggests it covers this area of work
|
||||
3. If a match is found → move the gap to the `deferred` list, recording which phase addresses it and the matching evidence (goal text or success criterion)
|
||||
4. If the gap does not match any later phase → keep it as a real `gap`
|
||||
|
||||
**Important:** Be conservative when matching. Only defer a gap when there is clear, specific evidence in a later phase's roadmap section. Vague or tangential matches should NOT cause a gap to be deferred — when in doubt, keep it as a real gap.
|
||||
|
||||
**Deferred items do NOT affect the status determination.** After filtering, recalculate:
|
||||
|
||||
- If the gaps list is now empty and no human verification items exist → `passed`
|
||||
- If the gaps list is now empty but human verification items exist → `human_needed`
|
||||
- If the gaps list still has items → `gaps_found`
|
||||
|
||||
## 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.
|
||||
@@ -485,6 +512,17 @@ gaps:
|
||||
- `artifacts`: Files with issues
|
||||
- `missing`: Specific things to add/fix
|
||||
|
||||
If Step 9b identified deferred items, add a `deferred` section after `gaps`:
|
||||
|
||||
```yaml
|
||||
deferred: # Items addressed in later phases — not actionable gaps
|
||||
- truth: "Observable truth not yet met"
|
||||
addressed_in: "Phase 5"
|
||||
evidence: "Phase 5 success criteria: 'Implement RuntimeConfigC FFI bindings'"
|
||||
```
|
||||
|
||||
Deferred items are informational only — they do not require closure plans.
|
||||
|
||||
**Group related gaps by concern** — if multiple truths fail from the same root cause, note this to help the planner create focused plans.
|
||||
|
||||
</verification_process>
|
||||
@@ -519,6 +557,10 @@ gaps: # Only if status: gaps_found
|
||||
issue: "What's wrong"
|
||||
missing:
|
||||
- "Specific thing to add/fix"
|
||||
deferred: # Only if deferred items exist (Step 9b)
|
||||
- truth: "Observable truth addressed in a later phase"
|
||||
addressed_in: "Phase N"
|
||||
evidence: "Matching goal or success criteria text"
|
||||
human_verification: # Only if status: human_needed
|
||||
- test: "What to do"
|
||||
expected: "What should happen"
|
||||
@@ -543,6 +585,15 @@ human_verification: # Only if status: human_needed
|
||||
|
||||
**Score:** {N}/{M} truths verified
|
||||
|
||||
### Deferred Items
|
||||
|
||||
Items not yet met but explicitly addressed in later milestone phases.
|
||||
Only include this section if deferred items exist (from Step 9b).
|
||||
|
||||
| # | Item | Addressed In | Evidence |
|
||||
|---|------|-------------|----------|
|
||||
| 1 | {truth} | Phase {N} | {matching goal or success criteria} |
|
||||
|
||||
### Required Artifacts
|
||||
|
||||
| Artifact | Expected | Status | Details |
|
||||
@@ -706,7 +757,9 @@ return <div>No messages</div> // Always shows "no messages"
|
||||
- [ ] Behavioral spot-checks run on runnable code (or skipped with reason)
|
||||
- [ ] Human verification items identified
|
||||
- [ ] Overall status determined
|
||||
- [ ] Deferred items filtered against later milestone phases (Step 9b)
|
||||
- [ ] Gaps structured in YAML frontmatter (if gaps_found)
|
||||
- [ ] Deferred items structured in YAML frontmatter (if deferred items exist)
|
||||
- [ ] Re-verification metadata included (if previous existed)
|
||||
- [ ] VERIFICATION.md created with complete report
|
||||
- [ ] Results returned to orchestrator (NOT committed)
|
||||
|
||||
Reference in New Issue
Block a user