@opengsd/gsd-core 1.11.0 → 1.12.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 (395) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/agents/gsd-code-fixer.md +1 -1
  4. package/agents/gsd-debug-session-manager.md +1 -1
  5. package/agents/gsd-debugger.md +1 -1
  6. package/agents/gsd-dom-verifier.md +169 -0
  7. package/agents/gsd-eval-auditor.md +1 -1
  8. package/agents/gsd-executor.md +17 -9
  9. package/agents/gsd-framework-selector.md +1 -3
  10. package/agents/gsd-intel-updater.md +1 -1
  11. package/agents/gsd-mempalace-curator.md +0 -1
  12. package/agents/gsd-pattern-mapper.md +11 -0
  13. package/agents/gsd-phase-researcher.md +3 -1
  14. package/agents/gsd-plan-checker.md +15 -55
  15. package/agents/gsd-planner.md +6 -4
  16. package/agents/gsd-project-researcher.md +1 -1
  17. package/agents/gsd-research-synthesizer.md +2 -2
  18. package/agents/gsd-roadmapper.md +15 -11
  19. package/agents/gsd-ui-checker.md +63 -4
  20. package/agents/gsd-ui-researcher.md +41 -3
  21. package/agents/gsd-verifier.md +1 -1
  22. package/bin/install.js +609 -134
  23. package/commands/gsd/discuss-phase.md +1 -1
  24. package/commands/gsd/import.md +1 -1
  25. package/commands/gsd/quick.md +8 -4
  26. package/gsd-core/bin/gsd-tools.cjs +567 -51
  27. package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
  28. package/gsd-core/bin/lib/adr-parser.cjs +13 -7
  29. package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
  30. package/gsd-core/bin/lib/api-coverage.cjs +30 -9
  31. package/gsd-core/bin/lib/artifacts.cjs +2 -0
  32. package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
  33. package/gsd-core/bin/lib/audit.cjs +163 -41
  34. package/gsd-core/bin/lib/broken-windows.cjs +306 -28
  35. package/gsd-core/bin/lib/capability-lock.cjs +10 -4
  36. package/gsd-core/bin/lib/capability-registry.cjs +336 -95
  37. package/gsd-core/bin/lib/capability-state.cjs +18 -3
  38. package/gsd-core/bin/lib/capability-validator.cjs +205 -18
  39. package/gsd-core/bin/lib/check-command-router.cjs +145 -5
  40. package/gsd-core/bin/lib/cli-exit.cjs +496 -10
  41. package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
  42. package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
  43. package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
  44. package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
  45. package/gsd-core/bin/lib/commands.cjs +543 -44
  46. package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
  47. package/gsd-core/bin/lib/config-loader.cjs +118 -29
  48. package/gsd-core/bin/lib/config.cjs +92 -2
  49. package/gsd-core/bin/lib/configuration.cjs +129 -37
  50. package/gsd-core/bin/lib/core-utils.cjs +84 -7
  51. package/gsd-core/bin/lib/edge-probe.cjs +9 -1
  52. package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
  53. package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
  54. package/gsd-core/bin/lib/frontmatter.cjs +840 -305
  55. package/gsd-core/bin/lib/gap-checker.cjs +27 -3
  56. package/gsd-core/bin/lib/git-base-branch.cjs +174 -39
  57. package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
  58. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +6 -3
  59. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
  60. package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
  61. package/gsd-core/bin/lib/host-integration.cjs +39 -6
  62. package/gsd-core/bin/lib/init-command-router.cjs +118 -21
  63. package/gsd-core/bin/lib/init.cjs +120 -41
  64. package/gsd-core/bin/lib/install-engine.cjs +68 -3
  65. package/gsd-core/bin/lib/install-model-override-resolver.cjs +33 -1
  66. package/gsd-core/bin/lib/install-profiles.cjs +78 -4
  67. package/gsd-core/bin/lib/installer-migration-report.cjs +3 -0
  68. package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
  69. package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
  70. package/gsd-core/bin/lib/intel.cjs +101 -26
  71. package/gsd-core/bin/lib/io.cjs +160 -15
  72. package/gsd-core/bin/lib/learnings.cjs +85 -14
  73. package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
  74. package/gsd-core/bin/lib/markdown-table.cjs +52 -4
  75. package/gsd-core/bin/lib/milestone.cjs +90 -5
  76. package/gsd-core/bin/lib/model-catalog.cjs +177 -19
  77. package/gsd-core/bin/lib/model-resolver.cjs +10 -28
  78. package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
  79. package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
  80. package/gsd-core/bin/lib/phase-id.cjs +70 -4
  81. package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
  82. package/gsd-core/bin/lib/phase-locator.cjs +138 -17
  83. package/gsd-core/bin/lib/phase.cjs +405 -84
  84. package/gsd-core/bin/lib/plan-document.cjs +263 -0
  85. package/gsd-core/bin/lib/plan-scan.cjs +13 -2
  86. package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
  87. package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
  88. package/gsd-core/bin/lib/planning-snapshot.cjs +18 -14
  89. package/gsd-core/bin/lib/planning-workspace.cjs +56 -0
  90. package/gsd-core/bin/lib/probe-core.cjs +4 -1
  91. package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
  92. package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
  93. package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
  94. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
  95. package/gsd-core/bin/lib/review-lane-descriptor.cjs +9 -9
  96. package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
  97. package/gsd-core/bin/lib/roadmap-parser.cjs +79 -16
  98. package/gsd-core/bin/lib/roadmap.cjs +74 -19
  99. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +96 -8
  100. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +34 -1
  101. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +287 -55
  102. package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
  103. package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
  104. package/gsd-core/bin/lib/shell-command-projection.cjs +71 -8
  105. package/gsd-core/bin/lib/smart-entry.cjs +12 -22
  106. package/gsd-core/bin/lib/spec-section.cjs +12 -7
  107. package/gsd-core/bin/lib/state-command-router.cjs +47 -18
  108. package/gsd-core/bin/lib/state-contract.cjs +359 -0
  109. package/gsd-core/bin/lib/state-document.cjs +186 -0
  110. package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
  111. package/gsd-core/bin/lib/state-transition.cjs +517 -101
  112. package/gsd-core/bin/lib/state.cjs +946 -163
  113. package/gsd-core/bin/lib/surface.cjs +10 -2
  114. package/gsd-core/bin/lib/task-command-router.cjs +111 -1
  115. package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
  116. package/gsd-core/bin/lib/teams-status.cjs +4 -1
  117. package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
  118. package/gsd-core/bin/lib/uat.cjs +1376 -125
  119. package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
  120. package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
  121. package/gsd-core/bin/lib/unusable-input.cjs +13 -0
  122. package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
  123. package/gsd-core/bin/lib/vendor/README.md +43 -5
  124. package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
  125. package/gsd-core/bin/lib/verification.cjs +14 -1
  126. package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
  127. package/gsd-core/bin/lib/verify.cjs +95 -40
  128. package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
  129. package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
  130. package/gsd-core/bin/lib/worktree-safety.cjs +177 -21
  131. package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
  132. package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
  133. package/gsd-core/bin/shared/exit-codes.json +8 -0
  134. package/gsd-core/bin/shared/exit-codes.sh +20 -0
  135. package/gsd-core/bin/shared/model-catalog.json +8 -1
  136. package/gsd-core/references/agent-contracts.md +3 -2
  137. package/gsd-core/references/api-coverage.md +24 -2
  138. package/gsd-core/references/autonomous-smart-discuss.md +3 -3
  139. package/gsd-core/references/checkpoints.md +37 -19
  140. package/gsd-core/references/decimal-phase-calculation.md +5 -5
  141. package/gsd-core/references/edge-probe.md +8 -0
  142. package/gsd-core/references/execute-mvp-tdd.md +1 -3
  143. package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
  144. package/gsd-core/references/execute-phase-wave-guard.md +11 -9
  145. package/gsd-core/references/failing-direction.md +78 -0
  146. package/gsd-core/references/gate-prompts.md +1 -1
  147. package/gsd-core/references/git-integration.md +5 -5
  148. package/gsd-core/references/git-planning-commit.md +3 -3
  149. package/gsd-core/references/gsd-run-resolver.md +1 -1
  150. package/gsd-core/references/loop-hook-dispatch.md +22 -0
  151. package/gsd-core/references/model-profiles.md +1 -1
  152. package/gsd-core/references/nyquist-compliance.md +74 -0
  153. package/gsd-core/references/offer-next.md +3 -5
  154. package/gsd-core/references/phase-argument-parsing.md +3 -3
  155. package/gsd-core/references/planner-failing-direction.md +53 -0
  156. package/gsd-core/references/planner-human-verify-mode.md +15 -1
  157. package/gsd-core/references/planner-revision.md +1 -1
  158. package/gsd-core/references/planner-verify-command-grounding.md +17 -0
  159. package/gsd-core/references/planning-config.md +37 -8
  160. package/gsd-core/references/reviewer-instances.md +31 -0
  161. package/gsd-core/references/runtime-aware-dispatch.md +1 -1
  162. package/gsd-core/references/tdd.md +1 -3
  163. package/gsd-core/references/ui-brand.md +65 -21
  164. package/gsd-core/references/ui-consideration-probe.md +1 -1
  165. package/gsd-core/references/universal-anti-patterns.md +2 -2
  166. package/gsd-core/references/verify-command-path-resolvability.md +42 -0
  167. package/gsd-core/references/verify-mvp-mode.md +1 -1
  168. package/gsd-core/references/workstream-flag.md +11 -11
  169. package/gsd-core/templates/README.md +1 -1
  170. package/gsd-core/templates/SECURITY.md +3 -3
  171. package/gsd-core/templates/UI-SPEC.md +25 -3
  172. package/gsd-core/templates/VALIDATION.md +3 -3
  173. package/gsd-core/templates/phase-prompt.md +3 -0
  174. package/gsd-core/templates/state.md +7 -0
  175. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  176. package/gsd-core/workflows/add-backlog.md +1 -1
  177. package/gsd-core/workflows/add-phase.md +3 -3
  178. package/gsd-core/workflows/add-tests.md +3 -8
  179. package/gsd-core/workflows/add-todo.md +1 -1
  180. package/gsd-core/workflows/ai-integration-phase.md +4 -9
  181. package/gsd-core/workflows/audit-fix.md +12 -3
  182. package/gsd-core/workflows/audit-milestone.md +9 -9
  183. package/gsd-core/workflows/audit-uat.md +17 -2
  184. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
  185. package/gsd-core/workflows/autonomous.md +10 -26
  186. package/gsd-core/workflows/check-todos.md +1 -1
  187. package/gsd-core/workflows/cleanup.md +2 -2
  188. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +1 -1
  189. package/gsd-core/workflows/code-review-fix.md +1 -1
  190. package/gsd-core/workflows/code-review.md +121 -40
  191. package/gsd-core/workflows/complete-milestone.md +15 -10
  192. package/gsd-core/workflows/debug.md +5 -3
  193. package/gsd-core/workflows/diagnose-issues.md +12 -6
  194. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  195. package/gsd-core/workflows/discuss-phase/modes/chain.md +3 -7
  196. package/gsd-core/workflows/discuss-phase/modes/text.md +1 -1
  197. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
  198. package/gsd-core/workflows/discuss-phase-assumptions.md +2 -2
  199. package/gsd-core/workflows/discuss-phase.md +1 -1
  200. package/gsd-core/workflows/do.md +3 -6
  201. package/gsd-core/workflows/docs-update.md +5 -4
  202. package/gsd-core/workflows/edit-phase.md +1 -1
  203. package/gsd-core/workflows/eval-review.md +4 -9
  204. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
  205. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +113 -11
  206. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
  207. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
  208. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  209. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +22 -4
  210. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
  211. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
  212. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -2
  213. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
  214. package/gsd-core/workflows/execute-phase.md +38 -54
  215. package/gsd-core/workflows/execute-plan.md +17 -12
  216. package/gsd-core/workflows/explore.md +1 -1
  217. package/gsd-core/workflows/extract-learnings.md +1 -1
  218. package/gsd-core/workflows/fast.md +2 -2
  219. package/gsd-core/workflows/forensics.md +1 -1
  220. package/gsd-core/workflows/graduation.md +5 -5
  221. package/gsd-core/workflows/health.md +3 -6
  222. package/gsd-core/workflows/import.md +14 -11
  223. package/gsd-core/workflows/inbox.md +4 -5
  224. package/gsd-core/workflows/ingest-docs.md +44 -11
  225. package/gsd-core/workflows/insert-phase.md +5 -5
  226. package/gsd-core/workflows/list-seeds.md +5 -3
  227. package/gsd-core/workflows/list-workspaces.md +1 -1
  228. package/gsd-core/workflows/manager.md +12 -23
  229. package/gsd-core/workflows/map-codebase.md +1 -1
  230. package/gsd-core/workflows/milestone-summary.md +1 -1
  231. package/gsd-core/workflows/mvp-phase.md +2 -2
  232. package/gsd-core/workflows/new-milestone.md +9 -21
  233. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
  234. package/gsd-core/workflows/new-project.md +12 -26
  235. package/gsd-core/workflows/new-workspace.md +1 -1
  236. package/gsd-core/workflows/next.md +2 -2
  237. package/gsd-core/workflows/pause-work.md +1 -1
  238. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
  239. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +1 -1
  240. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -4
  241. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +3 -3
  242. package/gsd-core/workflows/plan-phase.md +121 -42
  243. package/gsd-core/workflows/plan-review-convergence.md +46 -9
  244. package/gsd-core/workflows/plant-seed.md +2 -2
  245. package/gsd-core/workflows/pr-branch.md +187 -51
  246. package/gsd-core/workflows/profile-user.md +16 -14
  247. package/gsd-core/workflows/progress.md +27 -12
  248. package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
  249. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -3
  250. package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
  251. package/gsd-core/workflows/quick/steps/research-phase.md +2 -4
  252. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
  253. package/gsd-core/workflows/quick.md +20 -29
  254. package/gsd-core/workflows/remove-phase.md +4 -4
  255. package/gsd-core/workflows/remove-workspace.md +2 -2
  256. package/gsd-core/workflows/resume-project.md +8 -12
  257. package/gsd-core/workflows/review.md +193 -15
  258. package/gsd-core/workflows/scan.md +1 -1
  259. package/gsd-core/workflows/secure-phase.md +2 -2
  260. package/gsd-core/workflows/settings-advanced.md +7 -9
  261. package/gsd-core/workflows/settings-integrations.md +64 -31
  262. package/gsd-core/workflows/settings.md +3 -5
  263. package/gsd-core/workflows/ship.md +12 -6
  264. package/gsd-core/workflows/sketch-wrap-up.md +11 -17
  265. package/gsd-core/workflows/sketch.md +12 -18
  266. package/gsd-core/workflows/smart-entry.md +3 -5
  267. package/gsd-core/workflows/spec-phase.md +23 -1
  268. package/gsd-core/workflows/spike-wrap-up.md +7 -11
  269. package/gsd-core/workflows/spike.md +20 -31
  270. package/gsd-core/workflows/stats.md +2 -2
  271. package/gsd-core/workflows/sync-skills.md +1 -1
  272. package/gsd-core/workflows/thread.md +11 -7
  273. package/gsd-core/workflows/transition.md +5 -5
  274. package/gsd-core/workflows/ui-phase.md +10 -16
  275. package/gsd-core/workflows/ui-review.md +6 -10
  276. package/gsd-core/workflows/ultraplan-phase.md +5 -13
  277. package/gsd-core/workflows/undo.md +8 -16
  278. package/gsd-core/workflows/update.md +6 -10
  279. package/gsd-core/workflows/validate-phase.md +2 -2
  280. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
  281. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
  282. package/gsd-core/workflows/verify-work.md +57 -18
  283. package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
  284. package/hooks/dist/gsd-config-reload.js +18 -12
  285. package/hooks/dist/gsd-context-monitor.js +19 -10
  286. package/hooks/dist/gsd-cursor-post-tool.js +3 -1
  287. package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
  288. package/hooks/dist/gsd-cursor-session-start.js +2 -1
  289. package/hooks/dist/gsd-cursor-stop.js +2 -1
  290. package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
  291. package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
  292. package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
  293. package/hooks/dist/gsd-graphify-update.sh +22 -18
  294. package/hooks/dist/gsd-node-runner.sh +76 -0
  295. package/hooks/dist/gsd-phase-boundary.sh +1 -0
  296. package/hooks/dist/gsd-prompt-guard.js +16 -7
  297. package/hooks/dist/gsd-read-guard.js +16 -7
  298. package/hooks/dist/gsd-read-injection-scanner.js +17 -8
  299. package/hooks/dist/gsd-session-state.sh +1 -0
  300. package/hooks/dist/gsd-statusline.js +215 -26
  301. package/hooks/dist/gsd-validate-commit.sh +80 -6
  302. package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
  303. package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
  304. package/hooks/dist/gsd-workflow-guard.js +34 -16
  305. package/hooks/dist/gsd-worktree-path-guard.js +36 -21
  306. package/hooks/dist/gsd-write-guard.js +35 -25
  307. package/hooks/dist/lib/cli-exit.js +560 -0
  308. package/hooks/dist/lib/exit-code-registry.js +98 -0
  309. package/hooks/dist/lib/git-probe.js +84 -0
  310. package/hooks/dist/lib/hook-exit.js +81 -0
  311. package/hooks/dist/managed-hooks-registry.cjs +3 -0
  312. package/hooks/gsd-agent-isolation-guard.js +77 -38
  313. package/hooks/gsd-config-reload.js +18 -12
  314. package/hooks/gsd-context-monitor.js +19 -10
  315. package/hooks/gsd-cursor-post-tool.js +3 -1
  316. package/hooks/gsd-cursor-pre-tool.js +3 -1
  317. package/hooks/gsd-cursor-session-start.js +2 -1
  318. package/hooks/gsd-cursor-stop.js +2 -1
  319. package/hooks/gsd-cursor-subagent-start.js +28 -23
  320. package/hooks/gsd-cursor-subagent-stop.js +3 -1
  321. package/hooks/gsd-ensure-canonical-path.js +2 -1
  322. package/hooks/gsd-graphify-update.sh +22 -18
  323. package/hooks/gsd-node-runner.sh +76 -0
  324. package/hooks/gsd-phase-boundary.sh +1 -0
  325. package/hooks/gsd-prompt-guard.js +16 -7
  326. package/hooks/gsd-read-guard.js +16 -7
  327. package/hooks/gsd-read-injection-scanner.js +17 -8
  328. package/hooks/gsd-session-state.sh +1 -0
  329. package/hooks/gsd-statusline.js +215 -26
  330. package/hooks/gsd-validate-commit.sh +80 -6
  331. package/hooks/gsd-windsurf-pre-command.js +16 -11
  332. package/hooks/gsd-windsurf-pre-write.js +22 -13
  333. package/hooks/gsd-workflow-guard.js +34 -16
  334. package/hooks/gsd-worktree-path-guard.js +36 -21
  335. package/hooks/gsd-write-guard.js +35 -25
  336. package/hooks/lib/cli-exit.js +560 -0
  337. package/hooks/lib/exit-code-registry.js +98 -0
  338. package/hooks/lib/git-probe.js +84 -0
  339. package/hooks/lib/hook-exit.js +81 -0
  340. package/hooks/managed-hooks-registry.cjs +3 -0
  341. package/package.json +12 -7
  342. package/scripts/base64-scan.sh +74 -12
  343. package/scripts/build-hooks.js +5 -0
  344. package/scripts/check-glossary-refs.cjs +77 -15
  345. package/scripts/check-mutation-score-ratchet.cjs +156 -0
  346. package/scripts/ci-check-job-near-cap.cjs +49 -0
  347. package/scripts/ci-pr-mergeability.cjs +262 -0
  348. package/scripts/ci-test-scope.cjs +45 -12
  349. package/scripts/ci-timeout-report.cjs +230 -0
  350. package/scripts/docs-guard-registry.cjs +396 -0
  351. package/scripts/gen-capability-registry.cjs +8 -6
  352. package/scripts/gen-exit-code-docs.cjs +318 -0
  353. package/scripts/gen-exit-code-registry.cjs +891 -0
  354. package/scripts/gen-features.cjs +836 -0
  355. package/scripts/gen-hooks-cli-exit.cjs +239 -0
  356. package/scripts/gen-install-tree-fixtures.cjs +2 -2
  357. package/scripts/gen-loop-host-contract.cjs +134 -1
  358. package/scripts/gen-scripts-cli-exit.cjs +185 -0
  359. package/scripts/gen-state-md-docs.cjs +727 -0
  360. package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
  361. package/scripts/lib/ci-job-timing.cjs +72 -0
  362. package/scripts/lib/cli-exit.cjs +546 -44
  363. package/scripts/lib/drift-scan.cjs +32 -2
  364. package/scripts/lib/exit-code-registry.cjs +98 -0
  365. package/scripts/lib/ndjson-reporter.cjs +119 -0
  366. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  367. package/scripts/lint-docs-guard-registration.cjs +495 -0
  368. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +193 -0
  369. package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
  370. package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
  371. package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
  372. package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
  373. package/scripts/lint-phase-enumeration-drift.cjs +21 -8
  374. package/scripts/lint-planning-prompt-drift.cjs +38 -1
  375. package/scripts/lint-removed-but-needed.cjs +184 -16
  376. package/scripts/lint-seam-enforcement.cjs +182 -0
  377. package/scripts/lint-slug-derivation-drift.cjs +921 -0
  378. package/scripts/lint-source-test-name-collision.cjs +241 -0
  379. package/scripts/lint-state-write-path-drift.cjs +337 -432
  380. package/scripts/lint-test-file-count.allowlist.json +122 -4
  381. package/scripts/lint-test-file-count.cjs +25 -3
  382. package/scripts/lint-unreachable-guard-drift.cjs +51 -64
  383. package/scripts/lint-vendored-deps.cjs +208 -35
  384. package/scripts/mutation-matrix.cjs +599 -50
  385. package/scripts/prompt-injection-scan.sh +75 -14
  386. package/scripts/secret-scan.sh +75 -13
  387. package/scripts/select-docs-guards.cjs +56 -0
  388. package/scripts/sync-runtime-launcher.cjs +22 -3
  389. package/skills/gsd-discuss-phase/SKILL.md +1 -1
  390. package/skills/gsd-import/SKILL.md +1 -1
  391. package/skills/gsd-quick/SKILL.md +8 -4
  392. package/vscode/package.json +1 -1
  393. package/bin/lib/ui-safety-gate.cjs +0 -109
  394. package/scripts/lint-emitted-drift-ack.cjs +0 -344
  395. package/scripts/state-write-path-drift-baseline.json +0 -19
