@opengsd/gsd-core 1.12.0 → 1.13.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 (286) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +12 -0
  4. package/agents/gsd-executor.md +63 -35
  5. package/agents/gsd-plan-checker.md +76 -57
  6. package/agents/gsd-planner.md +14 -0
  7. package/agents/gsd-ui-checker.md +19 -3
  8. package/agents/gsd-ui-researcher.md +29 -0
  9. package/agents/gsd-verifier.md +23 -1
  10. package/bin/install.js +239 -67
  11. package/commands/gsd/execute-phase.md +1 -1
  12. package/commands/gsd/ns-workflow.md +2 -1
  13. package/commands/gsd/phase.md +1 -1
  14. package/commands/gsd/quick-batch.md +105 -0
  15. package/commands/gsd/surface.md +18 -8
  16. package/gsd-core/bin/gsd-tools.cjs +195 -50
  17. package/gsd-core/bin/lib/capability-activation.cjs +27 -0
  18. package/gsd-core/bin/lib/capability-registry.cjs +514 -114
  19. package/gsd-core/bin/lib/capability-state.cjs +7 -1
  20. package/gsd-core/bin/lib/capability-validator.cjs +120 -4
  21. package/gsd-core/bin/lib/capability-writer.cjs +14 -4
  22. package/gsd-core/bin/lib/check-command-router.cjs +85 -2
  23. package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
  24. package/gsd-core/bin/lib/clusters.cjs +1 -0
  25. package/gsd-core/bin/lib/command-aliases.cjs +16 -0
  26. package/gsd-core/bin/lib/commands.cjs +337 -13
  27. package/gsd-core/bin/lib/config-loader.cjs +3 -0
  28. package/gsd-core/bin/lib/core-utils.cjs +34 -7
  29. package/gsd-core/bin/lib/decisions.cjs +213 -1
  30. package/gsd-core/bin/lib/edge-probe.cjs +14 -1
  31. package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
  32. package/gsd-core/bin/lib/frontmatter.cjs +137 -23
  33. package/gsd-core/bin/lib/gap-checker.cjs +22 -13
  34. package/gsd-core/bin/lib/git-base-branch.cjs +10 -2
  35. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
  36. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +54 -11
  37. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
  38. package/gsd-core/bin/lib/host-integration.cjs +57 -5
  39. package/gsd-core/bin/lib/init-command-router.cjs +14 -0
  40. package/gsd-core/bin/lib/init.cjs +132 -15
  41. package/gsd-core/bin/lib/install-engine.cjs +184 -12
  42. package/gsd-core/bin/lib/install-model-override-resolver.cjs +45 -0
  43. package/gsd-core/bin/lib/install-profiles.cjs +22 -14
  44. package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
  45. package/gsd-core/bin/lib/io.cjs +35 -0
  46. package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
  47. package/gsd-core/bin/lib/markdown-table.cjs +123 -0
  48. package/gsd-core/bin/lib/milestone.cjs +22 -2
  49. package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
  50. package/gsd-core/bin/lib/phase-id.cjs +251 -9
  51. package/gsd-core/bin/lib/phase.cjs +774 -35
  52. package/gsd-core/bin/lib/plan-document.cjs +10 -0
  53. package/gsd-core/bin/lib/planning-snapshot.cjs +147 -20
  54. package/gsd-core/bin/lib/planning-workspace.cjs +103 -28
  55. package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
  56. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
  57. package/gsd-core/bin/lib/quick-batch.cjs +840 -0
  58. package/gsd-core/bin/lib/review-lane-descriptor.cjs +53 -5
  59. package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
  60. package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
  61. package/gsd-core/bin/lib/roadmap-parser.cjs +499 -26
  62. package/gsd-core/bin/lib/roadmap.cjs +187 -58
  63. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +233 -33
  64. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
  65. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +286 -108
  66. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +215 -43
  67. package/gsd-core/bin/lib/shell-command-projection.cjs +4 -0
  68. package/gsd-core/bin/lib/smart-entry.cjs +7 -9
  69. package/gsd-core/bin/lib/state-document.cjs +30 -5
  70. package/gsd-core/bin/lib/state-md-schema.cjs +23 -13
  71. package/gsd-core/bin/lib/state-transition.cjs +333 -44
  72. package/gsd-core/bin/lib/state.cjs +684 -125
  73. package/gsd-core/bin/lib/surface.cjs +23 -8
  74. package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
  75. package/gsd-core/bin/lib/uat.cjs +1419 -515
  76. package/gsd-core/bin/lib/update-context.cjs +6 -2
  77. package/gsd-core/bin/lib/validate.cjs +230 -12
  78. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  79. package/gsd-core/bin/lib/verification.cjs +273 -12
  80. package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
  81. package/gsd-core/bin/lib/verify.cjs +346 -16
  82. package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
  83. package/gsd-core/bin/lib/worktree-safety.cjs +8 -0
  84. package/gsd-core/bin/shared/config-schema.manifest.json +8 -0
  85. package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
  86. package/gsd-core/references/agent-contracts.md +3 -3
  87. package/gsd-core/references/edge-probe.md +17 -13
  88. package/gsd-core/references/execute-mvp-tdd.md +18 -16
  89. package/gsd-core/references/execute-phase-response-language.md +6 -0
  90. package/gsd-core/references/executor-examples.md +42 -0
  91. package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
  92. package/gsd-core/references/mvp-concepts.md +2 -2
  93. package/gsd-core/references/plan-checker-examples.md +41 -0
  94. package/gsd-core/references/planner-antipatterns.md +25 -0
  95. package/gsd-core/references/planner-chunked.md +5 -1
  96. package/gsd-core/references/planner-coupling.md +42 -0
  97. package/gsd-core/references/planner-quick-batch.md +71 -0
  98. package/gsd-core/references/planner-reviews.md +47 -0
  99. package/gsd-core/references/planner-revision.md +75 -2
  100. package/gsd-core/references/planning-config.md +2 -1
  101. package/gsd-core/references/response-language-directive.md +9 -0
  102. package/gsd-core/references/revision-loop.md +118 -11
  103. package/gsd-core/references/tdd.md +14 -9
  104. package/gsd-core/references/verifier-evidence-gate.md +160 -0
  105. package/gsd-core/templates/phase-prompt.md +4 -0
  106. package/gsd-core/templates/verification-report.md +5 -0
  107. package/gsd-core/workflows/add-backlog.md +2 -0
  108. package/gsd-core/workflows/add-phase.md +2 -0
  109. package/gsd-core/workflows/add-tests.md +1 -1
  110. package/gsd-core/workflows/add-todo.md +1 -1
  111. package/gsd-core/workflows/ai-integration-phase.md +1 -1
  112. package/gsd-core/workflows/analyze-dependencies.md +2 -0
  113. package/gsd-core/workflows/audit-fix.md +2 -0
  114. package/gsd-core/workflows/audit-milestone.md +2 -0
  115. package/gsd-core/workflows/audit-uat.md +2 -0
  116. package/gsd-core/workflows/autonomous.md +2 -0
  117. package/gsd-core/workflows/check-todos.md +1 -1
  118. package/gsd-core/workflows/cleanup.md +1 -1
  119. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +15 -13
  120. package/gsd-core/workflows/code-review-fix.md +2 -0
  121. package/gsd-core/workflows/code-review.md +73 -31
  122. package/gsd-core/workflows/complete-milestone.md +13 -4
  123. package/gsd-core/workflows/debug.md +1 -1
  124. package/gsd-core/workflows/diagnose-issues.md +5 -1
  125. package/gsd-core/workflows/discuss-phase/modes/advisor.md +2 -0
  126. package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
  127. package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
  128. package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
  129. package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
  130. package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -0
  131. package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
  132. package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
  133. package/gsd-core/workflows/discuss-phase/modes/text.md +2 -0
  134. package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
  135. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
  136. package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
  137. package/gsd-core/workflows/discuss-phase-power.md +2 -0
  138. package/gsd-core/workflows/discuss-phase.md +1 -1
  139. package/gsd-core/workflows/do.md +43 -13
  140. package/gsd-core/workflows/docs-update.md +1 -1
  141. package/gsd-core/workflows/edit-phase.md +2 -0
  142. package/gsd-core/workflows/eval-review.md +1 -1
  143. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +2 -0
  144. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +17 -1
  145. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +8 -2
  146. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -0
  147. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
  148. package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
  149. package/gsd-core/workflows/execute-phase.md +32 -14
  150. package/gsd-core/workflows/execute-plan.md +8 -8
  151. package/gsd-core/workflows/explore.md +2 -0
  152. package/gsd-core/workflows/extract-learnings.md +2 -0
  153. package/gsd-core/workflows/fast.md +6 -0
  154. package/gsd-core/workflows/forensics.md +2 -0
  155. package/gsd-core/workflows/graduation.md +1 -1
  156. package/gsd-core/workflows/health.md +1 -1
  157. package/gsd-core/workflows/help/modes/brief.md +2 -0
  158. package/gsd-core/workflows/help/modes/default.md +2 -0
  159. package/gsd-core/workflows/help/modes/full.md +12 -0
  160. package/gsd-core/workflows/help/modes/topic.md +2 -0
  161. package/gsd-core/workflows/help.md +2 -0
  162. package/gsd-core/workflows/import.md +3 -3
  163. package/gsd-core/workflows/inbox.md +1 -1
  164. package/gsd-core/workflows/ingest-docs.md +1 -1
  165. package/gsd-core/workflows/insert-phase.md +2 -0
  166. package/gsd-core/workflows/list-phase-assumptions.md +2 -0
  167. package/gsd-core/workflows/list-seeds.md +2 -0
  168. package/gsd-core/workflows/list-workspaces.md +2 -0
  169. package/gsd-core/workflows/manager.md +3 -3
  170. package/gsd-core/workflows/map-codebase.md +2 -0
  171. package/gsd-core/workflows/milestone-summary.md +2 -0
  172. package/gsd-core/workflows/mvp-phase.md +1 -1
  173. package/gsd-core/workflows/new-milestone.md +1 -1
  174. package/gsd-core/workflows/new-project.md +5 -3
  175. package/gsd-core/workflows/new-workspace.md +1 -1
  176. package/gsd-core/workflows/next.md +2 -0
  177. package/gsd-core/workflows/node-repair.md +2 -0
  178. package/gsd-core/workflows/note.md +2 -0
  179. package/gsd-core/workflows/onboard.md +1 -1
  180. package/gsd-core/workflows/pause-work.md +19 -4
  181. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
  182. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -0
  183. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +9 -0
  184. package/gsd-core/workflows/plan-phase.md +130 -12
  185. package/gsd-core/workflows/plan-review-convergence.md +102 -10
  186. package/gsd-core/workflows/plant-seed.md +1 -1
  187. package/gsd-core/workflows/pr-branch.md +11 -3
  188. package/gsd-core/workflows/profile-user.md +1 -1
  189. package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
  190. package/gsd-core/workflows/progress.md +25 -3
  191. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +37 -2
  192. package/gsd-core/workflows/quick/steps/research-phase.md +3 -3
  193. package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
  194. package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
  195. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
  196. package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
  197. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
  198. package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
  199. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
  200. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
  201. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
  202. package/gsd-core/workflows/quick-batch.md +203 -0
  203. package/gsd-core/workflows/quick.md +13 -3
  204. package/gsd-core/workflows/reapply-patches.md +2 -0
  205. package/gsd-core/workflows/remove-phase.md +2 -0
  206. package/gsd-core/workflows/remove-workspace.md +1 -1
  207. package/gsd-core/workflows/resume-project.md +6 -2
  208. package/gsd-core/workflows/review.md +215 -10
  209. package/gsd-core/workflows/scan.md +2 -0
  210. package/gsd-core/workflows/section-manifest.json +12 -0
  211. package/gsd-core/workflows/secure-phase.md +1 -1
  212. package/gsd-core/workflows/session-report.md +2 -0
  213. package/gsd-core/workflows/settings-advanced.md +2 -0
  214. package/gsd-core/workflows/settings-integrations.md +9 -8
  215. package/gsd-core/workflows/settings.md +1 -1
  216. package/gsd-core/workflows/ship.md +10 -10
  217. package/gsd-core/workflows/sketch-wrap-up.md +2 -0
  218. package/gsd-core/workflows/sketch.md +1 -1
  219. package/gsd-core/workflows/smart-entry.md +1 -1
  220. package/gsd-core/workflows/spec-phase.md +24 -19
  221. package/gsd-core/workflows/spike-wrap-up.md +2 -0
  222. package/gsd-core/workflows/spike.md +1 -1
  223. package/gsd-core/workflows/stats.md +2 -0
  224. package/gsd-core/workflows/sync-skills.md +12 -4
  225. package/gsd-core/workflows/thread.md +2 -0
  226. package/gsd-core/workflows/transition.md +2 -0
  227. package/gsd-core/workflows/ui-phase.md +26 -5
  228. package/gsd-core/workflows/ui-review.md +1 -1
  229. package/gsd-core/workflows/ultraplan-phase.md +2 -0
  230. package/gsd-core/workflows/undo.md +1 -1
  231. package/gsd-core/workflows/update.md +41 -38
  232. package/gsd-core/workflows/validate-phase.md +1 -1
  233. package/gsd-core/workflows/verify-work.md +49 -3
  234. package/hooks/dist/gsd-check-update-worker.js +19 -2
  235. package/hooks/dist/gsd-context-monitor.js +283 -12
  236. package/hooks/dist/gsd-node-runner.sh +1 -0
  237. package/hooks/dist/gsd-prompt-guard.js +30 -5
  238. package/hooks/dist/gsd-read-guard.js +2 -0
  239. package/hooks/dist/gsd-read-injection-scanner.js +5 -5
  240. package/hooks/dist/gsd-secret-read-guard.js +1079 -0
  241. package/hooks/dist/gsd-statusline.js +7 -3
  242. package/hooks/dist/gsd-validate-commit.sh +444 -7
  243. package/hooks/dist/gsd-workflow-guard.js +2 -1
  244. package/hooks/dist/lib/git-cmd.js +210 -1
  245. package/hooks/dist/lib/injection-patterns.js +36 -6
  246. package/hooks/dist/managed-hooks-registry.cjs +1 -0
  247. package/hooks/gsd-check-update-worker.js +19 -2
  248. package/hooks/gsd-context-monitor.js +283 -12
  249. package/hooks/gsd-node-runner.sh +1 -0
  250. package/hooks/gsd-prompt-guard.js +30 -5
  251. package/hooks/gsd-read-guard.js +2 -0
  252. package/hooks/gsd-read-injection-scanner.js +5 -5
  253. package/hooks/gsd-secret-read-guard.js +1079 -0
  254. package/hooks/gsd-statusline.js +7 -3
  255. package/hooks/gsd-validate-commit.sh +444 -7
  256. package/hooks/gsd-workflow-guard.js +2 -1
  257. package/hooks/hooks.json +6 -0
  258. package/hooks/lib/git-cmd.js +210 -1
  259. package/hooks/lib/injection-patterns.js +36 -6
  260. package/hooks/managed-hooks-registry.cjs +1 -0
  261. package/package.json +5 -5
  262. package/scripts/build-hooks.js +11 -4
  263. package/scripts/ci-test-scope.cjs +7 -0
  264. package/scripts/docs-guard-registry.cjs +10 -0
  265. package/scripts/gen-loop-host-contract.cjs +67 -15
  266. package/scripts/lib/shellcheck-fetch.cjs +247 -0
  267. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
  268. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  269. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  270. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +5 -0
  271. package/scripts/lint-phase-enumeration-drift.cjs +24 -6
  272. package/scripts/lint-phase-id-drift.cjs +133 -8
  273. package/scripts/lint-portable-grep.cjs +176 -0
  274. package/scripts/lint-response-language-coverage.cjs +524 -0
  275. package/scripts/lint-test-file-count.allowlist.json +3 -1
  276. package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
  277. package/scripts/lint-workflow-shellcheck.cjs +614 -0
  278. package/scripts/npm-audit-baseline.cjs +376 -0
  279. package/scripts/prompt-injection-scan.sh +8 -0
  280. package/scripts/require-issue-link-policy.cjs +16 -1
  281. package/skills/gsd-execute-phase/SKILL.md +1 -1
  282. package/skills/gsd-ns-workflow/SKILL.md +1 -0
  283. package/skills/gsd-phase/SKILL.md +1 -1
  284. package/skills/gsd-quick-batch/SKILL.md +105 -0
  285. package/skills/gsd-surface/SKILL.md +18 -8
  286. package/vscode/package.json +1 -1
