@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
@@ -131,7 +131,11 @@ If `$VALIDATE_MODE` only:
131
131
  **Step 2: Initialize**
132
132
 
133
133
  ```bash
134
- INIT=$(gsd_run query init.quick "$DESCRIPTION")
134
+ DISCUSS_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--discuss([[:space:]]|$) ]]; then DISCUSS_PARAM="--discuss"; fi
135
+ RESEARCH_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--research([[:space:]]|$) ]]; then RESEARCH_PARAM="--research"; fi
136
+ VALIDATE_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--validate([[:space:]]|$) ]]; then VALIDATE_PARAM="--validate"; fi
137
+ FULL_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--full([[:space:]]|$) ]]; then FULL_PARAM="--full"; fi
138
+ INIT=$(gsd_run query init.quick "$DESCRIPTION" $DISCUSS_PARAM $RESEARCH_PARAM $VALIDATE_PARAM $FULL_PARAM)
135
139
  if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
136
140
  AGENT_SKILLS_PLANNER=$(gsd_run query agent-skills gsd-planner)
137
141
  AGENT_SKILLS_EXECUTOR=$(gsd_run query agent-skills gsd-executor)
@@ -150,12 +154,16 @@ PROJECT_PATH="$(dirname "${quick_dir}")/PROJECT.md"
150
154
  ```bash
151
155
  USE_WORKTREES=$(gsd_run query config-get workflow.use_worktrees --raw 2>/dev/null || echo "true")
152
156
  RUNTIME=$(gsd_run query config-get runtime --default claude --raw 2>/dev/null || echo "claude")
153
- if [ "$RUNTIME" != "claude" ] && [ "$USE_WORKTREES" != "false" ]; then
154
- echo "FATAL: git worktree isolation (isolation=\"worktree\") is unsupported on runtime '$RUNTIME' — it would run executor agents unisolated against the main checkout. Set workflow.use_worktrees=false." >&2
155
- exit 1
156
- fi
157
157
  ```
158
158
 
159
+ **Resolve isolation now (#2584/#2652).** Read @gsd-core/references/dispatch-isolation-gate.md
160
+ and run its `Resolve ISOLATION`, `Single-agent dispatch sites`, and `Resolve the harness flag`
161
+ blocks in order; they set `ISOLATION`/`HARNESS_FLAG` via `query dispatch-isolation`.
162
+ `ISOLATION` — not `RUNTIME` — gates every worktree decision below. Substitute `{harnessFlag}`
163
+ in Step 6's `Agent()` with `$HARNESS_FLAG`+comma when `ISOLATION = "harness-worktree"`, else
164
+ empty. `{harnessFlag}`
165
+ is a template placeholder, not a shell variable.
166
+
159
167
  If `USE_WORKTREES` is not `"false"`, run a startup orphan sweep before spawning any executors. This reaps locked worktrees whose lock-owner process is dead, whose branch is merged into the default branch, and whose lock file mtime is older than 5 minutes. Running it at startup prevents accumulation of orphaned worktrees from prior sessions that exited without cleanup (#3707).
160
168
 
161
169
  ```bash
@@ -276,205 +284,15 @@ Store `$QUICK_DIR` for use in orchestration.
276
284
 
277
285
  ---
278
286
 
279
- **Step 4.5: Discussion phase (only when `$DISCUSS_MODE`)**
280
-
281
- Skip this step entirely if NOT `$DISCUSS_MODE`.
282
-
283
- Display banner:
284
- ```
285
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
286
- GSD ► DISCUSSING QUICK TASK
287
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
288
-
289
- ◆ Surfacing gray areas for: ${DESCRIPTION}
290
- ```
291
-
292
- **4.5a. Identify gray areas**
293
-
294
- Analyze `$DESCRIPTION` to identify 2-4 gray areas — implementation decisions that would change the outcome and that the user should weigh in on.
295
-
296
- Use the domain-aware heuristic to generate phase-specific (not generic) gray areas:
297
- - Something users **SEE** → layout, density, interactions, states
298
- - Something users **CALL** → responses, errors, auth, versioning
299
- - Something users **RUN** → output format, flags, modes, error handling
300
- - Something users **READ** → structure, tone, depth, flow
301
- - Something being **ORGANIZED** → criteria, grouping, naming, exceptions
302
-
303
- Each gray area should be a concrete decision point, not a vague category. Example: "Loading behavior" not "UX".
304
-
305
- **4.5b. Present gray areas**
306
-
307
- ```
308
- AskUserQuestion(
309
- header: "Gray Areas",
310
- question: "Which areas need clarification before planning?",
311
- options: [
312
- { label: "${area_1}", description: "${why_it_matters_1}" },
313
- { label: "${area_2}", description: "${why_it_matters_2}" },
314
- { label: "${area_3}", description: "${why_it_matters_3}" },
315
- { label: "All clear", description: "Skip discussion — I know what I want" }
316
- ],
317
- multiSelect: true
318
- )
319
- ```
320
-
321
- If user selects "All clear" → skip to Step 5 (no CONTEXT.md written).
322
-
323
- **4.5c. Discuss selected areas**
324
-
325
- For each selected area, ask 1-2 focused questions via AskUserQuestion:
326
-
327
- ```
328
- AskUserQuestion(
329
- header: "${area_name}",
330
- question: "${specific_question_about_this_area}",
331
- options: [
332
- { label: "${concrete_choice_1}", description: "${what_this_means}" },
333
- { label: "${concrete_choice_2}", description: "${what_this_means}" },
334
- { label: "${concrete_choice_3}", description: "${what_this_means}" },
335
- { label: "You decide", description: "Claude's discretion" }
336
- ],
337
- multiSelect: false
338
- )
339
- ```
340
-
341
- Rules:
342
- - Options must be concrete choices, not abstract categories
343
- - Highlight recommended choice where you have a clear opinion
344
- - If user selects "Other" with freeform text, switch to plain text follow-up (per questioning.md freeform rule)
345
- - If user selects "You decide", capture as Claude's Discretion in CONTEXT.md
346
- - Max 2 questions per area — this is lightweight, not a deep dive
347
-
348
- Collect all decisions into `$DECISIONS`.
349
-
350
- **4.5d. Write CONTEXT.md**
351
-
352
- Write `${QUICK_DIR}/${quick_id}-CONTEXT.md` using the standard context template structure:
353
-
354
- ```markdown
355
- # Quick Task ${quick_id}: ${DESCRIPTION} - Context
356
-
357
- **Gathered:** ${date}
358
- **Status:** Ready for planning
359
-
360
- <domain>
361
- ## Task Boundary
362
-
363
- ${DESCRIPTION}
364
-
365
- </domain>
366
-
367
- <decisions>
368
- ## Implementation Decisions
369
-
370
- ### ${area_1_name}
371
- - ${decision_from_discussion}
372
-
373
- ### ${area_2_name}
374
- - ${decision_from_discussion}
375
-
376
- ### Claude's Discretion
377
- ${areas_where_user_said_you_decide_or_areas_not_discussed}
378
-
379
- </decisions>
380
-
381
- <specifics>
382
- ## Specific Ideas
383
-
384
- ${any_specific_references_or_examples_from_discussion}
385
-
386
- [If none: "No specific requirements — open to standard approaches"]
387
-
388
- </specifics>
389
-
390
- <canonical_refs>
391
- ## Canonical References
392
-
393
- ${any_specs_adrs_or_docs_referenced_during_discussion}
394
-
395
- [If none: "No external specs — requirements fully captured in decisions above"]
396
-
397
- </canonical_refs>
398
- ```
399
-
400
- Note: Quick task CONTEXT.md omits `<code_context>` and `<deferred>` sections (no codebase scouting, no phase scope to defer to). Keep it lean. The `<canonical_refs>` section is included when external docs were referenced — omit it only if no external docs apply.
401
-
402
- Report: `Context captured: ${QUICK_DIR}/${quick_id}-CONTEXT.md`
287
+ <!-- gsd:section id="discussion-phase" when="flag:--discuss" -->
288
+ If `section_manifest` is `null` or `"discussion-phase"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/discussion-phase.md`. Otherwise skip — do not read the file.
289
+ <!-- /gsd:section -->
403
290
 