@@ -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).
@@ -55,7 +55,7 @@ Group by plan, dimension, severity.
55
55
  ### Step 6: Commit
56
56
 
57
57
  ```bash
58
- gsd-tools query commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
58
+ gsd_run query commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
59
59
  ```
60
60
 
61
61
  ### Step 7: Return Revision Summary
@@ -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,11 +289,12 @@ 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. |
@@ -278,6 +305,7 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
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 |
@@ -398,7 +427,7 @@ Several config fields affect each other or trigger special behavior:
398
427
 
399
428
  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
429
 
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).
430
+ 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
431
 
403
432
  ---
404
433
 
@@ -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.
@@ -19,7 +19,7 @@ preserves named-dispatch behavior on older GSD installs that lack the query.
19
19
 
20
20
  The persona rides `${AGENT_SKILLS_<ROLE>}` (Phase 3 / #2510) regardless of the
21
21
  resolved type — on non-Claude runtimes with no `agent_skills` config,
22
- `gsd-tools query agent-skills <role>` returns the installed agent prompt as
22
+ `gsd_run query agent-skills <role>` returns the installed agent prompt as
23
23
  the block. So a coder dispatch with the planner persona injected gives kimi-code
24
24
  the planner's behavior in the coder built-in's process.
25
25
 
@@ -289,9 +289,7 @@ When `workflow.tdd_mode` is enabled, the execute-phase orchestrator inserts a co
289
289
  ### Review Checkpoint Format
290
290
 
291
291
  ```
292
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
293
- TDD REVIEW — Phase {X}
294
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
292
+ ### TDD REVIEW — Phase {X}
295
293
 
296
294
  TDD Plans: {count} | Gate violations: {count}
297
295
 
@@ -2,14 +2,51 @@
2
2
 
3
3
  Visual patterns for user-facing GSD output. Orchestrators @-reference this file.
4
4
 
5
+ ## Separators and Banners
6
+
7
+ **Never emit a fixed-width run of box-drawing characters.** A run of `━`, `─` or
8
+ `═` is ordinary text to the host that renders your output. In a narrower pane it
9
+ wraps, leaving orphan glyphs on a second line and coming apart from the heading it
10
+ was meant to frame. Markdown adapts to the available width; a 53-character rule
11
+ does not.
12
+
13
+ Three forms, and nothing else:
14
+
15
+ | Need | Emit |
16
+ |---|---|
17
+ | A titled section — stage, phase, checkpoint, completion, error | `### {TITLE}` (ATX heading) |
18
+ | A break between two sections | `---` on its own line, **with a blank line above it** |
19
+ | A framed panel of rows | `### {TITLE}` followed by the rows as plain lines |
20
+
21
+ **The blank line above `---` is load-bearing, not cosmetic.** A `---` placed
22
+ directly under a line of text is parsed as a setext heading underline for that
23
+ line, not as a thematic break — the rule silently swallows the line above it. A
24
+ blank line is what makes it a thematic break. (A blank line *after* `---` is
25
+ optional: a thematic break is a leaf block, so whatever follows starts a new
26
+ block either way. Add one where it reads better.)
27
+
28
+ **A stage banner is a heading alone — do not put a `---` above it.** An ATX
29
+ heading already separates, and it cannot be misparsed the way a bare `---` can.
30
+
31
+ ### Why this is unconditional, not per-runtime
32
+
33
+ The alternative considered was a `rendersMarkdown` capability key, keeping
34
+ line-art for terminal-oriented runtimes and Markdown for Markdown hosts. It was
35
+ rejected: it needs a new descriptor key across every runtime plus the resolver,
36
+ and it leaves two output conventions to keep in sync forever — the divergence
37
+ class this repo already has a defect entry for. A heading and a thematic break
38
+ carry the same structure in a plain terminal that a rule pair did, without
39
+ committing to a width, so the second convention buys nothing. If a runtime ever
40
+ turns up that genuinely needs line-art, add the key then, against that evidence.
41
+
42
+ ---
43
+
5
44
  ## Stage Banners
6
45
 
7
46
  Use for major workflow transitions.
8
47
 
9
48
  ```
10
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
11
- GSD ► {STAGE NAME}
12
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
49
+ ### GSD ► {STAGE NAME}
13
50
  ```
14
51
 
15
52
  **Stage names (uppercase):**
@@ -25,20 +62,18 @@ Use for major workflow transitions.
25
62
 
26
63
  ---
27
64
 
28
- ## Checkpoint Boxes
65
+ ## Checkpoint Panels
29
66
 
30
- User action required. 62-character width.
67
+ User action required.
31
68
 
32
69
  ```
33
- ╔══════════════════════════════════════════════════════════════╗
34
- ║ CHECKPOINT: {Type} ║
35
- ╚══════════════════════════════════════════════════════════════╝
70
+ ### CHECKPOINT: {Type}
36
71
 
37
72
  {Content}
38
73
 
39
- ──────────────────────────────────────────────────────────────
40
- → {ACTION PROMPT}
41
- ──────────────────────────────────────────────────────────────
74
+ ---
75
+
76
+ **→ {ACTION PROMPT}**
42
77
  ```
43
78
 
44
79
  **Types:**
@@ -60,6 +95,9 @@ User action required. 62-character width.
60
95
  🎉 Milestone complete (only in banner)
61
96
  ```
62
97
 
98
+ Status symbols are single characters, not runs — they do not wrap and are
99
+ unaffected by the separator rule above.
100
+
63
101
  ---
64
102
 
65
103
  ## Progress Display
@@ -79,6 +117,9 @@ Tasks: 2/4 complete
79
117
  Plans: 3/5 complete
80
118
  ```
81
119
 
120
+ The bar itself is a fixed 10-cell gauge, not a separator; it is intentionally
121
+ fixed-width and stays as it is.
122
+
82
123
  ---
83
124
 
84
125
  ## Spawning Indicators
@@ -104,7 +145,7 @@ Plans: 3/5 complete
104
145
  Always at end of major completions.
105
146
 
106
147
  ```
107
- ───────────────────────────────────────────────────────────────
148
+ ---
108
149
 
109
150
  ## ▶ Next Up
110
151
 
@@ -114,23 +155,19 @@ Always at end of major completions.
114
155
 
115
156
  `{copy-paste command}`
116
157
 
117
- ───────────────────────────────────────────────────────────────
158
+ ---
118
159
 
119
160
  **Also available:**
120
161
  - `/gsd-alternative-1` — description
121
162
  - `/gsd-alternative-2` — description
122
-
123
- ───────────────────────────────────────────────────────────────
124
163
  ```
125
164
 
126
165
  ---
127
166
 
128
- ## Error Box
167
+ ## Error Panel
129
168
 
130
169
  ```
131
- ╔══════════════════════════════════════════════════════════════╗
132
- ║ ERROR ║
133
- ╚══════════════════════════════════════════════════════════════╝
170
+ ### ERROR
134
171
 
135
172
  {Error description}
136
173
 
@@ -149,14 +186,21 @@ Always at end of major completions.
149
186
  | 3 | ○ | 0/2 | 0% |
150
187
  ```
151
188
 
189
+ Table rules use ASCII `-`, never box-drawing characters.
190
+
152
191
  ---
153
192
 
154
193
  ## Anti-Patterns
155
194
 
156
- - Varying box/banner widths
157
- - Mixing banner styles (`===`, `---`, `***`)
195
+ - Fixed-width runs of `━`, `─` or `═` as separators — they wrap in a narrow pane
196
+ - Box panels drawn with double-line box characters (U+2554, U+2557, U+255A, U+255D, U+2551, U+2560, U+2563) — the borders wrap independently of their contents. They are named here by code point rather than shown, because the guard below rejects the characters themselves anywhere in shipped content.
197
+ - A `---` directly under a line of text with no blank line between — that is a setext heading underline, not a break, and it swallows the line above
198
+ - Boxing a heading between two rules — the heading is the separator
199
+ - Mixing banner styles (`===`, `***`)
158
200
  - Skipping `GSD ►` prefix in banners
159
201
  - Random emoji (`🚀`, `✨`, `💫`)
160
202
  - Missing Next Up block after completions
161
203
 
204
+ Enforced by `tests/responsive-separators.test.cjs`.
205
+
162
206
  </ui_patterns>
@@ -69,5 +69,5 @@ closed). The **open subset is prose-owned in [domain-probes.md](./domain-probes.
69
69
  real-time/offline/optimistic-UI, deep accessibility (WCAG breadth), i18n / RTL depth, and
70
70
  emerging interaction paradigms (gesture/voice/reduced-motion/print) are open-ended and
71
71
  cue-triggered — they do not belong in this closed taxonomy. This probe **complements** the
72
- `gsd-ui-checker` six quality dimensions (it adds a state-coverage axis); it does not change the
72
+ `gsd-ui-checker` seven quality dimensions (it adds a state-coverage axis); it does not change the
73
73
  BLOCK/FLAG/PASS enum or the dimensions themselves.
@@ -34,7 +34,7 @@ Reference: `gsd-core/references/questioning.md` for the full anti-pattern list.
34
34
 
35
35
  ## State Management Anti-Patterns
36
36
 
37
- 15. **No direct Write/Edit to STATE.md or ROADMAP.md for mutations.** Always use `gsd-tools query` for registered state/roadmap handlers (e.g. `state.update`, `state.advance-plan`, `roadmap.update-plan-progress`), or legacy `node …/gsd-tools.cjs` for CLI-only commands. Direct Write tool usage bypasses safe update logic and is unsafe in multi-session environments. Exception: first-time creation of STATE.md from template is allowed.
37
+ 15. **No direct Write/Edit to STATE.md or ROADMAP.md for mutations.** Always use `gsd_run query` for registered state/roadmap handlers (e.g. `state.update`, `state.advance-plan`, `roadmap.update-plan-progress`), or legacy `node …/gsd-tools.cjs` for CLI-only commands. Direct Write tool usage bypasses safe update logic and is unsafe in multi-session environments. Exception: first-time creation of STATE.md from template is allowed.
38
38
 
39
39
  ## Behavioral Rules
40
40
 
@@ -53,7 +53,7 @@ Reference: `gsd-core/references/questioning.md` for the full anti-pattern list.
53
53
  ## GSD-Specific Rules
54
54
 
55
55
  24. **Do not** check for `mode === 'auto'` or `mode === 'autonomous'` -- GSD uses `yolo` config flag. Check `yolo: true` for autonomous mode, absence or `false` for interactive mode.
56
- 25. **Prefer `gsd-tools query`** for orchestration when a handler exists; when shelling out to the legacy CLI, use **`gsd-tools.cjs`** (not `gsd-tools.js` or any other filename) — GSD ships the programmatic API as CommonJS for Node.js CLI compatibility.
56
+ 25. **Prefer `gsd_run query`** for orchestration when a handler exists; when shelling out to the legacy CLI, go through the same `gsd_run` launcher rather than naming the shim file. The shim is not on PATH under any name ending in `.cjs`, and an agent that meets the bare filename falls back to searching the filesystem for it — on Git Bash for Windows that is a full-drive `find.exe` traversal (#3809). `gsd_run` resolves the CommonJS shim itself across every runtime home.
57
57
  26. **Plan files MUST follow `{padded_phase}-{NN}-PLAN.md` pattern** (e.g., `01-01-PLAN.md`). Never use `PLAN-01.md`, `plan-01.md`, or any other variation -- gsd-tools detection depends on this exact pattern.
58
58
  27. **Do not start executing the next plan before writing the SUMMARY.md for the current plan** -- downstream plans may reference it via `@` includes.
59
59
 
@@ -0,0 +1,42 @@
1
+ # Verify Command Path Resolvability (#2401)
2
+
3
+ > Reference file for gsd-plan-checker agent. Loaded on-demand via `@` reference.
4
+
5
+ **Question:** Does each `<automated>` command's target directory actually resolve from the
6
+ executor's cwd (the project root)? Format sanity above asks whether the *pattern* can match;
7
+ this asks whether the command can *run at all*.
8
+
9
+ **Do not hand-reason the filesystem.** #2401 is precisely the failure of doing so: this
10
+ checker flagged a bad `cd ../../frontend` (correct), then prescribed two successively-wrong
11
+ replacement paths — the second citing a `package.json` that did not exist. Consume the
12
+ deterministic probe result, never re-derive it yourself.
13
+
14
+ `gsd-core/workflows/plan-phase.md` already runs the probe **before** spawning this checker and
15
+ interpolates the result into the verification prompt as `{VERIFY_PATHS}`, inside a
16
+ `<verify_command_path_probe>` block. This dimension reads that already-supplied JSON — it never
17
+ invokes `gsd_run check verify-command-paths` itself. If `{VERIFY_PATHS}` is absent from the
18
+ prompt, treat this dimension as silent (nothing to check) rather than trying to run the probe.
19
+
20
+ The probe never executes command text (PLAN.md is untrusted, LLM-authored). It recognizes two
21
+ grounded forms — a leading `cd <literal>` chain and `npm --prefix <literal>` — and refuses to
22
+ guess at anything else.
23
+
24
+ **Process:** for each row in `.commands`, act on `severity` only:
25
+
26
+ | `severity` | `reason` | Action |
27
+ |---|---|---|
28
+ | `blocker` | `missing_dir` / `no_manifest` | **BLOCKER** — quote `rawTarget` and `target` verbatim |
29
+ | `warning` | `dynamic_path` / `outside_root` / `script_missing` / `manifest_unreadable` | **WARNING** |
30
+ | `none` | — | silent |
31
+
32
+ Rules:
33
+ - **Report, never prescribe.** State the target that failed to resolve and what was missing.
34
+ Choosing the replacement is the planner's job — it now receives the prior phase's proven
35
+ commands (see `prior_verify_commands` in the planning context).
36
+ - `status: pending_creation` means an earlier task in this phase creates that directory. **Not
37
+ a finding.** Say nothing.
38
+ - `unresolvable` means the probe could not ground the path (a variable, glob, substitution, or
39
+ `~`). That is a WARNING, never a BLOCKER — and never a licence to guess the literal path.
40
+ - A non-empty `readError` means the probe **could not look**. Report that as a WARNING in its
41
+ own words; it is not a clean bill of health.
42
+ - `MISSING …` sentinels are Dimension 8's business — this dimension stays silent on them.
@@ -14,7 +14,7 @@ The user-flow form mirrors what a real user does: open, fill, click, see. No HTT
14
14
  ## When this framing applies
15
15
 
16
16
  The framing fires when:
17
- - The phase under verification has `**Mode:** mvp` in ROADMAP.md (parsed via `gsd-tools query roadmap.get-phase --pick mode`).
17
+ - The phase under verification has `**Mode:** mvp` in ROADMAP.md (parsed via `gsd_run query roadmap.get-phase --pick mode`).
18
18
  - AND the phase has a user-story-formatted goal (set by `/gsd mvp-phase` per Phase 2): "As a [user role], I want to [capability], so that [outcome]."
19
19
 
20
20
  If the phase has `mode: mvp` but the goal is NOT in user-story format, the verifier surfaces this as a discrepancy and asks the user to run `/gsd mvp-phase` to reformat the goal — same pattern as the planner agent under MVP_MODE (per `gsd-core/references/planner-mvp-mode.md`).
@@ -109,19 +109,19 @@ This ensures workstream scope chains automatically through the workflow:
109
109
  ## CLI Usage
110
110
 
111
111
  ```bash
112
- # All gsd-tools query commands accept --ws
113
- gsd-tools query state.json --ws feature-a
114
- gsd-tools query find-phase 3 --ws feature-b
112
+ # All gsd_run query commands accept --ws
113
+ gsd_run query state.json --ws feature-a
114
+ gsd_run query find-phase 3 --ws feature-b
115
115
 
116
116
  # Session-local switching without --ws on every command
117
- GSD_SESSION_KEY=my-terminal-a gsd-tools query workstream.set feature-a
118
- GSD_SESSION_KEY=my-terminal-a gsd-tools query state.json
119
- GSD_SESSION_KEY=my-terminal-b gsd-tools query workstream.set feature-b
120
- GSD_SESSION_KEY=my-terminal-b gsd-tools query state.json
117
+ GSD_SESSION_KEY=my-terminal-a gsd_run query workstream.set feature-a
118
+ GSD_SESSION_KEY=my-terminal-a gsd_run query state.json
119
+ GSD_SESSION_KEY=my-terminal-b gsd_run query workstream.set feature-b
120
+ GSD_SESSION_KEY=my-terminal-b gsd_run query state.json
121
121
 
122
122
  # Workstream CRUD
123
- gsd-tools query workstream.create <name>
124
- gsd-tools query workstream.list
125
- gsd-tools query workstream.status <name>
126
- gsd-tools query workstream.complete <name>
123
+ gsd_run query workstream.create <name>
124
+ gsd_run query workstream.list
125
+ gsd_run query workstream.status <name>
126
+ gsd_run query workstream.complete <name>
127
127
  ```
@@ -18,7 +18,7 @@ These files live directly at `.planning/` — not inside phase subdirectories.
18
18
  | `REQUIREMENTS.md` | `requirements.md` | `/gsd:new-milestone` | Functional requirements with traceability |
19
19
  | `MILESTONES.md` | `milestone.md` | `/gsd:complete-milestone` | Log of completed milestones with accomplishments |
20
20
  | `BACKLOG.md` | *(inline)* | `/gsd-add-backlog` | Pending ideas and deferred work |
21
- | `LEARNINGS.md` | *(inline)* | `/gsd:extract-learnings`, `/gsd:execute-phase` | Phase retrospective learnings for future plans |
21
+ | `LEARNINGS.md` | *(inline)* | `/gsd:extract-learnings`, `/gsd:execute-phase` (gated: `features.global_learnings`) | Phase retrospective learnings for future plans |
22
22
  | `THREADS.md` | *(inline)* | `/gsd:thread` | Persistent discussion threads |
23
23
  | `config.json` | `config.json` | `/gsd:new-project`, `/gsd:health --repair` | Project-specific GSD configuration |
24
24
  | `CLAUDE.md` | `claude-md.md` | `/gsd-profile` | Auto-assembled Claude Code context file |
@@ -1,11 +1,11 @@
1
1
  ---
2
- phase: {N}
3
- slug: {phase-slug}
2
+ phase: "{N}"
3
+ slug: "{phase-slug}"
4
4
  status: draft
5
5
  # threats_open = count of OPEN threats at or above workflow.security_block_on severity (the blocking gate)
6
6
  threats_open: 0
7
7
  asvs_level: 1
8
- created: {date}
8
+ created: "{date}"
9
9
  ---
10
10
 
11
11
  # Phase {N} — Security