@opengsd/gsd-core 1.9.0 → 1.10.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 (223) 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 +131 -34
  5. package/agents/gsd-debugger.md +12 -246
  6. package/agents/gsd-executor.md +7 -5
  7. package/agents/gsd-integration-checker.md +3 -0
  8. package/agents/gsd-plan-checker.md +9 -0
  9. package/agents/gsd-planner.md +5 -8
  10. package/agents/gsd-roadmapper.md +21 -3
  11. package/agents/gsd-verifier.md +14 -70
  12. package/bin/install.js +503 -341
  13. package/commands/gsd/mempalace-capture.md +1 -1
  14. package/commands/gsd/new-milestone.md +1 -1
  15. package/commands/gsd/plan-phase.md +1 -1
  16. package/gsd-core/bin/gsd-tools.cjs +607 -63
  17. package/gsd-core/bin/lib/active-workstream-store.cjs +25 -0
  18. package/gsd-core/bin/lib/agent-install-check.cjs +38 -6
  19. package/gsd-core/bin/lib/api-coverage.cjs +120 -0
  20. package/gsd-core/bin/lib/audit.cjs +89 -1
  21. package/gsd-core/bin/lib/broken-windows.cjs +36 -6
  22. package/gsd-core/bin/lib/capability-registry.cjs +96 -110
  23. package/gsd-core/bin/lib/capability-validator.cjs +12 -2
  24. package/gsd-core/bin/lib/check-command-router.cjs +43 -1
  25. package/gsd-core/bin/lib/command-aliases.cjs +72 -0
  26. package/gsd-core/bin/lib/commands.cjs +26 -25
  27. package/gsd-core/bin/lib/commonjs-marker.cjs +136 -0
  28. package/gsd-core/bin/lib/config-loader.cjs +1 -0
  29. package/gsd-core/bin/lib/config.cjs +12 -1
  30. package/gsd-core/bin/lib/context-composer.cjs +278 -0
  31. package/gsd-core/bin/lib/context-predicates.cjs +506 -0
  32. package/gsd-core/bin/lib/core-utils.cjs +91 -12
  33. package/gsd-core/bin/lib/docs.cjs +3 -2
  34. package/gsd-core/bin/lib/external-job.cjs +19 -4
  35. package/gsd-core/bin/lib/frontmatter.cjs +84 -12
  36. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
  37. package/gsd-core/bin/lib/git-base-branch.cjs +58 -15
  38. package/gsd-core/bin/lib/graphify.cjs +142 -27
  39. package/gsd-core/bin/lib/gsd2-import.cjs +27 -4
  40. package/gsd-core/bin/lib/host-integration.cjs +13 -1
  41. package/gsd-core/bin/lib/init-command-router.cjs +83 -8
  42. package/gsd-core/bin/lib/init.cjs +1021 -57
  43. package/gsd-core/bin/lib/install-engine.cjs +64 -10
  44. package/gsd-core/bin/lib/install-profiles.cjs +27 -1
  45. package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
  46. package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
  47. package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
  48. package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
  49. package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
  50. package/gsd-core/bin/lib/installer-migrations.cjs +87 -1
  51. package/gsd-core/bin/lib/io.cjs +28 -3
  52. package/gsd-core/bin/lib/markdown-sectionizer.cjs +6 -0
  53. package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
  54. package/gsd-core/bin/lib/mcp-server.cjs +135 -3
  55. package/gsd-core/bin/lib/milestone.cjs +106 -51
  56. package/gsd-core/bin/lib/phase-id.cjs +63 -0
  57. package/gsd-core/bin/lib/phase-locator.cjs +138 -45
  58. package/gsd-core/bin/lib/phase.cjs +260 -25
  59. package/gsd-core/bin/lib/plan-dependency-graph.cjs +232 -0
  60. package/gsd-core/bin/lib/planning-workspace.cjs +4 -0
  61. package/gsd-core/bin/lib/project-root.cjs +48 -0
  62. package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
  63. package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +80 -0
  64. package/gsd-core/bin/lib/review-lane-descriptor.cjs +99 -0
  65. package/gsd-core/bin/lib/review-lane-runner.cjs +30 -6
  66. package/gsd-core/bin/lib/roadmap-command-router.cjs +42 -9
  67. package/gsd-core/bin/lib/roadmap-parser.cjs +100 -18
  68. package/gsd-core/bin/lib/roadmap.cjs +37 -7
  69. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +195 -62
  70. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +15 -3
  71. package/gsd-core/bin/lib/runtime-homes.cjs +154 -41
  72. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +105 -41
  73. package/gsd-core/bin/lib/section-manifest.cjs +209 -0
  74. package/gsd-core/bin/lib/shell-command-projection.cjs +113 -27
  75. package/gsd-core/bin/lib/smart-entry.cjs +12 -0
  76. package/gsd-core/bin/lib/state-transition.cjs +73 -8
  77. package/gsd-core/bin/lib/state.cjs +151 -62
  78. package/gsd-core/bin/lib/surface.cjs +12 -1
  79. package/gsd-core/bin/lib/uat-predicate.cjs +11 -1
  80. package/gsd-core/bin/lib/uat.cjs +320 -21
  81. package/gsd-core/bin/lib/unusable-input.cjs +9 -0
  82. package/gsd-core/bin/lib/verification.cjs +29 -12
  83. package/gsd-core/bin/lib/verify.cjs +29 -5
  84. package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
  85. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +181 -18
  86. package/gsd-core/bin/lib/workstream-inventory.cjs +519 -27
  87. package/gsd-core/bin/lib/workstream.cjs +6 -0
  88. package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
  89. package/gsd-core/bin/lib/worktree-safety.cjs +276 -118
  90. package/gsd-core/bin/shared/config-schema.manifest.json +2 -0
  91. package/gsd-core/references/artifact-types.md +10 -3
  92. package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
  93. package/gsd-core/references/debugger-techniques.md +255 -0
  94. package/gsd-core/references/research-documentation-lookup.md +5 -3
  95. package/gsd-core/references/specless-probe-fallback.md +7 -6
  96. package/gsd-core/references/verifier-wiring-patterns.md +100 -0
  97. package/gsd-core/references/worktree-branch-check.md +2 -2
  98. package/gsd-core/templates/summary-complex.md +2 -0
  99. package/gsd-core/templates/summary-minimal.md +2 -0
  100. package/gsd-core/templates/summary-standard.md +2 -0
  101. package/gsd-core/templates/summary.md +2 -0
  102. package/gsd-core/workflows/audit-milestone.md +3 -0
  103. package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
  104. package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
  105. package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
  106. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
  107. package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
  108. package/gsd-core/workflows/autonomous.md +32 -69
  109. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
  110. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +83 -0
  111. package/gsd-core/workflows/code-review.md +42 -145
  112. package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
  113. package/gsd-core/workflows/complete-milestone.md +23 -81
  114. package/gsd-core/workflows/debug.md +9 -12
  115. package/gsd-core/workflows/diagnose-issues.md +22 -0
  116. package/gsd-core/workflows/discovery-phase.md +4 -4
  117. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
  118. package/gsd-core/workflows/discuss-phase-assumptions.md +5 -16
  119. package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
  120. package/gsd-core/workflows/docs-update.md +8 -51
  121. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +34 -2
  122. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
  123. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
  124. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +19 -0
  125. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
  126. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
  127. package/gsd-core/workflows/execute-phase.md +65 -137
  128. package/gsd-core/workflows/execute-plan.md +1 -1
  129. package/gsd-core/workflows/help/modes/full.md +6 -1
  130. package/gsd-core/workflows/ingest-docs.md +2 -1
  131. package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
  132. package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
  133. package/gsd-core/workflows/new-milestone.md +21 -38
  134. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
  135. package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
  136. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
  137. package/gsd-core/workflows/new-project.md +13 -226
  138. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
  139. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
  140. package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
  141. package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
  142. package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
  143. package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
  144. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
  145. package/gsd-core/workflows/plan-phase.md +49 -193
  146. package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
  147. package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
  148. package/gsd-core/workflows/progress.md +11 -153
  149. package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
  150. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
  151. package/gsd-core/workflows/quick/steps/quick-verification.md +46 -0
  152. package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
  153. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
  154. package/gsd-core/workflows/quick.md +20 -390
  155. package/gsd-core/workflows/resume-project.md +3 -0
  156. package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
  157. package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
  158. package/gsd-core/workflows/review.md +15 -8
  159. package/gsd-core/workflows/section-manifest.json +219 -0
  160. package/gsd-core/workflows/sketch.md +1 -1
  161. package/gsd-core/workflows/spec-phase.md +17 -14
  162. package/gsd-core/workflows/spike-wrap-up.md +20 -5
  163. package/gsd-core/workflows/spike.md +50 -16
  164. package/gsd-core/workflows/sync-skills.md +49 -11
  165. package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
  166. package/gsd-core/workflows/transition.md +8 -21
  167. package/gsd-core/workflows/ui-phase.md +8 -7
  168. package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
  169. package/gsd-core/workflows/update.md +18 -7
  170. package/gsd-core/workflows/verify-phase.md +4 -7
  171. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
  172. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
  173. package/gsd-core/workflows/verify-work.md +8 -58
  174. package/hooks/dist/gsd-agent-isolation-guard.js +428 -0
  175. package/hooks/dist/gsd-check-update-worker.js +14 -5
  176. package/hooks/dist/gsd-cursor-subagent-start.js +532 -26
  177. package/hooks/dist/gsd-read-injection-scanner.js +7 -0
  178. package/hooks/dist/gsd-statusline.js +72 -6
  179. package/hooks/dist/gsd-worktree-path-guard.js +2 -1
  180. package/hooks/dist/gsd-write-guard.js +359 -0
  181. package/hooks/dist/lib/isolation-sentinel.js +268 -0
  182. package/hooks/dist/managed-hooks-registry.cjs +2 -0
  183. package/hooks/gsd-agent-isolation-guard.js +428 -0
  184. package/hooks/gsd-check-update-worker.js +14 -5
  185. package/hooks/gsd-cursor-subagent-start.js +532 -26
  186. package/hooks/gsd-read-injection-scanner.js +7 -0
  187. package/hooks/gsd-statusline.js +72 -6
  188. package/hooks/gsd-worktree-path-guard.js +2 -1
  189. package/hooks/gsd-write-guard.js +359 -0
  190. package/hooks/hooks.json +12 -0
  191. package/hooks/lib/isolation-sentinel.js +268 -0
  192. package/hooks/managed-hooks-registry.cjs +2 -0
  193. package/package.json +14 -5
  194. package/pi/gsd.cjs +57 -12
  195. package/scripts/build-hooks.js +9 -0
  196. package/scripts/changeset/lint.cjs +9 -2
  197. package/scripts/changeset/serialize.cjs +5 -1
  198. package/scripts/gen-capability-matrix.cjs +1 -1
  199. package/scripts/gen-context-index.cjs +448 -0
  200. package/scripts/gen-inventory-manifest.cjs +101 -1
  201. package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
  202. package/scripts/gen-registry.cjs +39 -15
  203. package/scripts/gen-section-manifest.cjs +638 -0
  204. package/scripts/generate-package-identity.cjs +4 -2
  205. package/scripts/lint-allow-test-rule-refs.allowlist.json +17 -31
  206. package/scripts/lint-compiled-artifact-sync.cjs +6 -1
  207. package/scripts/lint-docs-command-form.cjs +195 -0
  208. package/scripts/lint-docs-required.cjs +9 -1
  209. package/scripts/lint-emitted-drift-ack.cjs +215 -20
  210. package/scripts/lint-example-parser-parity.cjs +395 -0
  211. package/scripts/lint-test-file-count.allowlist.json +27 -1
  212. package/scripts/mutation-matrix.cjs +13 -0
  213. package/scripts/prompt-injection-scan.sh +27 -6
  214. package/scripts/registry-schema.cjs +323 -94
  215. package/scripts/run-tests.cjs +3 -2
  216. package/scripts/validate-registry.cjs +10 -6
  217. package/skills/gsd-autonomous/SKILL.md +1 -1
  218. package/skills/gsd-execute-phase/SKILL.md +1 -1
  219. package/skills/gsd-mempalace-capture/SKILL.md +1 -1
  220. package/skills/gsd-new-milestone/SKILL.md +1 -1
  221. package/skills/gsd-plan-phase/SKILL.md +2 -2
  222. package/vscode/package.json +1 -1
  223. package/scripts/gen-emitted-baseline.cjs +0 -145