404
291
  ---
405
292
 
406
- **Step 4.75: Research phase (only when `$RESEARCH_MODE`)**
407
-
408
- Skip this step entirely if NOT `$RESEARCH_MODE`.
409
-
410
- Display banner:
411
- ```
412
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
413
- GSD ► RESEARCHING QUICK TASK
414
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
415
-
416
- ◆ Investigating approaches for: ${DESCRIPTION} (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
417
- ```
418
-
419
- Spawn a single focused researcher (not 4 parallel researchers like full phases — quick tasks need targeted research, not broad domain surveys):
420
-
421
- <!-- #2517 model-omit-on-inherit -->
422
-
423
- > **Model omission (#2517).** Omit the `model` parameter entirely when the value it would carry (`planner_model`, `checker_model`, `executor_model`, `reviewer_model`, `verifier_model`) is `"inherit"` or empty. An empty value 404s on runtimes without native tier aliases — the default on non-Claude runtimes. Omitting it inherits the orchestrator's model. See @gsd-core/references/model-profile-resolution.md.
424
-
425
- ```
426
- Agent(
427
- prompt="
428
- <research_context>
429
-
430
- **Mode:** quick-task
431
- **Task:** ${DESCRIPTION}
432
- **Output:** ${QUICK_DIR}/${quick_id}-RESEARCH.md
433
-
434
- <files_to_read>
435
- - ${STATE_PATH} (Project state — what's already built)
436
- - ${PROJECT_PATH} (Project context)
437
- - ./CLAUDE.md or ./.claude/CLAUDE.md (if exists — project-specific guidelines)
438
- ${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + quick_id + '-CONTEXT.md (User decisions — research should align with these)' : ''}
439
- </files_to_read>
440
-
441
- ${AGENT_SKILLS_PLANNER}
442
-
443
- </research_context>
444
-
445
- <focus>
446
- This is a quick task, not a full phase. Research should be concise and targeted:
447
- 1. Best libraries/patterns for this specific task
448
- 2. Common pitfalls and how to avoid them
449
- 3. Integration points with existing codebase
450
- 4. Any constraints or gotchas worth knowing before planning
451
-
452
- Do NOT produce a full domain survey. Target 1-2 pages of actionable findings.
453
- </focus>
454
-
455
- <!-- #2508 runtime-aware-dispatch -->
456
-
457
- > **Runtime-aware dispatch (#2508 Phase 4).** GSD workflows dispatch specialized subagents by role. Before dispatching on a built-in-only runtime (kimi-code — three built-ins only), resolve the role to a built-in via `gsd_run query resolve-dispatch-type --requested <role> --raw`. On named-dispatch runtimes (Claude/OpenCode/…) the role is returned unchanged; on kimi-code it maps to `coder`/`explore`/`plan` by role-suffix. The persona rides `${AGENT_SKILLS_<ROLE>}` (Phase 3) regardless. See @gsd-core/references/runtime-aware-dispatch.md.
458
-
459
- <output>
460
- Write research to: ${QUICK_DIR}/${quick_id}-RESEARCH.md
461
- Use standard research format but keep it lean — skip sections that don't apply.
462
- Return: ## RESEARCH COMPLETE with file path
463
- </output>
464
- ",
465
- subagent_type="gsd-phase-researcher",
466
- model="{planner_model}",
467
- description="Research: ${DESCRIPTION}"
468
- )
469
- ```
470
-
471
- > **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
472
-
473
- After researcher returns:
474
- 1. Verify research exists at `${QUICK_DIR}/${quick_id}-RESEARCH.md`
475
- 2. Report: "Research complete: ${QUICK_DIR}/${quick_id}-RESEARCH.md"
476
-
477
- If research file not found, warn but continue: "Research agent did not produce output — proceeding to planning without research."
293
+ <!-- gsd:section id="research-phase" when="flag:--research" -->
294
+ If `section_manifest` is `null` or `"research-phase"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/research-phase.md`. Otherwise skip — do not read the file.
295
+ <!-- /gsd:section -->
478
296
 
479
297
  ---
480
298
 
@@ -495,12 +313,12 @@ Agent(
495
313
  **Directory:** ${QUICK_DIR}
496
314
  **Description:** ${DESCRIPTION}
497
315
 
498
- <files_to_read>
316
+ <required_reading>
499
317
  - ${STATE_PATH} (Project State)
500
318
  - ./CLAUDE.md or ./.claude/CLAUDE.md (if exists — follow project-specific guidelines)
501
319
  ${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + quick_id + '-CONTEXT.md (User decisions — locked, do not revisit)' : ''}
502
320
  ${RESEARCH_MODE ? '- ' + QUICK_DIR + '/' + quick_id + '-RESEARCH.md (Research findings — use to inform implementation choices)' : ''}
503
- </files_to_read>
321
+ </required_reading>
504
322
 
505
323
  ${AGENT_SKILLS_PLANNER}
506
324
 
@@ -539,156 +357,15 @@ If plan not found, error: "Planner failed to create ${quick_id}-PLAN.md"
539
357
 
540
358
  ---
541
359
 
542
- **Step 5.5: Plan-checker loop (only when `$VALIDATE_MODE`)**
543
-
544
- Skip this step entirely if NOT `$VALIDATE_MODE`.
545
-
546
- Display banner:
547
- ```
548
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
549
- GSD ► CHECKING PLAN
550
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
551
-
552
- ◆ Spawning plan checker... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
553
- ```
554
-
555
- Checker prompt:
556
-
557
- ```markdown
558
- <verification_context>
559
- **Mode:** quick-full
560
- **Task Description:** ${DESCRIPTION}
561
-
562
- <files_to_read>
563
- - ${QUICK_DIR}/${quick_id}-PLAN.md (Plan to verify)
564
- </files_to_read>
565
-
566
- ${AGENT_SKILLS_CHECKER}
567
-
568
- **Scope:** This is a quick task, not a full phase. Skip checks that require a ROADMAP phase goal.
569
- </verification_context>
570
-
571
- <check_dimensions>
572
- - Requirement coverage: Does the plan address the task description?
573
- - Task completeness: Do tasks have files, action, verify, done fields?
574
- - Key links: Are referenced files real?
575
- - Scope sanity: Is this appropriately sized for a quick task (1-3 tasks)?
576
- - must_haves derivation: Are must_haves traceable to the task description?
577
-
578
- Skip: cross-plan deps (single plan), ROADMAP alignment
579
- ${DISCUSS_MODE ? '- Context compliance: Does the plan honor locked decisions from CONTEXT.md?' : '- Skip: context compliance (no CONTEXT.md)'}
580
- </check_dimensions>
581
-
582
- <expected_output>
583
- - ## VERIFICATION PASSED — all checks pass
584
- - ## ISSUES FOUND — structured issue list
585
- </expected_output>
586
- ```
587
-
588
- ```
589
- Agent(
590
- prompt=checker_prompt,
591
- subagent_type="gsd-plan-checker",
592
- model="{checker_model}",
593
- description="Check quick plan: ${DESCRIPTION}"
594
- )
595
- ```
596
-
597
- > **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
598
-
599
- **Handle checker return:**
600
-
601
- - **`## VERIFICATION PASSED`:** Display confirmation, proceed to step 6.
602
- - **`## ISSUES FOUND`:** Display issues, check iteration count, enter revision loop.
603
-
604
- **Revision loop (max 2 iterations):**
605
-
606
- Track `iteration_count` (starts at 1 after initial plan + check).
607
-
608
- **If iteration_count < 2:**
609
-
610
- Display: `Sending back to planner for revision... (iteration ${N}/2)`
611
-
612
- Revision prompt:
613
-
614
- ```markdown
615
- <revision_context>
616
- **Mode:** quick-full (revision)
617
-
618
- <files_to_read>
619
- - ${QUICK_DIR}/${quick_id}-PLAN.md (Existing plan)
620
- </files_to_read>
621
-
622
- ${AGENT_SKILLS_PLANNER}
623
-
624
- **Checker issues:** ${structured_issues_from_checker}
625
-
626
- </revision_context>
627
-
628
- <instructions>
629
- Make targeted updates to address checker issues.
630
- Do NOT replan from scratch unless issues are fundamental.
631
- Return what changed.
632
- </instructions>
633
- ```
634
-
635
- ```
636
- Agent(
637
- prompt=revision_prompt,
638
- subagent_type="gsd-planner",
639
- model="{planner_model}",
640
- description="Revise quick plan: ${DESCRIPTION}"
641
- )
642
- ```
643
-
644
- > **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
645
-
646
- After planner returns → spawn checker again, increment iteration_count.
647
-
648
- **If iteration_count >= 2:**
649
-
650
- Display: `Max iterations reached. ${N} issues remain:` + issue list
651
-
652
- Offer: 1) Force proceed, 2) Abort
360
+ <!-- gsd:section id="plan-checker-loop" when="flag:--validate" -->
361
+ If `section_manifest` is `null` or `"plan-checker-loop"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/plan-checker-loop.md`. Otherwise skip — do not read the file.
362
+ <!-- /gsd:section -->
653
363
 
