@opengsd/gsd-core 1.11.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 (498) 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-code-fixer.md +1 -1
  5. package/agents/gsd-debug-session-manager.md +1 -1
  6. package/agents/gsd-debugger.md +1 -1
  7. package/agents/gsd-dom-verifier.md +169 -0
  8. package/agents/gsd-eval-auditor.md +1 -1
  9. package/agents/gsd-executor.md +78 -42
  10. package/agents/gsd-framework-selector.md +1 -3
  11. package/agents/gsd-intel-updater.md +1 -1
  12. package/agents/gsd-mempalace-curator.md +0 -1
  13. package/agents/gsd-pattern-mapper.md +11 -0
  14. package/agents/gsd-phase-researcher.md +3 -1
  15. package/agents/gsd-plan-checker.md +91 -112
  16. package/agents/gsd-planner.md +20 -4
  17. package/agents/gsd-project-researcher.md +1 -1
  18. package/agents/gsd-research-synthesizer.md +2 -2
  19. package/agents/gsd-roadmapper.md +15 -11
  20. package/agents/gsd-ui-checker.md +82 -7
  21. package/agents/gsd-ui-researcher.md +70 -3
  22. package/agents/gsd-verifier.md +24 -2
  23. package/bin/install.js +847 -200
  24. package/commands/gsd/discuss-phase.md +1 -1
  25. package/commands/gsd/execute-phase.md +1 -1
  26. package/commands/gsd/import.md +1 -1
  27. package/commands/gsd/ns-workflow.md +2 -1
  28. package/commands/gsd/phase.md +1 -1
  29. package/commands/gsd/quick-batch.md +105 -0
  30. package/commands/gsd/quick.md +8 -4
  31. package/commands/gsd/surface.md +18 -8
  32. package/gsd-core/bin/gsd-tools.cjs +761 -100
  33. package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
  34. package/gsd-core/bin/lib/adr-parser.cjs +13 -7
  35. package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
  36. package/gsd-core/bin/lib/api-coverage.cjs +30 -9
  37. package/gsd-core/bin/lib/artifacts.cjs +2 -0
  38. package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
  39. package/gsd-core/bin/lib/audit.cjs +163 -41
  40. package/gsd-core/bin/lib/broken-windows.cjs +306 -28
  41. package/gsd-core/bin/lib/capability-activation.cjs +27 -0
  42. package/gsd-core/bin/lib/capability-lock.cjs +10 -4
  43. package/gsd-core/bin/lib/capability-registry.cjs +785 -144
  44. package/gsd-core/bin/lib/capability-state.cjs +25 -4
  45. package/gsd-core/bin/lib/capability-validator.cjs +321 -18
  46. package/gsd-core/bin/lib/capability-writer.cjs +14 -4
  47. package/gsd-core/bin/lib/check-command-router.cjs +229 -6
  48. package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
  49. package/gsd-core/bin/lib/cli-exit.cjs +496 -10
  50. package/gsd-core/bin/lib/clusters.cjs +1 -0
  51. package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
  52. package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
  53. package/gsd-core/bin/lib/command-aliases.cjs +16 -0
  54. package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
  55. package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
  56. package/gsd-core/bin/lib/commands.cjs +877 -54
  57. package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
  58. package/gsd-core/bin/lib/config-loader.cjs +121 -29
  59. package/gsd-core/bin/lib/config.cjs +92 -2
  60. package/gsd-core/bin/lib/configuration.cjs +129 -37
  61. package/gsd-core/bin/lib/core-utils.cjs +118 -14
  62. package/gsd-core/bin/lib/decisions.cjs +213 -1
  63. package/gsd-core/bin/lib/edge-probe.cjs +23 -2
  64. package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
  65. package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
  66. package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
  67. package/gsd-core/bin/lib/frontmatter.cjs +975 -326
  68. package/gsd-core/bin/lib/gap-checker.cjs +41 -8
  69. package/gsd-core/bin/lib/git-base-branch.cjs +182 -39
  70. package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
  71. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
  72. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +60 -14
  73. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
  74. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
  75. package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
  76. package/gsd-core/bin/lib/host-integration.cjs +96 -11
  77. package/gsd-core/bin/lib/init-command-router.cjs +132 -21
  78. package/gsd-core/bin/lib/init.cjs +252 -56
  79. package/gsd-core/bin/lib/install-engine.cjs +252 -15
  80. package/gsd-core/bin/lib/install-model-override-resolver.cjs +78 -1
  81. package/gsd-core/bin/lib/install-profiles.cjs +100 -18
  82. package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
  83. package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
  84. package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
  85. package/gsd-core/bin/lib/intel.cjs +101 -26
  86. package/gsd-core/bin/lib/io.cjs +195 -15
  87. package/gsd-core/bin/lib/learnings.cjs +85 -14
  88. package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
  89. package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
  90. package/gsd-core/bin/lib/markdown-table.cjs +175 -4
  91. package/gsd-core/bin/lib/milestone.cjs +112 -7
  92. package/gsd-core/bin/lib/model-catalog.cjs +177 -19
  93. package/gsd-core/bin/lib/model-resolver.cjs +10 -28
  94. package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
  95. package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
  96. package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
  97. package/gsd-core/bin/lib/phase-id.cjs +321 -13
  98. package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
  99. package/gsd-core/bin/lib/phase-locator.cjs +138 -17
  100. package/gsd-core/bin/lib/phase.cjs +1175 -115
  101. package/gsd-core/bin/lib/plan-document.cjs +273 -0
  102. package/gsd-core/bin/lib/plan-scan.cjs +13 -2
  103. package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
  104. package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
  105. package/gsd-core/bin/lib/planning-snapshot.cjs +165 -34
  106. package/gsd-core/bin/lib/planning-workspace.cjs +159 -28
  107. package/gsd-core/bin/lib/probe-core.cjs +4 -1
  108. package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
  109. package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
  110. package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
  111. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
  112. package/gsd-core/bin/lib/quick-batch.cjs +840 -0
  113. package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
  114. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
  115. package/gsd-core/bin/lib/review-lane-descriptor.cjs +62 -14
  116. package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
  117. package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
  118. package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
  119. package/gsd-core/bin/lib/roadmap-parser.cjs +577 -41
  120. package/gsd-core/bin/lib/roadmap.cjs +248 -64
  121. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +329 -41
  122. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
  123. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +320 -109
  124. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +487 -83
  125. package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
  126. package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
  127. package/gsd-core/bin/lib/shell-command-projection.cjs +75 -8
  128. package/gsd-core/bin/lib/smart-entry.cjs +19 -31
  129. package/gsd-core/bin/lib/spec-section.cjs +12 -7
  130. package/gsd-core/bin/lib/state-command-router.cjs +47 -18
  131. package/gsd-core/bin/lib/state-contract.cjs +359 -0
  132. package/gsd-core/bin/lib/state-document.cjs +216 -5
  133. package/gsd-core/bin/lib/state-md-schema.cjs +231 -0
  134. package/gsd-core/bin/lib/state-transition.cjs +850 -145
  135. package/gsd-core/bin/lib/state.cjs +1629 -287
  136. package/gsd-core/bin/lib/surface.cjs +33 -10
  137. package/gsd-core/bin/lib/task-command-router.cjs +111 -1
  138. package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
  139. package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
  140. package/gsd-core/bin/lib/teams-status.cjs +4 -1
  141. package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
  142. package/gsd-core/bin/lib/uat.cjs +2542 -387
  143. package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
  144. package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
  145. package/gsd-core/bin/lib/unusable-input.cjs +13 -0
  146. package/gsd-core/bin/lib/update-context.cjs +6 -2
  147. package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
  148. package/gsd-core/bin/lib/validate.cjs +230 -12
  149. package/gsd-core/bin/lib/vendor/README.md +43 -5
  150. package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
  151. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  152. package/gsd-core/bin/lib/verification.cjs +287 -13
  153. package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
  154. package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
  155. package/gsd-core/bin/lib/verify.cjs +441 -56
  156. package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
  157. package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
  158. package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
  159. package/gsd-core/bin/lib/worktree-safety.cjs +185 -21
  160. package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
  161. package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
  162. package/gsd-core/bin/shared/exit-codes.json +8 -0
  163. package/gsd-core/bin/shared/exit-codes.sh +20 -0
  164. package/gsd-core/bin/shared/model-catalog.json +8 -1
  165. package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
  166. package/gsd-core/references/agent-contracts.md +6 -5
  167. package/gsd-core/references/api-coverage.md +24 -2
  168. package/gsd-core/references/autonomous-smart-discuss.md +3 -3
  169. package/gsd-core/references/checkpoints.md +37 -19
  170. package/gsd-core/references/decimal-phase-calculation.md +5 -5
  171. package/gsd-core/references/edge-probe.md +17 -5
  172. package/gsd-core/references/execute-mvp-tdd.md +18 -18
  173. package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
  174. package/gsd-core/references/execute-phase-response-language.md +6 -0
  175. package/gsd-core/references/execute-phase-wave-guard.md +11 -9
  176. package/gsd-core/references/executor-examples.md +42 -0
  177. package/gsd-core/references/failing-direction.md +78 -0
  178. package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
  179. package/gsd-core/references/gate-prompts.md +1 -1
  180. package/gsd-core/references/git-integration.md +5 -5
  181. package/gsd-core/references/git-planning-commit.md +3 -3
  182. package/gsd-core/references/gsd-run-resolver.md +1 -1
  183. package/gsd-core/references/loop-hook-dispatch.md +22 -0
  184. package/gsd-core/references/model-profiles.md +1 -1
  185. package/gsd-core/references/mvp-concepts.md +2 -2
  186. package/gsd-core/references/nyquist-compliance.md +74 -0
  187. package/gsd-core/references/offer-next.md +3 -5
  188. package/gsd-core/references/phase-argument-parsing.md +3 -3
  189. package/gsd-core/references/plan-checker-examples.md +41 -0
  190. package/gsd-core/references/planner-antipatterns.md +25 -0
  191. package/gsd-core/references/planner-chunked.md +5 -1
  192. package/gsd-core/references/planner-coupling.md +42 -0
  193. package/gsd-core/references/planner-failing-direction.md +53 -0
  194. package/gsd-core/references/planner-human-verify-mode.md +15 -1
  195. package/gsd-core/references/planner-quick-batch.md +71 -0
  196. package/gsd-core/references/planner-reviews.md +47 -0
  197. package/gsd-core/references/planner-revision.md +76 -3
  198. package/gsd-core/references/planner-verify-command-grounding.md +17 -0
  199. package/gsd-core/references/planning-config.md +39 -9
  200. package/gsd-core/references/response-language-directive.md +9 -0
  201. package/gsd-core/references/reviewer-instances.md +31 -0
  202. package/gsd-core/references/revision-loop.md +118 -11
  203. package/gsd-core/references/runtime-aware-dispatch.md +1 -1
  204. package/gsd-core/references/tdd.md +15 -12
  205. package/gsd-core/references/ui-brand.md +65 -21
  206. package/gsd-core/references/ui-consideration-probe.md +1 -1
  207. package/gsd-core/references/universal-anti-patterns.md +2 -2
  208. package/gsd-core/references/verifier-evidence-gate.md +160 -0
  209. package/gsd-core/references/verify-command-path-resolvability.md +42 -0
  210. package/gsd-core/references/verify-mvp-mode.md +1 -1
  211. package/gsd-core/references/workstream-flag.md +11 -11
  212. package/gsd-core/templates/README.md +1 -1
  213. package/gsd-core/templates/SECURITY.md +3 -3
  214. package/gsd-core/templates/UI-SPEC.md +25 -3
  215. package/gsd-core/templates/VALIDATION.md +3 -3
  216. package/gsd-core/templates/phase-prompt.md +7 -0
  217. package/gsd-core/templates/state.md +7 -0
  218. package/gsd-core/templates/verification-report.md +5 -0
  219. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  220. package/gsd-core/workflows/add-backlog.md +3 -1
  221. package/gsd-core/workflows/add-phase.md +5 -3
  222. package/gsd-core/workflows/add-tests.md +4 -9
  223. package/gsd-core/workflows/add-todo.md +2 -2
  224. package/gsd-core/workflows/ai-integration-phase.md +5 -10
  225. package/gsd-core/workflows/analyze-dependencies.md +2 -0
  226. package/gsd-core/workflows/audit-fix.md +14 -3
  227. package/gsd-core/workflows/audit-milestone.md +11 -9
  228. package/gsd-core/workflows/audit-uat.md +19 -2
  229. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
  230. package/gsd-core/workflows/autonomous.md +12 -26
  231. package/gsd-core/workflows/check-todos.md +2 -2
  232. package/gsd-core/workflows/cleanup.md +3 -3
  233. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +16 -14
  234. package/gsd-core/workflows/code-review-fix.md +3 -1
  235. package/gsd-core/workflows/code-review.md +192 -69
  236. package/gsd-core/workflows/complete-milestone.md +28 -14
  237. package/gsd-core/workflows/debug.md +6 -4
  238. package/gsd-core/workflows/diagnose-issues.md +17 -7
  239. package/gsd-core/workflows/discuss-phase/modes/advisor.md +3 -1
  240. package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
  241. package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
  242. package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
  243. package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
  244. package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -7
  245. package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
  246. package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
  247. package/gsd-core/workflows/discuss-phase/modes/text.md +3 -1
  248. package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
  249. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
  250. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
  251. package/gsd-core/workflows/discuss-phase-assumptions.md +3 -3
  252. package/gsd-core/workflows/discuss-phase-power.md +2 -0
  253. package/gsd-core/workflows/discuss-phase.md +2 -2
  254. package/gsd-core/workflows/do.md +46 -19
  255. package/gsd-core/workflows/docs-update.md +6 -5
  256. package/gsd-core/workflows/edit-phase.md +3 -1
  257. package/gsd-core/workflows/eval-review.md +5 -10
  258. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -1
  259. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +129 -11
  260. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
  261. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
  262. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  263. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +29 -5
  264. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
  265. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
  266. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +4 -2
  267. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
  268. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
  269. package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
  270. package/gsd-core/workflows/execute-phase.md +68 -66
  271. package/gsd-core/workflows/execute-plan.md +25 -20
  272. package/gsd-core/workflows/explore.md +3 -1
  273. package/gsd-core/workflows/extract-learnings.md +3 -1
  274. package/gsd-core/workflows/fast.md +8 -2
  275. package/gsd-core/workflows/forensics.md +3 -1
  276. package/gsd-core/workflows/graduation.md +6 -6
  277. package/gsd-core/workflows/health.md +4 -7
  278. package/gsd-core/workflows/help/modes/brief.md +2 -0
  279. package/gsd-core/workflows/help/modes/default.md +2 -0
  280. package/gsd-core/workflows/help/modes/full.md +12 -0
  281. package/gsd-core/workflows/help/modes/topic.md +2 -0
  282. package/gsd-core/workflows/help.md +2 -0
  283. package/gsd-core/workflows/import.md +17 -14
  284. package/gsd-core/workflows/inbox.md +5 -6
  285. package/gsd-core/workflows/ingest-docs.md +45 -12
  286. package/gsd-core/workflows/insert-phase.md +7 -5
  287. package/gsd-core/workflows/list-phase-assumptions.md +2 -0
  288. package/gsd-core/workflows/list-seeds.md +7 -3
  289. package/gsd-core/workflows/list-workspaces.md +3 -1
  290. package/gsd-core/workflows/manager.md +15 -26
  291. package/gsd-core/workflows/map-codebase.md +3 -1
  292. package/gsd-core/workflows/milestone-summary.md +3 -1
  293. package/gsd-core/workflows/mvp-phase.md +3 -3
  294. package/gsd-core/workflows/new-milestone.md +10 -22
  295. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
  296. package/gsd-core/workflows/new-project.md +17 -29
  297. package/gsd-core/workflows/new-workspace.md +2 -2
  298. package/gsd-core/workflows/next.md +4 -2
  299. package/gsd-core/workflows/node-repair.md +2 -0
  300. package/gsd-core/workflows/note.md +2 -0
  301. package/gsd-core/workflows/onboard.md +1 -1
  302. package/gsd-core/workflows/pause-work.md +20 -5
  303. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
  304. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
  305. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +4 -4
  306. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +12 -3
  307. package/gsd-core/workflows/plan-phase.md +251 -54
  308. package/gsd-core/workflows/plan-review-convergence.md +148 -19
  309. package/gsd-core/workflows/plant-seed.md +3 -3
  310. package/gsd-core/workflows/pr-branch.md +195 -51
  311. package/gsd-core/workflows/profile-user.md +17 -15
  312. package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
  313. package/gsd-core/workflows/progress.md +52 -15
  314. package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
  315. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +38 -5
  316. package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
  317. package/gsd-core/workflows/quick/steps/research-phase.md +5 -7
  318. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
  319. package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
  320. package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
  321. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
  322. package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
  323. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
  324. package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
  325. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
  326. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
  327. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
  328. package/gsd-core/workflows/quick-batch.md +203 -0
  329. package/gsd-core/workflows/quick.md +33 -32
  330. package/gsd-core/workflows/reapply-patches.md +2 -0
  331. package/gsd-core/workflows/remove-phase.md +6 -4
  332. package/gsd-core/workflows/remove-workspace.md +3 -3
  333. package/gsd-core/workflows/resume-project.md +14 -14
  334. package/gsd-core/workflows/review.md +404 -21
  335. package/gsd-core/workflows/scan.md +3 -1
  336. package/gsd-core/workflows/section-manifest.json +12 -0
  337. package/gsd-core/workflows/secure-phase.md +3 -3
  338. package/gsd-core/workflows/session-report.md +2 -0
  339. package/gsd-core/workflows/settings-advanced.md +9 -9
  340. package/gsd-core/workflows/settings-integrations.md +66 -32
  341. package/gsd-core/workflows/settings.md +4 -6
  342. package/gsd-core/workflows/ship.md +22 -16
  343. package/gsd-core/workflows/sketch-wrap-up.md +13 -17
  344. package/gsd-core/workflows/sketch.md +13 -19
  345. package/gsd-core/workflows/smart-entry.md +4 -6
  346. package/gsd-core/workflows/spec-phase.md +31 -4
  347. package/gsd-core/workflows/spike-wrap-up.md +9 -11
  348. package/gsd-core/workflows/spike.md +21 -32
  349. package/gsd-core/workflows/stats.md +4 -2
  350. package/gsd-core/workflows/sync-skills.md +13 -5
  351. package/gsd-core/workflows/thread.md +13 -7
  352. package/gsd-core/workflows/transition.md +7 -5
  353. package/gsd-core/workflows/ui-phase.md +36 -21
  354. package/gsd-core/workflows/ui-review.md +7 -11
  355. package/gsd-core/workflows/ultraplan-phase.md +7 -13
  356. package/gsd-core/workflows/undo.md +9 -17
  357. package/gsd-core/workflows/update.md +47 -48
  358. package/gsd-core/workflows/validate-phase.md +3 -3
  359. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
  360. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
  361. package/gsd-core/workflows/verify-work.md +106 -21
  362. package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
  363. package/hooks/dist/gsd-check-update-worker.js +19 -2
  364. package/hooks/dist/gsd-config-reload.js +18 -12
  365. package/hooks/dist/gsd-context-monitor.js +302 -22
  366. package/hooks/dist/gsd-cursor-post-tool.js +3 -1
  367. package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
  368. package/hooks/dist/gsd-cursor-session-start.js +2 -1
  369. package/hooks/dist/gsd-cursor-stop.js +2 -1
  370. package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
  371. package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
  372. package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
  373. package/hooks/dist/gsd-graphify-update.sh +22 -18
  374. package/hooks/dist/gsd-node-runner.sh +77 -0
  375. package/hooks/dist/gsd-phase-boundary.sh +1 -0
  376. package/hooks/dist/gsd-prompt-guard.js +46 -12
  377. package/hooks/dist/gsd-read-guard.js +18 -7
  378. package/hooks/dist/gsd-read-injection-scanner.js +22 -13
  379. package/hooks/dist/gsd-secret-read-guard.js +1079 -0
  380. package/hooks/dist/gsd-session-state.sh +1 -0
  381. package/hooks/dist/gsd-statusline.js +222 -29
  382. package/hooks/dist/gsd-validate-commit.sh +523 -12
  383. package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
  384. package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
  385. package/hooks/dist/gsd-workflow-guard.js +36 -17
  386. package/hooks/dist/gsd-worktree-path-guard.js +36 -21
  387. package/hooks/dist/gsd-write-guard.js +35 -25
  388. package/hooks/dist/lib/cli-exit.js +560 -0
  389. package/hooks/dist/lib/exit-code-registry.js +98 -0
  390. package/hooks/dist/lib/git-cmd.js +210 -1
  391. package/hooks/dist/lib/git-probe.js +84 -0
  392. package/hooks/dist/lib/hook-exit.js +81 -0
  393. package/hooks/dist/lib/injection-patterns.js +36 -6
  394. package/hooks/dist/managed-hooks-registry.cjs +4 -0
  395. package/hooks/gsd-agent-isolation-guard.js +77 -38
  396. package/hooks/gsd-check-update-worker.js +19 -2
  397. package/hooks/gsd-config-reload.js +18 -12
  398. package/hooks/gsd-context-monitor.js +302 -22
  399. package/hooks/gsd-cursor-post-tool.js +3 -1
  400. package/hooks/gsd-cursor-pre-tool.js +3 -1
  401. package/hooks/gsd-cursor-session-start.js +2 -1
  402. package/hooks/gsd-cursor-stop.js +2 -1
  403. package/hooks/gsd-cursor-subagent-start.js +28 -23
  404. package/hooks/gsd-cursor-subagent-stop.js +3 -1
  405. package/hooks/gsd-ensure-canonical-path.js +2 -1
  406. package/hooks/gsd-graphify-update.sh +22 -18
  407. package/hooks/gsd-node-runner.sh +77 -0
  408. package/hooks/gsd-phase-boundary.sh +1 -0
  409. package/hooks/gsd-prompt-guard.js +46 -12
  410. package/hooks/gsd-read-guard.js +18 -7
  411. package/hooks/gsd-read-injection-scanner.js +22 -13
  412. package/hooks/gsd-secret-read-guard.js +1079 -0
  413. package/hooks/gsd-session-state.sh +1 -0
  414. package/hooks/gsd-statusline.js +222 -29
  415. package/hooks/gsd-validate-commit.sh +523 -12
  416. package/hooks/gsd-windsurf-pre-command.js +16 -11
  417. package/hooks/gsd-windsurf-pre-write.js +22 -13
  418. package/hooks/gsd-workflow-guard.js +36 -17
  419. package/hooks/gsd-worktree-path-guard.js +36 -21
  420. package/hooks/gsd-write-guard.js +35 -25
  421. package/hooks/hooks.json +6 -0
  422. package/hooks/lib/cli-exit.js +560 -0
  423. package/hooks/lib/exit-code-registry.js +98 -0
  424. package/hooks/lib/git-cmd.js +210 -1
  425. package/hooks/lib/git-probe.js +84 -0
  426. package/hooks/lib/hook-exit.js +81 -0
  427. package/hooks/lib/injection-patterns.js +36 -6
  428. package/hooks/managed-hooks-registry.cjs +4 -0
  429. package/package.json +14 -9
  430. package/scripts/base64-scan.sh +74 -12
  431. package/scripts/build-hooks.js +12 -0
  432. package/scripts/check-glossary-refs.cjs +77 -15
  433. package/scripts/check-mutation-score-ratchet.cjs +156 -0
  434. package/scripts/ci-check-job-near-cap.cjs +49 -0
  435. package/scripts/ci-pr-mergeability.cjs +262 -0
  436. package/scripts/ci-test-scope.cjs +52 -12
  437. package/scripts/ci-timeout-report.cjs +230 -0
  438. package/scripts/docs-guard-registry.cjs +406 -0
  439. package/scripts/gen-capability-registry.cjs +8 -6
  440. package/scripts/gen-exit-code-docs.cjs +318 -0
  441. package/scripts/gen-exit-code-registry.cjs +891 -0
  442. package/scripts/gen-features.cjs +836 -0
  443. package/scripts/gen-hooks-cli-exit.cjs +239 -0
  444. package/scripts/gen-install-tree-fixtures.cjs +2 -2
  445. package/scripts/gen-loop-host-contract.cjs +189 -4
  446. package/scripts/gen-scripts-cli-exit.cjs +185 -0
  447. package/scripts/gen-state-md-docs.cjs +727 -0
  448. package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
  449. package/scripts/lib/ci-job-timing.cjs +72 -0
  450. package/scripts/lib/cli-exit.cjs +546 -44
  451. package/scripts/lib/drift-scan.cjs +32 -2
  452. package/scripts/lib/exit-code-registry.cjs +98 -0
  453. package/scripts/lib/ndjson-reporter.cjs +119 -0
  454. package/scripts/lib/shellcheck-fetch.cjs +247 -0
  455. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
  456. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  457. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  458. package/scripts/lint-docs-guard-registration.cjs +495 -0
  459. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +198 -0
  460. package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
  461. package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
  462. package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
  463. package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
  464. package/scripts/lint-phase-enumeration-drift.cjs +45 -14
  465. package/scripts/lint-phase-id-drift.cjs +133 -8
  466. package/scripts/lint-planning-prompt-drift.cjs +38 -1
  467. package/scripts/lint-portable-grep.cjs +176 -0
  468. package/scripts/lint-removed-but-needed.cjs +184 -16
  469. package/scripts/lint-response-language-coverage.cjs +524 -0
  470. package/scripts/lint-seam-enforcement.cjs +182 -0
  471. package/scripts/lint-slug-derivation-drift.cjs +921 -0
  472. package/scripts/lint-source-test-name-collision.cjs +241 -0
  473. package/scripts/lint-state-write-path-drift.cjs +337 -432
  474. package/scripts/lint-test-file-count.allowlist.json +124 -4
  475. package/scripts/lint-test-file-count.cjs +25 -3
  476. package/scripts/lint-unreachable-guard-drift.cjs +51 -64
  477. package/scripts/lint-vendored-deps.cjs +208 -35
  478. package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
  479. package/scripts/lint-workflow-shellcheck.cjs +614 -0
  480. package/scripts/mutation-matrix.cjs +599 -50
  481. package/scripts/npm-audit-baseline.cjs +376 -0
  482. package/scripts/prompt-injection-scan.sh +83 -14
  483. package/scripts/require-issue-link-policy.cjs +16 -1
  484. package/scripts/secret-scan.sh +75 -13
  485. package/scripts/select-docs-guards.cjs +56 -0
  486. package/scripts/sync-runtime-launcher.cjs +22 -3
  487. package/skills/gsd-discuss-phase/SKILL.md +1 -1
  488. package/skills/gsd-execute-phase/SKILL.md +1 -1
  489. package/skills/gsd-import/SKILL.md +1 -1
  490. package/skills/gsd-ns-workflow/SKILL.md +1 -0
  491. package/skills/gsd-phase/SKILL.md +1 -1
  492. package/skills/gsd-quick/SKILL.md +8 -4
  493. package/skills/gsd-quick-batch/SKILL.md +105 -0
  494. package/skills/gsd-surface/SKILL.md +18 -8
  495. package/vscode/package.json +1 -1
  496. package/bin/lib/ui-safety-gate.cjs +0 -109
  497. package/scripts/lint-emitted-drift-ack.cjs +0 -344
  498. package/scripts/state-write-path-drift-baseline.json +0 -19
