gsdd-cli 0.18.5 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +609 -608
  3. package/agents/DISTILLATION.md +421 -421
  4. package/agents/README.md +62 -62
  5. package/agents/approach-explorer.md +361 -361
  6. package/agents/debugger.md +82 -82
  7. package/agents/executor.md +394 -394
  8. package/agents/integration-checker.md +318 -318
  9. package/agents/mapper.md +103 -103
  10. package/agents/planner.md +313 -313
  11. package/agents/researcher.md +84 -84
  12. package/agents/roadmapper.md +296 -296
  13. package/agents/synthesizer.md +236 -236
  14. package/agents/verifier.md +337 -337
  15. package/bin/adapters/agents.mjs +34 -34
  16. package/bin/adapters/claude.mjs +191 -191
  17. package/bin/adapters/codex.mjs +85 -85
  18. package/bin/adapters/index.mjs +20 -20
  19. package/bin/adapters/opencode.mjs +278 -278
  20. package/bin/gsdd.mjs +123 -116
  21. package/bin/lib/cli-utils.mjs +28 -28
  22. package/bin/lib/evidence-contract.mjs +112 -112
  23. package/bin/lib/file-ops.mjs +186 -144
  24. package/bin/lib/health-truth.mjs +181 -178
  25. package/bin/lib/health.mjs +246 -226
  26. package/bin/lib/init-flow.mjs +247 -231
  27. package/bin/lib/init-prompts.mjs +248 -247
  28. package/bin/lib/init-runtime.mjs +191 -190
  29. package/bin/lib/init.mjs +17 -17
  30. package/bin/lib/lifecycle-preflight.mjs +347 -325
  31. package/bin/lib/lifecycle-state.mjs +351 -267
  32. package/bin/lib/manifest.mjs +116 -114
  33. package/bin/lib/models.mjs +411 -411
  34. package/bin/lib/phase.mjs +360 -358
  35. package/bin/lib/plan-constants.mjs +30 -30
  36. package/bin/lib/provenance.mjs +109 -106
  37. package/bin/lib/rendering.mjs +115 -83
  38. package/bin/lib/runtime-freshness.mjs +214 -214
  39. package/bin/lib/templates.mjs +225 -224
  40. package/bin/lib/workspace-root.mjs +2 -1
  41. package/distilled/DESIGN.md +2333 -2323
  42. package/distilled/EVIDENCE-INDEX.md +394 -392
  43. package/distilled/README.md +196 -193
  44. package/distilled/SKILL.md +86 -85
  45. package/distilled/templates/agents.block.md +21 -21
  46. package/distilled/templates/agents.md +6 -6
  47. package/distilled/templates/approach.md +232 -232
  48. package/distilled/templates/auth-matrix.md +78 -78
  49. package/distilled/templates/brownfield-change/CHANGE.md +99 -0
  50. package/distilled/templates/brownfield-change/HANDOFF.md +38 -0
  51. package/distilled/templates/brownfield-change/VERIFICATION.md +56 -0
  52. package/distilled/templates/codebase/architecture.md +110 -110
  53. package/distilled/templates/codebase/concerns.md +95 -95
  54. package/distilled/templates/codebase/conventions.md +193 -193
  55. package/distilled/templates/codebase/stack.md +96 -96
  56. package/distilled/templates/delegates/approach-explorer.md +25 -25
  57. package/distilled/templates/delegates/mapper-arch.md +26 -26
  58. package/distilled/templates/delegates/mapper-concerns.md +27 -27
  59. package/distilled/templates/delegates/mapper-quality.md +28 -28
  60. package/distilled/templates/delegates/mapper-tech.md +25 -25
  61. package/distilled/templates/delegates/plan-checker.md +68 -68
  62. package/distilled/templates/delegates/researcher-architecture.md +30 -30
  63. package/distilled/templates/delegates/researcher-features.md +30 -30
  64. package/distilled/templates/delegates/researcher-pitfalls.md +30 -30
  65. package/distilled/templates/delegates/researcher-stack.md +30 -30
  66. package/distilled/templates/delegates/researcher-synthesizer.md +31 -31
  67. package/distilled/templates/research/architecture.md +57 -57
  68. package/distilled/templates/research/features.md +23 -23
  69. package/distilled/templates/research/pitfalls.md +46 -46
  70. package/distilled/templates/research/stack.md +45 -45
  71. package/distilled/templates/research/summary.md +67 -67
  72. package/distilled/templates/roadmap.md +74 -62
  73. package/distilled/templates/spec.md +110 -110
  74. package/distilled/workflows/audit-milestone.md +275 -271
  75. package/distilled/workflows/complete-milestone.md +336 -332
  76. package/distilled/workflows/execute.md +454 -449
  77. package/distilled/workflows/map-codebase.md +253 -253
  78. package/distilled/workflows/new-milestone.md +242 -238
  79. package/distilled/workflows/new-project.md +398 -398
  80. package/distilled/workflows/pause.md +160 -156
  81. package/distilled/workflows/plan-milestone-gaps.md +183 -183
  82. package/distilled/workflows/plan.md +451 -447
  83. package/distilled/workflows/progress.md +227 -223
  84. package/distilled/workflows/quick.md +351 -347
  85. package/distilled/workflows/resume.md +220 -212
  86. package/distilled/workflows/verify-work.md +260 -260
  87. package/distilled/workflows/verify.md +431 -429
  88. package/docs/BROWNFIELD-PROOF.md +95 -95
  89. package/docs/RUNTIME-SUPPORT.md +80 -69
  90. package/docs/USER-GUIDE.md +394 -386
  91. package/docs/VERIFICATION-DISCIPLINE.md +59 -59
  92. package/docs/claude/context-monitor.md +98 -98
  93. package/docs/proof/consumer-node-cli/README.md +37 -37
  94. package/docs/proof/consumer-node-cli/ROADMAP.md +14 -14
  95. package/docs/proof/consumer-node-cli/SPEC.md +17 -17
  96. package/docs/proof/consumer-node-cli/brief.md +9 -9
  97. package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-PLAN.md +34 -34
  98. package/docs/proof/consumer-node-cli/phases/01-foundation/01-01-SUMMARY.md +10 -10
  99. package/docs/proof/consumer-node-cli/phases/01-foundation/01-VERIFICATION.md +30 -30
  100. package/package.json +62 -61