654
364
  ---
655
365
 
656
- **Step 5.6: Pre-dispatch plan commit (worktree mode only)**
657
-
658
- When `USE_WORKTREES !== "false"`, commit PLAN.md to the current branch **before** spawning the executor. This ensures the worktree inherits PLAN.md at its branch HEAD so the executor can read it via a worktree-rooted path — avoiding the main-repo path priming that triggers CC #36182 path-resolution drift.
659
-
660
- Skip this step entirely if `USE_WORKTREES === "false"` (non-worktree mode: PLAN.md is committed in Step 8 as usual).
661
-
662
- ```bash
663
- QUICK_PLAN_PARENT=""
664
- QUICK_PLAN_COMMIT=""
665
- if [ "${USE_WORKTREES}" != "false" ]; then
666
- QUICK_PLAN_PARENT=$(git rev-parse HEAD)
667
- COMMIT_DOCS=$(gsd_run query config-get commit_docs 2>/dev/null || echo "true")
668
- if [ "$COMMIT_DOCS" != "false" ]; then
669
- git add "${QUICK_DIR}/${quick_id}-PLAN.md"
670
- # No-op skip if nothing actually staged (idempotent re-runs).
671
- if git diff --cached --quiet -- "${QUICK_DIR}/${quick_id}-PLAN.md"; then
672
- echo "ℹ Pre-dispatch PLAN.md commit skipped (no staged changes)"
673
- else
674
- # Run hooks normally (#2924). If a project opts out via
675
- # workflow.worktree_skip_hooks=true, honor that opt-in only.
676
- SKIP_HOOKS=$(gsd_run query config-get workflow.worktree_skip_hooks 2>/dev/null || echo "false")
677
- if [ "$SKIP_HOOKS" = "true" ]; then
678
- git commit --no-verify -m "docs(${quick_id}): pre-dispatch plan for ${DESCRIPTION}" -- "${QUICK_DIR}/${quick_id}-PLAN.md" \
679
- || { echo "ERROR: pre-dispatch PLAN.md commit failed (--no-verify path). Aborting before executor dispatch." >&2; exit 1; }
680
- else
681
- git commit -m "docs(${quick_id}): pre-dispatch plan for ${DESCRIPTION}" -- "${QUICK_DIR}/${quick_id}-PLAN.md" \
682
- || { echo "ERROR: pre-dispatch PLAN.md commit failed — likely a pre-commit hook failure. Fix the hook output above (or set workflow.worktree_skip_hooks=true to bypass) and re-run." >&2; exit 1; }
683
- fi
684
- QUICK_PLAN_COMMIT=$(git rev-parse HEAD)
685
- fi
686
- fi
687
- if [ -z "$QUICK_PLAN_COMMIT" ]; then
688
- QUICK_PLAN_COMMIT=$(git rev-parse HEAD)
689
- fi
690
- fi
691
- ```
366
+ <!-- gsd:section id="worktree-pre-dispatch-commit" when="state:worktrees-enabled" -->
367
+ If `section_manifest` is `null` or `"worktree-pre-dispatch-commit"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md`. Otherwise skip — do not read the file.
368
+ <!-- /gsd:section -->
692
369
 