@@ -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)
@@ -276,205 +280,15 @@ Store `$QUICK_DIR` for use in orchestration.
276
280
 
277
281
  ---
278
282
 
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`
283
+ <!-- gsd:section id="discussion-phase" when="flag:--discuss" -->
284
+ 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.
285
+ <!-- /gsd:section -->
403
286
 
404
287
  ---
405
288
 
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."
289
+ <!-- gsd:section id="research-phase" when="flag:--research" -->
290
+ 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.
291
+ <!-- /gsd:section -->
478
292
 
479
293
  ---
480
294
 
@@ -539,156 +353,15 @@ If plan not found, error: "Planner failed to create ${quick_id}-PLAN.md"
539
353
 
540
354
  ---
541
355
 
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
356
+ <!-- gsd:section id="plan-checker-loop" when="flag:--validate" -->
357
+ 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.
358
+ <!-- /gsd:section -->
653
359
 
654
360
  ---
655
361
 
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
- ```
362
+ <!-- gsd:section id="worktree-pre-dispatch-commit" when="state:worktrees-enabled" -->
363
+ 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.
364
+ <!-- /gsd:section -->
692
365
 
693
366
  ---
694
367
 
@@ -901,52 +574,9 @@ If review produces findings, display advisory message. **Error handling:** Failu
901
574
 
902
575
  ---
903
576
 
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"` |
577
+ <!-- gsd:section id="quick-verification" when="flag:--validate" -->
578
+ 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.
579
+ <!-- /gsd:section -->
950
580
 
951
581
  ---
952
582
 
@@ -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`.
@@ -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
@@ -306,13 +310,16 @@ An environment that genuinely hits an untrusted-hook prompt surfaces through the
306
310
  the empty-output stub as a dropped lane with diagnosable stderr, not silent attrition. Do not
307
311
  reintroduce the flag (even spelled out in prose — a regression test bans the literal file-wide).
308
312
 
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`.
313
+ <!-- gsd:section id="reviewer-instances-note-2" when="state:reviewer-instances-configured" -->
314
+ 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.
315
+ <!-- /gsd:section -->
312
316
 
313
317
  Lanes run **sequentially, not in parallel** — concurrent invocation trips provider rate limits.
314
318
 
315
319
  ```bash
320
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
321
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
322
+
316
323
  RUN_DIR="{run_dir}"
317
324
  REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
318
325
  # SELECTED_REVIEWERS is the comma-separated result of reviewer selection (ADR-0011 precedence: