@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
@@ -24,6 +24,7 @@ command -v opencode >/dev/null 2>&1 && echo "opencode:available" || echo "openco
24
24
  command -v qwen >/dev/null 2>&1 && echo "qwen:available" || echo "qwen:missing"
25
25
  command -v cursor-agent >/dev/null 2>&1 && echo "cursor:available" || echo "cursor:missing"
26
26
  command -v agy >/dev/null 2>&1 && echo "antigravity:available" || echo "antigravity:missing"
27
+ command -v kimi >/dev/null 2>&1 && echo "kimi-code:available" || echo "kimi-code:missing"
27
28
 
28
29
  # Check local model servers (OpenAI-compatible HTTP API — no CLI binary required)
29
30
  OLLAMA_HOST=$(gsd_run query config-get review.ollama_host --raw 2>/dev/null || echo "")
@@ -75,6 +76,7 @@ Parse flags from `$ARGUMENTS`:
75
76
  - `--qwen` → include Qwen Code
76
77
  - `--cursor` → include Cursor
77
78
  - `--agy` or `--antigravity` → include Antigravity CLI
79
+ - `--kimi-code` → include Kimi CLI
78
80
  - `--ollama` → include Ollama (local server, OpenAI-compatible)
79
81
  - `--lm-studio` → include LM Studio (local server, OpenAI-compatible)
80
82
  - `--llama-cpp` → include llama.cpp (local server, OpenAI-compatible)
@@ -105,10 +107,9 @@ user who wants a preferred set has `review.default_reviewers`. Both stay lenient
105
107
  preference evaluated across many hosts, so a subset being present is expected, not an error
106
108
  - If all configured reviewers are unavailable, fail with an actionable message
107
109
 