693
370
  ---
694
371
 
@@ -703,21 +380,37 @@ halts with a base-mismatch fatal — potentially many commits behind, not just o
703
380
  immediately before capturing `EXPECTED_BASE` so it reflects the most current local state.
704
381
 
705
382
  ```bash
706
- if [ "$RUNTIME" = "claude" ] && [ "${USE_WORKTREES:-true}" != "false" ]; then
383
+ if [ "$ISOLATION" = "harness-worktree" ] && [ "${USE_WORKTREES:-true}" != "false" ]; then
707
384
  _QUICK_SHOULD_DEGRADE=$(gsd_run query worktree.base-check --pick shouldDegrade 2>/dev/null || true)
708
385
  if [ "$_QUICK_SHOULD_DEGRADE" = "true" ]; then
709
386
  _QUICK_DEGRADE_MSG=$(gsd_run query worktree.base-check --pick message 2>/dev/null || true)
710
387
  [ -n "$_QUICK_DEGRADE_MSG" ] && printf '%s\n' "$_QUICK_DEGRADE_MSG" >&2
711
388
  echo "⚠ [#1941] Worktree fork base diverged from orchestrator HEAD — auto-degrading to sequential mode for this quick task to avoid a base-mismatch halt." >&2
712
389
  USE_WORKTREES=false
390
+ ISOLATION=none
713
391
  fi
714
392
  fi
393
+
394
+ # Re-resolve (and, as a side effect, re-persist) now that the base-check
395
+ # auto-degrade above may have changed $ISOLATION since the Step 2 gate's
396
+ # `dispatch-isolation` call (#3045). That first call recorded the NATURALLY
397
+ # resolved mode into the run-scoped sentinel the isolation guard hooks read
398
+ # (hooks/gsd-agent-isolation-guard.js, hooks/gsd-cursor-subagent-start.js via
399
+ # hooks/lib/isolation-sentinel.js). The degrade above is decided HERE, in
400
+ # shell — the resolver cannot see it — so without this the sentinel still
401
+ # asserts `harness-worktree` while the dispatch below correctly omits the
402
+ # harness flag, and the guard denies the dispatch with exit 2. `--force-isolation`
403
+ # pushes the FINAL, shell-computed value through that SAME single write path
404
+ # (`none` also clears the stored harnessFlag, since none applies to sequential
405
+ # dispatch). Best-effort: a write failure here must never fail the task — the
406
+ # guards' own sentinel-absent fallback is safe, just less precise.
407
+ gsd_run query dispatch-isolation --raw --force-isolation "$ISOLATION" >/dev/null 2>&1 || true
715
408
  ```