@@ -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,53 @@
1
+ # Stated Failing Direction (#3172)
2
+
3
+ > Reference file for the gsd-planner agent. Loaded on-demand via `@` reference from the
4
+ > `<failing_direction_contract>` block of the planner spawn prompt in
5
+ > `gsd-core/workflows/plan-phase.md` — NOT from `agents/gsd-planner.md`, which is frozen
6
+ > under a 49152-LF-char cap, so planner-side rules are projected onto its spawn contract
7
+ > (the #3297 / #3645 precedent).
8
+
9
+ **Every runnable `<automated>` command needs a `<fails_when>` sibling naming what output
10
+ constitutes failure.** A command with no expressible failure mode is not an acceptance test.
11
+
12
+ ```xml
13
+ <verify>
14
+ <automated>npm --prefix apps/api test -- auth.spec.ts</automated>
15
+ <fails_when>non-zero exit, or "0 passed" in the summary line</fails_when>
16
+ </verify>
17
+ ```
18
+
19
+ **Why.** #3172: six plans shipped 21 `<automated>` commands that could not run at all — a
20
+ `--lib` target against a binary-only package. They sat inside the very blocks that decide whether
21
+ work is done, so the acceptance criteria for those plans were improvised at execution time by
22
+ three separate executors instead of reviewed at planning time. Cargo happened to exit non-zero,
23
+ so it failed loudly. The identical mistake with a command that exits 0 on a no-op — a test-name
24
+ filter matching nothing — passes green and silently. Naming the failure signal is what makes the
25
+ difference visible while you are still authoring the plan.
26
+
27
+ **The authoring test, applied to yourself:** *if this command were silently doing nothing, what
28
+ in its output would tell me?* If you cannot answer, you do not yet have an acceptance command —
29
+ you have a command. Fix the command, do not invent a statement for it.
30
+
31
+ ## Rules
32
+
33
+ - **One statement per runnable command**, placed immediately after it. Within a task, each
34
+ `<fails_when>` binds to the nearest preceding `<automated>`, and the first statement after a
35
+ command is the binding one. Two commands need two statements.
36
+ - **Name an observable signal**, not the word "failure". `non-zero exit`, `"0 passed" in the
37
+ summary`, `the coverage line is absent`, `stderr contains "ECONNREFUSED"` are signals. *"the
38
+ command fails"*, *"it doesn't work"*, *"an error occurs"* are restatements and will be flagged.
39
+ - **Short is fine.** `non-zero exit` is complete. There is no minimum length and no required
40
+ keyword.
41
+ - **`TBD`, `TODO`, `N/A`, `none`, `unknown`, `?`, `-` are rejected outright** as whole values.
42
+ A statement you cannot write is a command you should not ship.
43
+ - **Any characters are safe.** `exit code > 0`, `stderr contains "FAIL" && exit != 0` are ordinary
44
+ prose here — that is exactly why this is an element and not an attribute.
45
+ - **The `MISSING — Wave 0 must create …` sentinel is exempt.** It is not a runnable command, so
46
+ it has no failure mode to state. Do not attach a `<fails_when>` to one.
47
+
48
+ ## Where the failing direction comes from
49
+
50
+ Prefer the signal the tool actually emits over one you imagine. When
51
+ `prior_verify_commands` supplies a command a prior phase already proved, the failure signal that
52
+ command produces is the one to state — you have seen its output. When you author a new command,
53
+ name the signal from the tool's documented output shape, not from a guess about it.
@@ -50,8 +50,22 @@ Choose `mid-flight` when you genuinely need the work to stop before any subseque
50
50
 
51
51
  `checkpoint:decision` and `checkpoint:human-action` tasks are still emitted in `end-of-phase` mode. Those gate the work itself (a choice the executor needs from the user, or an auth step only the user can perform), not post-hoc verification of completed work. Only `checkpoint:human-verify` is suppressed.
52
52
 
53
+ ## The tracer feedback gate (executor-side, #3299)
54
+
55
+ This mode is not purely a planner concern. The **tracer feedback gate** — the executor's early integration checkpoint after a `type="tracer"` task, in `workflows/execute-plan.md` and `agents/gsd-executor.md` — synthesizes a `checkpoint:human-verify` at runtime that no planner ever emitted, so planner-side suppression cannot reach it.
56
+
57
+ That gate predates this mode (added by #2294; `end-of-phase` became the default in #3309, whose scope was the planner and verifier only), and until #3299 it branched on auto-mode alone. The result was that under the documented default, an interactive run halted after **every** tracer whose evidence was purely a test verdict, asking the user to retype a result the executor had just computed.
58
+
59
+ The gate now honors `human_verify_mode`.
60
+
61
+ The full precedence chain lives in `gsd-core/references/checkpoints.md` → "Tracer feedback gate (#3299)"; it is evaluated in order, and `gate="blocking-human"` outranks everything. Summary: an interactive `end-of-phase` run with an automated-only `<verify>` re-runs it and continues with no checkpoint (HALT on failure, unconditionally); `mid-flight`, `<human-check>`, and `blocking-human` all still STOP; the auto-mode branch is unchanged.
62
+
63
+ **Why a tracer carrying `<human-check>` still halts rather than deferring to the end-of-phase UAT batch.** Deferring would be the more uniform reading of this mode — `<human-check>` on an `auto` task defers, so arguably it should defer on a tracer too. It deliberately does not, for three reasons. First, and decisively: **the end-of-phase harvest does not cover tracers.** `agents/gsd-verifier.md` collects `<verify><human-check>` blocks from `auto` tasks; deferring a tracer's human evidence without first widening that seam would drop the evidence on the floor entirely — strictly worse than halting. Second, the tracer gate exists to stop expansion being layered onto an unproven slice; deferring its human evidence would let every expansion task build on a slice no human has confirmed, the exact failure the gate was introduced to prevent. Third, the reported defect is scoped to tracers with *no* human-observable evidence, and fail-closed is the safe direction outside that scope. If uniformity is later preferred, the harvest must be widened to tracers in the same change — record that decision here rather than re-deriving it.
64
+
65
+ `workflow.human_verify_mode` is **absent from `SCHEMA_DEFAULTS`** in `src/config.cts`, so `query config-get workflow.human_verify_mode` exits non-zero with `Key not found` on any project whose `config.json` predates #3309 — it does not resolve the documented `end-of-phase` default. Every consumer must therefore pass `--default end-of-phase` explicitly.
66
+
53
67
  ## Compatibility with other modes
54
68
 
55
69
  - **`workflow.tdd_mode`**: orthogonal. TDD tasks still emit `tdd="true"` and `<behavior>`; the `<verify>` block carries the human-check sub-element when `human_verify_mode = end-of-phase`.
56
70
  - **`MVP_MODE`**: orthogonal. Vertical-slice ordering is unchanged. The first task remains a failing end-to-end test; later auto tasks may carry `<verify><human-check>` instead of standalone checkpoint tasks.
57
- - **`workflow.auto_advance` / `_auto_chain_active`**: in mid-flight mode these auto-approve checkpoint:human-verify halts. In end-of-phase mode there are no halts to auto-approve, so the flags have no effect on this code path.
71
+ - **`workflow.auto_advance` / `_auto_chain_active`**: in mid-flight mode these auto-approve checkpoint:human-verify halts. In end-of-phase mode there are no *planner-emitted* halts to auto-approve, so the flags have no effect on the planner's output. They are not inert at execution time, though: the executor-side tracer feedback gate above synthesizes its own checkpoint, and the auto-mode branch takes precedence over `human_verify_mode` there — except for `gate="blocking-human"`, which is evaluated first and STOPs in every mode (#3299).
@@ -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.
@@ -21,12 +21,43 @@ issues:
21
21
  - plan: "16-01"
22
22
  dimension: "task_completeness"
23
23
  severity: "blocker"
24
+ required_property: "Every `auto` task has a `<verify>` separating pass from fail"
24
25
  description: "Task 2 missing <verify> element"
25
26
  fix_hint: "Add verification command for build output"
26
27
  ```
27
28
 
28
29
  Group by plan, dimension, severity.
29
30
 
31
+ **What binds and what does not.** `required_property` (the invariant that must hold),
32
+ `description` (the evidence it does not) and `severity` are binding. `fix_hint` is **one
33
+ example** of a route to that property — an illustration, never an instruction. You address an
34
+ issue by making `required_property` true; the hint's own mechanism is optional.
35
+
36
+ An older checker may return an issue with no `required_property`. Derive it from `dimension`
37
+ + `description` and state the derived property in your revision summary. Never treat the
38
+ absence of the field as licence to apply `fix_hint` literally.
39
+
40
+ **Prefer the smallest sufficient mechanism.** If a smaller change than the hint makes
41
+ `required_property` true, take it — that fully addresses the issue and must be reported as
42
+ addressed, naming the property satisfied and the mechanism used.
43
+
44
+ ### Step 2.5: Constraint Re-check (before any edit)
45
+
46
+ Before editing, re-read the constraints already in force:
47
+
48
+ - Locked decisions in CONTEXT.md (`## Decisions`) and deferred ideas (`## Deferred Ideas`)
49
+ - Active capability / project guidance (CLAUDE.md, `.claude/skills/`, `.agents/skills/`)
50
+ - Constraints the existing plans already encode (chosen mechanism, scope boundary, must_haves)
51
+
52
+ A `fix_hint` conflicts when applying it would contradict any of those. Applying it anyway is
53
+ a contract violation, not a judgement call. When a hint conflicts — or when the property is
54
+ unreachable without breaking a constraint — do NOT edit around it and do NOT burn a revision
55
+ iteration on it: emit `## REVISION_CONFLICT` (Step 7) for that issue, apply every
56
+ non-conflicting issue normally, and return.
57
+
58
+ A hint that merely proposes a *bigger* mechanism than needed is not a conflict. Take the
59
+ smaller route under Step 2 and report it as addressed.
60
+
30
61
  ### Step 3: Revision Strategy
31
62
 
32
63
  | Dimension | Strategy |
@@ -38,15 +69,25 @@ Group by plan, dimension, severity.
38
69
  | scope_sanity | Split into multiple plans |
39
70
  | must_haves_derivation | Derive and add must_haves to frontmatter |
40
71
 
72
+ Each strategy is the usual route, not the only one. Any change that makes the issue's
73
+ `required_property` true is a valid strategy.
74
+
41
75
  ### Step 4: Make Targeted Updates
42
76
 
43
77
  **DO:** Edit specific flagged sections, preserve working parts, update waves if dependencies change.
78
+ Choose the smallest mechanism that makes each issue's `required_property` true — explicitly
79
+ including a mechanism smaller than, or different from, the one its `fix_hint` names.
44
80
 
45
- **DO NOT:** Rewrite entire plans for minor issues, add unnecessary tasks, break existing working plans.
81
+ **DO NOT:** Rewrite entire plans for minor issues, add unnecessary tasks, break existing working
82
+ plans, or apply a `fix_hint` that contradicts a constraint from Step 2.5 — that one goes to
83
+ `## REVISION_CONFLICT` instead.
46
84
 
47
85
  ### Step 5: Validate Changes
48
86
 
49
- - [ ] All flagged issues addressed
87
+ - [ ] Every flagged issue's `required_property` now holds — reached by its `fix_hint` OR by a
88
+ smaller/different mechanism (both count as addressed), OR raised as `## REVISION_CONFLICT`
89
+ - [ ] No `fix_hint` applied that contradicts a locked decision, capability guidance, or an
90
+ existing plan constraint (Step 2.5)
50
91
  - [ ] No new issues introduced
51
92
  - [ ] Wave numbers still valid
52
93
  - [ ] Dependencies still correct
@@ -55,7 +96,7 @@ Group by plan, dimension, severity.
55
96
  ### Step 6: Commit
56
97
 
57
98
  ```bash
58
- gsd-tools query commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
99
+ gsd_run query commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
59
100
  ```
60
101
 
61
102
  ### Step 7: Return Revision Summary
@@ -85,3 +126,35 @@ gsd-tools query commit "fix($PHASE): revise plans based on checker feedback" --f
85
126
  |-------|--------|
86
127
  | {issue} | {why - needs user input, architectural change, etc.} |
87
128
  ```
129
+
130
+ ### Step 7b: Return Revision Conflict (when Step 2.5 found one)
131
+
132
+ Emit this INSTEAD OF `## REVISION COMPLETE` when at least one issue could not be addressed
133
+ without contradicting a constraint. Non-conflicting issues you already fixed stay listed under
134
+ `### Changes Made` so the work is not lost. The orchestrator routes this to the user or to the
135
+ configured plan-review convergence loop; it does not count as a failed revision iteration.
136
+
137
+ ```markdown
138
+ ## REVISION_CONFLICT
139
+
140
+ **Conflicts:** {N} | **Issues addressed anyway:** {M}
141
+
142
+ | Issue | required_property | Conflicts with | Why the hint cannot be applied |
143
+ |-------|-------------------|----------------|-------------------------------|
144
+ | {dimension}/{plan} | {property} | {locked decision D-nn / CLAUDE.md rule / plan constraint} | {one line} |
145
+
146
+ ### Alternatives Considered
147
+
148
+ | Issue | Alternative | Satisfies required_property? | Cost of adopting |
149
+ |-------|-------------|------------------------------|------------------|
150
+ | {dimension}/{plan} | {smaller or different mechanism} | {yes / partially — how} | {what it changes} |
151
+
152
+ ### Changes Made
153
+
154
+ {table of the non-conflicting issues you DID address, same shape as REVISION COMPLETE}
155
+ ```
156
+
157
+ **Every field is one line of plain text.** No newlines inside a cell, and never begin a field with
158
+ `#`, `-`, `|` or a code fence. These fields are appended to a shared markdown file that a later
159
+ reader scans by heading; a field that starts a heading truncates that scan and hides conflicts
160
+ below it.
@@ -0,0 +1,17 @@
1
+ # Verify Command Grounding (#2401)
2
+
3
+ > Reference file for gsd-planner agent. Loaded on-demand via `@` reference.
4
+
5
+ **Inherit the command that already worked.** The planning context carries
6
+ `prior_verify_commands` — the `<automated>` commands from the most recent prior phase that had
7
+ any, surfaced **at every context window**, not only on 1M-class models. When this phase's build
8
+ or test story is the same one a prior phase already proved, **reuse that command verbatim**
9
+ rather than re-deriving a path. Re-invention is what produced `cd ../../frontend && npm run
10
+ lint` against a directory that holds no `package.json`, and cost two revision cycles.
11
+
12
+ Ground every path you do author: a command's `cd` target or `npm --prefix` target must be a
13
+ directory that exists (or that an earlier task in this phase creates) and, for an npm/make
14
+ command, must hold the matching `package.json`/`Makefile`. `npm --prefix <dir> run <script>` is
15
+ preferred over `cd <dir> && npm run <script>` — it does not depend on the executor's cwd. If
16
+ `prior_verify_commands` is empty and you cannot ground a path, say so in the plan instead of
17
+ guessing one.
@@ -6,11 +6,13 @@ Configuration options for `.planning/` directory behavior.
6
6
  ```json
7
7
  "planning": {
8
8
  "commit_docs": true,
9
+ "pr_strict": false,
9
10
  "search_gitignored": false
10
11
  },
11
12
  "git": {
12
13
  "branching_strategy": "none",
13
14
  "base_branch": null,
15
+ "protected_branches": ["develop", "staging"],
14
16
  "phase_branch_template": "gsd/phase-{phase}-{slug}",
15
17
  "milestone_branch_template": "gsd/{milestone}-{slug}",
16
18
  "quick_branch_template": null
@@ -27,15 +29,18 @@ Configuration options for `.planning/` directory behavior.
27
29
  | Option | Default | Description |
28
30
  |--------|---------|-------------|
29
31
  | `commit_docs` | `true` | Whether to commit planning artifacts to git |
32
+ | `pr_strict` | `false` | Filter mode for `/gsd:pr-branch`. `false` keeps structural planning state (STATE.md, ROADMAP.md, MILESTONES.md, PROJECT.md, REQUIREMENTS.md, milestones/) in the PR branch; `true` drops every `.planning/` path |
30
33
  | `search_gitignored` | `false` | Add `--no-ignore` to broad rg searches |
31
34
  | `git.branching_strategy` | `"none"` | Git branching approach: `"none"`, `"phase"`, or `"milestone"` |
32
35
  | `git.base_branch` | `null` (auto-detect) | Target branch for PRs and merges (e.g. `"master"`, `"develop"`). When `null`, auto-detects from `git symbolic-ref refs/remotes/origin/HEAD`, falling back to `"main"`. |
36
+ | `git.protected_branches` | (none) | Optional array of non-empty strings naming additional shared branches that should trigger protected-branch warnings |
33
37
  | `git.create_tag` | `true` | Create git tags on milestone completion |
34
38
  | `git.phase_branch_template` | `"gsd/phase-{phase}-{slug}"` | Branch template for phase strategy |
35
39
  | `git.milestone_branch_template` | `"gsd/{milestone}-{slug}"` | Branch template for milestone strategy |
36
40
  | `git.quick_branch_template` | `null` | Optional branch template for quick-task runs |
37
41
  | `workflow.use_worktrees` | `true` | Whether executor agents run in isolated git worktrees. Set to `false` to disable worktrees — agents execute sequentially on the main working tree instead. Recommended for solo developers or when worktree merges cause issues. Note: if your branch is ahead of `origin/HEAD` (a diverged milestone or feature branch), GSD auto-degrades to sequential and prints a warning; set `worktree.baseRef:"head"` in `.claude/settings.local.json` to restore parallel execution. See the branch-divergence note below. |
38
42
  | `workflow.subagent_timeout` | `300000` | Timeout in milliseconds for parallel subagent tasks (e.g. codebase mapping). Increase for large codebases or slower models. Default: 300000 (5 minutes). |
43
+ | `workflow.inline_plan_threshold` | `2` | Plans with this many tasks or fewer execute inline (Pattern C) instead of spawning a subagent. Avoids ~14K token spawn overhead for small plans. Set to `0` to always spawn subagents. |
39
44
  | `workflow.test_command` | `null` | Custom shell command run as the regression/test gate by execute-phase, audit-fix, and post-merge-gate. When unset, GSD auto-detects (Makefile / package.json / Cargo.toml / go.mod / pyproject.toml). Example: `npm test`. |
40
45
  | `workflow.build_command` | `null` | Custom shell command run as the build gate by the post-merge gate. When unset, the build step is skipped/auto-detected. Example: `npm run build`. |
41
46
  | `workflow.inline_plan_threshold` | `2` | Plans with this many tasks or fewer execute inline (Pattern C) instead of spawning a subagent. Avoids ~14K token spawn overhead for small plans. Set to `0` to always spawn subagents. |
@@ -45,6 +50,26 @@ Configuration options for `.planning/` directory behavior.
45
50
  | `response_language` | `null` | Language for user-facing questions and prompts across all phases/subagents (e.g. `"Portuguese"`, `"Japanese"`, `"Spanish"`). When set, all spawned agents include a directive to respond in this language. |
46
51
  </config_schema>
47
52
 
53
+ `git.protected_branches` has no persisted default. When it is absent, only the resolved base branch
54
+ is protected, preserving existing project behavior. Every configured item must be a non-empty
55
+ string. The configured list extends the resolved base branch; it never replaces the base or changes
56
+ the resolution ladder. A match produces an advisory warning at execute-phase and ship and does not
57
+ change `git.branching_strategy: "none"`.
58
+
59
+ Matching is by exact branch name — there is no glob or prefix support, so a git-flow
60
+ layout must name each `release/*` or `hotfix/*` branch it wants protected. An entry that
61
+ is not a non-empty string is ignored with a warning naming it, and the remaining names
62
+ still apply.
63
+
64
+ ```json
65
+ {
66
+ "git": {
67
+ "branching_strategy": "none",
68
+ "protected_branches": ["develop", "staging"]
69
+ }
70
+ }
71
+ ```
72
+
48
73
  <commit_docs_behavior>
49
74
 
50
75
  **When `commit_docs: true` (default):**
@@ -61,15 +86,15 @@ Configuration options for `.planning/` directory behavior.
61
86
 
62
87
  ```bash
63
88
  # Commit with automatic commit_docs + gitignore checks:
64
- gsd-tools query commit "docs: update state" --files .planning/STATE.md
89
+ gsd_run query commit "docs: update state" --files .planning/STATE.md
65
90
 
66
91
  # Load config via state load (returns JSON):
67
- INIT=$(gsd-tools query state.load)
92
+ INIT=$(gsd_run query state.load)
68
93
  if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
69
94
  # commit_docs is available in the JSON output
70
95
 
71
96
  # Or use init commands which include commit_docs:
72
- INIT=$(gsd-tools query init.execute-phase "1")
97
+ INIT=$(gsd_run query init.execute-phase "1")
73
98
  if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
74
99
  # commit_docs is included in all init command outputs
75
100
  ```
@@ -81,7 +106,7 @@ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
81
106
  **Commit via CLI (handles checks automatically):**
82
107
 
83
108
  ```bash
84
- gsd-tools query commit "docs: update state" --files .planning/STATE.md
109
+ gsd_run query commit "docs: update state" --files .planning/STATE.md
85
110
  ```
86
111
 
87
112
  The CLI checks `commit_docs` config and gitignore status internally — no manual conditionals needed.
@@ -169,14 +194,14 @@ To use uncommitted mode:
169
194
 
170
195
  Use `init execute-phase` which returns all config as JSON:
171
196
  ```bash
172
- INIT=$(gsd-tools query init.execute-phase "1")
197
+ INIT=$(gsd_run query init.execute-phase "1")
173
198
  if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
174
199
  # JSON output includes: branching_strategy, phase_branch_template, milestone_branch_template
175
200
  ```
176
201
 
177
202
  Or use `state load` for the config values:
178
203
  ```bash
179
- INIT=$(gsd-tools query state.load)
204
+ INIT=$(gsd_run query state.load)
180
205
  if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
181
206
  # Parse branching_strategy, phase_branch_template, milestone_branch_template from JSON
182
207
  ```
@@ -242,6 +267,7 @@ Generated from `CONFIG_DEFAULTS` (configuration.cjs) and `VALID_CONFIG_KEYS` (co
242
267
  | `resolve_model_ids` | boolean\|string | `false` | `false`, `true`, `"omit"` | Map model aliases to full Claude IDs; `"omit"` returns empty string |
243
268
  | `context` | string\|null | `null` | `"dev"`, `"research"`, `"review"` | Execution context profile that adjusts agent behavior: `"dev"` for development tasks, `"research"` for investigation/exploration, `"review"` for code review workflows |
244
269
  | `review.models.<cli>` | string\|null | `null` | Any model ID string | Per-CLI model override for /gsd:review (e.g., `review.models.gemini`). Falls back to CLI default when null. |
270
+ | `review.max_prompt_tokens` | number\|null | `null` | Any positive integer, or `null` | Central, cross-lane default cap (in estimated tokens) on the assembled review prompt; `null` means no trim. A per-lane `review.max_prompt_tokens_per_reviewer.<slug>` value overrides it for that lane: `-1` means unset (inherits this global default), `0` means "do not trim that lane" (not unset — it is an explicit, standing opt-out). _Alias:_ `max_prompt_tokens` is the flat-key form used in `CONFIG_DEFAULTS`; `review.max_prompt_tokens` is the canonical namespaced form. |
245
271
 
246
272
  ### Workflow Fields
247
273
 
@@ -263,21 +289,23 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
263
289
  | `workflow.ui_phase` | boolean | `true` | `true`, `false` | Generate UI-SPEC.md for frontend phases |
264
290
  | `workflow.ui_safety_gate` | boolean | `true` | `true`, `false` | Require safety gate approval for UI changes |
265
291
  | `workflow.text_mode` | boolean | `false` | `true`, `false` | Use plain-text numbered lists instead of AskUserQuestion menus |
266
- | `workflow.research_before_questions` | boolean | `false` | `true`, `false` | Run research before interactive questions in discuss phase |
292
+ | `workflow.research_before_questions` | boolean | `false` | `true`, `false` | Run research before interactive questions in discuss phase (also honored on the `/gsd:quick` path, #3894). _Alias:_ `research_before_questions` is the flat-key form used in `CONFIG_DEFAULTS`; `workflow.research_before_questions` is the canonical namespaced form. |
267
293
  | `workflow.discuss_mode` | string | `"discuss"` | `"discuss"`, `"assumptions"` | Default mode for discuss-phase: `"discuss"` runs interactive questioning; `"assumptions"` analyzes codebase and surfaces assumptions instead |
268
294
  | `workflow.skip_discuss` | boolean | `false` | `true`, `false` | Skip discuss phase entirely |
269
295
  | `workflow.use_worktrees` | boolean | `true` | `true`, `false` | Run executor agents in isolated git worktrees |
270
296
  | `workflow.subagent_timeout` | number | `300000` | Any positive integer (ms) | Timeout for parallel subagent tasks (default: 5 minutes) |
297
+ | `workflow.inline_plan_threshold` | number | `2` | `0`–`10` | Plans with ≤N tasks execute inline instead of spawning a subagent |
271
298
  | `workflow.test_command` | string\|null | `null` | Any shell command | Regression/test gate command run by execute-phase, audit-fix, and post-merge-gate. Unset → GSD auto-detects (Makefile / package.json / Cargo.toml / go.mod / pyproject.toml). |
272
299
  | `workflow.build_command` | string\|null | `null` | Any shell command | Build gate command run by the post-merge gate. Unset → build step auto-detected/skipped. |
273
300
  | `workflow.mvp_mode` | boolean | `false` | `true`, `false` | Persist the MVP-mode flag in config so every phase defaults to MVP framing without requiring `--mvp` on the CLI. Resolved via the chain: `--mvp` CLI flag → ROADMAP.md `**Mode:** mvp` field → this config value → `false`. When `true`, the planner, executor, verifier, and discovery surfaces (progress, stats, graphify) all treat the phase as an MVP vertical slice (UI → API → DB) of one user-visible capability. |
274
301
  | `workflow.context_guard_mode` | string | `"warn"` | `"auto"`, `"warn"`, `"off"` | Context exhaustion guard mode for `execute-phase`. Before each wave, the orchestrator self-assesses context pressure using degradation signals from `context-budget.md`. `"warn"` (default): emit a warning and recommend `/gsd:pause-work` when POOR tier is detected. `"auto"`: automatically invoke `/gsd:pause-work` before the next wave when POOR tier is detected. `"off"`: disable the guard. The guard is heuristic — no programmatic context-% API exists. |
275
- | `workflow.plan_chunked` | boolean | `false` | `true`, `false` | Enable chunked planning mode. When `true`, the plan-phase orchestrator splits the single long-lived planner Task into a short outline Task followed by N short per-plan Tasks (~3–5 min each). Each plan is committed individually for crash resilience. Particularly useful on Windows where long-lived Tasks may hang on stdio. Also activated by the `--chunked` flag. |
302
+ | `workflow.plan_chunked` | boolean | `false` | `true`, `false` | Enable chunked planning mode. When `true`, the plan-phase orchestrator splits the single long-lived planner Task into a short outline Task followed by N short per-plan Tasks (~3–5 min each). Each plan is committed individually for crash resilience. Particularly useful on Windows where long-lived Tasks may hang on stdio. Also activated by the `--chunked` flag. See `planning.chunked_parallel` below for concurrent per-plan dispatch. |
276
303
  | `workflow.specless_probe_fallback` | boolean | `true` | `true`, `false` | Gate the SPEC-less probe fallback in `plan-phase`. When `true` (default), a phase that did not supply a `## Edge Coverage` / `## Prohibitions` SPEC section (header absent or present-but-empty) runs the existing probe protocol — the deterministic `edge-probe.cjs` for edges and an in-planner LLM recall pass for prohibitions — and authors the resulting predicates into PLAN.md `must_haves` (section-level precedence: a SPEC-supplied section is never re-run or overwritten). When `false`, the fallback is skipped but the skip is recorded: plan-phase emits a visible "probe fallback disabled" marker, never a silent skip. |
277
304
  | `workflow.code_review_command` | string\|null | `null` | Any shell command | External code-review command integrated into `/gsd:ship`. The diff is piped to the command via stdin; the command must output JSON with a `verdict` field (`"APPROVED"` or `"REVISE"`). Non-zero exit or `"REVISE"` verdict blocks the ship workflow. When unset, the built-in review flow runs. Example: `my-review-tool --review`. |
278
305
  | `workflow.inline_plan_threshold` | number | `2` | `0`–`10` | Plans with ≤N tasks execute inline instead of spawning a subagent |
279
306
  | `workflow.code_review` | boolean | `true` | `true`, `false` | Enable built-in code review step in the ship workflow |
280
307
  | `workflow.code_review_depth` | string | `"standard"` | `"quick"`, `"standard"`, `"deep"` | Depth level for code review analysis in the ship workflow |
308
+ | `workflow.code_review_depth_overrides` | array | `[]` | Array of `{paths, depth}` rule objects | Ordered path-scoped depth rules for `/gsd:code-review` (#2554). Each rule's `paths` are matched against the review's changed-file set by whole-segment directory-path prefix (`src/auth` matches `src/auth/token.ts`, never `src/authfoo/x.ts`); matching is case-sensitive. Glob syntax (`*`, `?`) is a configuration error. One matched file escalates the entire review — depth is not applied per file. Resolution order: `--depth=` flag → strongest matching rule → `workflow.code_review_depth` → `standard`. A malformed rule halts the review with a typed error rather than falling back silently. |
281
309
  | `workflow._auto_chain_active` | boolean | `false` | `true`, `false` | Internal: tracks whether autonomous chaining is active |
282
310
  | `workflow.security_enforcement` | boolean | `true` | `true`, `false` | Enable threat-model-anchored security verification via `/gsd:secure-phase`. When `false`, security checks are skipped entirely |
283
311
  | `workflow.security_asvs_level` | number | `1` | `1`, `2`, `3` | OWASP ASVS verification level. Level 1 = opportunistic, Level 2 = standard, Level 3 = comprehensive. Scales both planner threat-disposition rigor (which threats must be mitigated vs. accepted) and auditor verification depth (grep-level → boundary-placement check → full data-flow trace). See `gsd-core/references/security-asvs-levels.md`. |
@@ -300,6 +328,7 @@ Set via `git.*` namespace (e.g., `"git": { "branching_strategy": "phase" }`).
300
328
  |-----|------|---------|----------------|-------------|
301
329
  | `git.branching_strategy` | string | `"none"` | `"none"`, `"phase"`, `"milestone"` | Git branching approach for phase/milestone isolation |
302
330
  | `git.base_branch` | string\|null | `null` (auto-detect) | Any branch name | Target branch for PRs and merges; auto-detects from `origin/HEAD` when `null` |
331
+ | `git.protected_branches` | array of non-empty strings | (none) | Non-empty branch names | Optional protected names added to the resolved base branch for execute-phase and ship warnings |
303
332
  | `git.create_tag` | boolean | `true` | `true`, `false` | Create git tags on milestone completion |
304
333
  | `git.phase_branch_template` | string | `"gsd/phase-{phase}-{slug}"` | Template with `{phase}`, `{slug}` | Branch naming template for `phase` strategy |
305
334
  | `git.milestone_branch_template` | string | `"gsd/{milestone}-{slug}"` | Template with `{milestone}`, `{slug}` | Branch naming template for `milestone` strategy |
@@ -375,6 +404,7 @@ These can be set at top level or nested under `planning.*` (e.g., `"planning": {
375
404
  |-----|------|---------|----------------|-------------|
376
405
  | `planning.commit_docs` | boolean | `true` | `true`, `false` | Alias for top-level `commit_docs` |
377
406
  | `planning.search_gitignored` | boolean | `false` | `true`, `false` | Alias for top-level `search_gitignored` |
407
+ | `planning.chunked_parallel` | boolean | `false` | `true`, `false` | Opt-in for `workflow.plan_chunked`'s per-plan loop (§8.5.2 of `chunked-planning-mode.md`, #3777). When `true`, the runnable per-plan planners within one outline Wave are dispatched concurrently (one message, `run_in_background=true` each) instead of one at a time, honoring the outline's Wave column as the schedule (`Depends On` is expected to name only an earlier Wave and is not separately parsed — batching strictly by Wave already respects it). Gated on the negotiated `dispatch-capacity` query (#3673): a host that declares no `maxConcurrency` (capacity resolves to `1`) stays serial regardless of this setting. Default `false` is byte-identical to the pre-#3777 serial loop. Trade-off: per-plan commits interleave within a batch instead of strictly one-at-a-time, and a stalled plan's retry no longer blocks sibling plans in the same batch from having already committed. |
378
408
 
379
409
  ---
380
410
 
@@ -398,7 +428,7 @@ Several config fields affect each other or trigger special behavior:
398
428
 
399
429
  8. **`sub_repos` auto-sync** -- On every config load, GSD scans for child directories with `.git` and updates the `sub_repos` array if the filesystem has changed. Legacy `multiRepo: true` is automatically migrated to a detected `sub_repos` array.
400
430
 
401
- 9. **`workflow.use_worktrees` and branch divergence** -- When `use_worktrees` is `true` (default), executor worktrees are forked from `origin/HEAD` -- by the host's own harness on `dispatch.isolation: harness-worktree` runtimes (Claude Code, Cursor), or by GSD itself on `orchestrator-worktree` runtimes (Codex, OpenCode, Kimi, Kimi Code). The divergence behavior below is identical either way, because the fork base is a property of the repository rather than of whoever creates the worktree. If your current branch has commits that `origin/HEAD` does not (for example an unmerged milestone or feature branch), GSD automatically degrades to sequential execution for that run and prints a one-line `⚠ Worktree base mismatch` warning. To restore parallel execution permanently, set `worktree.baseRef:"head"` in `.claude/settings.local.json` (run `node gsd-tools.cjs worktree set-baseref`). This makes the harness fork worktrees from the live HEAD instead of `origin/HEAD`. Both fresh installs and upgrades of GSD Core set this automatically (no-clobber) when `use_worktrees` is enabled; you can also run the command manually at any time. Setting `workflow.use_worktrees: false` is the alternative if worktrees are not needed at all. On a runtime whose declared `dispatch.isolation` is `none`, an explicit `true` is a config the execution workflows fail closed on; `/gsd:health` reports it as warning `W025` and `/gsd:settings` offers to repair it (#2486).
431
+ 9. **`workflow.use_worktrees` and branch divergence** -- When `use_worktrees` is `true` (default), executor worktrees are forked from `origin/HEAD` -- by the host's own harness on `dispatch.isolation: harness-worktree` runtimes (Claude Code, Cursor), or by GSD itself on `orchestrator-worktree` runtimes (Codex, OpenCode, Kimi, Kimi Code). The divergence behavior below is identical either way, because the fork base is a property of the repository rather than of whoever creates the worktree. If your current branch has commits that `origin/HEAD` does not (for example an unmerged milestone or feature branch), GSD automatically degrades to sequential execution for that run and prints a one-line `⚠ Worktree base mismatch` warning. To restore parallel execution permanently, set `worktree.baseRef:"head"` in `.claude/settings.local.json` (run `gsd_run worktree set-baseref`). This makes the harness fork worktrees from the live HEAD instead of `origin/HEAD`. Both fresh installs and upgrades of GSD Core set this automatically (no-clobber) when `use_worktrees` is enabled; you can also run the command manually at any time. Setting `workflow.use_worktrees: false` is the alternative if worktrees are not needed at all. On a runtime whose declared `dispatch.isolation` is `none`, an explicit `true` is a config the execution workflows fail closed on; `/gsd:health` reports it as warning `W025` and `/gsd:settings` offers to repair it (#2486).
402
432
 
403
433
  ---
404
434
 
@@ -0,0 +1,9 @@
1
+ # Response-Language Directive (#2529)
2
+
3
+ **If `response_language` is set** (in the init JSON this workflow parses, or in `.planning/config.json`): ALL user-facing output of this workflow MUST be in that language — narration between tool calls, status updates, progress notes, findings, banners, report prose, questions (AskUserQuestion or plain text), and summaries. Technical terms, code, file paths, commands, and identifiers stay in English.
4
+
5
+ Literal English report/banner templates embedded in a workflow 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. Exception: blocks a workflow explicitly requires to be emitted byte-for-byte (e.g. pre-rendered checkpoints) are output exactly as rendered.
6
+
7
+ Pass `response_language: {value}` into every spawned subagent prompt so any user-facing output they produce stays in the configured language.
8
+
9
+ Workflows take this contract in one of three forms (REQ-LANG-03): an `@`-reference to this file; their own inline directive naming the same narration class; or, for a fragment loaded by a covered parent, inheritance from that parent. Coverage is enforced by `scripts/lint-response-language-coverage.cjs` — a new workflow cannot ship without one of the three, and the lint checks this file's own wording too, so a weakened directive here uncovers every workflow that imports it rather than passing silently. Workflow-specific directives (e.g. `execute-phase-response-language.md`) take precedence where present.
@@ -106,3 +106,34 @@ with an argv array and `shell: false`.
106
106
  - **Shared-adapter caveat:** when ≥2 invoked instances share the same base `cli`, print a
107
107
  one-line caveat immediately after the frontmatter (before the first section), e.g.:
108
108
  `> Note: opencode-deepseek and opencode-mimo share the opencode adapter; their consensus is cross-model, not cross-tool.`
109
+
110
+ ---
111
+
112
+ ## Interaction with the convergence loop (#2398)
113
+
114
+ Running 2+ instances changes how `/gsd:plan-review-convergence` counts HIGHs. Its **consensus gate**
115
+ (`plan-review-convergence.md`, step 5a, immediately before the counting rules) engages only when two
116
+ or more reviewers actually ran in a cycle — which is precisely the configuration this file enables.
117
+
118
+ Under that gate, a HIGH raised by exactly one instance is treated by what the claim asserts:
119
+
120
+ - an **existence-class** claim (a symbol, file, flag, commit or ID exists / is absent / says X)
121
+ counts toward `current_high` only if source-grounding confirms it or another reviewer raised the
122
+ same concern;
123
+ - a **judgment-class** claim (a design or correctness property) counts unless that instance's own
124
+ section opens with an evidence-quality discount marker — `[reviewed-without-source-citations]`
125
+ (#3194) or `[reviewed-without-repo-access]` (#2176).
126
+
127
+ Judgment-class findings are deliberately exempt from the corroboration requirement: instances catch
128
+ materially different classes of issue, so demanding two of them independently raise the same
129
+ architectural concern would suppress the findings this feature exists to surface.
130
+
131
+ A suppressed HIGH is still reported, tagged `(single-reviewer, unconfirmed)`. If every instance that
132
+ ran carries a discount marker the gate disengages entirely, so a cycle in which nothing was verified
133
+ can never be counted as converged.
134
+
135
+ **Practical consequence for this file's use case:** instances of uneven reliability are safe to
136
+ configure. A weak instance that returns no `file:line` evidence gets stamped, and its lone
137
+ judgment-class HIGHs stop forcing replan cycles — while any instance that does produce grounded
138
+ evidence keeps full blocking weight, alone, on exactly the architectural findings it was added to
139
+ catch.