@@ -11,11 +11,11 @@ This doc describes what IS, not what should be. Casing inconsistencies are docum
11
11
  | Agent | Role | Completion Markers | Consumed by | Kind |
12
12
  |-------|------|--------------------|--------------|------|
13
13
  | gsd-ai-researcher | AI framework research | No marker (writes the AI-SPEC.md framework section via Edit) | `gsd-core/workflows/ai-integration-phase.md` reads the AI-SPEC.md section after the agent returns | artifact+query |
14
- | gsd-planner | Plan creation | `## PLANNING COMPLETE`, `## OUTLINE COMPLETE`, `## PHASE SPLIT RECOMMENDED`, `## ⚠ Source Audit`, `## CHECKPOINT REACHED`, `## PLANNING INCONCLUSIVE` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md`, `gsd-core/workflows/plan-review-convergence.md`, `gsd-core/workflows/quick.md` | sentinel-match |
14
+ | gsd-planner | Plan creation | `## PLANNING COMPLETE`, `## OUTLINE COMPLETE`, `## PHASE SPLIT RECOMMENDED`, `## ⚠ Source Audit`, `## CHECKPOINT REACHED`, `## PLANNING INCONCLUSIVE`, `## REVISION_CONFLICT` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md`, `gsd-core/workflows/plan-review-convergence.md`, `gsd-core/workflows/quick.md`, `gsd-core/workflows/quick/steps/plan-checker-loop.md`, `gsd-core/workflows/verify-work.md` | sentinel-match |
15
15
  | gsd-executor | Plan execution | `## PLAN COMPLETE`, `## CHECKPOINT REACHED` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md`, `agents/gsd-debug-session-manager.md`, `agents/gsd-debugger.md` | sentinel-match |
16
16
  | gsd-phase-researcher | Phase-scoped research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/quick/steps/research-phase.md`, `agents/gsd-project-researcher.md` | sentinel-match |
17
17
  | gsd-project-researcher | Project-wide research | `## RESEARCH COMPLETE`, `## RESEARCH BLOCKED` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/quick/steps/research-phase.md`, `agents/gsd-phase-researcher.md` | sentinel-match |
18
- | gsd-plan-checker | Plan validation | `## VERIFICATION PASSED`, `## ISSUES FOUND` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md`, `gsd-core/workflows/quick/steps/plan-checker-loop.md`, `gsd-core/workflows/ui-phase.md`, `gsd-core/workflows/verify-work.md`, `agents/gsd-ui-checker.md` | sentinel-match |
18
+ | gsd-plan-checker | Plan validation | `## VERIFICATION PASSED`, `## ISSUES FOUND` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md`, `gsd-core/workflows/quick/steps/plan-checker-loop.md`, `gsd-core/workflows/import.md`, `gsd-core/workflows/ui-phase.md`, `gsd-core/workflows/verify-work.md`, `agents/gsd-ui-checker.md` | sentinel-match |
19
19
  | gsd-research-synthesizer | Multi-research synthesis | `## SYNTHESIS COMPLETE`, `## SYNTHESIS BLOCKED` (unconsumed: blocked-research return — spawners detect failure via the #222 SUMMARY.md-on-disk check, no dispatch branch keys on the marker) | `gsd-core/workflows/new-milestone.md`, `gsd-core/workflows/new-project.md` | sentinel-match |
20
20
  | gsd-debugger | Debug investigation | `## DEBUG COMPLETE`, `## ROOT CAUSE FOUND`, `## CHECKPOINT REACHED`, `## INVESTIGATION INCONCLUSIVE`, `## TDD CHECKPOINT`, `## FIX REJECTED BY GUARDRAIL` | `agents/gsd-debug-session-manager.md`, `gsd-core/workflows/diagnose-issues.md`, `gsd-core/workflows/plan-phase.md`, `agents/gsd-executor.md` | sentinel-match |
21
21
  | gsd-debug-session-manager | Debug checkpoint loop | `## DEBUG SESSION COMPLETE`, `## CONTINUE_REQUIRED` | `gsd-core/workflows/debug.md` | sentinel-match |
@@ -23,7 +23,7 @@ This doc describes what IS, not what should be. Casing inconsistencies are docum
23
23
  | gsd-ui-auditor | UI review | `## UI REVIEW COMPLETE` | `gsd-core/workflows/ui-review.md` | sentinel-match |
24
24
  | gsd-dom-verifier | Live-DOM UAT verification | No marker (writes `{phase}-DOM-VERIFY.md` directly; the frontmatter `outcome` / `reason` scalars carry the verdict, and `could_not_look` is never conflated with `nothing_to_report`) | `{phase}-DOM-VERIFY.md` artifact, written by the `live-dom-uat` capability's `execute:wave:post` step dispatched from `gsd-core/workflows/execute-phase.md` | artifact+query |
25
25
  | gsd-ui-checker | UI validation | `## ISSUES FOUND`, `## UI-SPEC VERIFIED` | `gsd-core/workflows/plan-phase.md`, `gsd-core/workflows/quick/steps/plan-checker-loop.md`, `gsd-core/workflows/ui-phase.md`, `gsd-core/workflows/verify-work.md`, `agents/gsd-plan-checker.md` | sentinel-match |