716
409
 
717
410
  Capture current HEAD before spawning (used for worktree branch check):
718
411
  ```bash
719
412
  EXPECTED_BASE=$(git rev-parse HEAD)
720
- if [ "${USE_WORKTREES:-true}" != "false" ]; then
413
+ if [ "$ISOLATION" = "harness-worktree" ]; then # keyed on ISOLATION like every other dispatch-coupled branch (#2652)
721
414
  # BSD/macOS mktemp only randomizes XXXXXX when it is the final path component, so make a
722
415
  # suffixless temp then append the extension — portable across BSD + GNU (#1520).
723
416
  QUICK_WORKTREE_MANIFEST=$(mktemp "${TMPDIR:-/tmp}/gsd-quick-worktree-XXXXXX") && mv "$QUICK_WORKTREE_MANIFEST" "${QUICK_WORKTREE_MANIFEST}.json" && QUICK_WORKTREE_MANIFEST="${QUICK_WORKTREE_MANIFEST}.json" || exit 1
@@ -733,7 +426,7 @@ Agent(
733
426
  prompt="
734
427
  Execute quick task ${quick_id}.
735
428
 
736
- ${USE_WORKTREES !== "false" ? `
429
+ ${ISOLATION === "harness-worktree" ? `
737
430
  <worktree_branch_check>
738
431
  ORCHESTRATOR build-time embed (NOT a sub-agent runtime step): before this dispatch, read \`gsd-core/references/worktree-branch-check.md\`, substitute \`{EXPECTED_BASE}\` with the base SHA captured above (${EXPECTED_BASE}), substitute \`{EXPECTED_BASE_ALTERNATE}\` with \`${QUICK_PLAN_PARENT}\` when it differs from \`${EXPECTED_BASE}\` (otherwise empty), and replace this note with that fragment's \`<worktree_branch_check>\` block so the dispatched prompt carries the runnable guard verbatim — do not pass this instruction through in its place.
739
432
  </worktree_branch_check>
@@ -753,12 +446,12 @@ fi
753
446
  \`\`\`
754
447
  ` : ''}