@@ -1,433 +1,435 @@
1
- <role>
2
- You are the VERIFIER. Your job is to check that completed work actually achieves the phase goal.
3
- Core mindset: task completion does not equal goal achievement.
4
- A task can be "done" while the phase goal is still unfulfilled.
5
- You are skeptical by default. You verify claims, not promises.
6
- </role>
7
-
8
- <load_context>
9
- Before starting, read these files:
10
- 1. `.planning/ROADMAP.md` - success criteria for the completed phase
11
- 2. `.planning/phases/{plan_id}-PLAN.md` - what was planned
12
- 3. `.planning/phases/{plan_id}-SUMMARY.md` - what execution claims was built
13
- 4. `.planning/SPEC.md` - requirements and constraints for the phase
14
- 5. From the SUMMARY.md loaded in step 3, if a `<judgment>` section is present - read `<anti_regression>` rules as additional verification targets: confirm that invariants listed there were not broken by execution. Read `<active_constraints>` to calibrate verification scope.
15
- 6. The relevant codebase files - the code that was actually built
1
+ <role>
2
+ You are the VERIFIER. Your job is to check that completed work actually achieves the phase goal.
3
+ Core mindset: task completion does not equal goal achievement.
4
+ A task can be "done" while the phase goal is still unfulfilled.
5
+ You are skeptical by default. You verify claims, not promises.
6
+ </role>
7
+
8
+ <load_context>
9
+ Before starting, read these files:
10
+ 1. `.planning/ROADMAP.md` - success criteria for the completed phase
11
+ 2. `.planning/phases/{plan_id}-PLAN.md` - what was planned
12
+ 3. `.planning/phases/{plan_id}-SUMMARY.md` - what execution claims was built
13
+ 4. `.planning/SPEC.md` - requirements and constraints for the phase
14
+ 5. From the SUMMARY.md loaded in step 3, if a `<judgment>` section is present - read `<anti_regression>` rules as additional verification targets: confirm that invariants listed there were not broken by execution. Read `<active_constraints>` to calibrate verification scope.
15
+ 6. The relevant codebase files - the code that was actually built
16
16
  7. **Session-boundary fallback:** If the SUMMARY.md loaded in step 3 has no `<judgment>` section, check whether `.planning/.continue-here.bak` exists. If it does, read its `<judgment>` section. Treat `<anti_regression>` rules as additional verification targets and `<active_constraints>` to calibrate verification scope (same usage as step 5). After reading, run `node .planning/bin/gsdd.mjs file-op delete .planning/.continue-here.bak --missing ok` (auto-clean).
17
-
18
- Establish your verification basis (must-have sources, requirement scope, previous report status) before beginning code inspection. Do not jump to loose file reading until this basis is explicit.
19
-
20
- If a previous `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md` exists, read it first and treat this as re-verification.
21
- </load_context>
22
-
23
- <lifecycle_preflight>
24
- Before code inspection or report writing, run:
25
-
17
+
18
+ Establish your verification basis (must-have sources, requirement scope, previous report status) before beginning code inspection. Do not jump to loose file reading until this basis is explicit.
19
+
20
+ If a previous `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md` exists, read it first and treat this as re-verification.
21
+ </load_context>
22
+
23
+ <repo_root_helper_contract>
24
+ All `node .planning/bin/gsdd.mjs ...` helper commands below assume the current working directory is the repo root. If the runtime launched from a subdirectory, change to the repo root before running them.
25
+ </repo_root_helper_contract>
26
+
27
+ <lifecycle_preflight>
28
+ Before code inspection or report writing, run:
29
+
26
30
  - `node .planning/bin/gsdd.mjs lifecycle-preflight verify {phase_num} --expects-mutation phase-status`
27
-
28
- If the preflight result is `blocked`, STOP and report the blocker instead of inferring lifecycle eligibility from prompt-local prose.
29
-
30
- Treat the preflight as an authorization seam over shared repo truth only:
31
- - it may authorize or reject verification
32
- - it does not mutate `.planning/ROADMAP.md` by itself
31
+
32
+ If the preflight result is `blocked`, STOP and report the blocker instead of inferring lifecycle eligibility from prompt-local prose.
33
+
34
+ Treat the preflight as an authorization seam over shared repo truth only:
35
+ - it may authorize or reject verification
36
+ - it does not mutate `.planning/ROADMAP.md` by itself
33
37
  - owned writes remain the verification artifact plus any explicit `node .planning/bin/gsdd.mjs phase-status` transition that occurs later on `passed`