26
- | gsd-ui-researcher | UI spec creation | `## UI-SPEC COMPLETE`, `## UI-SPEC BLOCKED` | `gsd-core/workflows/ui-phase.md` | sentinel-match |
26
+ | gsd-ui-researcher | UI spec creation | `## UI-SPEC COMPLETE`, `## UI-SPEC BLOCKED`, `## REVISION_CONFLICT` | `gsd-core/workflows/ui-phase.md` | sentinel-match |
27
27
  | gsd-verifier | Post-execution verification | `## Verification Complete` (unconsumed: Marker Rule 2 recorded decision — intentional title-case marker; completion is detected via the artifact route, nothing matches the marker) | `*-VERIFICATION.md` artifact + `gsd_run query verification.status` in `gsd-core/workflows/verify-work.md` | artifact+query |
28
28
  | gsd-integration-checker | Cross-phase integration check | `## Integration Check Complete` (unconsumed: Marker Rule 2 recorded decision — intentional title-case marker; the auditor reads the inline report, nothing matches the marker) | `gsd-core/workflows/audit-milestone.md` reads the agent's inline return text directly (agent has no Write tool -- it cannot write an artifact) | structured-return |
29
29
  | gsd-nyquist-auditor | Sampling audit | `## PARTIAL`, `## ESCALATE`, `## GAPS FILLED` (non-standard) | `gsd-core/workflows/validate-phase.md`, `gsd-core/workflows/secure-phase.md`, `agents/gsd-security-auditor.md` | sentinel-match |
@@ -41,19 +41,23 @@ core finding that the spec layer is the measured weak point:
41
41
 
42
42
  ## Inputs
43
43
 
