@opengsd/gsd-core 1.9.1 → 1.11.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 (426) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +2 -3
  3. package/.opencode/plugins/gsd-core.js +8 -1
  4. package/agents/gsd-code-fixer.md +27 -3
  5. package/agents/gsd-debug-session-manager.md +11 -0
  6. package/agents/gsd-debugger.md +12 -246
  7. package/agents/gsd-doc-synthesizer.md +2 -4
  8. package/agents/gsd-executor.md +12 -10
  9. package/agents/gsd-integration-checker.md +3 -0
  10. package/agents/gsd-mempalace-curator.md +5 -2
  11. package/agents/gsd-phase-researcher.md +20 -1
  12. package/agents/gsd-plan-checker.md +46 -0
  13. package/agents/gsd-planner.md +49 -54
  14. package/agents/gsd-roadmapper.md +21 -3
  15. package/agents/gsd-user-profiler.md +3 -0
  16. package/agents/gsd-verifier.md +26 -73
  17. package/bin/install.js +1272 -1238
  18. package/bin/lib/ui-safety-gate.cjs +2 -0
  19. package/commands/gsd/code-review.md +1 -1
  20. package/commands/gsd/execute-phase.md +1 -1
  21. package/commands/gsd/map-codebase.md +1 -1
  22. package/commands/gsd/mempalace-capture.md +2 -2
  23. package/commands/gsd/mempalace-recall.md +1 -1
  24. package/commands/gsd/new-milestone.md +2 -2
  25. package/commands/gsd/plan-phase.md +1 -1
  26. package/commands/gsd/quick.md +1 -1
  27. package/commands/gsd/review-backlog.md +2 -1
  28. package/commands/gsd/verify-work.md +1 -1
  29. package/gsd-core/bin/gsd-tools.cjs +1009 -115
  30. package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
  31. package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
  32. package/gsd-core/bin/lib/api-coverage.cjs +123 -5
  33. package/gsd-core/bin/lib/artifacts.cjs +3 -0
  34. package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
  35. package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
  36. package/gsd-core/bin/lib/audit.cjs +926 -202
  37. package/gsd-core/bin/lib/broken-windows.cjs +36 -6
  38. package/gsd-core/bin/lib/capability-consent.cjs +149 -15
  39. package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
  40. package/gsd-core/bin/lib/capability-registry.cjs +608 -148
  41. package/gsd-core/bin/lib/capability-source.cjs +92 -0
  42. package/gsd-core/bin/lib/capability-trust.cjs +444 -25
  43. package/gsd-core/bin/lib/capability-validator.cjs +507 -24
  44. package/gsd-core/bin/lib/capability-writer.cjs +3 -2
  45. package/gsd-core/bin/lib/check-command-router.cjs +114 -38
  46. package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
  47. package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
  48. package/gsd-core/bin/lib/command-aliases.cjs +94 -0
  49. package/gsd-core/bin/lib/command-roster.cjs +44 -1
  50. package/gsd-core/bin/lib/commands.cjs +665 -99
  51. package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
  52. package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
  53. package/gsd-core/bin/lib/config-loader.cjs +76 -0
  54. package/gsd-core/bin/lib/config.cjs +22 -2
  55. package/gsd-core/bin/lib/context-composer.cjs +278 -0
  56. package/gsd-core/bin/lib/context-predicates.cjs +506 -0
  57. package/gsd-core/bin/lib/core-utils.cjs +217 -40
  58. package/gsd-core/bin/lib/decisions.cjs +23 -0
  59. package/gsd-core/bin/lib/docs.cjs +3 -2
  60. package/gsd-core/bin/lib/external-job.cjs +19 -4
  61. package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
  62. package/gsd-core/bin/lib/frontmatter.cjs +239 -32
  63. package/gsd-core/bin/lib/gap-checker.cjs +68 -7
  64. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
  65. package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
  66. package/gsd-core/bin/lib/graphify.cjs +142 -27
  67. package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
  68. package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
  69. package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
  70. package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
  71. package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
  72. package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
  73. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
  74. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
  75. package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
  76. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
  77. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
  78. package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
  79. package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
  80. package/gsd-core/bin/lib/host-integration.cjs +13 -1
  81. package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
  82. package/gsd-core/bin/lib/init-command-router.cjs +83 -8
  83. package/gsd-core/bin/lib/init.cjs +1325 -169
  84. package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
  85. package/gsd-core/bin/lib/install-engine.cjs +805 -264
  86. package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
  87. package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
  88. package/gsd-core/bin/lib/install-profiles.cjs +160 -57
  89. package/gsd-core/bin/lib/install-scope.cjs +270 -0
  90. package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
  91. package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
  92. package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
  93. package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
  94. package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
  95. package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
  96. package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
  97. package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
  98. package/gsd-core/bin/lib/io.cjs +38 -3
  99. package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
  100. package/gsd-core/bin/lib/markdown-table.cjs +133 -20
  101. package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
  102. package/gsd-core/bin/lib/mcp-server.cjs +135 -3
  103. package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
  104. package/gsd-core/bin/lib/milestone.cjs +821 -109
  105. package/gsd-core/bin/lib/model-catalog.cjs +59 -1
  106. package/gsd-core/bin/lib/model-resolver.cjs +183 -40
  107. package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
  108. package/gsd-core/bin/lib/pattern.cjs +122 -0
  109. package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
  110. package/gsd-core/bin/lib/phase-id.cjs +507 -36
  111. package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
  112. package/gsd-core/bin/lib/phase-locator.cjs +258 -58
  113. package/gsd-core/bin/lib/phase.cjs +891 -156
  114. package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
  115. package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
  116. package/gsd-core/bin/lib/plan-scan.cjs +86 -2
  117. package/gsd-core/bin/lib/planning-scope.cjs +31 -0
  118. package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
  119. package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
  120. package/gsd-core/bin/lib/probe-core.cjs +1 -1
  121. package/gsd-core/bin/lib/profile-output.cjs +1 -1
  122. package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
  123. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
  124. package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
  125. package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
  126. package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
  127. package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
  128. package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
  129. package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
  130. package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
  131. package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
  132. package/gsd-core/bin/lib/roadmap.cjs +405 -84
  133. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
  134. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
  135. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
  136. package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
  137. package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
  138. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
  139. package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
  140. package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
  141. package/gsd-core/bin/lib/section-manifest.cjs +209 -0
  142. package/gsd-core/bin/lib/security.cjs +104 -5
  143. package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
  144. package/gsd-core/bin/lib/smart-entry.cjs +154 -22
  145. package/gsd-core/bin/lib/state-command-router.cjs +5 -1
  146. package/gsd-core/bin/lib/state-document.cjs +152 -8
  147. package/gsd-core/bin/lib/state-transition.cjs +424 -105
  148. package/gsd-core/bin/lib/state.cjs +1927 -401
  149. package/gsd-core/bin/lib/surface.cjs +35 -10
  150. package/gsd-core/bin/lib/text-lines.cjs +80 -0
  151. package/gsd-core/bin/lib/token-scanner.cjs +76 -0
  152. package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
  153. package/gsd-core/bin/lib/uat.cjs +706 -64
  154. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
  155. package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
  156. package/gsd-core/bin/lib/unusable-input.cjs +33 -0
  157. package/gsd-core/bin/lib/update-context.cjs +8 -2
  158. package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
  159. package/gsd-core/bin/lib/validate.cjs +20 -6
  160. package/gsd-core/bin/lib/vendor/README.md +37 -0
  161. package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
  162. package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
  163. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  164. package/gsd-core/bin/lib/verification.cjs +287 -20
  165. package/gsd-core/bin/lib/verify.cjs +368 -880
  166. package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
  167. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
  168. package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
  169. package/gsd-core/bin/lib/workstream.cjs +8 -2
  170. package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
  171. package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
  172. package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
  173. package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
  174. package/gsd-core/references/agent-contracts.md +43 -26
  175. package/gsd-core/references/artifact-types.md +10 -3
  176. package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
  177. package/gsd-core/references/checkpoints.md +2 -2
  178. package/gsd-core/references/context-budget.md +1 -1
  179. package/gsd-core/references/debugger-techniques.md +255 -0
  180. package/gsd-core/references/dispatch-isolation-gate.md +138 -0
  181. package/gsd-core/references/doc-conflict-engine.md +1 -1
  182. package/gsd-core/references/execute-mvp-tdd.md +3 -3
  183. package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
  184. package/gsd-core/references/execute-phase-context-guard.md +1 -1
  185. package/gsd-core/references/execute-phase-response-language.md +1 -1
  186. package/gsd-core/references/execute-phase-wave-guard.md +6 -2
  187. package/gsd-core/references/gate-prompts.md +1 -1
  188. package/gsd-core/references/git-planning-commit.md +2 -1
  189. package/gsd-core/references/loop-hook-dispatch.md +39 -2
  190. package/gsd-core/references/model-profiles.md +12 -4
  191. package/gsd-core/references/mvp-concepts.md +9 -9
  192. package/gsd-core/references/planner-guidance.md +3 -9
  193. package/gsd-core/references/planner-preconditions.md +1 -1
  194. package/gsd-core/references/planner-reviews.md +1 -1
  195. package/gsd-core/references/planning-config.md +8 -6
  196. package/gsd-core/references/research-documentation-lookup.md +5 -3
  197. package/gsd-core/references/revision-loop.md +1 -1
  198. package/gsd-core/references/specless-probe-fallback.md +8 -7
  199. package/gsd-core/references/universal-anti-patterns.md +3 -3
  200. package/gsd-core/references/verifier-phase-gates.md +192 -0
  201. package/gsd-core/references/verifier-wiring-patterns.md +100 -0
  202. package/gsd-core/references/verify-mvp-mode.md +1 -1
  203. package/gsd-core/references/workstream-flag.md +22 -6
  204. package/gsd-core/references/worktree-branch-check.md +2 -2
  205. package/gsd-core/templates/discussion-log.md +1 -1
  206. package/gsd-core/templates/phase-prompt.md +2 -4
  207. package/gsd-core/templates/state.md +4 -4
  208. package/gsd-core/templates/summary-complex.md +2 -0
  209. package/gsd-core/templates/summary-minimal.md +2 -0
  210. package/gsd-core/templates/summary-standard.md +2 -0
  211. package/gsd-core/templates/summary.md +2 -0
  212. package/gsd-core/templates/verification-report.md +9 -1
  213. package/gsd-core/workflows/ai-integration-phase.md +9 -11
  214. package/gsd-core/workflows/audit-milestone.md +3 -0
  215. package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
  216. package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
  217. package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
  218. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
  219. package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
  220. package/gsd-core/workflows/autonomous.md +33 -70
  221. package/gsd-core/workflows/cleanup.md +62 -3
  222. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
  223. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
  224. package/gsd-core/workflows/code-review-fix.md +37 -10
  225. package/gsd-core/workflows/code-review.md +74 -166
  226. package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
  227. package/gsd-core/workflows/complete-milestone.md +160 -95
  228. package/gsd-core/workflows/debug.md +16 -17
  229. package/gsd-core/workflows/diagnose-issues.md +56 -8
  230. package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
  231. package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
  232. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
  233. package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
  234. package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
  235. package/gsd-core/workflows/docs-update.md +8 -51
  236. package/gsd-core/workflows/edit-phase.md +26 -1
  237. package/gsd-core/workflows/eval-review.md +3 -5
  238. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
  239. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
  240. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
  241. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
  242. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
  243. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
  244. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
  245. package/gsd-core/workflows/execute-phase.md +103 -187
  246. package/gsd-core/workflows/execute-plan.md +36 -4
  247. package/gsd-core/workflows/explore.md +131 -4
  248. package/gsd-core/workflows/fast.md +10 -2
  249. package/gsd-core/workflows/health.md +73 -4
  250. package/gsd-core/workflows/help/modes/full.md +6 -1
  251. package/gsd-core/workflows/import.md +4 -4
  252. package/gsd-core/workflows/ingest-docs.md +7 -6
  253. package/gsd-core/workflows/mvp-phase.md +6 -3
  254. package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
  255. package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
  256. package/gsd-core/workflows/new-milestone.md +35 -47
  257. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
  258. package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
  259. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
  260. package/gsd-core/workflows/new-project.md +27 -240
  261. package/gsd-core/workflows/next.md +12 -0
  262. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
  263. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
  264. package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
  265. package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
  266. package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
  267. package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
  268. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
  269. package/gsd-core/workflows/plan-phase.md +89 -209
  270. package/gsd-core/workflows/plan-review-convergence.md +50 -2
  271. package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
  272. package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
  273. package/gsd-core/workflows/progress.md +45 -159
  274. package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
  275. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
  276. package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
  277. package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
  278. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
  279. package/gsd-core/workflows/quick.md +55 -405
  280. package/gsd-core/workflows/resume-project.md +3 -0
  281. package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
  282. package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
  283. package/gsd-core/workflows/review.md +41 -13
  284. package/gsd-core/workflows/section-manifest.json +219 -0
  285. package/gsd-core/workflows/secure-phase.md +1 -1
  286. package/gsd-core/workflows/session-report.md +2 -1
  287. package/gsd-core/workflows/settings.md +66 -2
  288. package/gsd-core/workflows/ship.md +104 -44
  289. package/gsd-core/workflows/sketch.md +1 -1
  290. package/gsd-core/workflows/spec-phase.md +41 -20
  291. package/gsd-core/workflows/spike-wrap-up.md +20 -5
  292. package/gsd-core/workflows/spike.md +50 -16
  293. package/gsd-core/workflows/sync-skills.md +106 -13
  294. package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
  295. package/gsd-core/workflows/transition.md +53 -31
  296. package/gsd-core/workflows/ui-phase.md +13 -12
  297. package/gsd-core/workflows/ui-review.md +2 -2
  298. package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
  299. package/gsd-core/workflows/update.md +19 -8
  300. package/gsd-core/workflows/validate-phase.md +1 -1
  301. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
  302. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
  303. package/gsd-core/workflows/verify-work.md +17 -65
  304. package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
  305. package/hooks/dist/gsd-check-update-worker.js +64 -12
  306. package/hooks/dist/gsd-check-update.js +19 -1
  307. package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
  308. package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
  309. package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
  310. package/hooks/dist/gsd-prompt-guard.js +21 -20
  311. package/hooks/dist/gsd-read-injection-scanner.js +45 -24
  312. package/hooks/dist/gsd-statusline.js +90 -6
  313. package/hooks/dist/gsd-update-banner.js +22 -1
  314. package/hooks/dist/gsd-workflow-guard.js +134 -36
  315. package/hooks/dist/gsd-worktree-path-guard.js +2 -1
  316. package/hooks/dist/gsd-write-guard.js +359 -0
  317. package/hooks/dist/lib/git-cmd.js +92 -59
  318. package/hooks/dist/lib/injection-patterns.js +45 -0
  319. package/hooks/dist/lib/isolation-deny-reason.js +39 -0
  320. package/hooks/dist/lib/isolation-sentinel.js +277 -0
  321. package/hooks/dist/managed-hooks-registry.cjs +2 -0
  322. package/hooks/gsd-agent-isolation-guard.js +517 -0
  323. package/hooks/gsd-check-update-worker.js +64 -12
  324. package/hooks/gsd-check-update.js +19 -1
  325. package/hooks/gsd-cursor-pre-tool.js +0 -3
  326. package/hooks/gsd-cursor-subagent-start.js +607 -26
  327. package/hooks/gsd-cursor-subagent-stop.js +3 -2
  328. package/hooks/gsd-prompt-guard.js +21 -20
  329. package/hooks/gsd-read-injection-scanner.js +45 -24
  330. package/hooks/gsd-statusline.js +90 -6
  331. package/hooks/gsd-update-banner.js +22 -1
  332. package/hooks/gsd-workflow-guard.js +134 -36
  333. package/hooks/gsd-worktree-path-guard.js +2 -1
  334. package/hooks/gsd-write-guard.js +359 -0
  335. package/hooks/hooks.json +12 -0
  336. package/hooks/lib/git-cmd.js +92 -59
  337. package/hooks/lib/injection-patterns.js +45 -0
  338. package/hooks/lib/isolation-deny-reason.js +39 -0
  339. package/hooks/lib/isolation-sentinel.js +277 -0
  340. package/hooks/managed-hooks-registry.cjs +2 -0
  341. package/package.json +31 -10
  342. package/pi/gsd.cjs +71 -12
  343. package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
  344. package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
  345. package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
  346. package/scripts/build-hooks.js +9 -0
  347. package/scripts/changeset/lint.cjs +68 -6
  348. package/scripts/changeset/serialize.cjs +5 -1
  349. package/scripts/check-alias-drift.cjs +7 -43
  350. package/scripts/check-contract-drift.cjs +297 -0
  351. package/scripts/ci-test-scope.cjs +19 -2
  352. package/scripts/command-contract-helpers.cjs +903 -1
  353. package/scripts/gen-adr-index.cjs +728 -38
  354. package/scripts/gen-capability-matrix.cjs +1 -1
  355. package/scripts/gen-capability-registry.cjs +3 -15
  356. package/scripts/gen-context-index.cjs +439 -0
  357. package/scripts/gen-health-docs.cjs +390 -0
  358. package/scripts/gen-inventory-manifest.cjs +150 -4
  359. package/scripts/gen-loop-host-contract.cjs +4 -24
  360. package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
  361. package/scripts/gen-registry.cjs +3 -14
  362. package/scripts/gen-section-manifest.cjs +638 -0
  363. package/scripts/generate-package-identity.cjs +4 -2
  364. package/scripts/lib/alias-drift-families.cjs +46 -0
  365. package/scripts/lib/drift-scan.cjs +278 -0
  366. package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
  367. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
  368. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
  369. package/scripts/lint-canary-version-leak.cjs +73 -0
  370. package/scripts/lint-command-contract.cjs +96 -13
  371. package/scripts/lint-compiled-artifact-sync.cjs +6 -1
  372. package/scripts/lint-completion-predicate-drift.cjs +933 -0
  373. package/scripts/lint-completion-ratio-drift.cjs +214 -0
  374. package/scripts/lint-default-flip-documentation.cjs +193 -0
  375. package/scripts/lint-docs-command-form.cjs +195 -0
  376. package/scripts/lint-docs-required.cjs +9 -1
  377. package/scripts/lint-emitted-drift-ack.cjs +215 -20
  378. package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
  379. package/scripts/lint-eslint-glob-coverage.cjs +340 -0
  380. package/scripts/lint-example-parser-parity.cjs +395 -0
  381. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
  382. package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
  383. package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
  384. package/scripts/lint-milestone-window-drift.cjs +468 -0
  385. package/scripts/lint-phase-enumeration-drift.cjs +479 -0
  386. package/scripts/lint-plan-count-drift.cjs +318 -0
  387. package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
  388. package/scripts/lint-planning-prompt-drift.cjs +434 -0
  389. package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
  390. package/scripts/lint-regression-test-names.cjs +15 -13
  391. package/scripts/lint-removed-but-needed.cjs +320 -0
  392. package/scripts/lint-state-field-drift.cjs +805 -0
  393. package/scripts/lint-state-write-path-drift.cjs +1045 -0
  394. package/scripts/lint-test-file-count.allowlist.json +40 -3
  395. package/scripts/lint-unreachable-guard-drift.cjs +843 -0
  396. package/scripts/lint-vendored-deps.cjs +124 -0
  397. package/scripts/mutation-matrix.cjs +13 -0
  398. package/scripts/pr-changed-files.cjs +63 -0
  399. package/scripts/pr-template-policy.cjs +14 -4
  400. package/scripts/prompt-injection-scan.sh +52 -6
  401. package/scripts/require-issue-link-policy.cjs +192 -0
  402. package/scripts/state-write-path-drift-baseline.json +19 -0
  403. package/scripts/sync-runtime-launcher.cjs +2 -4
  404. package/skills/gsd-autonomous/SKILL.md +0 -1
  405. package/skills/gsd-code-review/SKILL.md +1 -1
  406. package/skills/gsd-execute-phase/SKILL.md +1 -2
  407. package/skills/gsd-map-codebase/SKILL.md +1 -1
  408. package/skills/gsd-mempalace-capture/SKILL.md +2 -2
  409. package/skills/gsd-mempalace-recall/SKILL.md +1 -1
  410. package/skills/gsd-new-milestone/SKILL.md +2 -2
  411. package/skills/gsd-next/SKILL.md +0 -1
  412. package/skills/gsd-plan-phase/SKILL.md +1 -2
  413. package/skills/gsd-progress/SKILL.md +0 -1
  414. package/skills/gsd-quick/SKILL.md +1 -1
  415. package/skills/gsd-review-backlog/SKILL.md +2 -1
  416. package/skills/gsd-stats/SKILL.md +0 -1
  417. package/skills/gsd-verify-work/SKILL.md +1 -1
  418. package/vscode/package.json +1 -1
  419. package/gsd-core/workflows/discovery-phase.md +0 -298
  420. package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
  421. package/gsd-core/workflows/verify-phase.md +0 -577
  422. package/scripts/affected-tests-lib.cjs +0 -554
  423. package/scripts/gen-emitted-baseline.cjs +0 -145
  424. package/scripts/lint-allow-test-rule-refs.cjs +0 -162
  425. package/scripts/run-affected-tests.cjs +0 -7
  426. package/scripts/run-tests.cjs +0 -1050