108
- **Reviewer instances (#1517, optional):** if `review.reviewer_instances` is configured,
109
- instance names in `review.default_reviewers` run as independent identities. Resolution rules
110
- are in `gsd-core/references/reviewer-instances.md` — load it lazily only when instances are
111
- configured. Unconfigured → default path unchanged.
110
+ <!-- gsd:section id="reviewer-instances-note-1" when="state:reviewer-instances-configured" -->
111
+ If `section_manifest` is `null` or `"reviewer-instances-note-1"` is in its `included` list: read and execute `gsd-core/workflows/review/steps/reviewer-instances-note-1.md`. Otherwise skip — do not read the file.
112
+ <!-- /gsd:section -->
112
113
 
113
114
  If no CLIs are available:
114
115
  ```
@@ -156,7 +157,7 @@ Rules:
156
157
  Collect phase artifacts for the review prompt:
157
158
 
158
159
  ```bash
159
- INIT=$(gsd_run query init.phase-op "${PHASE_ARG}")
160
+ INIT=$(gsd_run query init.review "${PHASE_ARG}")
160
161
  if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
161
162
 
162
163
  # #2358: ONE run-scoped temp dir (portable via ${TMPDIR:-/tmp}) so overlapping
@@ -243,6 +244,9 @@ Write to a temp file: `{run_dir}/gsd-review-prompt.md`
243
244
  Also write individual section files so the budget tool can re-trim per reviewer:
244
245
 
245
246
  ```bash
247
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
248
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
249
+
246
250
  RUN_DIR="{run_dir}" # from gather_context
247
251
 
248
252
  # Write individual section files for per-reviewer budget trimming
@@ -262,11 +266,13 @@ done
262
266
  if [ -f ".planning/PROJECT.md" ]; then
263
267
  cp .planning/PROJECT.md "${RUN_DIR}/gsd-review-project.md"
264
268
  fi
265
- if ls "${PHASE_DIR}/"*"-CONTEXT.md" >/dev/null 2>&1; then
266
- cat "${PHASE_DIR}/"*"-CONTEXT.md" > "${RUN_DIR}/gsd-review-context.md"
269
+ _CTX=( "${PHASE_DIR}"/*-CONTEXT.md )
270
+ if [ ${#_CTX[@]} -gt 0 ]; then
271
+ cat "${_CTX[@]}" > "${RUN_DIR}/gsd-review-context.md"
267
272
  fi
268
- if ls "${PHASE_DIR}/"*"-RESEARCH.md" >/dev/null 2>&1; then
269
- cat "${PHASE_DIR}/"*"-RESEARCH.md" > "${RUN_DIR}/gsd-review-research.md"
273
+ _RESEARCH=( "${PHASE_DIR}"/*-RESEARCH.md )
274
+ if [ ${#_RESEARCH[@]} -gt 0 ]; then
275
+ cat "${_RESEARCH[@]}" > "${RUN_DIR}/gsd-review-research.md"
270
276
  fi
271
277
  if [ -f ".planning/REQUIREMENTS.md" ]; then
272
278
  cp .planning/REQUIREMENTS.md "${RUN_DIR}/gsd-review-requirements.md"
@@ -306,13 +312,16 @@ An environment that genuinely hits an untrusted-hook prompt surfaces through the
306
312
  the empty-output stub as a dropped lane with diagnosable stderr, not silent attrition. Do not
307
313
  reintroduce the flag (even spelled out in prose — a regression test bans the literal file-wide).
308
314
 
309
- **Reviewer instances (#1517, optional):** instances resolve *through* a lane and are not lanes
310
- themselves (ADR-2782 D8). Each selected instance invokes its base `cli` with its own `model`/`agent`
311
- as opaque argv. Exact invocation in `gsd-core/references/reviewer-instances.md`.
315
+ <!-- gsd:section id="reviewer-instances-note-2" when="state:reviewer-instances-configured" -->
316
+ If `section_manifest` is `null` or `"reviewer-instances-note-2"` is in its `included` list: read and execute `gsd-core/workflows/review/steps/reviewer-instances-note-2.md`. Otherwise skip — do not read the file.
317
+ <!-- /gsd:section -->
312
318
 
313
319
  Lanes run **sequentially, not in parallel** — concurrent invocation trips provider rate limits.
314
320
 
315
321
  ```bash
322
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
323
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
324
+
316
325
  RUN_DIR="{run_dir}"
317
326
  REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
318
327
  # SELECTED_REVIEWERS is the comma-separated result of reviewer selection (ADR-0011 precedence:
@@ -414,12 +423,31 @@ names, each gets its own `## <Adapter> Review (<instance>)` section, and ≥2 sa
414
423
  instances print a one-line shared-adapter caveat. Format in
415
424
  `gsd-core/references/reviewer-instances.md`.
416
425
 
426
+ **Resolved model (#2295):** each lane's `review-lane invoke --json` line in
427
+ `{run_dir}/gsd-review-lane-results.jsonl` carries a `model` object; render `models:` from
428
+ its `value` and `model_sources:` from its `source`. Both maps carry exactly one entry per
429
+ reviewer that appears in `reviewers:` — the two key sets always match. Write the literal
430
+ `unknown` rather than omitting a key: an omitted key is indistinguishable from the feature
431
+ not having run, and a reader must be able to tell *no model recorded* from *nothing to
432
+ look at*. Emit every `models:`/`model_sources:` value as a DOUBLE-QUOTED YAML scalar — a
433
+ legitimate model id can contain `:` (`llama3:70b`, `qwen2.5:7b`), which is unquotable as a
434
+ bare scalar; a control character is already refused at the recording seam, so quoting is
435
+ what closes the remaining `:`/`#`/leading-`-` cases. When GSD applied a reasoning effort to
436
+ a lane, its `value` already carries a `(reasoning=<level>)` suffix (e.g.
437
+ `gpt-5.6-sol (reasoning=high)`) — render it as-is, without re-deriving or re-formatting it.
438
+
417
439
  ```markdown
418
440
  ---
419
441
  phase: {N}
420
442
  reviewers: [gemini, claude, codex, coderabbit, opencode, qwen, cursor, antigravity, ollama, lm_studio, llama_cpp] # populate at runtime with only the reviewers actually invoked
421
443
  reviewed_at: {ISO timestamp}
422
444
  plans_reviewed: [{list of PLAN.md files}]
445
+ models: # resolved model per reviewer; `unknown` when not recoverable
446
+ codex: "gpt-5.6-sol (reasoning=low)"
447
+ antigravity: "unknown"
448
+ model_sources: # how each value above was determined
449
+ codex: "banner"
450
+ antigravity: "unknown"
423
451
  trimmed_reviewers: # only present if at least one reviewer was trimmed
424
452
  ollama:
425
453
  budget: 6000
@@ -457,7 +485,7 @@ trimmed_reviewers: # only present if at least one reviewer was trimmed
457
485
 
458
486
  ## Consensus Summary
459
487
 
460
- {synthesize common concerns across all reviewers. CodeRabbit is a diff-only reviewer (it never received the source-grounding prompt), so do not weight its verdict as a grounded plan review — fold in its diff findings, but base plan-level consensus on the prompt-fed reviewers. A reviewer output carrying the `[reviewed-without-repo-access]` marker (or beginning with `REVIEWED-WITHOUT-REPO-ACCESS`) ran without repo access (#2176) — treat it the same way: note its concerns, but do not count its verdict at full consensus weight.}
488
+ {synthesize common concerns across all reviewers. CodeRabbit is a diff-only reviewer (it never received the source-grounding prompt), so do not weight its verdict as a grounded plan review — fold in its diff findings, but base plan-level consensus on the prompt-fed reviewers. A reviewer output carrying the `[reviewed-without-repo-access]` marker (or beginning with `REVIEWED-WITHOUT-REPO-ACCESS`) ran without repo access (#2176) — treat it the same way: note its concerns, but do not count its verdict at full consensus weight. A reviewer output carrying the `[reviewed-without-source-citations]` marker (#3194) declared source-grounded evidence but cited no `file:line` evidence, so it reviewed the plan text only — treat it the same way: note its concerns, but do not count its verdict at full consensus weight.}
461
489
 
462
490
  ### Agreed Strengths
463
491
  {strengths mentioned by 2+ reviewers}
@@ -0,0 +1,219 @@
1
+ {
2
+ "workflows": {
3
+ "autonomous": [
4
+ {
5
+ "id": "converge-fail-fast",
6
+ "when": "state:plan-strategy-converge",
7
+ "read": "gsd-core/workflows/autonomous/steps/converge-fail-fast.md"
8
+ },
9
+ {
10
+ "id": "converge-banner",
11
+ "when": "state:plan-strategy-converge",
12
+ "read": "gsd-core/workflows/autonomous/steps/converge-banner.md"
13
+ },
14
+ {
15
+ "id": "converge-dispatch-bg",
16
+ "when": "state:plan-strategy-converge",
17
+ "read": "gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md"
18
+ },
19
+ {
20
+ "id": "converge-dispatch-inline",
21
+ "when": "state:plan-strategy-converge",
22
+ "read": "gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md"
23
+ },
24
+ {
25
+ "id": "converge-loop",
26
+ "when": "state:plan-strategy-converge",
27
+ "read": "gsd-core/workflows/autonomous/steps/converge-loop.md"
28
+ }
29
+ ],
30
+ "code-review": [
31
+ {
32
+ "id": "structural-pre-pass",
33
+ "when": "state:fallow-enabled",
34
+ "read": "gsd-core/workflows/code-review/steps/structural-pre-pass.md"
35
+ },
36
+ {
37
+ "id": "dispatch-fix",
38
+ "when": "flag:--fix",
39
+ "read": "gsd-core/workflows/code-review/steps/dispatch-fix.md"
40
+ }
41
+ ],
42
+ "complete-milestone": [
43
+ {
44
+ "id": "git-tag",
45
+ "when": "state:git-create-tag",
46
+ "read": "gsd-core/workflows/complete-milestone/steps/git-tag.md"
47
+ }
48
+ ],
49
+ "discuss-phase-assumptions": [
50
+ {
51
+ "id": "auto-advance-dispatch",
52
+ "when": "state:auto-advance-active",
53
+ "read": "gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md"
54
+ }
55
+ ],
56
+ "docs-update": [
57
+ {
58
+ "id": "dispatch-monorepo-packages",
59
+ "when": "state:is-monorepo",
60
+ "read": "gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md"
61
+ }
62
+ ],
63
+ "execute-phase": [
64
+ {
65
+ "id": "partial-wave",
66
+ "when": "flag:--wave",
67
+ "read": "gsd-core/workflows/execute-phase/steps/partial-wave.md"
68
+ },
69
+ {
70
+ "id": "gap-closure-artifacts",
71
+ "when": "state:gap-closure-phase",
72
+ "read": "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md"
73
+ },
74
+ {
75
+ "id": "regression-gate",
76
+ "when": "state:has-prior-phases",
77
+ "read": "gsd-core/workflows/execute-phase/steps/regression-gate.md"
78
+ }
79
+ ],
80
+ "new-milestone": [
81
+ {
82
+ "id": "project-md-milestone-write",
83
+ "when": "state:flat-mode",
84
+ "read": "gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md"
85
+ },
86
+ {
87
+ "id": "reset-phase-safety",
88
+ "when": "flag:--reset-phase-numbers",
89
+ "read": "gsd-core/workflows/new-milestone/steps/reset-phase-safety.md"
90
+ }
91
+ ],
92
+ "new-project": [
93
+ {
94
+ "id": "auto-mode-detection",
95
+ "when": "flag:--auto",
96
+ "read": "gsd-core/workflows/new-project/steps/auto-mode-detection.md"
97
+ },
98
+ {
99
+ "id": "codebase-map-offer",
100
+ "when": "state:needs-codebase-map",
101
+ "read": "gsd-core/workflows/new-project/steps/codebase-map-offer.md"
102
+ },
103
+ {
104
+ "id": "auto-mode-config",
105
+ "when": "flag:--auto",
106
+ "read": "gsd-core/workflows/new-project/steps/auto-mode-config.md"
107
+ }
108
+ ],
109
+ "plan-phase": [
110
+ {
111
+ "id": "reviews-prerequisite",
112
+ "when": "flag:--reviews",
113
+ "read": "gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md"
114
+ },
115
+ {
116
+ "id": "prd-express-gate",
117
+ "when": "flag:--prd",
118
+ "read": "gsd-core/workflows/plan-phase/steps/prd-express-gate.md"
119
+ },
120
+ {
121
+ "id": "adr-ingest-express-path",
122
+ "when": "flag:--ingest",
123
+ "read": "gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md"
124
+ },
125
+ {
126
+ "id": "research-only-modifiers",
127
+ "when": "flag:--research-phase",
128
+ "read": "gsd-core/workflows/plan-phase/steps/research-only-modifiers.md"
129
+ },
130
+ {
131
+ "id": "research-only-early-exit",
132
+ "when": "flag:--research-phase",
133
+ "read": "gsd-core/workflows/plan-phase/steps/research-only-early-exit.md"
134
+ },
135
+ {
136
+ "id": "chunked-planning-mode",
137
+ "when": "state:chunked-mode",
138
+ "read": "gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md"
139
+ }
140
+ ],
141
+ "progress": [
142
+ {
143
+ "id": "mvp-display",
144
+ "when": "state:phase-mvp-mode",
145
+ "read": "gsd-core/workflows/progress/steps/mvp-display.md"
146
+ },
147
+ {
148
+ "id": "forensic-audit",
149
+ "when": "flag:--forensic",
150
+ "read": "gsd-core/workflows/progress/steps/forensic-audit.md"
151
+ }
152
+ ],
153
+ "quick": [
154
+ {
155
+ "id": "discussion-phase",
156
+ "when": "flag:--discuss",
157
+ "read": "gsd-core/workflows/quick/steps/discussion-phase.md"
158
+ },
159
+ {
160
+ "id": "research-phase",
161
+ "when": "flag:--research",
162
+ "read": "gsd-core/workflows/quick/steps/research-phase.md"
163
+ },
164
+ {
165
+ "id": "plan-checker-loop",
166
+ "when": "flag:--validate",
167
+ "read": "gsd-core/workflows/quick/steps/plan-checker-loop.md"
168
+ },
169
+ {
170
+ "id": "worktree-pre-dispatch-commit",
171
+ "when": "state:worktrees-enabled",
172
+ "read": "gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md"
173
+ },
174
+ {
175
+ "id": "quick-verification",
176
+ "when": "flag:--validate",
177
+ "read": "gsd-core/workflows/quick/steps/quick-verification.md"
178
+ }
179
+ ],
180
+ "review": [
181
+ {
182
+ "id": "reviewer-instances-note-1",
183
+ "when": "state:reviewer-instances-configured",
184
+ "read": "gsd-core/workflows/review/steps/reviewer-instances-note-1.md"
185
+ },
186
+ {
187
+ "id": "reviewer-instances-note-2",
188
+ "when": "state:reviewer-instances-configured",
189
+ "read": "gsd-core/workflows/review/steps/reviewer-instances-note-2.md"
190
+ }
191
+ ],
192
+ "transition": [
193
+ {
194
+ "id": "workstream-collision-check",
195
+ "when": "state:workstream-active",
196
+ "read": "gsd-core/workflows/transition/steps/workstream-collision-check.md"
197
+ }
198
+ ],
199
+ "update": [
200
+ {
201
+ "id": "channel-banner",
202
+ "when": "state:next-channel",
203
+ "read": "gsd-core/workflows/update/steps/channel-banner.md"
204
+ }
205
+ ],
206
+ "verify-work": [
207
+ {
208
+ "id": "automated-ui-verification",
209
+ "when": "state:ui-phase-active",
210
+ "read": "gsd-core/workflows/verify-work/steps/automated-ui-verification.md"
211
+ },
212
+ {
213
+ "id": "mvp-uat-framing",
214
+ "when": "state:phase-mvp-mode",
215
+ "read": "gsd-core/workflows/verify-work/steps/mvp-uat-framing.md"
216
+ }
217
+ ]
218
+ }
219
+ }
@@ -115,7 +115,7 @@ Print: `◆ Spawning security auditor... (runs in a subagent — no output until
115
115
  ```
116
116
  Agent(
117
117
  prompt="Read ~/.claude/agents/gsd-security-auditor.md for instructions.\n\n" +
118
- "<files_to_read>{PLAN, SUMMARY, impl files, SECURITY.md}</files_to_read>" +
118
+ "<required_reading>{PLAN, SUMMARY, impl files, SECURITY.md}</required_reading>" +
119
119
  "<threat_register>{threat register}</threat_register>" +
120
120
  "<config>asvs_level: {SECURITY_ASVS}, block_on: {SECURITY_BLOCK_ON}</config>" +
121
121
  "<constraints>Never modify implementation files. Verify mitigations exist — do not scan for new threats. Escalate implementation gaps. Return a structured verdict only — do NOT write SECURITY.md (the orchestrator owns the file write).</constraints>" +
@@ -34,7 +34,8 @@ Read `.planning/ROADMAP.md` to get milestone name and goals.
34
34
 
35
35
  Check for existing reports:
36
36
  ```bash
37
- ls -la .planning/reports/SESSION_REPORT*.md 2>/dev/null || echo "No previous reports"
37
+ _REPORTS=( .planning/reports/SESSION_REPORT*.md )
38
+ if [ -e "${_REPORTS[0]}" ]; then ls -la "${_REPORTS[@]}"; else echo "No previous reports"; fi
38
39
  ```
39
40
  </step>
40
41
 
@@ -59,7 +59,7 @@ Parse current values (default to `true` if not present):
59
59
  - `graphify.auto_update` — opt-in: auto-rebuild graph after main HEAD advances (#3347) (default: `false`)
60
60
  - `model_profile` — which model each agent uses (default: `balanced`)
61
61
  - `git.branching_strategy` — branching approach (default: `"none"`)
62
- - `workflow.use_worktrees` — whether parallel executor agents run in worktree isolation (default: `true`)
62
+ - `workflow.use_worktrees` — whether parallel executor agents run in worktree isolation (honored when the runtime declares a `dispatch.isolation` primitive — `harness-worktree` or `orchestrator-worktree`; runtimes declaring `none` default it to `false` and fail closed on an explicit `true` — #1521, #2486, #2584)
63
63
  - `model_policy.provider` — provider slug for model policy (default: `null`; known values: anthropic, openai, google, qwen; set via /gsd:config --advanced)
64
64
  - `model_policy.budget` — budget level for model policy (default: `null`; known values: high, medium, low; set via /gsd:config --advanced)
65
65
  - `model_policy.high` — model ID for high-cost tier (default: `null`; set via /gsd:config --advanced)
@@ -87,6 +87,30 @@ configure `model_overrides` manually in .planning/config.json to target specific
87
87
  models per agent.
88
88
  ```
89
89
 
90
+ **Isolation resolution for the Worktrees question (#2486):** resolve the runtime's declared executor-isolation primitive and the current worktrees value before presenting the questions. Use `inspect-dispatch-isolation`, the **sentinel-free** inspection verb — never `dispatch-isolation`, whose #3045 contract records the resolved decision to the executor-dispatch sentinel as an unconditional side effect; a settings menu must not be able to stamp a sentinel the isolation guards then enforce against real dispatches. Sentinel-free is the exact claim: the shared CLI bootstrap still runs, but nothing it does can block a dispatch. The worktrees read deliberately carries no `--default`/fallback: an absent key must stay distinguishable from an explicit `false` (empty output = key absent), which the pre-selection rule below depends on.
91
+
92
+ A failed query is not a capability verdict, so track the two apart: settings still fails closed, but
93
+ says so instead of claiming the runtime declares no primitive. The verb fail-closes an unknown runtime — or an
94
+ internal resolution error — to `none` and exits 0, so `INSPECTED_RESOLVED=false` means only "the query did not answer"
95
+ (#2486 review):
96
+
97
+ ```bash
98
+ _INSPECTED_RAW=$(gsd_run query inspect-dispatch-isolation --raw 2>/dev/null)
99
+ _ISOLATION_RC=$?
100
+ if [ $_ISOLATION_RC -ne 0 ] || [ -z "$_INSPECTED_RAW" ]; then
101
+ INSPECTED_ISOLATION=none
102
+ INSPECTED_RESOLVED=false # no verdict learned — not the same as "declares none"
103
+ else
104
+ INSPECTED_ISOLATION="$_INSPECTED_RAW"
105
+ INSPECTED_RESOLVED=true
106
+ fi
107
+ case "$INSPECTED_ISOLATION" in
108
+ harness-worktree|orchestrator-worktree|none) ;;
109
+ *) INSPECTED_ISOLATION=none; INSPECTED_RESOLVED=false ;; # out of vocabulary is not a verdict either
110
+ esac
111
+ USE_WORKTREES_CURRENT=$(gsd_run query config-get workflow.use_worktrees --raw 2>/dev/null)
112
+ ```
113
+
90
114
  Use AskUserQuestion with current values pre-selected. Questions are grouped into six visual sections; the first question in each section carries the section-denoting `header` field (AskUserQuestion renders abbreviated section tags for grouping, max 12 chars).
91
115
 
92
116
  Section layout:
@@ -113,6 +137,46 @@ Context Warnings, Research Qs
113
137
 
114
138
  **Conditional visibility — graphify.auto_update:** This question is shown only when the user's chosen `graphify.enabled` value is on. If `graphify.enabled` is off, omit the `graphify.auto_update` question and preserve the existing `graphify.auto_update` value in config (do not overwrite). Implementation: ask Graphify first; only ask Graph auto-update when Graphify is enabled.
115
139
 
140
+ **Conditional options — Worktrees (#2486):** whether a runtime can honor `workflow.use_worktrees: true` depends on its **declared `dispatch.isolation` capability, not its name** (#2584): `harness-worktree` (the host isolates each executor) and `orchestrator-worktree` (GSD drives the worktrees) both run parallel; `none` fails closed on an explicit `true`. Branch on the same negotiation the execution gate resolves, via the sentinel-free `inspect-dispatch-isolation` verb, which fail-closes unknown/undeclared/`undocumented` to `none`. The rule is one-directional: **never persist a value the isolation gate would fail closed on.** **Do not add a runtime-name test here.** Branch on `$INSPECTED_ISOLATION`:
141
+
142
+ - **If `INSPECTED_ISOLATION` ≠ `none`** (`harness-worktree` or `orchestrator-worktree`): present the Worktrees question exactly as written below — unchanged behavior. The `none` branch is the entirety of the #2486 change.
143
+ - **If `INSPECTED_ISOLATION` = `none`:** replace the question's options with the two below — do NOT offer an enabling option, and NEVER write `workflow.use_worktrees: true` from this workflow when the runtime declares no isolation primitive, regardless of the user's answer:
144
+
145
+ ```
146
+ {
147
+ question: "Use git worktrees for parallel agent isolation?",
148
+ header: "Worktrees",
149
+ multiSelect: false,
150
+ options: [
151
+ { label: "No (Recommended)", description: "Write use_worktrees: false. {FINDING}, so parallel plans run sequentially and {CONSEQUENCE}." },
152
+ { label: "Leave unchanged", description: "Do not write the key. {ABSENCE}; an existing explicit value is kept intact (e.g. for a worktree-capable install sharing this config)." }
153
+ ]
154
+ }
155
+ ```
156
+
157
+ **The three placeholders** carry the only difference between a capability GSD resolved and one it could not, so no text in this branch ever asserts a verdict that was not reached. Substitute them everywhere they appear — the two `description`s above, the pre-selection rationale, and the notice — from whichever column applies:
158
+
159
+ | | `INSPECTED_RESOLVED=true` | `INSPECTED_RESOLVED=false` |
160
+ |---|---|---|
161
+ | `{FINDING}` | this runtime has no usable executor-isolation primitive | GSD could not resolve this runtime's executor-isolation capability |
162
+ | `{CONSEQUENCE}` | execution fails closed on an explicit true | GSD cannot tell whether execution will accept an explicit true |
163
+ | `{ABSENCE}` | absent, it resolves to false wherever this emit stamped that default | absent, it is the safe state until the capability resolves |
164
+
165
+ Failing closed is right in both columns — never write `workflow.use_worktrees: true` from this branch either way. Only the explanation changes.
166
+
167
+ Persistence: "No (Recommended)" → write `workflow.use_worktrees: false`; "Leave unchanged" → do not write `workflow.use_worktrees` at all (preserve the existing value or absence).
168
+
169
+ Pre-selection: the generic "current values pre-selected" rule does not apply when `INSPECTED_ISOLATION` is `none` — an explicit `true` has no matching option by design. Pre-select "No (Recommended)" in every case, including an absent key (`$USE_WORKTREES_CURRENT` empty, the no-`--default` read's absent signal): absence resolves to `false` only where this emit stamped that default and to `true` otherwise, so leaving it absent can preserve the very state this branch prevents, while an explicit `false` is correct under either emit (#2486 review). The same applies when it is an explicit non-false value — the broken-inheritance case the notice below covers. "Leave unchanged" remains available for the deliberate shared-config case, but is never the default here. The default must be the repair the "(Recommended)" label points to, so accepting it never keeps a value this branch could not justify. In TEXT_MODE, mark that option as the default in the numbered list.
170
+
171
+ Additionally, if `$USE_WORKTREES_CURRENT` is non-empty and not `false` (the config carries an explicit `true` — e.g. inherited from a worktree-capable install sharing the repo; empty means the key is absent, which needs no notice), prepend this notice before the question:
172
+
173
+ ```
174
+ Note: the project config currently sets workflow.use_worktrees: true.
175
+ {FINDING}, so {CONSEQUENCE}. Choose "No" to repair it for this runtime, or
176
+ "Leave unchanged" to keep it for a worktree-capable install that shares this
177
+ config.
178
+ ```
179
+
116
180
  ```
117
181
  // Model profile is selected via a two-question split because AskUserQuestion enforces a
118
182
  // hard 4-option cap and there are 5 valid profiles (quality, balanced, budget, adaptive,
@@ -411,7 +475,7 @@ Merge new settings into existing config.json:
411
475
  "research_before_questions": true/false,
412
476
  "discuss_mode": "discuss" | "assumptions",
413
477
  "skip_discuss": true/false,
414
- "use_worktrees": true/false
478
+ "use_worktrees": true/false // never written as true when the runtime's dispatch.isolation is none; omitted entirely when the user chose "Leave unchanged" (#2486)
415
479
  },
416
480
  "plan_review": {
417
481
  "source_grounding": true/false