44
- A list of requirements, each a `{ id, text, shapes? }` record where `text` is a testable
45
- statement and `shapes` is an optional author-supplied override of the data/behavior shape.
46
- The five shapes are: `numeric-range`, `collection`, `text`, `stateful`, `io`. When
47
- `shapes` is absent, a heuristic classifier proposes them from the requirement prose
48
- (propose-then-confirm) — the author may correct the shape.
49
-
50
- **`text` is English, whatever language the SPEC is in.** The heuristic cues are English
51
- word-boundary patterns, so a project running with `response_language` set must pass `text` as a
52
- faithful English translation of the requirement; the SPEC itself keeps the original language and
53
- the `id` is never translated. Prose in another language matches no cue, classifies to zero
54
- shapes, and surfaces as `unclassified` (#1110) — the probe contributes nothing. Where a
55
- requirement carries no cue even in English, author `shapes` explicitly rather than leaning on
56
- the classifier.
44
+ A list of requirements, each a `{ id, text, text_en?, shapes? }` record where `text` is a
45
+ testable statement, `text_en` is an optional English translation of `text`, and `shapes` is an
46
+ optional author-supplied override of the data/behavior shape. The five shapes are:
47
+ `numeric-range`, `collection`, `text`, `stateful`, `io`. When `shapes` is absent, a heuristic
48
+ classifier proposes them from the requirement prose — reading `text_en` in preference to
49
+ `text` when present (`text_en ?? text`) — (propose-then-confirm); the author may correct the
50
+ shape.
51
+
52
+ **The classifier reads English; `text` does not have to be.** The heuristic cues (`SHAPE_CUES`)
53
+ are English word-boundary patterns, so a requirement whose `text` is not English classifies to
54
+ zero shapes unless `text_en` supplies a faithful English translation. A project running with
55
+ `response_language` set should populate `text_en` for every requirement; `text` keeps its own
56
+ meaning — the requirement's own text, in whatever language the SPEC uses — and is never
57
+ translated or overwritten. `text_en` is engine input, not part of the SPEC. `id` is never
58
+ translated. Prose that matches no cue in either field surfaces as `unclassified` (#1110) — the
59
+ probe contributes nothing for that requirement. Where a requirement carries no cue even in
60
+ English, author `shapes` explicitly rather than leaning on the classifier.
57
61
 
58
62
  ## Taxonomy (8 categories)
59
63
 
@@ -1,11 +1,10 @@
1
- # Execute-Phase — MVP+TDD Gate (Runtime Enforcement)
1
+ # Execute-Phase — TDD Gate (Runtime Enforcement)
2
2
 
3
- > Loaded by `execute-phase` workflow and `gsd-executor` agent only when **both** `MVP_MODE=true` AND `TDD_MODE=true` for the phase. Defines the runtime gate that blocks behavior-adding tasks until a failing-test commit exists.
3
+ > Loaded by `execute-phase` workflow and `gsd-executor` agent when `TDD_MODE=true` for the phase (#4011 — the gate no longer requires MVP mode; MVP may imply TDD, but TDD never requires MVP). Defines the runtime gate that blocks behavior-adding tasks until a failing-test commit exists.
4
4
 
5
5
  ## When this gate fires
6
6
 
7
- - `MVP_MODE` is `true` (resolved from CLI flag → ROADMAP `**Mode:**` field → config; see `gsd-core/references/planner-mvp-mode.md`).
8
- - `TDD_MODE` is `true` (resolved from `--tdd` flag → `workflow.tdd_mode` config).
7
+ - `TDD_MODE` is `true` (resolved from `--tdd` flag → `workflow.tdd_mode` config). MVP mode is NOT required (#4011).
9
8
  - The current task being executed has `tdd="true"` in its `<task>` frontmatter (set by the planner per Phase 1).
10
9
  - The task's `<behavior>` block lists at least one expected behavior.
11
10
 
@@ -13,15 +12,18 @@ If any of these is false, the gate is inactive — execution proceeds normally.
13
12
 
14
13
  ## What the gate checks
15
14
 
16
- For each task gated by MVP+TDD, the executor MUST verify (before running the implementation step):
15
+ For each task gated by TDD, the executor MUST verify (before running the implementation step):
17
16
 
18
17
  1. **A failing-test commit exists.** Search git log on the current branch for a commit matching `test({phase}-{plan})` whose subject mentions the same plan as the current task. The commit must touch a test file (`*.test.*`, `*.spec.*`, `tests/**`).
19
- 2. **The test was actually red.** The commit message body or the executor's recent shell history must show the test failed when first run. Acceptable evidence:
20
- - Commit message contains `RED:` prefix or `(RED)` tag
21
- - Recent terminal output shows `FAIL` or non-zero exit on the new test before any implementation commit
18
+ 2. **The test was actually red — INTENTIONALLY (#3770).** A nonzero exit is not RED by itself: syntax errors, zero-test discovery, fixture crashes, parser errors, and unrelated assertions are INVALID_RED. The executor must persist the RED evidence record (command, exit code, failing test, expected result from `<behavior>`, actual result) and verify it:
19
+ ```bash
20
+ gsd_run check tdd-red-evidence <record.json> --raw
21
+ ```
22
+ - `RED_EVIDENCE_OK` (reason `target_test_failed`): the TARGET test named by the plan failed on a real assertion — the ONLY verdict that authorizes GREEN.
23
+ - `INVALID_RED` (reasons `unexpected_green`, `zero_tests_discovered`, `nonzero_exit_without_test_failure`, `fixture_or_load_failure`, `no_target_test_failure`, `invalid_record`, `unreadable_record`): the gate trips — halt, fix the RED phase (test identity, fixture, discovery), and re-verify before any implementation step. A `RED:` prefix or `(RED)` tag in the commit message is NOT sufficient evidence on its own.
22
24
  3. **No implementation commit yet.** No `feat({phase}-{plan})` commit may exist for the same plan ID before the failing-test commit.
23
25
 
24
- If any check fails, the gate trips.
26
+ If any check fails, the gate trips. For check 2, an INVALID_RED verdict (`check tdd-red-evidence`) trips the gate — the executor MUST halt and block the implementation step.
25
27
 
26
28
  ## What "behavior-adding task" means
27
29
 
@@ -40,9 +42,9 @@ The executor MUST:
40
42
  2. Emit a structured halt report:
41
43
 
42
44
  ```
43
- ### MVP+TDD GATE TRIPPED — Plan {plan_id}, Task {task_id}
45
+ ### TDD GATE TRIPPED — Plan {plan_id}, Task {task_id}
44
46
 
45
- Reason: {missing_red_commit | red_commit_not_failing | feat_before_test}
47
+ Reason: {missing_red_commit | red_commit_not_failing | feat_before_test | invalid_red}
46
48
 
47
49
  Behavior expected to be tested:
48
50
  - {first behavior bullet}
@@ -56,24 +58,24 @@ The executor MUST:
56
58
  3. Exit the current execution wave cleanly. Do NOT roll back any prior commits in the same wave.
57
59
  4. Update `STATE.md` with `last_gate_trip: {plan_id}/{task_id}` so the user can resume after writing the test.
58
60
 
59
- ## Escalation: end-of-phase TDD review under MVP+TDD
61
+ ## Escalation: end-of-phase TDD review under TDD
60
62
 
61
63
  The existing end-of-phase TDD review (in `workflows/execute-phase.md`'s `tdd_review_checkpoint` step) is normally **advisory** — it surfaces gate violations but does not block phase completion.
62
64
 
63
- Under MVP+TDD, escalate this to **blocking**:
65
+ Under TDD mode, escalate this to **blocking**:
64
66
  - If any TDD plan is missing a RED or GREEN commit, the executor MUST refuse to mark the phase complete.
65
67
  - The user is shown the same review table, but the verdict line reads:
66
- > "Phase blocked: {N} TDD plan(s) violate the RED→GREEN gate sequence under MVP+TDD. Resolve and re-run /gsd execute-phase, or override with `/gsd execute-phase {phase} --force-mvp-gate` to ship anyway."
68
+ > "Phase blocked: {N} TDD plan(s) violate the RED→GREEN gate sequence under TDD. Resolve and re-run /gsd execute-phase, or override with `/gsd execute-phase {phase} --force-mvp-gate` to ship anyway."
67
69
 
68
70
  The `--force-mvp-gate` flag is documented but not introduced by this plan — it is the escape hatch the spec mentions; if the user later builds it, the workflow already references the contract.
69
71
 
70
72
  ## What this gate does NOT do
71
73
 
72
74
  - It does not enforce REFACTOR commits. REFACTOR remains optional (per `gsd-core/references/tdd.md`).
73
- - It does not check test quality (the test could be trivially passing). That's the planner's job.
75
+ - It does not check test quality (the test could be trivially weak). That's the planner's job. It DOES check that the RED failure was intentional — the target test failing an assertion (#3770).
74
76
  - It does not run tests. The executor only inspects git log + file system. Running tests is the implementation step's job.
75
77
  - It does not gate config-only or doc-only tasks (see "behavior-adding task" definition).
76
78
 
77
79
  ## Compatibility with existing TDD discipline
78
80
 
79
- This gate is additive to `gsd-core/references/tdd.md`. Tasks not under MVP+TDD continue to use the existing advisory TDD discipline (RED/GREEN/REFACTOR commits with end-of-phase review checkpoint). Only the runtime gate and the blocking escalation are new.
81
+ This gate is additive to `gsd-core/references/tdd.md`. Tasks not under TDD mode continue to use the existing advisory TDD discipline (RED/GREEN/REFACTOR commits with end-of-phase review checkpoint). Only the runtime gate and the blocking escalation are new.
@@ -2,6 +2,12 @@
2
2
 
3
3
  **If `response_language` is set:** User-facing orchestrator output (questions, narration, report-template prose) in `{response_language}`; technical terms, code, file paths, and subagent prompts stay in English. Pass `response_language: {value}` into every spawned subagent prompt so any user-facing output they produce stays in the configured language.
4
4
 
5
+ **The `gsd-verifier` subagent has no workflow file of its own (#2529):** the `verify_phase_goal` step reaches it by dispatch, not by reading a workflow, so there is no file in which to place a directive — the dispatch prompt is the only place its coverage can live. That prompt MUST carry this line verbatim, immediately after `Create VERIFICATION.md.`:
6
+
7
+ `Use response_language {response_language} for all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code and paths.`
8
+
9
+ It lives here rather than inline in `workflows/execute-phase.md` for the same reason the rest of this file does — that workflow is held under the frozen byte ceiling named below, and this `@-reference` is eager, so the orchestrator loads this instruction with the workflow either way.
10
+
5
11
  The literal report templates embedded in this workflow (`## Execution Plan`, `## Phase {X}: {Name} Execution Complete`, `## ⚠ Phase {X}: {Name} — Gaps Found`, etc.) are a structural source, not literal output to copy verbatim — render their prose translated into `{response_language}` while keeping headings' structural markers, table columns, IDs, commands, and file paths unchanged.
6
12
 
7
13
  This directive was extracted from `workflows/execute-phase.md` to keep that file under the frozen pre-phase-6 byte ceiling (ADR-857 Phase 6 capstone, `tests/claude-orchestration.test.cjs`). The `@-reference` is eager, so the runtime still loads this content alongside the workflow — the extraction is purely a file-size discipline, not a lazy-load optimization.
@@ -69,6 +69,48 @@
69
69
  - MAYBE → Rule 4 (ask the user)
70
70
  - NO → Out of scope (log to deferred-items.md)
71
71
 
72
+ ### Writing `deferred-items.md`
73
+
74
+ The file has no template — write it by hand, as a Markdown list under a
75
+ `## Deferred Items` heading. What counts as one entry:
76
+
77
+ - One entry per top-level list item. `-`, `*` and `+` all count, and so does a
78
+ dot-terminated ordered marker (`1.`) when the list starts at `0.` or `1.`, or
79
+ continues a list already open at that level — a sentence that merely opens
80
+ with a number (`2026. was a bad year`) is prose, not an item, and so is a
81
+ list numbered from `2.` upward until its first `0.`/`1.` line. `1)` is not a
82
+ marker here, and neither is an ordinal past nine digits (`999999999.`
83
+ counts, `1234567890.` does not).
84
+ - Continuation lines indent beneath their entry. Fields go on those lines:
85
+ `status: resolved`, or the bolded `**Status:** resolved` convention. **The
86
+ BARE key is lower-case only** — write `Status: resolved` without the bold and
87
+ the field is not read, so the entry stays open with no warning. Bold it or
88
+ lower-case it. The bolded form matches the key case-insensitively, and the
89
+ VALUE is case-insensitive in both forms.
90
+ - A `* * *` or `- - -` separator closes the list rather than opening an entry,
91
+ and nothing inside a fenced code block is an entry or a field — at any indent,
92
+ including one deeper than CommonMark's three-space cap, which is what a fence
93
+ written under a nested bullet looks like. A fence that is never closed runs to
94
+ the end of its own entry and no further, so an unclosed delimiter cannot hide
95
+ the entries after it — a closed pair of delimiters is a fence, whatever sits
96
+ between them.
97
+
98
+ An entry is RESOLVED only if it carries an explicit `status: resolved`. Anything
99
+ else — including an entry with no `status:` at all — stays open and will surface
100
+ in `audit-open`, `audit-uat` and `complete-milestone`. That is deliberate: the
101
+ scanner never silently drops a possibly-open item. What it reads as something
102
+ other than an item is the short list above — a fenced line, a separator, and an
103
+ ordered list numbered from `2.` upward at a paragraph position — and nothing
104
+ else.
105
+
106
+ ```markdown
107
+ ## Deferred Items
108
+
109
+ - Retry budget is hardcoded at 3
110
+ status: open
111
+ **What:** `fetchWithRetry` ignores the configured budget.
112
+ ```
113
+
72
114
  ## Checkpoint Examples
73
115
 
74
116
  ### Good checkpoint placement
@@ -17,13 +17,13 @@ last_calibrated: 2026-03-24
17
17
  > ```yaml
18
18
  > issues:
19
19
  > - dimension: task_completeness
20
- > severity: BLOCKER
21
- > finding: "Task T1 action says 'implement the authentication feature' without naming target files, functions to create, or middleware to apply. Executor cannot determine what to build."
22
- > affected_field: "<action>"
23
- > suggested_fix: "Specify: create authMiddleware in src/middleware/auth.js, apply to routes in src/routes/api.js lines 12-45, verify with integration test"
20
+ > severity: blocker
21
+ > required_property: "Every task action names its target files, and any functions it creates"
22
+ > description: "Task T1 action says 'implement the authentication feature' without naming target files, functions to create, or middleware to apply. Executor cannot determine what to build."
23
+ > fix_hint: "Specify: create authMiddleware in src/middleware/auth.js, apply to routes in src/routes/api.js lines 12-45, verify with integration test"
24
24
  > ```
25
25
 
26
- **Why this is good:** The checker cited the specific dimension (task_completeness), quoted the problematic text, explained why it is a blocker (executor cannot determine what to build), and gave a concrete fix with file paths and function names. The finding is actionable -- the planner knows exactly what to add.
26
+ **Why this is good:** The checker stated the invariant that failed (`required_property`), cited the specific dimension (task_completeness), quoted the problematic text as evidence, explained why it is a blocker (executor cannot determine what to build), and gave a concrete example route with file paths and function names. The finding is actionable -- and because the binding payload is the property rather than the example, the planner may satisfy it a different way.
27
27
 
28
28
  ### Example 2: BLOCKER for same-wave file conflict between two plans
29
29
 
@@ -34,13 +34,13 @@ last_calibrated: 2026-03-24
34
34
  > ```yaml
35
35
  > issues:
36
36
  > - dimension: dependency_correctness
37
- > severity: BLOCKER
38
- > finding: "Plans 01 and 02 both modify gsd-core/workflows/execute-phase.md in wave 1 with no depends_on relationship. Concurrent execution will cause merge conflicts or lost changes."
39
- > affected_field: "files_modified"
40
- > suggested_fix: "Either move Plan 02 to wave 2 with depends_on: ['01'] or consolidate the file changes into a single plan"
37
+ > severity: blocker
38
+ > required_property: "Same-wave plans never modify the same file without a declared dependency"
39
+ > description: "Plans 01 and 02 both modify gsd-core/workflows/execute-phase.md in wave 1 with no depends_on relationship. Concurrent execution will cause merge conflicts or lost changes."
40
+ > fix_hint: "Either move Plan 02 to wave 2 with depends_on: ['01'] or consolidate the file changes into a single plan"
41
41
  > ```
42
42
 
43
- **Why this is good:** The checker identified a real structural problem -- two plans modifying the same file in the same wave without a dependency relationship. It cited dependency_correctness, named both plans, the conflicting file, and provided two alternative fixes.
43
+ **Why this is good:** The checker identified a real structural problem -- two plans modifying the same file in the same wave without a dependency relationship. It stated the property that must hold, cited dependency_correctness, named both plans and the conflicting file, and offered two example routes -- neither of which binds, since either makes the property true.
44
44
 
45
45
  ## Negative Examples
46
46
 
@@ -64,10 +64,10 @@ last_calibrated: 2026-03-24
64
64
  > ```yaml
65
65
  > issues:
66
66
  > - dimension: scope_sanity
67
- > severity: INFO
68
- > finding: "Plan has 3 tasks -- consider splitting into smaller plans for faster iteration"
69
- > affected_field: "task count"
70
- > suggested_fix: "Split tasks into separate plans"
67
+ > severity: info
68
+ > required_property: "Each plan stays within the per-plan context budget"
69
+ > description: "Plan has 3 tasks -- consider splitting into smaller plans for faster iteration"
70
+ > fix_hint: "Split tasks into separate plans"
71
71
  > ```
72
72
 
73
- **Why this is bad:** The checker flagged a non-issue. scope_sanity allows 2-3 tasks per plan -- 3 tasks is within limits. The checker applied a personal preference ("smaller is better") rather than the documented threshold. This wastes planner time on false positives and erodes trust in the checker's judgment. A correct check would produce no issue for this plan.
73
+ **Why this is bad:** The checker flagged a non-issue. The `required_property` it states is already satisfied, which is the tell: scope_sanity allows 2-3 tasks per plan -- 3 tasks is within limits. The checker applied a personal preference ("smaller is better") rather than the documented threshold. This wastes planner time on false positives and erodes trust in the checker's judgment. A correct check would produce no issue for this plan.
@@ -12,7 +12,7 @@ Canonical domain terms for the concepts named below live in [CONTEXT.md](../../C
12
12
  | `gsd-core/references/skeleton-template.md` | **Template.** Shape of `SKELETON.md` for new-project Phase 1 under `--mvp`. | `gsd-planner` agent when the Walking Skeleton gate fires |
13
13
  | `gsd-core/references/user-story-template.md` | **Template.** Format and slot definitions for `As a / I want to / So that`. | `gsd-mvp-phase` workflow during interactive prompting; `gsd-planner` when emitting the `## Phase Goal` header |
14
14
  | `gsd-core/references/spidr-splitting.md` | **Splitting discipline.** Five-axis decomposition (Spike, Paths, Interfaces, Data, Rules) for stories too large for one phase. | `gsd-mvp-phase` workflow when the user story exceeds size threshold |
15
- | `gsd-core/references/execute-mvp-tdd.md` | **Gate.** MVP+TDD runtime gate semantics: when it fires, what it checks, halt-and-report protocol, end-of-phase blocking escalation, Behavior-Adding Task definition. | `gsd-executor` agent when `MVP_MODE=true && TDD_MODE=true` |
15
+ | `gsd-core/references/execute-mvp-tdd.md` | **Gate.** TDD runtime gate semantics: when it fires, what it checks, halt-and-report protocol, end-of-phase blocking escalation, Behavior-Adding Task definition. | `gsd-executor` agent when `TDD_MODE=true` (#4011) |
16
16
  | `gsd-core/references/verify-mvp-mode.md` | **UAT framing.** Three-section UAT structure (user-flow → technical → coverage), anti-patterns, `User Flow Coverage` section in VERIFICATION.md. | `gsd-verifier` agent when the phase under verification has `mode: mvp` |
17
17
 
18
18
  ## Concept-to-file map
@@ -33,7 +33,7 @@ If you're looking for the canonical statement of a concept, this is where to fin
33
33
 
34
34
  - **`--mvp` and `--prd <file>` together on Phase 1.** Both paths converge at the planner spawn. The PRD express path creates `CONTEXT.md` from the PRD file and continues to the research step; the Walking Skeleton gate fires independently when Phase 1 + new project + `--mvp`. The planner therefore receives both `WALKING_SKELETON=true` and PRD-derived context. This is intentional: the PRD informs what the skeleton should prove.
35
35
  - **`MVP_MODE` is all-or-nothing per phase, not per task.** A phase is either MVP-mode or standard. Mixed-mode phases are not supported (PRD #2826 Q1).
36
- - **`TDD_MODE` is independent of `MVP_MODE`.** TDD can be on without MVP, MVP can be on without TDD. Only the *intersection* (both true) activates the MVP+TDD Gate.
36
+ - **`TDD_MODE` is independent of `MVP_MODE`.** TDD can be on without MVP, MVP can be on without TDD. The TDD runtime gate activates on `TDD_MODE` alone (#4011); MVP mode remains free to imply TDD without being required by it.
37
37
  - **The `gsd-roadmapper` agent makes the MVP/standard decision once at project init** based on `PROJECT_MODE`. Per-phase opt-in/out happens later via `/gsd:mvp-phase` or `/gsd-edit-phase`.
38
38
 
39
39
  ## Tests
@@ -0,0 +1,41 @@
1
+ # Plan-Checker Examples
2
+
3
+ > Progressive-disclosure reference for `agents/gsd-plan-checker.md`. The checker
4
+ > inlines this file from its `<examples>` block via `@`; the calibrated few-shot
5
+ > set lives separately in `gsd-core/references/few-shot-examples/plan-checker.md`.
6
+
7
+ ## Scope Exceeded (most common miss)
8
+
9
+ **Plan 01 analysis:**
10
+ ```
11
+ Tasks: 5
12
+ Files modified: 12
13
+ - prisma/schema.prisma
14
+ - src/app/api/auth/login/route.ts
15
+ - src/app/api/auth/logout/route.ts
16
+ - src/app/api/auth/refresh/route.ts
17
+ - src/middleware.ts
18
+ - src/lib/auth.ts
19
+ - src/lib/jwt.ts
20
+ - src/components/LoginForm.tsx
21
+ - src/components/LogoutButton.tsx
22
+ - src/app/login/page.tsx
23
+ - src/app/dashboard/page.tsx
24
+ - src/types/auth.ts
25
+ ```
26
+
27
+ 5 tasks exceeds 2-3 target, 12 files is high, auth is complex domain → quality degradation risk.
28
+
29
+ ```yaml
30
+ issue:
31
+ dimension: scope_sanity
32
+ severity: blocker
33
+ required_property: "Each plan stays within the per-plan context budget"
34
+ description: "Plan 01 has 5 tasks with 12 files - exceeds context budget"
35
+ plan: "01"
36
+ metrics:
37
+ tasks: 5
38
+ files: 12
39
+ estimated_context: "~80%"
40
+ fix_hint: "Split into: 01 (schema + API), 02 (middleware + lib), 03 (UI components)"
41
+ ```
@@ -228,3 +228,28 @@ test -f src/i18n/en.json && test -f src/i18n/de.json || { echo "missing input fi
228
228
  ```
229
229
 
230
230
  **When `|| echo "default"` is acceptable:** only when absence is semantically the default AND the result is NOT used in a comparison that should detect absence.
231
+
232
+ ## External Review Before PR Open (#4107)
233
+
234
+ Apply this ordering only when opening the PR is known to trigger automatic external review and the plan also has internal review lanes.
235
+
236
+ **Bad:**
237
+
238
+ ```text
239
+ Wave 1: Open PR; automatic external review starts
240
+ Wave 2: Run internal review
241
+ Wave 3: Apply accepted fixes
242
+ ```
243
+
244
+ The external reviewer spends its first pass on a diff the plan already expects to change.
245
+
246
+ **Good:**
247
+
248
+ ```text
249
+ Wave 1: Run internal review
250
+ Wave 2: Apply accepted fixes
251
+ Wave 3: If applicable, re-check the open-time property; then immediately open PR
252
+ Wave 4+: Run post-open CI, external review, and tracking work
253
+ ```
254
+
255
+ Nothing may intervene between an applicable re-check and the open. Post-open work may follow; "immediately" constrains only that gap. Opening-time properties do not justify an early PR.
@@ -23,7 +23,11 @@ Return:
23
23
  | {padded_phase}-02 | [brief objective] | 1 | none | REQ-003 |
24
24
  ```
25
25
 
26
- The orchestrator reads this table, then spawns one single-plan Task per row.
26
+ The orchestrator reads this table, groups rows by `Wave` (ascending, blank treated as `1`), then
27
+ spawns one single-plan Task per row — one Wave at a time, serially across Waves. Within a Wave,
28
+ Tasks are spawned one at a time by default, or together (`run_in_background=true` on each, issued
29
+ in one message) when `planning.chunked_parallel: true` and the host's negotiated dispatch capacity
30
+ supports it (#3777; see `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md` §8.5.2).
27
31
 
28
32
  ### single-plan
29
33
 
@@ -0,0 +1,42 @@
1
+ # Planner Coupling — Same-Wave Shared Mutable State
2
+
3
+ > Progressive-disclosure reference for `agents/gsd-planner.md`. The planner agent
4
+ > reads this file when assigning waves (issue #3724). The slim pointer in
5
+ > `agents/gsd-planner.md` → `assign_waves` routes here; the canonical schema row
6
+ > for `coupling_justified` lives in `docs/reference/plan-md.md`. The verifying
7
+ > side is `agents/gsd-plan-checker.md` Dimension 3b (#1954).
8
+
9
+ ## The rule
10
+
11
+ `files_modified`/`files_deleted` overlap is not the only coupling between
12
+ same-wave plans. If two plans in the same wave touch the same **mutable
13
+ resource** through their task actions — a config key, DB table/row, migration,
14
+ env var, singleton, cache — with at least one writer, or one plan produces a
15
+ prerequisite the other consumes, the pair is coupled through shared state even
16
+ though no file overlaps: under parallel execution the outcome depends on which
17
+ executor gets there first.
18
+
19
+ Resolve it one of three ways, in order of preference:
20
+
21
+ 1. **Declare the edge** — add the producing plan to the consumer's
22
+ `depends_on`. Wave assignment then orders them automatically.
23
+ 2. **Re-wave** — move one plan to a later wave when the dependency direction
24
+ is unclear but an ordering is still wanted.
25
+ 3. **Justify the pair** — when the coupling is deliberate and genuinely
26
+ order-independent (both orders produce a correct result), record it in
27
+ either plan's frontmatter, one `"plan-id: reason"` entry per coupled peer:
28
+
29
+ ```yaml
30
+ coupling_justified: ["03-02: both plans append independent keys to config; order irrelevant"]
31
+ ```
32
+
33
+ The plan-checker's Dimension 3b recognizes the declaration and does not
34
+ flag the pair, so a deliberately coupled plan set passes verification
35
+ without serializing waves it was designed to run in parallel.
36
+
37
+ ## Why declare it up front
38
+
39
+ Dimension 3b flags same-wave plan pairs with an undeclared shared-mutable-state
40
+ dependency (advisory severity — it never blocks). Declaring the edge, re-waving,
41
+ or justifying the pair at plan time means the first checker pass comes back
42
+ clean instead of surfacing an advisory the planner then has to interpret.
@@ -0,0 +1,71 @@
1
+ # Quick-Batch Mode — Planner Reference
2
+
3
+ Triggered when `<planning_context>` declares `**Mode:** quick-batch`
4
+ (#3676, epic #3344, ADR-1239 "Quick-batch binding"). One dispatch = one
5
+ item's plan — the SAME single-plan, 1-3-task scope as `/gsd:quick`'s own
6
+ `quick`/`quick-full` modes, with one fixed difference: **`depends_on` and
7
+ `files_modified` frontmatter are ALWAYS required, regardless of whether
8
+ `--validate` was requested.** This reuses the EXISTING frontmatter grammar
9
+ (the same keys full phase planning already emits — see the frontmatter
10
+ schema table above); it is not a new schema.
11
+
12
+ **Why always, not gated on `--validate`.** The coordinating workflow
13
+ (`gsd-core/workflows/quick-batch.md`) recomputes every item's execution wave
14
+ from these two fields after each DAG layer's planners return (`quick-batch
15
+ update`, wrapping `updateBatchItems`) — without them, every item stays in
16
+ wave 0 forever and the batch cannot parallelize independent items or
17
+ sequence dependent ones correctly. This is load-bearing dispatch input, not
18
+ an optional quality signal.
19
+
20
+ ### `depends_on` — reference SIBLING items by `quick_id`, never invent one
21
+
22
+ The `<planning_context>` you receive includes a **full batch task catalog** —
23
+ every item's `quick_id` + description, not just your own. When your item's
24
+ implementation genuinely requires another item's item to land first (shared
25
+ file, prerequisite API, sequencing the user implied), declare it:
26
+
27
+ ```yaml
28
+ depends_on: ["260101-abc"] # a quick_id from the task catalog
29
+ ```
30
+
31
+ - Reference ONLY `quick_id`s from the task catalog you were given. Never
32
+ reference a plan id from a phase, another batch, or a value you invented.
33
+ - Empty array (`depends_on: []`) is the correct, common answer when your item
34
+ is genuinely independent — do not manufacture a dependency to seem
35
+ thorough.
36
+ - A dependency on your OWN `quick_id` (self-reference) or on an id outside
37
+ the catalog is rejected by `quick-batch update` and blocks the whole
38
+ layer's persistence — when uncertain, prefer `[]` over a guess.
39
+
40
+ ### `files_modified` — every path your plan's tasks will touch
41
+
42
+ ```yaml
43
+ files_modified: ["src/foo.ts", "tests/foo.test.ts"]
44
+ ```
45
+
46
+ Used two ways downstream, both from THIS field (never re-derived from your
47
+ plan's prose): (1) `partitionByFileOverlap` splits same-wave items that
48
+ would touch the same file into separate waves, so two isolated worktrees
49
+ never race on one path; (2) at merge time the coordinator reads it FRESH from
50
+ your PLAN.md (not from what you declared here at planning time — keep the
51
+ frontmatter accurate if you revise the plan) for the advisory scope-
52
+ conformance check.
53
+
54
+ ### `files_deleted` — only if your plan removes a file
55
+
56
+ ```yaml
57
+ files_deleted: ["legacy/old-module.ts"]
58
+ ```
59
+
60
+ Optional; omit entirely when your plan deletes nothing. If your plan DOES
61
+ delete a file and you omit this, the merge's deletions guard blocks that
62
+ deletion as undeclared — there is no "authorize everything" fallback.
63
+
64
+ ### What quick-batch mode does NOT need
65
+
66
+ Same exclusions as `/gsd:quick`'s own modes: no `requirements` (no ROADMAP
67
+ linkage — a quick-batch item is not a phase), no `estimate` block, no
68
+ `user_setup` unless genuinely needed. `must_haves` is required only when the
69
+ calling prompt's own `<constraints>` says so (mirrors `--validate`'s
70
+ existing quick-full behavior) — that instruction rides the prompt, not this
71
+ reference.
@@ -40,3 +40,50 @@ Use standard PLANNING COMPLETE return format, adding a reviews section:
40
40
  |---------|--------|
41
41
  | {concern} | {why — out of scope, disagree, etc.} |
42
42
  ```
43
+
44
+ ### Step 5: Write the ledger into PLAN.md (#3806)
45
+
46
+ The two tables above are not only the planner's return payload — they are also the **canonical
47
+ Review Dispositions Ledger**, and they belong in the affected PLAN.md itself, in this exact shape.
48
+ `gsd-core/workflows/plan-phase.md` (`<review_incorporation_contract>`) and
49
+ `agents/gsd-plan-checker.md` (Review Incorporation dimension) both point back to this section for
50
+ the ledger's shape rather than restating it — this is the one place it is defined.
51
+
52
+ ## Review Dispositions Ledger
53
+
54
+ Add or extend a `## Review Dispositions Ledger` section in the affected PLAN.md, containing one
55
+ `### Round {N} — {REVIEWS_sha}` subsection per reviews-mode round that touched this plan, where
56
+ `{REVIEWS_sha}` is the commit that wrote the REVIEWS.md snapshot being ruled on (the short sha from
57
+ `git log -1 --format=%h -- <phase_dir>/<NN>-REVIEWS.md`, after `workflows/review.md`'s REVIEWS.md
58
+ commit step). Under each round heading, use the two tables from Step 4 above, unchanged in shape:
59
+
60
+ ```markdown
61
+ ## Review Dispositions Ledger
62
+
63
+ ### Round 1 — a1b2c3d
64
+
65
+ ### Review Feedback Addressed
66
+ | Concern | Severity | How Addressed |
67
+ |---------|----------|---------------|
68
+ | {concern} | HIGH | Plan {N}, Task {M}: {how} |
69
+
70
+ ### Review Feedback Deferred
71
+ | Concern | Reason |
72
+ |---------|--------|
73
+ | {concern} | {why — out of scope, disagree, etc.} |
74
+ ```
75
+
76
+ **Anchoring.** Any reference to a specific REVIEWS.md line cites `L##@{REVIEWS_sha}` (e.g.
77
+ `L32@a1b2c3d`) — a bare line number is meaningless once the next round rewrites REVIEWS.md
78
+ wholesale. `{Concern}` and `{Reason}` stay free text; do not invent a reviewer/severity enum — the
79
+ reviewer roster is capability-owned and open to third-party additions (see each capability's
80
+ `reviewer.reviewsSection`).
81
+
82
+ **Append-only.** A later round never edits or deletes a prior round's tables. To overturn a prior
83
+ round's verdict, add a new row in the current round's table whose Reason/How Addressed names the
84
+ round and concern it supersedes (e.g. "Supersedes Round 1 Deferred: {concern} — now addressed in
85
+ Plan 3").
86
+
87
+ **Out of scope for this contract.** A deterministic lint/check verb that mechanically enforces this
88
+ shape is a separate, later addition (#3806 part 2) — this section defines the format only. Legacy
89
+ PLAN.md content written before this convention existed is not migrated or flagged by it.