@@ -0,0 +1,192 @@
1
+ # Verifier Phase Gates
2
+
3
+ > Loaded eagerly by `agents/gsd-verifier.md` (`<required_reading>`). Carries the three
4
+ > verification-time gates that lived in the retired `verify-phase` workflow
5
+ > (#1892 / epic #1891 F7): decision-coverage validation (#2492), the test-quality audit,
6
+ > and infrastructure-phase human-verification scoping (#2504) — plus the backstop-abstention
7
+ > reporting contract (#3206). Run each gate at its named
8
+ > agent step; `gsd_run` is the launcher shim defined in the agent's own Step 1 block.
9
+
10
+ ## verify_decisions — Decision Coverage Gate (run after Step 6, requirements coverage)
11
+
12
+ <step name="verify_decisions">
13
+ **Decision coverage validation gate (issue #2492).**
14
+
15
+ After requirements coverage, also check that each trackable CONTEXT.md
16
+ `<decisions>` entry shows up somewhere in the shipped artifacts (plans,
17
+ SUMMARY.md, files modified by the phase, or recent commit subjects on the
18
+ phase branch).
19
+
20
+ This gate is **non-blocking / warning only** by deliberate asymmetry with
21
+ the plan-phase translation gate. The plan-phase gate already blocked at
22
+ translation time, so by the time verification runs every decision has
23
+ either been translated or explicitly deferred. This gate's job is to
24
+ surface decisions that *were* translated but vanished during execution —
25
+ that's a soft signal because "honors a decision" is a fuzzy substring
26
+ heuristic, and we don't want a paraphrase miss to fail an otherwise good
27
+ phase.
28
+
29
+ **Skip if** `workflow.context_coverage_gate` is explicitly set to `false`
30
+ (absent key = enabled). Also skip cleanly when CONTEXT.md is missing or has
31
+ no `<decisions>` block.
32
+
33
+ ```bash
34
+ GATE_CFG=$(gsd_run query config-get workflow.context_coverage_gate 2>/dev/null || echo "true")
35
+ if [ "$GATE_CFG" != "false" ]; then
36
+ CONTEXT_PATH=$(ls "${PHASE_DIR}"/*-CONTEXT.md 2>/dev/null | head -1) # #2962: not a for-glob (zsh aborts)
37
+ DECISION_RESULT=$(gsd_run query check.decision-coverage-verify "${PHASE_DIR}" "${CONTEXT_PATH}")
38
+ fi
39
+ ```
40
+
41
+ The handler returns JSON `{ skipped, blocking: false, total, honored,
42
+ not_honored: [...], message }`.
43
+
44
+ **Reporting:** Append the handler's `message` (a `### Decision Coverage`
45
+ section) to VERIFICATION.md regardless of outcome — even when all
46
+ decisions are honored, recording the count helps reviewers spot drift over
47
+ time. Set `decision_coverage` in the verification result to
48
+ `{honored, total, not_honored: [...]}` so downstream tooling can read it.
49
+
50
+ **Status impact:** none. The decision gate does NOT influence the
51
+ `gaps_found` / `human_needed` / `passed` decision tree in Step 9. Its
52
+ findings are warnings the user reviews and may act on by re-opening the
53
+ phase or by acknowledging the decision was abandoned intentionally.
54
+ </step>
55
+
56
+ ## audit_test_quality (run after Step 7b, alongside anti-patterns)
57
+
58
+ <step name="audit_test_quality">
59
+ **Verify that tests PROVE what they claim to prove.**
60
+
61
+ This step catches test-level deceptions that pass all prior checks: files exist, are substantive, are wired, and tests pass — but the tests don't actually validate the requirement.
62
+
63
+ **1. Identify requirement-linked test files**
64
+
65
+ From PLAN and SUMMARY files, map each requirement to the test files that are supposed to prove it.
66
+
67
+ **2. Disabled test scan**
68
+
69
+ For ALL test files linked to requirements, search for disabled/skipped patterns:
70
+
71
+ ```bash
72
+ grep -rn -E "it\.skip|describe\.skip|test\.skip|xit\(|xdescribe\(|xtest\(|@pytest\.mark\.skip|@unittest\.skip|#\[ignore\]|\.pending|it\.todo|test\.todo" "$TEST_FILE"
73
+ ```
74
+
75
+ **Rule:** A disabled test linked to a requirement = requirement NOT tested.
76
+ - 🛑 BLOCKER if the disabled test is the only test proving that requirement
77
+ - ⚠️ WARNING if other active tests also cover the requirement
78
+
79
+ **3. Circular test detection**
80
+
81
+ Search for scripts/utilities that generate expected values by running the system under test:
82
+
83
+ ```bash
84
+ grep -rn -E "writeFileSync|writeFile|fs\.write|open\(.*w\)" "$TEST_DIRS"
85
+ ```
86
+
87
+ For each match, check if it also imports the system/service/module being tested. If a script both imports the system-under-test AND writes expected output values → CIRCULAR.
88
+
89
+ **Circular test indicators:**
90
+ - Script imports a service AND writes to fixture files
91
+ - Expected values have comments like "computed from engine", "captured from baseline"
92
+ - Script filename contains "capture", "baseline", "generate", "snapshot" in test context
93
+ - Expected values were added in the same commit as the test assertions
94
+
95
+ **Rule:** A test comparing system output against values generated by the same system is circular. It proves consistency, not correctness.
96
+
97
+ **4. Expected value provenance** (for comparison/parity/migration requirements)
98
+
99
+ When a requirement demands comparison with an external source ("identical to X", "matches Y", "same output as Z"):
100
+
101
+ - Is the external source actually invoked or referenced in the test pipeline?
102
+ - Do fixture files contain data sourced from the external system?
103
+ - Or do all expected values come from the new system itself or from mathematical formulas?
104
+
105
+ **Provenance classification:**
106
+ - VALID: Expected value from external/legacy system output, manual capture, or independent oracle
107
+ - PARTIAL: Expected value from mathematical derivation (proves formula, not system match)
108
+ - CIRCULAR: Expected value from the system being tested
109
+ - UNKNOWN: No provenance information — treat as SUSPECT
110
+
111
+ **5. Assertion strength**
112
+
113
+ For each test linked to a requirement, classify the strongest assertion:
114
+
115
+ | Level | Examples | Proves |
116
+ |-------|---------|--------|
117
+ | Existence | `toBeDefined()`, `!= null` | Something returned |
118
+ | Type | `typeof x === 'number'` | Correct shape |
119
+ | Status | `code === 200` | No error |
120
+ | Value | `toEqual(expected)`, `toBeCloseTo(x)` | Specific value |
121
+ | Behavioral | Multi-step workflow assertions | End-to-end correctness |
122
+
123
+ If a requirement demands value-level or behavioral-level proof and the test only has existence/type/status assertions → INSUFFICIENT.
124
+
125
+ **6. Coverage quantity**
126
+
127
+ If a requirement specifies a quantity of test cases (e.g., "30 calculations"), check if the actual number of active (non-skipped) test cases meets the requirement.
128
+
129
+ **Reporting — add to VERIFICATION.md:**
130
+
131
+ ```markdown
132
+ ### Test Quality Audit
133
+
134
+ | Test File | Linked Req | Active | Skipped | Circular | Assertion Level | Verdict |
135
+ |-----------|-----------|--------|---------|----------|-----------------|---------|
136
+
137
+ **Disabled tests on requirements:** {N} → {BLOCKER if any req has ONLY disabled tests}
138
+ **Circular patterns detected:** {N} → {BLOCKER if any}
139
+ **Insufficient assertions:** {N} → {WARNING}
140
+ ```
141
+
142
+ **Impact on status:** Any BLOCKER from test quality audit → overall status = `gaps_found` (Step 9 rule 1), regardless of other checks passing.
143
+ </step>
144
+
145
+ ## identify_human_verification — infrastructure/foundation scoping (apply at Step 8)
146
+
147
+ **First: determine if this is an infrastructure/foundation phase.**
148
+
149
+ Infrastructure and foundation phases — code foundations, database schema, internal APIs, data models, build tooling, CI/CD, internal service integrations — have no user-facing elements by definition. For these phases:
150
+
151
+ - Do NOT invent artificial manual steps (e.g., "manually run git commits", "manually invoke methods", "manually check database state").
152
+ - Mark human verification as **N/A** with rationale: "Infrastructure/foundation phase — no user-facing elements to test manually."
153
+ - Set `human_verification: []` and do **not** produce a `human_needed` status solely due to lack of user-facing features.
154
+ - Only add human verification items if the phase goal or success criteria explicitly describe something a user would interact with (UI, CLI command output visible to end users, external service UX).
155
+ - **Exception — behavior-unverified truths still count.** A truth marked ⚠️ PRESENT_BEHAVIOR_UNVERIFIED (a state transition or a cancellation/cleanup/ordering invariant with no test exercising it) is a behavioral-evidence gap, not an artificial user-facing step. Record it in `behavior_unverified_items` and emit a human-verification item for it **even on an infrastructure/foundation phase** — these invariants are exactly where infra phases hide runtime state leaks. Such a truth drives `human_needed`; the auto-pass-UAT shortcut applies only to the absence of user-facing UX, never to a behavior-unverified invariant. The same carve-out covers an **abstained non-inferable truth** (⚠️ `insufficient_spec`, § Backstop abstention below) — an insufficient-spec gap is an evidence gap, not a user-facing step, so it too still emits its human-verification item and drives `human_needed` on an infrastructure phase.
156
+
157
+ **How to determine if a phase is infrastructure/foundation:**
158
+ - Phase goal or name contains: "foundation", "infrastructure", "schema", "database", "internal API", "data model", "scaffolding", "pipeline", "tooling", "CI", "migrations", "service layer", "backend", "core library"
159
+ - Phase success criteria describe only technical artifacts (files exist, tests pass, schema is valid) with no user interaction required
160
+ - There is no UI, CLI output visible to end users, or real-time behavior to observe
161
+
162
+ **If the phase IS infrastructure/foundation:** auto-pass UAT — skip the human verification items list entirely, **except any ⚠️ PRESENT_BEHAVIOR_UNVERIFIED or abstained ⚠️ `insufficient_spec` truth (see exception above), which still emits a human-verification item and drives `human_needed`.** Only when no such excepted truth exists, log:
163
+
164
+ ```markdown
165
+ ## Human Verification
166
+
167
+ N/A — Infrastructure/foundation phase with no user-facing elements.
168
+ All acceptance criteria are verifiable programmatically.
169
+ ```
170
+
171
+ **If the phase IS user-facing:** only flag items that genuinely require a human — per the Step 8 always/uncertain lists already in the agent. Do not invent steps.
172
+
173
+ ## Backstop abstention — reporting contract (#3206, companion to agent Step 3 item 5b)
174
+
175
+ When a non-inferable (`verification: backstop`) truth abstains for lack of explicit evidence:
176
+
177
+ - **Never silent, never a hard halt.** *Interactive:* the abstained item routes to the end-of-phase
178
+ human checkpoint. *Autonomous (AFK):* it produces a prominent `unverified — held-out test
179
+ recommended` flag and the completion line reads "complete with N unverified non-inferable checks";
180
+ the run neither silently passes the blind spot nor hard-halts.
181
+ - **Distinguishable reason.** The abstain disposition carries `reason: insufficient_spec` so its
182
+ `human_needed` outcome is never conflated with an ordinary manual-UAT `human_needed`.
183
+ - **Infrastructure phases included.** This rides the same carve-out as ⚠️ PRESENT_BEHAVIOR_UNVERIFIED
184
+ in the infrastructure-phase gate above: an abstention is an evidence gap, not a user-facing step,
185
+ so the infra auto-pass-UAT shortcut never absorbs it.
186
+
187
+ Full protocol and rationale: `gsd-core/references/honest-verifier.md`.
188
+
189
+ ## Lazy references
190
+
191
+ - **Per-stack verification patterns:** before Step 4 (artifact verification) on an unfamiliar stack, Read `~/.claude/gsd-core/references/verification-patterns.md` — the grep catalog for React/Next.js components, API routes, database schema, and the universal stub patterns. Read it lazily (only the sections for the stack under verification); it is too large to load wholesale on every run.
192
+ - **Canonical report shape:** the emitted VERIFICATION.md follows `@~/.claude/gsd-core/templates/verification-report.md` — the template whose Guidelines and row shapes `src/uat.cts` treats as canonical when consuming verification output.
@@ -0,0 +1,100 @@
1
+ # Verifier wiring and data-flow patterns
2
+
3
+ Full pattern bodies for `agents/gsd-verifier.md`, extracted per
4
+ `DEFECT.AGENT-FILE-SIZE-CAP-BREACH` (issue #2995, epic #1671 Phase 6.4). The agent
5
+ keeps the step and its checklist; the per-pattern detail and shell recipes live here.
6
+
7
+ Artifacts that pass Levels 1-3 (exist, substantive, wired) can still be hollow if their data source produces empty or hardcoded values. Level 4 traces upstream from the artifact to verify real data flows through the wiring.
8
+
9
+ **When to run:** For each artifact that passes Level 3 (WIRED) and renders dynamic data (components, pages, dashboards — not utilities or configs).
10
+
11
+ **How:**
12
+
13
+ 1. **Identify the data variable** — what state/prop does the artifact render?
14
+
15
+ ```bash
16
+ # Find state variables that are rendered in JSX/TSX
17
+ grep -n -E "useState|useQuery|useSWR|useStore|props\." "$artifact" 2>/dev/null
18
+ ```
19
+
20
+ 2. **Trace the data source** — where does that variable get populated?
21
+
22
+ ```bash
23
+ # Find the fetch/query that populates the state
24
+ grep -n -A 5 "set${STATE_VAR}\|${STATE_VAR}\s*=" "$artifact" 2>/dev/null | grep -E "fetch|axios|query|store|dispatch|props\."
25
+ ```
26
+
27
+ 3. **Verify the source produces real data** — does the API/store return actual data or static/empty values?
28
+
29
+ ```bash
30
+ # Check the API route or data source for real DB queries vs static returns
31
+ grep -n -E "prisma\.|db\.|query\(|findMany|findOne|select|FROM" "$source_file" 2>/dev/null
32
+ # Flag: static returns with no query
33
+ grep -n -E "return.*json\(\s*\[\]|return.*json\(\s*\{\}" "$source_file" 2>/dev/null
34
+ ```
35
+
36
+ 4. **Check for disconnected props** — props passed to child components that are hardcoded empty at the call site
37
+
38
+ ```bash
39
+ # Find where the component is used and check prop values
40
+ grep -r -A 3 "<${COMPONENT_NAME}" "${search_path:-src/}" --include="*.tsx" 2>/dev/null | grep -E "=\{(\[\]|\{\}|null|''|\"\")\}"
41
+ ```
42
+
43
+ > These two status tables are intentionally mirrored in `agents/gsd-verifier.md`.
44
+ > The status vocabulary is load-bearing verifier output and must remain in the
45
+ > agent body (#2995); this copy is here so the procedure below reads standalone.
46
+
47
+ **Data-flow status:**
48
+
49
+ | Data Source | Produces Real Data | Status |
50
+ | ---------- | ------------------ | ------ |
51
+ | DB query found | Yes | ✓ FLOWING |
52
+ | Fetch exists, static fallback only | No | ⚠️ STATIC |
53
+ | No data source found | N/A | ✗ DISCONNECTED |
54
+ | Props hardcoded empty at call site | No | ✗ HOLLOW_PROP |
55
+
56
+ **Final Artifact Status (updated with Level 4):**
57
+
58
+ | Exists | Substantive | Wired | Data Flows | Status |
59
+ | ------ | ----------- | ----- | ---------- | ------ |
60
+ | ✓ | ✓ | ✓ | ✓ | ✓ VERIFIED |
61
+ | ✓ | ✓ | ✓ | ✗ | ⚠️ HOLLOW — wired but data disconnected |
62
+ | ✓ | ✓ | ✗ | - | ⚠️ ORPHANED |
63
+ | ✓ | ✗ | - | - | ✗ STUB |
64
+ | ✗ | - | - | - | ✗ MISSING |
65
+
66
+ ### Pattern: Component → API
67
+
68
+ ```bash
69
+ grep -E "fetch\(['\"].*$api_path|axios\.(get|post).*$api_path" "$component" 2>/dev/null
70
+ grep -A 5 "fetch\|axios" "$component" | grep -E "await|\.then|setData|setState" 2>/dev/null
71
+ ```
72
+
73
+ Status: WIRED (call + response handling) | PARTIAL (call, no response use) | NOT_WIRED (no call)
74
+
75
+ ### Pattern: API → Database
76
+
77
+ ```bash
78
+ grep -E "prisma\.$model|db\.$model|$model\.(find|create|update|delete)" "$route" 2>/dev/null
79
+ grep -E "return.*json.*\w+|res\.json\(\w+" "$route" 2>/dev/null
80
+ ```
81
+
82
+ Status: WIRED (query + result returned) | PARTIAL (query, static return) | NOT_WIRED (no query)
83
+
84
+ ### Pattern: Form → Handler
85
+
86
+ ```bash
87
+ grep -E "onSubmit=\{|handleSubmit" "$component" 2>/dev/null
88
+ grep -A 10 "onSubmit.*=" "$component" | grep -E "fetch|axios|mutate|dispatch" 2>/dev/null
89
+ ```
90
+
91
+ Status: WIRED (handler + API call) | STUB (only logs/preventDefault) | NOT_WIRED (no handler)
92
+
93
+ ### Pattern: State → Render
94
+
95
+ ```bash
96
+ grep -E "useState.*$state_var|\[$state_var," "$component" 2>/dev/null
97
+ grep -E "\{.*$state_var.*\}|\{$state_var\." "$component" 2>/dev/null
98
+ ```
99
+
100
+ Status: WIRED (state displayed) | NOT_WIRED (state exists, not rendered)
@@ -17,7 +17,7 @@ The framing fires when:
17
17
  - The phase under verification has `**Mode:** mvp` in ROADMAP.md (parsed via `gsd-tools 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
- 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 `references/planner-mvp-mode.md`).
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`).
21
21
 
22
22
  ## Generated UAT script structure under MVP mode
23
23
 
@@ -9,8 +9,12 @@ parallel milestone work by multiple Claude Code instances on the same codebase.
9
9
 
10
10
  1. `--ws <name>` flag (explicit, highest priority)
11
11
  2. `GSD_WORKSTREAM` environment variable (per-instance)
12
- 3. Session-scoped active workstream pointer in temp storage (per runtime session / terminal)
13
- 4. `.planning/active-workstream` file (legacy shared fallback when no session key exists)
12
+ 3. Session-scoped active workstream pointer in temp storage (per runtime session / terminal),
13
+ when that pointer exists and is non-blank
14
+ 4. `.planning/active-workstream` file — consulted whenever step 3 has nothing to say: either
15
+ there is no session identity at all, or there is one but it has never pointed at a
16
+ workstream. A session that already has its own pointer (step 3) is never overridden by
17
+ this step, even if that pointer is stale.
14
18
  5. `null` — flat mode (no workstreams)
15
19
 
16
20
  ## Why session-scoped pointers exist
@@ -20,16 +24,22 @@ Claude/Codex instances are active on the same repo at the same time. One session
20
24
  silently repoint another session's `STATE.md`, `ROADMAP.md`, and phase paths.
21
25
 
22
26
  GSD now prefers a session-scoped pointer keyed by runtime/session identity
23
- (`GSD_SESSION_KEY`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SSE_PORT`, terminal session IDs,
27
+ (`GSD_SESSION_KEY`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SESSION_ID`,
28
+ `CLAUDE_CODE_SSE_PORT`, terminal session IDs,
24
29
  or the controlling TTY). This keeps concurrent sessions isolated while preserving
25
30
  legacy compatibility for runtimes that do not expose a stable session key.
26
31
 
32
+ A session that has never set its own pointer inherits `.planning/active-workstream`
33
+ (step 4) rather than silently falling back to flat mode — this does not weaken the
34
+ isolation guarantee above: inheritance only fires when a session's own pointer is
35
+ absent, and a session that has ever set one is never repointed by the shared file.
36
+
27
37
  ## Session Identity Resolution
28
38
 
29
39
  When GSD resolves the session-scoped pointer in step 3 above, it uses this order:
30
40
 
31
41
  1. Explicit runtime/session env vars such as `GSD_SESSION_KEY`, `CODEX_THREAD_ID`,
32
- `CLAUDE_SESSION_ID`, `CLAUDE_CODE_SSE_PORT`, `OPENCODE_SESSION_ID`,
42
+ `CLAUDE_SESSION_ID`, `CLAUDE_CODE_SESSION_ID`, `CLAUDE_CODE_SSE_PORT`, `OPENCODE_SESSION_ID`,
33
43
  `GEMINI_SESSION_ID`, `CURSOR_SESSION_ID`, `WINDSURF_SESSION_ID`,
34
44
  `TERM_SESSION_ID`, `WT_SESSION`, `TMUX_PANE`, and `ZELLIJ_SESSION_NAME`
35
45
  2. `TTY` or `SSH_TTY` if the shell/runtime already exposes the terminal path
@@ -47,7 +57,13 @@ routing hot path.
47
57
 
48
58
  Session-scoped pointers are intentionally lightweight and best-effort:
49
59
 
50
- - Clearing a workstream for one session removes only that session's pointer file
60
+ - Clearing a workstream for one session removes only that session's pointer file.
61
+ This returns that session to step 4 of Resolution Priority above — it goes back
62
+ to **inheriting** `.planning/active-workstream` (if a marker exists there), not
63
+ to flat mode. A cleared session with no marker present resolves to `null`; a
64
+ cleared session with a marker present resolves to whatever that marker names.
65
+ To force flat mode for a cleared session, remove the shared marker file, or use
66
+ an explicit override such as `--ws` / `GSD_WORKSTREAM` on the command in question.
51
67
  - If that was the last pointer for the repo, GSD also removes the now-empty
52
68
  per-project temp directory
53
69
  - If sibling session pointers still exist, the temp directory is left in place
@@ -76,7 +92,7 @@ This ensures workstream scope chains automatically through the workflow:
76
92
  ├── config.json # Shared
77
93
  ├── milestones/ # Shared
78
94
  ├── codebase/ # Shared
79
- ├── active-workstream # Legacy shared fallback only
95
+ ├── active-workstream # Shared marker; inherited when a session has no pointer of its own
80
96
  └── workstreams/
81
97
  ├── feature-a/ # Workstream A
82
98
  │ ├── STATE.md
@@ -30,8 +30,8 @@ if [ "$HEAD_REF" = "DETACHED" ] || echo "$ACTUAL_BRANCH" | grep -Eq '^(main|mast
30
30
  echo "FATAL: worktree HEAD on '$ACTUAL_BRANCH' (expected agent-* or worktree-agent-*); refusing to commit or self-recover via 'git update-ref' (#2924)." >&2
31
31
  exit 42
32
32
  fi
33
- if ! echo "$ACTUAL_BRANCH" | grep -Eq '^(worktree-)?agent-[A-Za-z0-9._/-]+$'; then
34
- echo "FATAL: worktree HEAD '$ACTUAL_BRANCH' is not in the agent-* / worktree-agent-* namespace; refusing to commit (#2924)." >&2
33
+ if ! echo "$ACTUAL_BRANCH" | grep -Eq '^((worktree-)?agent-|worktree-wf_)[A-Za-z0-9._/-]+$'; then
34
+ echo "FATAL: worktree HEAD '$ACTUAL_BRANCH' is not in the agent-* / worktree-agent-* / worktree-wf_* namespace; refusing to commit (#2924)." >&2
35
35
  exit 42
36
36
  fi
37
37
  ACTUAL_BASE=$(git rev-parse HEAD)
@@ -4,7 +4,7 @@ Template for `.planning/phases/XX-name/{phase_num}-DISCUSSION-LOG.md` — audit
4
4
 
5
5
  **Purpose:** Software audit trail for decision-making. Captures all options considered, not just the selected one. Separate from CONTEXT.md which is the implementation artifact consumed by downstream agents.
6
6
 
7
- **NOT for LLM consumption.** This file should never be referenced in `<files_to_read>` blocks or agent prompts.
7
+ **NOT for LLM consumption.** This file should never be referenced in `<required_reading>` blocks or agent prompts.
8
8
 
9
9
  ## Format
10
10
 
@@ -187,7 +187,7 @@ autonomous: true
187
187
 
188
188
  # Plan 02 - Protected features (needs auth)
189
189
  wave: 2
190
- depends_on: ["01"]
190
+ depends_on: ["01-01"]
191
191
  files_modified: [src/features/dashboard.ts]
192
192
  autonomous: true
193
193
  ```
@@ -199,7 +199,7 @@ Plan 02 in Wave 2 waits for Plan 01 in Wave 1 - genuine dependency on auth types
199
199
  ```yaml
200
200
  # Plan 03 - UI with verification
201
201
  wave: 3
202
- depends_on: ["01", "02"]
202
+ depends_on: ["01-01", "01-02"]
203
203
  files_modified: [src/components/Dashboard.tsx]
204
204
  autonomous: false # Has checkpoint:human-verify
205
205
  ```
@@ -606,5 +606,3 @@ Task completion ≠ Goal achievement. A task "create chat component" can complet
606
606
  4. Verification subagent checks must_haves against codebase
607
607
  5. Gaps found → fix plans created → execute → re-verify
608
608
  6. All must_haves pass → phase complete
609
-
610
- See `~/.claude/gsd-core/workflows/verify-phase.md` for verification logic.
@@ -79,11 +79,11 @@ None yet.
79
79
 
80
80
  ## Deferred Items
81
81
 
82
- Items acknowledged and carried forward from previous milestone close:
82
+ Items acknowledged and deferred at milestone close, most recent first:
83
83
 
84
- | Category | Item | Status | Deferred At |
85
- |----------|------|--------|-------------|
86
- | *(none)* | | | |
84
+ | Category | Item | Status | Deferred At | Milestone |
85
+ |----------|------|--------|-------------|-----------|
86
+ | *(none)* | | | | |
87
87
 
88
88
  ## Session Continuity
89
89
 
@@ -28,6 +28,8 @@ completed: YYYY-MM-DD
28
28
  status: complete
29
29
  ---
30
30
 
31
+ **Status (#2830):** `status: complete` is the default — the plan finished. Use `status: halted` instead when the plan reached a designed stop (a gate failure, a spike concluding without expanding into the full build, or any other intentional non-completion) and intentionally left tasks unfinished.
32
+
31
33
  # Phase [X]: [Name] Summary (Complex)
32
34
 
33
35
  **[Substantive one-liner describing outcome]**
@@ -25,6 +25,8 @@ completed: YYYY-MM-DD
25
25
  status: complete
26
26
  ---
27
27
 
28
+ **Status (#2830):** `status: complete` is the default — the plan finished. Use `status: halted` instead when the plan reached a designed stop (a gate failure, a spike concluding without expanding into the full build, or any other intentional non-completion) and intentionally left tasks unfinished.
29
+
28
30
  # Phase [X]: [Name] Summary (Minimal)
29
31
 
30
32
  **[Substantive one-liner describing outcome]**
@@ -27,6 +27,8 @@ completed: YYYY-MM-DD
27
27
  status: complete
28
28
  ---
29
29
 
30
+ **Status (#2830):** `status: complete` is the default — the plan finished. Use `status: halted` instead when the plan reached a designed stop (a gate failure, a spike concluding without expanding into the full build, or any other intentional non-completion) and intentionally left tasks unfinished.
31
+
30
32
  # Phase [X]: [Name] Summary
31
33
 
32
34
  **[Substantive one-liner describing outcome]**
@@ -171,6 +171,8 @@ None - no external service configuration required.
171
171
  **Patterns:** Established conventions future phases should maintain.
172
172
 
173
173
  **Population:** Frontmatter is populated during summary creation in execute-plan.md. See `<step name="create_summary">` for field-by-field guidance.
174
+
175
+ **Status (#2830):** `status: complete` is the default — the plan finished. Use `status: halted` instead when the plan reached a designed stop (a gate failure, a spike concluding without expanding into the full build, or any other intentional non-completion) and intentionally left tasks unfinished. `halted` is machine-read: any plan whose `depends_on` (directly or transitively) names a halted plan is reported as blocked, not offered to the executor, until the halt is resolved and re-summarized as `complete`.
174
176
  </frontmatter_guidance>
175
177
 
176
178
  <coverage_guidance>
@@ -18,6 +18,10 @@ behavior_unverified_items: # Only if behavior_unverified > 0 — the truths abov
18
18
  test: "What to trigger"
19
19
  expected: "What state must hold afterward"
20
20
  why_human: "Why presence checks can't see it"
21
+ coincidental_reliance_items: # Only if a ✓ VERIFIED truth holds incidentally — emitted regardless of overall status (survives gaps_found)
22
+ - truth: "Observable truth that holds incidentally"
23
+ reason: undeclared-precondition | incidental-ordering | fixture-only
24
+ harden: "Precondition/ordering to declare or enforce"
21
25
  ---
22
26
 
23
27
  # Phase {X}: {Name} Verification Report
@@ -35,7 +39,8 @@ behavior_unverified_items: # Only if behavior_unverified > 0 — the truths abov
35
39
  | 1 | {truth from must_haves} | ✓ VERIFIED | {what confirmed it} |
36
40
  | 2 | {truth from must_haves} | ✗ FAILED | {what's wrong} |
37
41
  | 3 | {truth from must_haves} | ⚠️ PRESENT_BEHAVIOR_UNVERIFIED | {present + wired; transition/invariant not exercised by a test — see Human Verification} |
38
- | 4 | {truth from must_haves} | ? UNCERTAIN | {why can't verify} |
42
+ | 4 | {truth from must_haves} | ✓ VERIFIED (coincidental-reliance) | {holds, but incidentally — see coincidental_reliance_items} |
43
+ | 5 | {truth from must_haves} | ? UNCERTAIN | {why can't verify} |
39
44
 
40
45
  **Score:** {N}/{M} truths verified ({P} present, behavior-unverified)
41
46
 
@@ -176,6 +181,9 @@ None — all verifiable items checked programmatically.
176
181
  **Per-truth states (Observable Truths `Status` column):**
177
182
  - `✓ VERIFIED` — supporting artifacts pass all checks; for a behavior-dependent truth, a behavioral test exercised the asserted behavior
178
183
  - `⚠️ PRESENT_BEHAVIOR_UNVERIFIED` — present + wired, but a state transition or cancellation/cleanup/ordering invariant was not exercised by any test. Counts toward `behavior_unverified`, routes to human verification, and is *excluded* from the verified score. Per-truth only — on its own the overall `status:` becomes `human_needed` (unless a higher-precedence `gaps_found` also applies); the item is preserved in `behavior_unverified_items` regardless.
184
+ - `✓ VERIFIED (coincidental-reliance)` — an **advisory** qualifier on a truth that *is* verified but holds for an incidental reason rather than a guaranteed one (#1955): `undeclared-precondition` (state nothing in the phase's artifacts or a declared prerequisite guarantees), `incidental-ordering` (an order or side effect nothing in the code enforces), or `fixture-only` (the test's own setup establishes the precondition; the production path has no equivalent). The base `✓ VERIFIED` token is kept verbatim and leading, so it counts toward the verified score exactly as before — the advisory changes no score and no status, and never produces a human-verification item. Each flagged truth is listed in `coincidental_reliance_items` with the reason and what to harden. Not applied to a truth that never reached `✓ VERIFIED`, nor to a `PASSED (override)` truth.
185
+
186
+ **Filling this column — apply the reliance check to every `✓ VERIFIED` truth before writing the row.** Ask why the truth holds and classify the evidence you already recorded, not your confidence in it. Flag it when the evidence names one of the three reasons above. Do NOT flag: a precondition the code establishes or explicitly defaults; ordering the code enforces (await, explicit sequencing); a fixture merely supplying input the real caller also supplies; unease naming no specific state, ordering, or fixture. The check is endogenous and so weaker than an exogenous tag (`gsd-core/references/honest-verifier.md`) — which is why it is advisory and never a gate. The usual fix is to promote the hidden assumption into a declared precondition.
179
187
  - `✗ FAILED` — artifact missing, stub, or unwired
180
188
  - `? UNCERTAIN` — can't verify programmatically
181
189
 
@@ -112,10 +112,10 @@ Select the right AI framework for Phase {phase_number}: {phase_name}
112
112
  Goal: {phase_goal}
113
113
  </objective>
114
114
 
115
- <files_to_read>
115
+ <required_reading>
116
116
  {context_path if exists}
117
117
  {requirements_path if exists}
118
- </files_to_read>
118
+ </required_reading>
119
119
 
120
120
  <phase_context>
121
121
  Phase: {phase_number} — {phase_name}
@@ -161,10 +161,10 @@ Before editing, verify the section you are about to write is still a template pl
161
161
  <objective>
162
162
  </objective>
163
163
 
164
- <files_to_read>
164
+ <required_reading>
165
165
  {ai_spec_path}
166
166
  {context_path if exists}
167
- </files_to_read>
167
+ </required_reading>
168
168
 
169
169
  <input>
170
170
  framework: {primary_framework}
@@ -196,11 +196,11 @@ Before editing, verify the section you are about to write is still a template pl
196
196
  <objective>
197
197
  </objective>
198
198
 
199
- <files_to_read>
199
+ <required_reading>
200
200
  {ai_spec_path}
201
201
  {context_path if exists}
202
202
  {requirements_path if exists}
203
- </files_to_read>
203
+ </required_reading>
204
204
 
205
205
  <input>
206
206
  system_type: {system_type}
@@ -227,11 +227,11 @@ Write Sections 5, 6, and 7 of AI-SPEC.md
227
227
  AI-SPEC.md now contains domain context (Section 1b) — use it as your rubric starting point.
228
228
  </objective>
229
229
 
230
- <files_to_read>
230
+ <required_reading>
231
231
  {ai_spec_path}
232
232
  {context_path if exists}
233
233
  {requirements_path if exists}
234
- </files_to_read>
234
+ </required_reading>
235
235
 
236
236
  <input>
237
237
  system_type: {system_type}
@@ -258,10 +258,8 @@ Read the completed AI-SPEC.md. Check that:
258
258
 
259
259
  ## 11. Commit
260
260
 
261
- **If `commit_docs` is true:**
262
261
  ```bash
263
- git add "${AI_SPEC_FILE}"
264
- git commit -m "docs({phase_slug}): generate AI-SPEC.md — {primary_framework} + domain context + eval strategy"
262
+ gsd_run query commit "docs({phase_slug}): generate AI-SPEC.md — {primary_framework} + domain context + eval strategy" --files "${AI_SPEC_FILE}"
265
263
  ```
266
264
 
267
265
  ## 12. Display Completion
@@ -124,6 +124,9 @@ For each phase's VERIFICATION.md, extract the expanded requirements table:
124
124
 
125
125
  For each phase's SUMMARY.md, extract `requirements-completed` from YAML frontmatter:
126
126
  ```bash
127
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
128
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
129
+
127
130
  for summary in .planning/phases/*-*/*-SUMMARY.md; do
128
131
  [ -e "$summary" ] || continue
129
132
  gsd_run query summary-extract "$summary" --fields requirements_completed --pick requirements_completed
@@ -0,0 +1 @@
1
+ If `PLAN_STRATEGY` is `converge`, display: `Planning: Plan-review convergence enabled`
@@ -0,0 +1,11 @@
1
+ ## Converge Dispatch (Background)
2
+
3
+ If `PLAN_STRATEGY=converge`, print: `◆ Spawning background plan-convergence loop for phase ${PHASE_NUM}... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)`
4
+
5
+ ```
6
+ Agent(
7
+ description="Plan convergence phase ${PHASE_NUM}: ${PHASE_NAME}",
8
+ run_in_background=true,
9
+ prompt="Run plan convergence for phase ${PHASE_NUM}: Skill(skill=\"gsd-plan-review-convergence\", args=\"${PHASE_NUM} ${CONVERGENCE_ARGS}\")"
10
+ )
11
+ ```
@@ -0,0 +1,7 @@
1
+ ## Converge Dispatch (Inline)
2
+
3
+ If `PLAN_STRATEGY=converge`:
4
+
5
+ ```
6
+ Skill(skill="gsd-plan-review-convergence", args="${PHASE_NUM} ${CONVERGENCE_ARGS}")
7
+ ```
@@ -0,0 +1,21 @@
1
+ ## Converge Fail-Fast
2
+
3
+ When `PLAN_STRATEGY` is `converge`, fail fast unless the existing convergence feature gate is enabled:
4
+
5
+ ```bash
6
+ _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
7
+ if [ "$PLAN_STRATEGY" = "converge" ]; then
8
+ CONVERGENCE_ENABLED=$(gsd_run query config-get workflow.plan_review_convergence 2>/dev/null || echo "false")
9
+ if [ "$CONVERGENCE_ENABLED" != "true" ]; then
10
+ printf '%s\n' \
11
+ 'gsd-autonomous --converge is disabled (workflow.plan_review_convergence=false).' \
12
+ '' \
13
+ 'Enable plan convergence with:' \
14
+ '' \
15
+ ' gsd config-set workflow.plan_review_convergence true' \
16
+ '' \
17
+ 'Then re-run the autonomous command with --converge.'
18
+ exit 1
19
+ fi
20
+ fi
21
+ ```