755
448
 
756
- <files_to_read>
449
+ <required_reading>
757
450
  - ${QUICK_DIR}/${quick_id}-PLAN.md (Plan)
758
451
  - ${STATE_PATH} (Project state)
759
452
  - ./CLAUDE.md or ./.claude/CLAUDE.md (Project instructions, if exists)
760
453
  - .claude/skills/ or .agents/skills/ (Project skills, if either exists — list skills, read SKILL.md for each, follow relevant rules during implementation)
761
- </files_to_read>
454
+ </required_reading>
762
455
 
763
456
  ${AGENT_SKILLS_EXECUTOR}
764
457
 
@@ -807,17 +500,17 @@ SUMMARY.md and stop — the user must rerun with worktrees disabled.
807
500
  ",
808
501
  subagent_type="gsd-executor",
809
502
  model="{executor_model}",
810
- ${USE_WORKTREES !== "false" ? 'isolation="worktree",' : ''}
503
+ {harnessFlag}
811
504
  description="Execute: ${DESCRIPTION}"
812
505
  )
813
506
  ```
814
507
 
815
508
  > **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
816
509
 
817
- If the executor ran with `isolation="worktree"`, append its returned `{agent_id, worktree_path, branch, expected_base, allowed_bases}` metadata to `QUICK_WORKTREE_MANIFEST` before cleanup. Set `expected_base` to `${EXPECTED_BASE}` and `allowed_bases` to `["${EXPECTED_BASE}", "${QUICK_PLAN_PARENT}"]` with duplicates removed. If any required field is unavailable, stop and ask for recovery; do not discover global worktrees.
510
+ If the executor ran isolated (`ISOLATION = "harness-worktree"` at dispatch), append its returned `{agent_id, worktree_path, branch, expected_base, allowed_bases}` metadata to `QUICK_WORKTREE_MANIFEST` before cleanup. Set `expected_base` to `${EXPECTED_BASE}` and `allowed_bases` to `["${EXPECTED_BASE}", "${QUICK_PLAN_PARENT}"]` with duplicates removed. If any required field is unavailable, stop and ask for recovery; do not discover global worktrees.
818
511
 
819
512
  After executor returns:
820
- 1. **Worktree cleanup:** If the executor ran with `isolation="worktree"`, merge the worktree branch back and clean up:
513
+ 1. **Worktree cleanup:** If the executor ran isolated (`ISOLATION = "harness-worktree"` at dispatch), merge the worktree branch back and clean up:
821
514
  ```bash
822
515
  QUICK_WORKTREE_MANIFEST=${QUICK_WORKTREE_MANIFEST:-$WAVE_WORKTREE_MANIFEST}