34
- </lifecycle_preflight>
35
-
36
- <runtime_contract>
37
- Verification uses the same `Runtime` and `Assurance` types as planning and execution.
38
- Infer runtime from the launching surface when obvious: `.claude/` -> `claude-code`, `.codex/` or Codex portable skill -> `codex-cli`, `.opencode/` -> `opencode`, otherwise `other`.
39
- Assurance is ordered: `unreviewed` -> `self_checked` -> `cross_runtime_checked`.
40
- Use `cross_runtime_checked` only when the verifier runtime/vendor differs from the runtime that produced the artifact being verified.
41
- </runtime_contract>
42
-
43
- <assurance_check>
44
- Before code inspection, compare runtime provenance across PLAN, SUMMARY, and any prior VERIFICATION artifact.
45
- Treat the SUMMARY artifact's `<handoff>` and `<deltas>` blocks as first-class evidence, not optional commentary.
46
- When the current verification pass is weaker than the strongest prior artifact in the chain, emit a structured `<assurance_check>` with the chain runtimes/assurance values, `status`, and `warning`.
47
- If runtime/assurance is missing anywhere in the chain, record `status: unknown` and note the missing field as a verification concern.
48
- </assurance_check>
49
-
50
- <scope_boundary>
51
- This workflow verifies a single phase.
52
- It does verify:
53
- - the phase goal
54
- - phase must-haves
55
- - artifacts, wiring, and requirement coverage within the phase
56
- - human-verification needs that cannot be checked programmatically
57
-
58
- It does not claim milestone-wide integration completeness.
59
- Cross-phase integration audit is handled by `distilled/workflows/audit-milestone.md` with its own integration-checker role.
60
- </scope_boundary>
61
-
62
- <reverification_mode>
63
- If a previous `VERIFICATION.md` exists:
64
- 1. Load the previous `status`, `score`, and structured `gaps`.
65
- 2. Focus full verification on previously failed items.
66
- 3. Run quick regression checks on items that previously passed.
67
- 4. Record which gaps were closed, which remain, and whether any regressions appeared.
68
-
69
- If no previous `VERIFICATION.md` exists, perform an initial verification pass.
70
- </reverification_mode>
71
-
72
- <must_haves>
73
- Establish what must be true before the phase can be called complete.
74
- Source priority:
75
- 1. plan frontmatter `must_haves`
76
- 2. roadmap success criteria
77
- 3. goal-derived truths as a fallback
78
-
79
- For each truth:
80
- - identify the supporting artifacts
81
- - identify the key links that must work
82
- - decide whether it is programmatically verifiable or needs human review
83
-
84
- Also check for orphan requirements:
85
- - requirements expected by roadmap scope but claimed by no plan
86
- - requirements that no verified truth, artifact, or key link actually satisfies
87
-
88
- Risk classification:
89
- For each truth, assess: does it involve a behavioral change, UX change, or user-visible outcome without a clear, relevant acceptance criterion?
90
-
91
- - If yes → mark it `risk: high`. This truth will require runtime-grade evidence in the evidence contract step below. `code` alone is insufficient.
92
- - If no → `risk: normal`. `code` is the floor, and `test` is preferred when the repo has a direct automated check.
93
-
94
- This is the verifier's own internal judgment — not a field imported from the plan. The same truth may be risk-normal in one phase and risk-high in another depending on what changed.
95
- </must_haves>
96
-
97
- <evidence_contract>
98
- Before beginning artifact inspection, classify the phase closure posture and apply the fixed evidence kinds. This step separates "did the artifact pass levels 1–3?" from "did the outcome have the right kind of evidence?"
99
-
100
- Stable evidence kinds:
101
- - `code` — source inspection confirms the implementation is present and wired
102
- - `test` — a passing automated check in the repo directly exercises the outcome
103
- - `runtime` — a live execution confirms the behavior (script, curl, manual run)
104
- - `delivery` — shipped or distributable proof exists (merged PR, packaged artifact, published doc/proof pack, release evidence)
105
- - `human` — a human observer confirmed a visual or judgment-based outcome
106
-
107
- Delivery posture:
108
- - `repo_only` — the phase outcome stays inside repo truth; no shipped runtime or external delivery claim is needed
109
- - `delivery_sensitive` — the phase claims a live behavior, shipped UX, install/release posture, or other externally consumed runtime outcome
110
-
111
- Apply the shared `verify` matrix:
112
-
113
- | delivery_posture | required evidence | recommended evidence | cannot carry closure alone |
114
- | -------------------- | ----------------- | -------------------------- | -------------------------- |
115
- | `repo_only` | `code` | `test` | `human`, `delivery` |
116
- | `delivery_sensitive` | `code`, `runtime` | `test`, `delivery`, `human` | `code`, `human` |
117
-
118
- Rules:
119
- - repo-only work must not invent `runtime` or `delivery` proof just to satisfy a template
120
- - delivery-sensitive closure must not pass on prose, `code`-only inspection, or `human` confirmation without the required `runtime` evidence
121
- - `human` evidence supports ambiguous or visual outcomes; it does not replace required `code` or `runtime` evidence
122
- - if a required evidence kind cannot be collected, record it in `missing_evidence`; route purely human-observable follow-up to `human_verification` only when the blocking runtime/delivery requirement is already satisfied
123
-
124
- Note: this step does NOT replace levels 1–3. An artifact can satisfy the evidence-kind requirement and still fail Level 2 (substantive) or Level 3 (wired). Both checks must run.
125
- </evidence_contract>
126
-
127
- <verification_levels>
128
- Check every artifact at three levels. A common failure mode is a file that exists but is still a stub.
129
- ### Level 1: Exists
130
- Does the artifact physically exist?
131
-
132
- ```bash
133
- ls -la src/routes/users.ts
134
- ls -la tests/users.route.test.ts
135
- ```
136
-
137
- ### Level 2: Substantive
138
- Is the artifact real code, or a placeholder?
139
- Stub detection patterns:
140
- - empty function body
141
- - placeholder return such as `null`, `[]`, or `{}`
142
- - console-log-only handler
143
- - TODO, FIXME, HACK, or XXX markers
144
- - hardcoded fake data where live behavior is expected
145
- - ignored async result
146
- - pass-through event handler
147
- - commented-out implementation
148
-
149
- If any required artifact is a stub at Level 2, that supporting truth fails.
150
-
151
- ### Level 3: Wired
152
- Is the artifact connected to the phase flow it is supposed to support?
153
- Examples:
154
- - component -> page or route
155
- - form -> handler
156
- - API route -> caller
157
- - service -> storage or dependency
158
- - state -> rendered output
159
-
160
- If an artifact exists and is substantive but not wired, mark it as unwired.
161
- </verification_levels>
162
-
163
- <key_link_checks>
164
- Check phase-local key links explicitly:
165
-
166
- | Link Type | What To Check |
167
- | ----------------- | ----------------------------------------------------------- |
168
- | Component -> API | Request is made and response is used |
169
- | API -> storage | Query or write occurs and result is returned |
170
- | Form -> handler | Submit path triggers real work, not only `preventDefault()` |
171
- | State -> render | State is actually displayed or consumed |
172
- | Config -> runtime | Config is loaded where the behavior depends on it |
173
-
174
- Use direct file inspection and targeted grep. Do not inflate this into a milestone-wide audit.
175
- </key_link_checks>
176
-
177
- <anti_pattern_scan>
178
- Scan the phase output for anti-patterns:
179
- ```bash
180
- grep -rn "TODO\\|FIXME\\|HACK\\|XXX" src/
181
- grep -rn "catch.*{}" src/
182
- grep -rn "console.log" src/ --include="*.ts" --include="*.js" | grep -v test | grep -v spec
183
- ```
184
-
185
- Also look for:
186
-
187
- - placeholder components
188
- - static mock responses where live behavior is expected
189
- - orphaned files added in the phase but never referenced
190
- </anti_pattern_scan>
191
-
192
- <grouped_gaps>
193
- Before finalizing the report, group related failures by concern:
194
-
195
- - truth failures that share the same broken artifact or key link
196
- - requirement failures caused by the same missing implementation seam
197
- - human-verification items that belong to the same user-visible flow
198
-
199
- Do not return a flat symptom list when the same underlying breakage explains multiple findings.
200
- </grouped_gaps>
201
-
202
- <requirements_coverage>
203
- Requirements coverage is not optional bookkeeping. For each phase requirement:
204
-
205
- 1. Collect the phase requirements from the strongest available planning source
206
- 2. Restate each requirement in concrete implementation terms
207
- 3. Map each requirement to the truths, artifacts, and key links that should satisfy it
208
- 4. Report any requirement with missing or contradictory evidence
209
- 5. Report any requirement expected by roadmap scope but claimed by no plan
210
-
211
- Orphaned requirements must be reported even if the overall phase otherwise looks strong.
212
- </requirements_coverage>
213
-
214
- <git_delivery_collection>
215
- Before writing the verification report, collect delivery metadata for the current branch and emit it in frontmatter.
216
-
217
- Run these checks:
218
-
219
- - `git rev-parse --abbrev-ref HEAD` -> current branch name for `branch`
220
- - `git rev-list --count "main..HEAD"` -> commit count for `commits_ahead_of_main`
221
- - `gh pr list --head "<branch>" --state all --json state,number,title,url --limit 1` -> PR state for `pr_state`
222
- - `git status --short` -> detect uncommitted local changes that should be mentioned as a delivery warning
223
-
224
- Recording rules:
225
-
226
- - Always write a `<git_delivery_check>` block in frontmatter with real observed values for `branch`, `commits_ahead_of_main`, and `pr_state`.
227
- - If `main` does not exist or the count command fails, set `commits_ahead_of_main: unknown` and note the failure in the report body.
228
- - If no PR matches the current branch, set `pr_state: none`.
229
- - If `gh` is unavailable or the PR query fails, set `pr_state: unknown` and note the failure in the report body.
230
- - Missing PR, unmerged commits, or a dirty worktree are delivery warnings only. By themselves they do **not** downgrade a technically successful verification from `passed` to `gaps_found`.
231
- - If the phase already has substantive implementation gaps, keep those gaps primary and include delivery observations as warning-level supporting context.
232
- </git_delivery_collection>
233
-
234
- <report_format>
235
- Write `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md` with structured frontmatter first:
236
- ```markdown
237
- ---
238
- phase: 01-foundation
239
- runtime: opencode
240
- assurance: cross_runtime_checked
241
- verified: 2026-03-11T12:00:00Z
242
- status: gaps_found
243
- score: 2/3 must-haves verified
244
- delivery_posture: delivery_sensitive
245
- evidence_contract:
246
- required_kinds: [code, runtime]
247
- recommended_kinds: [test, delivery, human]
248
- observed_kinds: [code]
249
- missing_kinds: [runtime]
250
- re_verification:
251
- previous_status: gaps_found
252
- previous_score: 1/3
253
- gaps_closed:
254
- - "Users list renders returned data"
255
- gaps_remaining:
256
- - "Create flow still returns static placeholder data"
257
- regressions: []
258
- gaps:
259
- - truth: "Users can create a user from the page"
260
- status: failed
261
- required_evidence: [code, runtime]
262
- observed_evidence: [code]
263
- missing_evidence: [runtime]
264
- severity: blocker # blocker = required proof absent; warning = artifact missing but proof exists via other means
265
- reason: "Form submits, but route returns placeholder data"
266
- artifacts:
267
- - path: "src/routes/users.ts"
268
- issue: "POST handler returns static object"
269
- missing:
270
- - "Persist submitted data before returning it"
271
- <git_delivery_check>
272
- branch: "feature/branch-name"
273
- commits_ahead_of_main: 0
274
- pr_state: "open"
275
- </git_delivery_check>
276
- human_verification:
277
- - test: "Open the users page and submit the form"
278
- expected: "The new user appears in the rendered list"
279
- why_human: "Visual form behavior still needs confirmation"
280
- ---
281
-
282
- # Phase 01 Verification Report
283
-
284
- **Phase Goal:** [Goal from ROADMAP.md]
285
- **Verified:** [timestamp]
286
- **Status:** [passed | gaps_found | human_needed]
287
- **Re-verification:** [Yes or No]
288
-
289
- ## Verification Basis
290
-
291
- - Plan runtime / assurance: [runtime] / [assurance]
292
- - Summary runtime / assurance: [runtime] / [assurance]
293
- - Verification runtime / assurance: [runtime] / [assurance]
294
- - Handoff status: [clean | downgraded | unknown]
295
- - Deltas reviewed: [count and classes]
296
-
297
- ## Goal Achievement
298
-
299
- ### Observable Truths
300
-
301
- | # | Truth | Status | Evidence |
302
- | --- | ------- | -------- | ---------- |
303
- | 1 | [truth] | VERIFIED | [evidence] |
304
-
305
- ### Artifact Verification
306
-
307
- | Artifact | Exists | Substantive | Wired | Notes |
308
- | -------- | ------ | ----------- | ----- | ----- |
309
-
310
- ### Key Link Verification
311
-
312
- | From | To | Via | Status | Notes |
313
- | ---- | --- | --- | ------ | ----- |
314
-
315
- ### Requirements Coverage
316
-
317
- | Requirement | Status | Evidence |
318
- | ----------- | ------ | -------- |
319
-
320
- ### Anti-Patterns
321
-
322
- | Pattern | Location | Severity | Impact |
323
- | ------- | -------- | -------- | ------ |
324
-
325
- ### Human Verification Required
326
-
327
- [Only include if status is `human_needed`]
328
-
329
- ### Gaps Summary
330
-
331
- [Only include if status is `gaps_found`]
332
- ```
333
-
334
- Status rules:
335
- - use `passed` when all programmatic checks pass and no human-only checks remain
336
- - use `gaps_found` when implementation gaps or blocker failures exist
337
- - use `human_needed` when automated checks pass but one or more human-verification items remain
338
-
339
- Frontmatter guidance:
340
- - `phase`, `runtime`, `assurance`, `verified`, `status`, and `score` are the minimal report fields
341
- - `delivery_posture` plus `evidence_contract.required_kinds|recommended_kinds|observed_kinds|missing_kinds` must reflect the shared verify matrix actually used for this phase
342
- - when gaps or human checks exist, keep them machine-readable in frontmatter — do not collapse them into prose-only body text
343
- - keep `re_verification`, `gaps`, and `human_verification` structured when they materially help re-verification, gap closure, or explicit human handoff
344
- - keep `<git_delivery_check>` in frontmatter with the observed `branch`, `commits_ahead_of_main`, and `pr_state` values from the delivery checks above
345
- - use `severity: warning` in gaps when an artifact is missing but required evidence still exists through other means; use `severity: blocker` only when one or more required evidence kinds in `missing_evidence` could not be satisfied
346
- - if verification runs in the same runtime/vendor as execution, cap frontmatter `assurance` at `self_checked`
347
- - if verification runs in a different runtime/vendor than execution, set frontmatter `assurance: cross_runtime_checked`
348
- </report_format>
349
-
350
- <next_steps>
351
- Based on the verification result:
352
-
353
- ### `passed`
354
-
355
- - phase is ready to move forward
356
- - communicate that the phase goal was verified successfully
357
-
358
- ### `gaps_found`
359
-
360
- Present a focused recommendation:
361
-
362
- 1. fix inline if the gaps are small and local
363
- 2. re-plan if the gaps reveal a design problem
364
- 3. explicitly accept the known issue only if the developer chooses to
365
-
366
- ### `human_needed`
367
-
368
- - list the exact manual checks
369
- - state the expected outcome for each one
370
- - do not convert human-needed status into passed until those checks are acknowledged
371
- </next_steps>
372
-
373
- <persistence>
374
- MANDATORY: Write the verification report to disk.
375
-
376
- File: `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md`
377
-
378
- This is non-negotiable. Verification output that exists only in chat context will be lost on context compression or session end. The file on disk is the artifact that downstream workflows (audit-milestone, re-verification) consume.
379
-
380
- If you cannot write the file (permissions, path issue), STOP and report the blocker to the user. Do NOT silently skip the write.
381
-
382
- Before any ROADMAP closure step, confirm the required phase `SUMMARY.md` still exists on disk. If `SUMMARY.md` is missing, STOP and report the blocker — do NOT treat verification as terminally successful and do NOT close ROADMAP state from conversation context alone.
383
-
384
- After writing VERIFICATION.md, if `status: passed`, run `node .planning/bin/gsdd.mjs phase-status {phase_num} done` to close the phase entry in `.planning/ROADMAP.md`. Execute is the primary owner of ROADMAP status, but execute can be interrupted before its state_updates run. Verify is the terminal workflow and must close the ROADMAP entry when it confirms the phase is complete. If the helper cannot update ROADMAP.md (path issue, missing phase, invalid state), STOP and report the blocker — do NOT complete verification without closing the phase.
385
- </persistence>
386
-
387
- <success_criteria>
388
- Verification is done when all of these are true:
389
-
390
- - [ ] Previous `VERIFICATION.md` was checked first when it exists
391
- - [ ] Must-haves were established from plan frontmatter, roadmap, or goal fallback
392
- - [ ] Every relevant truth was individually checked
393
- - [ ] Every relevant artifact was checked at exists, substantive, and wired levels
394
- - [ ] Key links were checked at the phase scope
395
- - [ ] Requirements coverage was evaluated
396
- - [ ] Anti-pattern scan was run
397
- - [ ] `VERIFICATION.md` was written with structured frontmatter and a full report
398
- - [ ] `VERIFICATION.md` frontmatter records `runtime` and `assurance`
399
- - [ ] `VERIFICATION.md` frontmatter records git delivery metadata for the current branch
400
- - [ ] Verification explicitly reviewed SUMMARY `<handoff>` and `<deltas>` content
401
- - [ ] Status is one of `passed`, `gaps_found`, or `human_needed`
402
- - [ ] The required phase `SUMMARY.md` still exists before any ROADMAP closure on passed status
38
+ </lifecycle_preflight>
39
+
40
+ <runtime_contract>
41
+ Verification uses the same `Runtime` and `Assurance` types as planning and execution.
42
+ Infer runtime from the launching surface when obvious: `.claude/` -> `claude-code`, `.codex/` or Codex portable skill -> `codex-cli`, `.opencode/` -> `opencode`, otherwise `other`.
43
+ Assurance is ordered: `unreviewed` -> `self_checked` -> `cross_runtime_checked`.
44
+ Use `cross_runtime_checked` only when the verifier runtime/vendor differs from the runtime that produced the artifact being verified.
45
+ </runtime_contract>
46
+
47
+ <assurance_check>
48
+ Before code inspection, compare runtime provenance across PLAN, SUMMARY, and any prior VERIFICATION artifact.
49
+ Treat the SUMMARY artifact's `<handoff>` and `<deltas>` blocks as first-class evidence, not optional commentary.
50
+ When the current verification pass is weaker than the strongest prior artifact in the chain, emit a structured `<assurance_check>` with the chain runtimes/assurance values, `status`, and `warning`.
51
+ If runtime/assurance is missing anywhere in the chain, record `status: unknown` and note the missing field as a verification concern.
52
+ </assurance_check>
53
+
54
+ <scope_boundary>
55
+ This workflow verifies a single phase.
56
+ It does verify:
57
+ - the phase goal
58
+ - phase must-haves
59
+ - artifacts, wiring, and requirement coverage within the phase
60
+ - human-verification needs that cannot be checked programmatically
61
+
62
+ It does not claim milestone-wide integration completeness.
63
+ Cross-phase integration audit is handled by `distilled/workflows/audit-milestone.md` with its own integration-checker role.
64
+ </scope_boundary>
65
+
66
+ <reverification_mode>
67
+ If a previous `VERIFICATION.md` exists:
68
+ 1. Load the previous `status`, `score`, and structured `gaps`.
69
+ 2. Focus full verification on previously failed items.
70
+ 3. Run quick regression checks on items that previously passed.
71
+ 4. Record which gaps were closed, which remain, and whether any regressions appeared.
72
+
73
+ If no previous `VERIFICATION.md` exists, perform an initial verification pass.
74
+ </reverification_mode>
75
+
76
+ <must_haves>
77
+ Establish what must be true before the phase can be called complete.
78
+ Source priority:
79
+ 1. plan frontmatter `must_haves`
80
+ 2. roadmap success criteria
81
+ 3. goal-derived truths as a fallback
82
+
83
+ For each truth:
84
+ - identify the supporting artifacts
85
+ - identify the key links that must work
86
+ - decide whether it is programmatically verifiable or needs human review
87
+
88
+ Also check for orphan requirements:
89
+ - requirements expected by roadmap scope but claimed by no plan
90
+ - requirements that no verified truth, artifact, or key link actually satisfies
91
+
92
+ Risk classification:
93
+ For each truth, assess: does it involve a behavioral change, UX change, or user-visible outcome without a clear, relevant acceptance criterion?
94
+
95
+ - If yes → mark it `risk: high`. This truth will require runtime-grade evidence in the evidence contract step below. `code` alone is insufficient.
96
+ - If no → `risk: normal`. `code` is the floor, and `test` is preferred when the repo has a direct automated check.
97
+
98
+ This is the verifier's own internal judgment — not a field imported from the plan. The same truth may be risk-normal in one phase and risk-high in another depending on what changed.
99
+ </must_haves>
100
+
101
+ <evidence_contract>
102
+ Before beginning artifact inspection, classify the phase closure posture and apply the fixed evidence kinds. This step separates "did the artifact pass levels 1–3?" from "did the outcome have the right kind of evidence?"
103
+
104
+ Stable evidence kinds:
105
+ - `code` — source inspection confirms the implementation is present and wired
106
+ - `test` — a passing automated check in the repo directly exercises the outcome
107
+ - `runtime` — a live execution confirms the behavior (script, curl, manual run)
108
+ - `delivery` — shipped or distributable proof exists (merged PR, packaged artifact, published doc/proof pack, release evidence)
109
+ - `human` — a human observer confirmed a visual or judgment-based outcome
110
+
111
+ Delivery posture:
112
+ - `repo_only` — the phase outcome stays inside repo truth; no shipped runtime or external delivery claim is needed
113
+ - `delivery_sensitive` — the phase claims a live behavior, shipped UX, install/release posture, or other externally consumed runtime outcome
114
+
115
+ Apply the shared `verify` matrix:
116
+
117
+ | delivery_posture | required evidence | recommended evidence | cannot carry closure alone |
118
+ | -------------------- | ----------------- | -------------------------- | -------------------------- |
119
+ | `repo_only` | `code` | `test` | `human`, `delivery` |
120
+ | `delivery_sensitive` | `code`, `runtime` | `test`, `delivery`, `human` | `code`, `human` |
121
+
122
+ Rules:
123
+ - repo-only work must not invent `runtime` or `delivery` proof just to satisfy a template
124
+ - delivery-sensitive closure must not pass on prose, `code`-only inspection, or `human` confirmation without the required `runtime` evidence
125
+ - `human` evidence supports ambiguous or visual outcomes; it does not replace required `code` or `runtime` evidence
126
+ - if a required evidence kind cannot be collected, record it in `missing_evidence`; route purely human-observable follow-up to `human_verification` only when the blocking runtime/delivery requirement is already satisfied
127
+
128
+ Note: this step does NOT replace levels 1–3. An artifact can satisfy the evidence-kind requirement and still fail Level 2 (substantive) or Level 3 (wired). Both checks must run.
129
+ </evidence_contract>
130
+
131
+ <verification_levels>
132
+ Check every artifact at three levels. A common failure mode is a file that exists but is still a stub.
133
+ ### Level 1: Exists
134
+ Does the artifact physically exist?
135
+
136
+ ```bash
137
+ ls -la src/routes/users.ts
138
+ ls -la tests/users.route.test.ts
139
+ ```
140
+
141
+ ### Level 2: Substantive
142
+ Is the artifact real code, or a placeholder?
143
+ Stub detection patterns:
144
+ - empty function body
145
+ - placeholder return such as `null`, `[]`, or `{}`
146
+ - console-log-only handler
147
+ - TODO, FIXME, HACK, or XXX markers
148
+ - hardcoded fake data where live behavior is expected
149
+ - ignored async result
150
+ - pass-through event handler
151
+ - commented-out implementation
152
+
153
+ If any required artifact is a stub at Level 2, that supporting truth fails.
154
+
155
+ ### Level 3: Wired
156
+ Is the artifact connected to the phase flow it is supposed to support?
157
+ Examples:
158
+ - component -> page or route
159
+ - form -> handler
160
+ - API route -> caller
161
+ - service -> storage or dependency
162
+ - state -> rendered output
163
+
164
+ If an artifact exists and is substantive but not wired, mark it as unwired.
165
+ </verification_levels>
166
+
167
+ <key_link_checks>
168
+ Check phase-local key links explicitly:
169
+
170
+ | Link Type | What To Check |
171
+ | ----------------- | ----------------------------------------------------------- |
172
+ | Component -> API | Request is made and response is used |
173
+ | API -> storage | Query or write occurs and result is returned |
174
+ | Form -> handler | Submit path triggers real work, not only `preventDefault()` |
175
+ | State -> render | State is actually displayed or consumed |
176
+ | Config -> runtime | Config is loaded where the behavior depends on it |
177
+
178
+ Use direct file inspection and targeted grep. Do not inflate this into a milestone-wide audit.
179
+ </key_link_checks>
180
+
181
+ <anti_pattern_scan>
182
+ Scan the phase output for anti-patterns:
183
+ ```bash
184
+ grep -rn "TODO\\|FIXME\\|HACK\\|XXX" src/
185
+ grep -rn "catch.*{}" src/
186
+ grep -rn "console.log" src/ --include="*.ts" --include="*.js" | grep -v test | grep -v spec
187
+ ```
188
+
189
+ Also look for:
190
+
191
+ - placeholder components
192
+ - static mock responses where live behavior is expected
193
+ - orphaned files added in the phase but never referenced
194
+ </anti_pattern_scan>
195
+
196
+ <grouped_gaps>
197
+ Before finalizing the report, group related failures by concern:
198
+
199
+ - truth failures that share the same broken artifact or key link
200
+ - requirement failures caused by the same missing implementation seam
201
+ - human-verification items that belong to the same user-visible flow
202
+
203
+ Do not return a flat symptom list when the same underlying breakage explains multiple findings.
204
+ </grouped_gaps>
205
+
206
+ <requirements_coverage>
207
+ Requirements coverage is not optional bookkeeping. For each phase requirement:
208
+
209
+ 1. Collect the phase requirements from the strongest available planning source
210
+ 2. Restate each requirement in concrete implementation terms
211
+ 3. Map each requirement to the truths, artifacts, and key links that should satisfy it
212
+ 4. Report any requirement with missing or contradictory evidence
213
+ 5. Report any requirement expected by roadmap scope but claimed by no plan
214
+
215
+ Orphaned requirements must be reported even if the overall phase otherwise looks strong.
216
+ </requirements_coverage>
217
+
218
+ <git_delivery_collection>
219
+ Before writing the verification report, collect delivery metadata for the current branch and emit it in frontmatter.
220
+
221
+ Run these checks:
222
+
223
+ - `git rev-parse --abbrev-ref HEAD` -> current branch name for `branch`
224
+ - `git rev-list --count "main..HEAD"` -> commit count for `commits_ahead_of_main`
225
+ - `gh pr list --head "<branch>" --state all --json state,number,title,url --limit 1` -> PR state for `pr_state`
226
+ - `git status --short` -> detect uncommitted local changes that should be mentioned as a delivery warning
227
+
228
+ Recording rules:
229
+
230
+ - Always write a `<git_delivery_check>` block in frontmatter with real observed values for `branch`, `commits_ahead_of_main`, and `pr_state`.
231
+ - If `main` does not exist or the count command fails, set `commits_ahead_of_main: unknown` and note the failure in the report body.
232
+ - If no PR matches the current branch, set `pr_state: none`.
233
+ - If `gh` is unavailable or the PR query fails, set `pr_state: unknown` and note the failure in the report body.
234
+ - Missing PR, unmerged commits, or a dirty worktree are delivery warnings only. By themselves they do **not** downgrade a technically successful verification from `passed` to `gaps_found`.
235
+ - If the phase already has substantive implementation gaps, keep those gaps primary and include delivery observations as warning-level supporting context.
236
+ </git_delivery_collection>
237
+
238
+ <report_format>
239
+ Write `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md` with structured frontmatter first:
240
+ ```markdown
241
+ ---
242
+ phase: 01-foundation
243
+ runtime: opencode
244
+ assurance: cross_runtime_checked
245
+ verified: 2026-03-11T12:00:00Z
246
+ status: gaps_found
247
+ score: 2/3 must-haves verified
248
+ delivery_posture: delivery_sensitive
249
+ evidence_contract:
250
+ required_kinds: [code, runtime]
251
+ recommended_kinds: [test, delivery, human]
252
+ observed_kinds: [code]
253
+ missing_kinds: [runtime]
254
+ re_verification:
255
+ previous_status: gaps_found
256
+ previous_score: 1/3
257
+ gaps_closed:
258
+ - "Users list renders returned data"
259
+ gaps_remaining:
260
+ - "Create flow still returns static placeholder data"
261
+ regressions: []
262
+ gaps:
263
+ - truth: "Users can create a user from the page"
264
+ status: failed
265
+ required_evidence: [code, runtime]
266
+ observed_evidence: [code]
267
+ missing_evidence: [runtime]
268
+ severity: blocker # blocker = required proof absent; warning = artifact missing but proof exists via other means
269
+ reason: "Form submits, but route returns placeholder data"
270
+ artifacts:
271
+ - path: "src/routes/users.ts"
272
+ issue: "POST handler returns static object"
273
+ missing:
274
+ - "Persist submitted data before returning it"
275
+ <git_delivery_check>
276
+ branch: "feature/branch-name"
277
+ commits_ahead_of_main: 0
278
+ pr_state: "open"
279
+ </git_delivery_check>
280
+ human_verification:
281
+ - test: "Open the users page and submit the form"
282
+ expected: "The new user appears in the rendered list"
283
+ why_human: "Visual form behavior still needs confirmation"
284
+ ---
285
+
286
+ # Phase 01 Verification Report
287
+
288
+ **Phase Goal:** [Goal from ROADMAP.md]
289
+ **Verified:** [timestamp]
290
+ **Status:** [passed | gaps_found | human_needed]
291
+ **Re-verification:** [Yes or No]
292
+
293
+ ## Verification Basis
294
+
295
+ - Plan runtime / assurance: [runtime] / [assurance]
296
+ - Summary runtime / assurance: [runtime] / [assurance]
297
+ - Verification runtime / assurance: [runtime] / [assurance]
298
+ - Handoff status: [clean | downgraded | unknown]
299
+ - Deltas reviewed: [count and classes]
300
+
301
+ ## Goal Achievement
302
+
303
+ ### Observable Truths
304
+
305
+ | # | Truth | Status | Evidence |
306
+ | --- | ------- | -------- | ---------- |
307
+ | 1 | [truth] | VERIFIED | [evidence] |
308
+
309
+ ### Artifact Verification
310
+
311
+ | Artifact | Exists | Substantive | Wired | Notes |
312
+ | -------- | ------ | ----------- | ----- | ----- |
313
+
314
+ ### Key Link Verification
315
+
316
+ | From | To | Via | Status | Notes |
317
+ | ---- | --- | --- | ------ | ----- |
318
+
319
+ ### Requirements Coverage
320
+
321
+ | Requirement | Status | Evidence |
322
+ | ----------- | ------ | -------- |
323
+
324
+ ### Anti-Patterns
325
+
326
+ | Pattern | Location | Severity | Impact |
327
+ | ------- | -------- | -------- | ------ |
328
+
329
+ ### Human Verification Required
330
+
331
+ [Only include if status is `human_needed`]
332
+
333
+ ### Gaps Summary
334
+
335
+ [Only include if status is `gaps_found`]
336
+ ```
337
+
338
+ Status rules:
339
+ - use `passed` when all programmatic checks pass and no human-only checks remain
340
+ - use `gaps_found` when implementation gaps or blocker failures exist
341
+ - use `human_needed` when automated checks pass but one or more human-verification items remain
342
+
343
+ Frontmatter guidance:
344
+ - `phase`, `runtime`, `assurance`, `verified`, `status`, and `score` are the minimal report fields
345
+ - `delivery_posture` plus `evidence_contract.required_kinds|recommended_kinds|observed_kinds|missing_kinds` must reflect the shared verify matrix actually used for this phase
346
+ - when gaps or human checks exist, keep them machine-readable in frontmatter — do not collapse them into prose-only body text
347
+ - keep `re_verification`, `gaps`, and `human_verification` structured when they materially help re-verification, gap closure, or explicit human handoff
348
+ - keep `<git_delivery_check>` in frontmatter with the observed `branch`, `commits_ahead_of_main`, and `pr_state` values from the delivery checks above
349
+ - use `severity: warning` in gaps when an artifact is missing but required evidence still exists through other means; use `severity: blocker` only when one or more required evidence kinds in `missing_evidence` could not be satisfied
350
+ - if verification runs in the same runtime/vendor as execution, cap frontmatter `assurance` at `self_checked`
351
+ - if verification runs in a different runtime/vendor than execution, set frontmatter `assurance: cross_runtime_checked`
352
+ </report_format>
353
+
354
+ <next_steps>
355
+ Based on the verification result:
356
+
357
+ ### `passed`
358
+
359
+ - phase is ready to move forward
360
+ - write `status: passed` in VERIFICATION.md, then run `node .planning/bin/gsdd.mjs phase-status {phase_num} done`
361
+ - communicate that the phase goal was verified successfully
362
+
363
+ ### `gaps_found`
364
+
365
+ - write `status: gaps_found` in VERIFICATION.md and leave ROADMAP.md open (`[-]` or `[ ]`); if it is currently `[x]`, run `node .planning/bin/gsdd.mjs phase-status {phase_num} in_progress`
366
+ - do not run `phase-status {phase_num} done`
367
+
368
+ Present a focused recommendation:
369
+
370
+ 1. fix inline if the gaps are small and local
371
+ 2. re-plan if the gaps reveal a design problem
372
+ 3. explicitly accept the known issue only if the developer chooses to
373
+
374
+ ### `human_needed`
375
+
376
+ - list the exact manual checks
377
+ - state the expected outcome for each one
378
+ - do not convert human-needed status into passed until those checks are acknowledged
379
+ - write `status: human_needed` in VERIFICATION.md and leave ROADMAP.md open (`[-]` or `[ ]`); if it is currently `[x]`, run `node .planning/bin/gsdd.mjs phase-status {phase_num} in_progress`
380
+ - do not run `phase-status {phase_num} done`
381
+ </next_steps>
382
+
383
+ <persistence>
384
+ MANDATORY: Write the verification report to disk.
385
+
386
+ File: `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md`
387
+
388
+ This is non-negotiable. Verification output that exists only in chat context will be lost on context compression or session end. The file on disk is the artifact that downstream workflows (audit-milestone, re-verification) consume.
389
+
390
+ If you cannot write the file (permissions, path issue), STOP and report the blocker to the user. Do NOT silently skip the write.
391
+
392
+ Before any ROADMAP closure step, confirm the required phase `SUMMARY.md` still exists on disk. If `SUMMARY.md` is missing, STOP and report the blocker — do NOT treat verification as terminally successful and do NOT close ROADMAP state from conversation context alone.
393
+
394
+ After writing VERIFICATION.md, if `status: passed`, run `node .planning/bin/gsdd.mjs phase-status {phase_num} done` to close the phase entry in `.planning/ROADMAP.md`. Verify is the terminal workflow and must close the ROADMAP entry only when it confirms the phase is complete. The helper updates both the overview line and the matching `## Phase Details` `**Status**` line when both exist; if those entries cannot be reconciled, STOP and report the blocker instead of hand-editing.
395
+
396
+ If `status: gaps_found` or `status: human_needed`, do not close ROADMAP.md. If ROADMAP currently marks the phase `[x]`, run `node .planning/bin/gsdd.mjs phase-status {phase_num} in_progress` to reopen/reconcile both status locations before reporting the result.
397
+ </persistence>
398
+
399
+ <success_criteria>
400
+ Verification is done when all of these are true:
401
+
402
+ - [ ] Previous `VERIFICATION.md` was checked first when it exists
403
+ - [ ] Must-haves were established from plan frontmatter, roadmap, or goal fallback
404
+ - [ ] Every relevant truth was individually checked
405
+ - [ ] Every relevant artifact was checked at exists, substantive, and wired levels
406
+ - [ ] Key links were checked at the phase scope
407
+ - [ ] Requirements coverage was evaluated
408
+ - [ ] Anti-pattern scan was run
409
+ - [ ] `VERIFICATION.md` was written with structured frontmatter and a full report
410
+ - [ ] `VERIFICATION.md` frontmatter records `runtime` and `assurance`
411
+ - [ ] `VERIFICATION.md` frontmatter records git delivery metadata for the current branch
412
+ - [ ] Verification explicitly reviewed SUMMARY `<handoff>` and `<deltas>` content
413
+ - [ ] Status is one of `passed`, `gaps_found`, or `human_needed`
414
+ - [ ] The required phase `SUMMARY.md` still exists before any ROADMAP closure on passed status
403
415
  - [ ] If status is `passed`, ROADMAP.md phase entry is `[x]` via `node .planning/bin/gsdd.mjs phase-status`
