@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +131 -34
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-executor.md +7 -5
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-plan-checker.md +9 -0
- package/agents/gsd-planner.md +5 -8
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-verifier.md +14 -70
- package/bin/install.js +503 -341
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/plan-phase.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +607 -63
- package/gsd-core/bin/lib/active-workstream-store.cjs +25 -0
- package/gsd-core/bin/lib/agent-install-check.cjs +38 -6
- package/gsd-core/bin/lib/api-coverage.cjs +120 -0
- package/gsd-core/bin/lib/audit.cjs +89 -1
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-registry.cjs +96 -110
- package/gsd-core/bin/lib/capability-validator.cjs +12 -2
- package/gsd-core/bin/lib/check-command-router.cjs +43 -1
- package/gsd-core/bin/lib/command-aliases.cjs +72 -0
- package/gsd-core/bin/lib/commands.cjs +26 -25
- package/gsd-core/bin/lib/commonjs-marker.cjs +136 -0
- package/gsd-core/bin/lib/config-loader.cjs +1 -0
- package/gsd-core/bin/lib/config.cjs +12 -1
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +91 -12
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/frontmatter.cjs +84 -12
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +58 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +27 -4
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1021 -57
- package/gsd-core/bin/lib/install-engine.cjs +64 -10
- package/gsd-core/bin/lib/install-profiles.cjs +27 -1
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +87 -1
- package/gsd-core/bin/lib/io.cjs +28 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +6 -0
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone.cjs +106 -51
- package/gsd-core/bin/lib/phase-id.cjs +63 -0
- package/gsd-core/bin/lib/phase-locator.cjs +138 -45
- package/gsd-core/bin/lib/phase.cjs +260 -25
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +232 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +4 -0
- package/gsd-core/bin/lib/project-root.cjs +48 -0
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +80 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +99 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +30 -6
- package/gsd-core/bin/lib/roadmap-command-router.cjs +42 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +100 -18
- package/gsd-core/bin/lib/roadmap.cjs +37 -7
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +195 -62
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +15 -3
- package/gsd-core/bin/lib/runtime-homes.cjs +154 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +105 -41
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +113 -27
- package/gsd-core/bin/lib/smart-entry.cjs +12 -0
- package/gsd-core/bin/lib/state-transition.cjs +73 -8
- package/gsd-core/bin/lib/state.cjs +151 -62
- package/gsd-core/bin/lib/surface.cjs +12 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +11 -1
- package/gsd-core/bin/lib/uat.cjs +320 -21
- package/gsd-core/bin/lib/unusable-input.cjs +9 -0
- package/gsd-core/bin/lib/verification.cjs +29 -12
- package/gsd-core/bin/lib/verify.cjs +29 -5
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +181 -18
- package/gsd-core/bin/lib/workstream-inventory.cjs +519 -27
- package/gsd-core/bin/lib/workstream.cjs +6 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +276 -118
- package/gsd-core/bin/shared/config-schema.manifest.json +2 -0
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/specless-probe-fallback.md +7 -6
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +32 -69
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +83 -0
- package/gsd-core/workflows/code-review.md +42 -145
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +23 -81
- package/gsd-core/workflows/debug.md +9 -12
- package/gsd-core/workflows/diagnose-issues.md +22 -0
- package/gsd-core/workflows/discovery-phase.md +4 -4
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +5 -16
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +34 -2
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +19 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +65 -137
- package/gsd-core/workflows/execute-plan.md +1 -1
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/ingest-docs.md +2 -1
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +21 -38
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +13 -226
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +49 -193
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +11 -153
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +46 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +20 -390
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +15 -8
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +17 -14
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +49 -11
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +8 -21
- package/gsd-core/workflows/ui-phase.md +8 -7
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +18 -7
- package/gsd-core/workflows/verify-phase.md +4 -7
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +8 -58
- package/hooks/dist/gsd-agent-isolation-guard.js +428 -0
- package/hooks/dist/gsd-check-update-worker.js +14 -5
- package/hooks/dist/gsd-cursor-subagent-start.js +532 -26
- package/hooks/dist/gsd-read-injection-scanner.js +7 -0
- package/hooks/dist/gsd-statusline.js +72 -6
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/isolation-sentinel.js +268 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +428 -0
- package/hooks/gsd-check-update-worker.js +14 -5
- package/hooks/gsd-cursor-subagent-start.js +532 -26
- package/hooks/gsd-read-injection-scanner.js +7 -0
- package/hooks/gsd-statusline.js +72 -6
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/isolation-sentinel.js +268 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +14 -5
- package/pi/gsd.cjs +57 -12
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +9 -2
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-context-index.cjs +448 -0
- package/scripts/gen-inventory-manifest.cjs +101 -1
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +39 -15
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lint-allow-test-rule-refs.allowlist.json +17 -31
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-docs-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-test-file-count.allowlist.json +27 -1
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/prompt-injection-scan.sh +27 -6
- package/scripts/registry-schema.cjs +323 -94
- package/scripts/run-tests.cjs +3 -2
- package/scripts/validate-registry.cjs +10 -6
- package/skills/gsd-autonomous/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-plan-phase/SKILL.md +2 -2
- package/vscode/package.json +1 -1
- 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
|
-
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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
|
-
|
|
543
|
-
|
|
544
|
-
|
|
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
|
-
|
|
657
|
-
|
|
658
|
-
|
|
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
|
-
|
|
905
|
-
|
|
906
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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.
|
|
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
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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:
|