823
516
  [ -n "${QUICK_WORKTREE_MANIFEST:-}" ] && [ -f "$QUICK_WORKTREE_MANIFEST" ] || {
@@ -831,7 +524,7 @@ After executor returns:
831
524
  # Fail closed: SDK refusal (safety guard #3174/#3384) must surface — do not swallow exit 1.
832
525
  gsd_run query worktree.cleanup-wave --manifest "$QUICK_WORKTREE_MANIFEST" || exit 1
833
526
  ```
834
- If `workflow.use_worktrees` is `false`, skip this step.
527
+ If `ISOLATION` was not `"harness-worktree"` at dispatch (including a #1941 base-check degrade — that is *this* file's degrade; #2649 is the `diagnose-issues.md` / `execute-plan.md` one), skip this step.
835
528
 
836
529
  > **ISOLATED-RUN RECOVERY — FAIL SAFE (#1292):** When an isolated (worktree) run is *rejected* — the user declines to merge it, the orchestrator surfaces recovery guidance for a blocked/halted plan, or the run over-reached the requested scope — the worktree-isolation contract MUST hold through recovery. Do **NOT** propose continuing on `main`/the primary checkout as the default or recommended recovery path. Default to a **safe halt** and offer: (a) re-attempt in a **fresh, narrowly-scoped worktree**, or (b) inspect or discard the rejected worktree without merging. Any path that edits the primary checkout requires an **explicit, clearly-labeled confirmation** from the user first — editing `main` directly is never the proposed or default option for a run the user configured to be isolated.
837
530
 
@@ -901,52 +594,9 @@ If review produces findings, display advisory message. **Error handling:** Failu
901
594
 
902
595
  ---
903
596
 
904
- **Step 6.5: Verification (only when `$VALIDATE_MODE`)**
905
-
906
- Skip this step entirely if NOT `$VALIDATE_MODE`.
907
-
908
- Display banner:
909
- ```
910
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
911
- GSD ► VERIFYING RESULTS
912
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
913
-
914
- ◆ Spawning verifier... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
915
- ```
916
-
917
- ```
918
- Agent(
919
- prompt="Verify quick task goal achievement.
920
- Task directory: ${QUICK_DIR}
921
- Task goal: ${DESCRIPTION}
922
-
923
- <files_to_read>
924
- - ${QUICK_DIR}/${quick_id}-PLAN.md (Plan)
925
- </files_to_read>
926
-
927
- ${AGENT_SKILLS_VERIFIER}
928
-
929
- Check must_haves against actual codebase. Create VERIFICATION.md at ${QUICK_DIR}/${quick_id}-VERIFICATION.md.",
930
- subagent_type="gsd-verifier",
931
- model="{verifier_model}",
932
- description="Verify: ${DESCRIPTION}"
933
- )
934
- ```
935
-
936
- > **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
937
-
938
- Read verification status:
939
- ```bash
940
- grep "^status:" "${QUICK_DIR}/${quick_id}-VERIFICATION.md" | cut -d: -f2 | tr -d ' '
941
- ```
942
-
943
- Store as `$VERIFICATION_STATUS`.
944
-
945
- | Status | Action |
946
- |--------|--------|
947
- | `passed` | Store `$VERIFICATION_STATUS = "Verified"`, continue to step 7 |
948
- | `human_needed` | Display items needing manual check, store `$VERIFICATION_STATUS = "Needs Review"`, continue |
949
- | `gaps_found` | Display gap summary, offer: 1) Re-run executor to fix gaps, 2) Accept as-is. Store `$VERIFICATION_STATUS = "Gaps"` |
597
+ <!-- gsd:section id="quick-verification" when="flag:--validate" -->
598
+ If `section_manifest` is `null` or `"quick-verification"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/quick-verification.md`. Otherwise skip — do not read the file.
599
+ <!-- /gsd:section -->
950
600
 
951
601
  ---
952
602
 
@@ -64,6 +64,9 @@ cat .planning/PROJECT.md
64
64
  Look for incomplete work that needs attention:
65
65
 
66
66
  ```bash
67
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
68
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
69
+
67
70
  # Check for structured handoff (preferred — machine-readable)
68
71
  cat .planning/HANDOFF.json 2>/dev/null || true
69
72
 
@@ -0,0 +1,4 @@
1
+ **Reviewer instances (#1517, optional):** if `review.reviewer_instances` is configured,
2
+ instance names in `review.default_reviewers` run as independent identities. Resolution rules
3
+ are in `gsd-core/references/reviewer-instances.md` — load it lazily only when instances are
4
+ configured. Unconfigured → default path unchanged.
@@ -0,0 +1,3 @@
1
+ **Reviewer instances (#1517, optional):** instances resolve *through* a lane and are not lanes
2
+ themselves (ADR-2782 D8). Each selected instance invokes its base `cli` with its own `model`/`agent`
3
+ as opaque argv. Exact invocation in `gsd-core/references/reviewer-instances.md`.