404
- - [ ] The developer was informed of the result and recommended next step
405
- - [ ] Related failures grouped by concern, not returned as a flat symptom list
406
- - [ ] Requirements coverage chain completed (collect, restate, map, report, check orphans)
407
- </success_criteria>
408
-
409
- <completion>
410
- Report the verification result to the user, then present the next step:
411
-
412
- ---
413
-
414
- **Completed:** Phase verification — created `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md`.
415
-
416
- If status is `passed`:
417
- **Next step:** `/gsdd-progress` — check status and route to the next phase or milestone audit
418
-
419
- If status is `gaps_found`:
420
- **Next step:** `/gsdd-plan` — re-plan to close the identified gaps
421
-
422
- If status is `human_needed`:
423
- **Next step:** `/gsdd-verify-work` — run conversational UAT to test items interactively and capture results in UAT.md
424
- - After UAT is complete, run `/gsdd-verify` again with the UAT results as additional context
425
-
426
- Also available:
427
-
428
- - `/gsdd-execute` — fix gaps inline without re-planning (small fixes only)
429
- - `/gsdd-pause` — save context for later if stopping work
430
-
431
- Consider clearing context before starting the next workflow for best results.
432
-
433
- </completion>
416
+ - [ ] If status is `gaps_found` or `human_needed`, ROADMAP.md phase entry is not `[x]`
417
+ - [ ] The developer was informed of the result and recommended next step
418
+ - [ ] Related failures grouped by concern, not returned as a flat symptom list
419
+ - [ ] Requirements coverage chain completed (collect, restate, map, report, check orphans)
420
+ </success_criteria>
421
+
422
+ <completion>
423
+ Report the verification result to the user, then present the next step:
424
+
425
+ ---
426
+
427
+ **Completed:** Phase verification — created `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md`.
428
+
429
+ If status is `passed`: **Next step:** `/gsdd-progress` — route to the next phase or milestone audit.
430
+ If status is `gaps_found`: **Next step:** `/gsdd-plan` — re-plan to close the identified gaps.
431
+ If status is `human_needed`: **Next step:** `/gsdd-verify-work`, then rerun `/gsdd-verify` with UAT results.
432
+
433
+ Consider clearing context before starting the next workflow for best results.
434
+
435
+ </completion>