fix(#3684): resume verified-unmarked phases at update_roadmap (#3814)

* test(#3684): failing-first rows for the verified-unmarked resume

* fix(#3684): resume verified-unmarked phases at update_roadmap

* test(#3684): heading-shaped roadmap fixture, plain phase.complete calls

* fix(#3684): fit under the pre-phase-6 margin, fix pins and verify call

* fix(#3684): padding-normalize the marked-complete join, assert STATE idempotency

* test(#3684): anchor fixes, node jq mirror, characterized STATE delta

* chore(#3684): backfill changeset pr number

---------

Co-authored-by: sim <sim@local>
This commit is contained in:
Tom Boucher
2026-08-24 10:58:04 -04:00
committed by GitHub
parent 4b84be1da4
commit 8ed105c8a4
4 changed files with 256 additions and 3 deletions

View File

@@ -350,6 +350,10 @@ are done. Blocked-and-incomplete must never be reported as finished.
```bash
VERIFY_STATUS=$(gsd_run query verification status "${PHASE_DIR}" --pick status)
# #3684: checkbox = marked-complete; report fields can claim a no-op write (#3685).
ANALYZE=$(gsd_run query roadmap.analyze)
if [[ "$ANALYZE" == @file:* ]]; then ANALYZE=$(cat "${ANALYZE#@file:}"); fi
PHASE_MARKED=$(echo "$ANALYZE"|jq -r --arg p "$PHASE_NUMBER" 'def n:sub("^0+(?=[0-9])";"");.phases[]|select(((.number//.phase_number|tostring|n))==($p|n))|.roadmap_complete'|head -1)
```
Evaluate in this exact order — the first matching condition decides the outcome; do not evaluate
@@ -366,8 +370,6 @@ later conditions once one matches:
→ exit. Do not fall through to condition 3; this is not a completion state.
3. **No filter is active, and every filtered plan was filtered by `has_summary` alone** (no
blocked-plan skip occurred):
- **`VERIFY_STATUS` is anything other than `missing`**: the phase genuinely finished. Report
"No matching incomplete plans" → exit, unchanged.
- **`VERIFY_STATUS == missing`**: the plans are all summarized but the run never reached the
tail gates. Report:
`"All {plan_count} plans are summarized but no VERIFICATION.md exists — resuming at the phase gates (#2868)."`
@@ -382,6 +384,13 @@ later conditions once one matches:
skip `aggregate_results`, `code_review_gate` or `regression_gate` on this path — the manual
workaround this replaces skipped all three, and that gap is the reason this route exists
rather than telling users to spawn the verifier by hand.
- **`VERIFY_STATUS` ≠ `missing` + `PHASE_MARKED` is `true`**: genuinely finished.
Report "No matching incomplete plans" → exit, unchanged.
- **`VERIFY_STATUS` ≠ `missing` + `PHASE_MARKED` not `true`** — the run died between
`verify_phase_goal` and `update_roadmap` (#3684): verification EXISTS — do not redo
it or the gates already run. Report `"Phase {X} is verified but never marked
complete — resuming at update_roadmap (#3684)."` and continue directly at
`update_roadmap`; the tail steps then run in their normal order.
Report:
```