@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.
- 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 +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- 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 +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- 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 +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- 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-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- 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/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- 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 +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- 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/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- 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-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -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 +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- 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 +35 -47
- 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 +27 -240
- package/gsd-core/workflows/next.md +12 -0
- 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 +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- 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 +45 -159
- 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 +67 -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 +55 -405
- 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 +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- 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 +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- 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 +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- 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/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- 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-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -19,7 +19,7 @@ Orchestrator coordinates, not executes. Each subagent loads the full execute-pla
|
|
|
19
19
|
|
|
20
20
|
<runtime_compatibility>
|
|
21
21
|
**Subagent spawning is runtime-specific:**
|
|
22
|
-
- **Claude Code:** Uses `Agent(subagent_type="gsd-executor", ...)` —
|
|
22
|
+
- **Claude Code:** Uses `Agent(subagent_type="gsd-executor", ...)` — backgrounded by default; verify completion
|
|
23
23
|
- **Copilot:** Subagent spawning does not reliably return completion signals. **Default to
|
|
24
24
|
sequential inline execution**: read and follow execute-plan.md directly for each plan
|
|
25
25
|
instead of spawning parallel agents. Only attempt parallel spawning if the user
|
|
@@ -81,14 +81,17 @@ Load all context in one call:
|
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
83
|
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
84
|
-
|
|
84
|
+
WAVE_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--wave[[:space:]]+([^[:space:]-][^[:space:]]*) ]]; then WAVE_PARAM="--wave ${BASH_REMATCH[2]}"; fi
|
|
85
|
+
INIT=$(gsd_run query init.execute-phase "${PHASE_ARG}" $WAVE_PARAM)
|
|
85
86
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
86
87
|
AGENT_SKILLS=$(gsd_run query agent-skills gsd-executor)
|
|
87
88
|
```
|
|
88
89
|
|
|
89
|
-
Parse JSON for: `executor_model`, `verifier_model`, `commit_docs`, `parallelization`, `branching_strategy`, `branch_name`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `plans`, `incomplete_plans`, `plan_count`, `incomplete_count`, `state_exists`, `roadmap_exists`, `phase_req_ids`, `response_language`, `requirements_path`.
|
|
90
|
+
Parse JSON for: `executor_model`, `verifier_model`, `commit_docs`, `parallelization`, `branching_strategy`, `branch_name`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `plans`, `incomplete_plans`, `plan_count`, `incomplete_count`, `state_exists`, `roadmap_exists`, `phase_req_ids`, `response_language`, `requirements_path`, `section_manifest`.
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
`section_manifest` (#2932) gates the three `steps/*.md` reads below: read a step file only when its `id` is in `section_manifest.included` (equivalently, its path is in `section_manifest.read`); skip it — without reading — when its `id` is in `section_manifest.excluded`. When `section_manifest` is `null` (degraded: manifest artifact missing/unreadable), read all three unconditionally — the safe superset.
|
|
93
|
+
|
|
94
|
+
**Model resolution:** If `executor_model` is `"inherit"`, omit the `model=` parameter from all `Agent()` calls — do NOT pass `model="inherit"` to Agent. Omitting the `model=` parameter causes Claude Code to inherit the orchestrator model automatically. Only set `model=` when `executor_model` is an explicit model name (e.g., `"claude-sonnet-5"`, `"claude-opus-4-8"`).
|
|
92
95
|
|
|
93
96
|
@~/.claude/gsd-core/references/execute-phase-response-language.md
|
|
94
97
|
|
|
@@ -301,7 +304,9 @@ else
|
|
|
301
304
|
else
|
|
302
305
|
git switch --quiet "$DEFAULT_BRANCH" 2>/dev/null && git merge --ff-only --quiet "origin/$DEFAULT_BRANCH" 2>/dev/null || true
|
|
303
306
|
fi
|
|
304
|
-
# Pinned base (#2916); --no-track (#2498)
|
|
307
|
+
# Pinned base (#2916); --no-track (#2498). #2639: warn if local ahead of origin.
|
|
308
|
+
AHEAD=$(git rev-list --count "origin/$DEFAULT_BRANCH..$DEFAULT_BRANCH" 2>/dev/null || echo 0)
|
|
309
|
+
[ "$AHEAD" != "0" ] && [ -n "$AHEAD" ] && echo "WARNING: $DEFAULT_BRANCH is $AHEAD ahead of origin — '$BRANCH_NAME' won't include those commits (#2639)." >&2
|
|
305
310
|
git checkout -b "$BRANCH_NAME" "origin/$DEFAULT_BRANCH" --no-track \
|
|
306
311
|
|| { echo "ERROR: Could not create '$BRANCH_NAME' from origin/$DEFAULT_BRANCH (#2916)." >&2; exit 1; }
|
|
307
312
|
fi
|
|
@@ -329,13 +334,54 @@ Load plan inventory with wave grouping in one call:
|
|
|
329
334
|
PLAN_INDEX=$(gsd_run query phase-plan-index "${PHASE_NUMBER}")
|
|
330
335
|
```
|
|
331
336
|
|
|
332
|
-
Parse JSON for: `phase`, `plans[]` (each with `id`, `wave`, `autonomous`, `objective`, `files_modified`, `task_count`, `has_summary`), `waves` (map of wave number → plan IDs), `incomplete`, `has_checkpoints`.
|
|
337
|
+
Parse JSON for: `phase`, `plans[]` (each with `id`, `wave`, `autonomous`, `objective`, `files_modified`, `task_count`, `has_summary`, `halted`, `blocked_by`), `waves` (map of wave number → plan IDs), `incomplete`, `runnable`, `has_checkpoints`.
|
|
333
338
|
|
|
334
|
-
**Filtering:** Skip plans where `has_summary: true`. If `--gaps-only`: also skip non-gap_closure plans. If `WAVE_FILTER` is set: also skip plans whose `wave` does not equal `WAVE_FILTER`.
|
|
339
|
+
**Filtering:** Skip plans where `has_summary: true`. Additionally skip any plan whose `blocked_by` array is non-empty (#2830) — it depends, directly or transitively, on a plan that halted at a designed stop rather than completing — and report it by name: "Skipping {plan.id}: blocked by halted {blocked_by.join(', ')}". Never silently drop a blocked plan from the report; it must appear by name with its reason, not merely vanish from the executable list. This rule is additive to the `has_summary` skip, not a replacement for it. If `--gaps-only`: also skip non-gap_closure plans. If `WAVE_FILTER` is set: also skip plans whose `wave` does not equal `WAVE_FILTER`.
|
|
335
340
|
|
|
336
341
|
**Wave safety check:** If `WAVE_FILTER` is set and there are still incomplete plans in any lower wave that match the current execution mode, STOP and tell the user to finish earlier waves first. Do not let Wave 2+ execute while prerequisite earlier-wave plans remain incomplete.
|
|
337
342
|
|
|
338
|
-
If all filtered
|
|
343
|
+
**If all filtered — do NOT exit unconditionally (#2868).** "No plan work left" and "phase fully
|
|
344
|
+
done" are different conditions: a run can be interrupted between the final wave's SUMMARY and
|
|
345
|
+
`verify_phase_goal` (most commonly by a checkpoint plan that is retired but still writes a SUMMARY),
|
|
346
|
+
leaving a phase that looks complete from every index yet never produced `*-VERIFICATION.md`. A
|
|
347
|
+
third condition looks identical to the first two by plan_count alone but is neither: some filtered
|
|
348
|
+
plans were filtered because they are **blocked** (non-empty `blocked_by`, #2830), not because they
|
|
349
|
+
are done. Blocked-and-incomplete must never be reported as finished.
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
VERIFY_STATUS=$(gsd_run query verification status "${PHASE_DIR}" --pick status)
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Evaluate in this exact order — the first matching condition decides the outcome; do not evaluate
|
|
356
|
+
later conditions once one matches:
|
|
357
|
+
|
|
358
|
+
1. **A filter is active** (`--gaps-only`, or `WAVE_FILTER` set): report "No matching incomplete
|
|
359
|
+
plans" → exit, unchanged. A filtered run finding nothing left in ITS slice says nothing about
|
|
360
|
+
whether the phase as a whole is done, and must never jump to verification.
|
|
361
|
+
2. **No filter is active, and at least one filtered plan was skipped because of a non-empty
|
|
362
|
+
`blocked_by`** (irrespective of `VERIFY_STATUS`): the phase is NOT finished — it is **stuck on a
|
|
363
|
+
halt**. A plan with no SUMMARY and no dispatched work must never be treated as done merely
|
|
364
|
+
because nothing was left to filter. Report:
|
|
365
|
+
`"Phase stuck: {blocked plan ids} blocked by halted {their blocked_by ids} — resolve the halt, do not resume verification."`
|
|
366
|
+
→ exit. Do not fall through to condition 3; this is not a completion state.
|
|
367
|
+
3. **No filter is active, and every filtered plan was filtered by `has_summary` alone** (no
|
|
368
|
+
blocked-plan skip occurred):
|
|
369
|
+
- **`VERIFY_STATUS` is anything other than `missing`**: the phase genuinely finished. Report
|
|
370
|
+
"No matching incomplete plans" → exit, unchanged.
|
|
371
|
+
- **`VERIFY_STATUS == missing`**: the plans are all summarized but the run never reached the
|
|
372
|
+
tail gates. Report:
|
|
373
|
+
`"All {plan_count} plans are summarized but no VERIFICATION.md exists — resuming at the phase gates (#2868)."`
|
|
374
|
+
SKIP `cross_ai_delegation`, `execute_waves` and `checkpoint_handling` — there is no wave work
|
|
375
|
+
to do — and continue directly at `aggregate_results`, NOT `code_review_gate`. `aggregate_results`
|
|
376
|
+
is the only step that runs the `SECURITY_FILE` / secure-phase threats-open gate, and it reads
|
|
377
|
+
exclusively from on-disk `${PHASE_DIR}` artifacts (`*-SUMMARY.md`, `*-SECURITY.md` via `ls`) and
|
|
378
|
+
independent `gsd_run` calls — nothing it reads is produced only by `execute_waves` or
|
|
379
|
+
`checkpoint_handling` — so it tolerates having executed no plans in this run. From there the
|
|
380
|
+
run proceeds exactly as a normal one: `aggregate_results` → `code_review_gate` →
|
|
381
|
+
`close_parent_artifacts` → `regression_gate` → `verify_phase_goal` → `update_roadmap`. Never
|
|
382
|
+
skip `aggregate_results`, `code_review_gate` or `regression_gate` on this path — the manual
|
|
383
|
+
workaround this replaces skipped all three, and that gap is the reason this route exists
|
|
384
|
+
rather than telling users to spawn the verifier by hand.
|
|
339
385
|
|
|
340
386
|
Report:
|
|
341
387
|
```
|
|
@@ -433,7 +479,7 @@ cwd inside an agent worktree (or a subdirectory of one). Every subsequent
|
|
|
433
479
|
orchestrator-side git call would then target the wrong tree — this is how a wrong-base
|
|
434
480
|
merge nearly shipped ~1000 files. Resolve the *worktree root* (so a subdirectory cwd
|
|
435
481
|
cannot skew the check) and refuse if it is an agent worktree. The discriminator is the
|
|
436
|
-
per-agent branch namespace `agent
|
|
482
|
+
per-agent branch namespace `agent-`/`worktree-agent-`/`worktree-wf_`, NOT the path: the
|
|
437
483
|
orchestrator may itself be legitimately invoked from a feature worktree under
|
|
438
484
|
`.claude/worktrees/`, so a path-substring refusal would break legitimate runs. Do NOT
|
|
439
485
|
pin to `git worktree list`'s first entry — that is the main worktree, the wrong target
|
|
@@ -444,7 +490,7 @@ when the orchestrator legitimately runs from a feature worktree.
|
|
|
444
490
|
ORCHESTRATOR_WT=$(git rev-parse --show-toplevel 2>/dev/null) || {
|
|
445
491
|
echo "FATAL: execute_waves entry is not inside a git worktree (#48)." >&2; exit 1; }
|
|
446
492
|
ORCH_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
|
447
|
-
if printf '%s' "$ORCH_BRANCH" | grep -Eq '^(worktree-)?agent-'; then
|
|
493
|
+
if printf '%s' "$ORCH_BRANCH" | grep -Eq '^((worktree-)?agent-|worktree-wf_)'; then
|
|
448
494
|
echo "FATAL: orchestrator cwd is inside an agent worktree (branch '$ORCH_BRANCH', root '$ORCHESTRATOR_WT') — refusing to execute waves (#48). A prior isolation=\"worktree\" dispatch drifted the cwd; re-run from the orchestrator's own worktree." >&2
|
|
449
495
|
# #1856 handoff: the refusal above is correct, but on its own it is a dead end —
|
|
450
496
|
# this worktree may hold committed fixes AND uncommitted work, and "re-run from
|
|
@@ -607,9 +653,9 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
607
653
|
|
|
608
654
|
`[checkpoint] phase {PHASE_NUMBER} wave {N}/{M} plan {plan_id} starting ({P}/{Q} plans done)`
|
|
609
655
|
|
|
610
|
-
Pass paths only — executors read files themselves
|
|
611
|
-
|
|
612
|
-
|
|
656
|
+
Pass paths only — executors read files themselves.
|
|
657
|
+
|
|
658
|
+
**Executor routing (#1689/#3370).** Per plan, run `gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md` to set `EXECUTOR_TYPE` for `subagent_type="{EXECUTOR_TYPE}"` below.
|
|
613
659
|
|
|
614
660
|
**Worktree mode** (`USE_WORKTREES` and `USE_WORKTREES_FOR_PLAN` not `false`):
|
|
615
661
|
|
|
@@ -644,8 +690,8 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
644
690
|
|
|
645
691
|
```text
|
|
646
692
|
Agent(
|
|
647
|
-
|
|
648
|
-
|
|
693
|
+
subagent_type="{EXECUTOR_TYPE}",
|
|
694
|
+
description="Execute plan {plan_number} of phase {phase_number}",
|
|
649
695
|
# Only include model= when executor_model is an explicit model name.
|
|
650
696
|
# When executor_model is "inherit", omit this parameter entirely so
|
|
651
697
|
# Claude Code inherits the orchestrator model automatically.
|
|
@@ -663,7 +709,7 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
663
709
|
|
|
664
710
|
<worktree_branch_check>
|
|
665
711
|
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}), 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.
|
|
666
|
-
Per-commit HEAD/cwd-drift/path-guard: `agents/gsd-executor.md` steps 0/0a/0b + `references/worktree-path-safety.md` (in <execution_context>).
|
|
712
|
+
Per-commit HEAD/cwd-drift/path-guard: `agents/gsd-executor.md` steps 0/0a/0b + `gsd-core/references/worktree-path-safety.md` (in <execution_context>).
|
|
667
713
|
</worktree_branch_check>
|
|
668
714
|
|
|
669
715
|
<parallel_execution>
|
|
@@ -687,15 +733,16 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
687
733
|
</parallel_execution>
|
|
688
734
|
|
|
689
735
|
<execution_context>
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
736
|
+
ORCHESTRATOR build-time embed (NOT a sub-agent runtime step): before this dispatch, read each file listed below and replace this note with those files' contents, inlined verbatim in this block in the listed order. Never leave `@`-include lines in the dispatched prompt — `@path` never expands inside an Agent() `prompt="..."` string (#3324), so an include arrives as literal text the executor never sees.
|
|
737
|
+
- `~/.claude/gsd-core/workflows/execute-plan.md`
|
|
738
|
+
- `~/.claude/gsd-core/templates/summary.md`
|
|
739
|
+
- `~/.claude/gsd-core/references/checkpoints.md`
|
|
740
|
+
- `~/.claude/gsd-core/references/tdd.md`
|
|
741
|
+
- `~/.claude/gsd-core/references/worktree-path-safety.md`
|
|
742
|
+
${CONTEXT_WINDOW < 200000 ? '' : '- `~/.claude/gsd-core/references/executor-examples.md`'}
|
|
696
743
|
</execution_context>
|
|
697
744
|
|
|
698
|
-
<
|
|
745
|
+
<required_reading>
|
|
699
746
|
Read these files at execution start using the Read tool.
|
|
700
747
|
First resolve repo root so every path is anchored:
|
|
701
748
|
\`PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)\`
|
|
@@ -710,7 +757,7 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
710
757
|
` : ''}
|
|
711
758
|
- ${PROJECT_ROOT}/CLAUDE.md (Project instructions, if exists — follow project-specific guidelines and coding conventions)
|
|
712
759
|
- ${PROJECT_ROOT}/.claude/skills/ or ${PROJECT_ROOT}/.agents/skills/ (Project skills, if either exists — list skills, read SKILL.md for each, follow relevant rules during implementation)
|
|
713
|
-
</
|
|
760
|
+
</required_reading>
|
|
714
761
|
|
|
715
762
|
${AGENT_SKILLS}
|
|
716
763
|
|
|
@@ -731,7 +778,7 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
731
778
|
)
|
|
732
779
|
```
|
|
733
780
|
|
|
734
|
-
After each `Agent()` returns, parse executor-returned worktree metadata (`<worktree_metadata>`) before harness metadata, then record the `{agent_id, worktree_path, branch, expected_base}` entry with `gsd_run query worktree.record-agent --manifest "$WAVE_WORKTREE_MANIFEST" --agent-id … --path … --branch … --base
|
|
781
|
+
After each `Agent()` returns, parse executor-returned worktree metadata (`<worktree_metadata>`) before harness metadata, then record the `{agent_id, worktree_path, branch, expected_base}` entry with `gsd_run query worktree.record-agent --manifest "$WAVE_WORKTREE_MANIFEST" --agent-id … --path … --branch … --base … --files "$PLAN_FILES"`. The verb validates every field at write time using the `cleanup-wave` reader's own rules (write-strict `--agent-id`), failing loudly with a recovery hint rather than appending an under-populated entry the reader would later drop silently. On a non-zero exit or any missing field: stop and ask for recovery instead of scanning worktrees.
|
|
735
782
|
|
|
736
783
|
> **Worktree recovery policy (#48 + #1292):** See `execute-phase/steps/worktree-recovery-policy.md` — FAIL-CLOSED rule for base/HEAD-namespace mismatches AND isolated-run fail-safe recovery.
|
|
737
784
|
|
|
@@ -806,8 +853,8 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
806
853
|
|
|
807
854
|
If the stalled executor ran in an isolated worktree, `kill and switch to inline execution` edits the primary checkout — see worktree recovery policy (`execute-phase/steps/worktree-recovery-policy.md`). Prefer `kill and retry` in a fresh worktree; inline execution requires explicit confirmation, never the default.
|
|
808
855
|
|
|
809
|
-
**This fallback applies
|
|
810
|
-
|
|
856
|
+
**This fallback applies to all runtimes.** Claude Code's Agent() backgrounds by
|
|
857
|
+
default: the completion signal may never arrive. Verify, never wait.
|
|
811
858
|
|
|
812
859
|
5. **Post-wave hook validation (parallel mode only):** Hooks run on every executor commit by default (#2924); this post-wave run only fires when `workflow.worktree_skip_hooks=true` opted out of per-commit hooks:
|
|
813
860
|
```bash
|
|
@@ -967,7 +1014,9 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
967
1014
|
|
|
968
1015
|
**If `activeHooks` is empty or absent:** Skip silently to step 5.8.
|
|
969
1016
|
|
|
970
|
-
**
|
|
1017
|
+
⚠ **Validate `check` before shell use** (third-party manifest input) — `loop-hook-dispatch.md` § `gate`.
|
|
1018
|
+
|
|
1019
|
+
**For each active entry where `kind == "gate"`** (process in array order), run the gate check — a `predicate` gate (ADR-2008 / #2008) substitutes `gsd_run check predicate --predicate '<predicate JSON>' --phase-number "${PHASE_NUMBER}" --raw`:
|
|
971
1020
|
|
|
972
1021
|
```bash
|
|
973
1022
|
GATE_RESULT=$(gsd_run check ${hook.check.query} "${PHASE_NUMBER}" --raw)
|
|
@@ -1086,7 +1135,7 @@ Plans with `autonomous: false` require user interaction.
|
|
|
1086
1135
|
**Auto-mode checkpoint handling:**
|
|
1087
1136
|
Read auto-advance config (chain flag OR user preference — same boolean as `check.auto-mode`):
|
|
1088
1137
|
```bash
|
|
1089
|
-
AUTO_MODE=$(gsd_run query check auto-mode --pick active 2>/dev/null
|
|
1138
|
+
AUTO_MODE=$(gsd_run query check auto-mode --pick active 2>/dev/null)
|
|
1090
1139
|
```
|
|
1091
1140
|
|
|
1092
1141
|
When executor returns a checkpoint AND `AUTO_MODE` is `true`:
|
|
@@ -1094,7 +1143,7 @@ When executor returns a checkpoint AND `AUTO_MODE` is `true`:
|
|
|
1094
1143
|
- **decision** → Auto-spawn continuation agent with `{user_response}` = first option from checkpoint details. Log `⚡ Auto-selected: [option]`. **Except `blocking-human`.**
|
|
1095
1144
|
- **human-action** → Present to user (existing behavior below). Auth gates cannot be automated.
|
|
1096
1145
|
|
|
1097
|
-
**Carve-out — overrides all branches above.** If the returned `Gate:` is `blocking-human
|
|
1146
|
+
**Carve-out — overrides all branches above.** If the returned `Gate:` is `blocking-human` (precondition-unmet, #3210), or its `<what-built>` mentions `Package verification required before install` or `Package install failed — human verification required`, never auto-approve or auto-select. Present to user (standard flow). Log `⛔ blocking-human gate — auto-mode suspended`.
|
|
1098
1147
|
|
|
1099
1148
|
**Standard flow (not auto-mode, human-action, or blocking-human):**
|
|
1100
1149
|
|
|
@@ -1171,36 +1220,9 @@ If an active secure-phase step hook exists AND SECURITY.md exists: check frontma
|
|
|
1171
1220
|
```
|
|
1172
1221
|
</step>
|
|
1173
1222
|
|
|
1174
|
-
|
|
1175
|
-
If `
|
|
1176
|
-
|
|
1177
|
-
```bash
|
|
1178
|
-
POST_PLAN_INDEX=$(gsd_run query phase-plan-index "${PHASE_NUMBER}")
|
|
1179
|
-
```
|
|
1180
|
-
|
|
1181
|
-
Apply the same "incomplete" filtering rules as earlier:
|
|
1182
|
-
- ignore plans with `has_summary: true`
|
|
1183
|
-
- if `--gaps-only`, only consider `gap_closure: true` plans
|
|
1184
|
-
|
|
1185
|
-
**If incomplete plans still remain anywhere in the phase:**
|
|
1186
|
-
- STOP here
|
|
1187
|
-
- Do NOT run phase verification
|
|
1188
|
-
- Do NOT mark the phase complete in ROADMAP/STATE
|
|
1189
|
-
- Present:
|
|
1190
|
-
|
|
1191
|
-
```markdown
|
|
1192
|
-
## Wave {WAVE_FILTER} Complete
|
|
1193
|
-
|
|
1194
|
-
Selected wave finished successfully. This phase still has incomplete plans, so phase-level verification and completion were intentionally skipped.
|
|
1195
|
-
|
|
1196
|
-
/gsd:execute-phase {phase} ${GSD_WS} # Continue remaining waves
|
|
1197
|
-
/gsd:execute-phase {phase} --wave {next} ${GSD_WS} # Run the next wave explicitly
|
|
1198
|
-
```
|
|
1199
|
-
|
|
1200
|
-
**If no incomplete plans remain after the selected wave finishes:**
|
|
1201
|
-
- continue with the normal phase-level verification and completion flow below
|
|
1202
|
-
- this means the selected wave happened to be the last remaining work in the phase
|
|
1203
|
-
</step>
|
|
1223
|
+
<!-- gsd:section id="partial-wave" when="flag:--wave" -->
|
|
1224
|
+
If `section_manifest` is `null` or `"partial-wave"` is in its `included` list: read and execute `gsd-core/workflows/execute-phase/steps/partial-wave.md`. Otherwise skip — do not read the file.
|
|
1225
|
+
<!-- /gsd:section -->
|
|
1204
1226
|
|
|
1205
1227
|
<step name="code_review_gate" required="true">
|
|
1206
1228
|
**This step is REQUIRED to evaluate the capability hook.** When the code-review capability is active, auto-invoke code review on the phase's source changes. Advisory only — never blocks execution flow. Also dispatches advisory execute:post gate hooks (e.g. tdd.review-checkpoint).
|
|
@@ -1210,7 +1232,7 @@ Selected wave finished successfully. This phase still has incomplete plans, so p
|
|
|
1210
1232
|
EXECUTE_POST_HOOKS_JSON=${EXECUTE_POST_HOOKS_JSON:-$(gsd_run loop render-hooks execute:post --raw)}
|
|
1211
1233
|
```
|
|
1212
1234
|
|
|
1213
|
-
|
|
1235
|
+
Dispatch `kind == "step"` hooks per @gsd-core/references/loop-hook-dispatch.md. `ref.skill == "code-review"`:
|
|
1214
1236
|
|
|
1215
1237
|
If no active code-review step hook exists: display "Code review skipped (code-review capability inactive)" and proceed to gate dispatch.
|
|
1216
1238
|
|
|
@@ -1234,14 +1256,14 @@ Code review found issues. Consider running:
|
|
|
1234
1256
|
|
|
1235
1257
|
**Error handling:** If the Skill invocation fails or throws, catch the error, display "Code review encountered an error (non-blocking): {error}" and proceed to gate dispatch. Review failures must never block execution.
|
|
1236
1258
|
|
|
1237
|
-
**Execute:post gate hook dispatch.** After code review, dispatch all active gate hooks from `EXECUTE_POST_HOOKS_JSON` where `kind == "gate"`. For each, run
|
|
1259
|
+
**Execute:post gate hook dispatch.** After code review, dispatch all active gate hooks from `EXECUTE_POST_HOOKS_JSON` where `kind == "gate"`. ⚠ **Validate `check` before shell use** (third-party manifest input) — `loop-hook-dispatch.md` § `gate`. For each, run the form below, or — for a `predicate` gate (ADR-2008 / #2008) — `gsd_run check predicate --predicate '<predicate JSON>' --phase-number "${PHASE_NUMBER}" --raw`:
|
|
1238
1260
|
|
|
1239
1261
|
```bash
|
|
1240
1262
|
GATE_RESULT=$(gsd_run check ${hook.check.query} "${PHASE_NUMBER}" --raw)
|
|
1241
1263
|
CHECK_EXIT=$?
|
|
1242
1264
|
```
|
|
1243
1265
|
|
|
1244
|
-
**Gate evaluation** uses the same two-step contract as `execute:wave:post` above
|
|
1266
|
+
**Gate evaluation** uses the same two-step contract as `execute:wave:post` above.
|
|
1245
1267
|
|
|
1246
1268
|
**TDD review escalation (overrides the advisory default for the `tdd.review-checkpoint` gate only).** The tdd `execute:post` gate is declared `blocking: false`, so by the generic contract above it displays its `message`/table and continues. There is ONE documented exception (see `~/.claude/gsd-core/references/execute-mvp-tdd.md`): when `MVP_MODE=true` AND `TDD_MODE=true` AND `GATE_RESULT.block == true` (one or more TDD plans miss a RED or GREEN gate commit), the end-of-phase TDD review escalates from advisory to **blocking under MVP+TDD** — refuse to mark the phase complete and present:
|
|
1247
1269
|
|
|
@@ -1255,104 +1277,13 @@ Resolve and re-run /gsd execute-phase, or override with /gsd execute-phase {phas
|
|
|
1255
1277
|
**Proceed rule:** If `MVP_MODE && TDD_MODE && GATE_RESULT.block == true` for `tdd.review-checkpoint`: STOP — do NOT proceed to `close_parent_artifacts`, `regression_gate`, `verify_phase_goal`, or `phase.complete`. Otherwise proceed normally.
|
|
1256
1278
|
</step>
|
|
1257
1279
|
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
**Skip if** phase number has no decimal (e.g., `3`, `04`) — only applies to gap-closure phases like `4.1`, `03.1`.
|
|
1262
|
-
|
|
1263
|
-
**1. Detect decimal phase and derive parent:**
|
|
1264
|
-
```bash
|
|
1265
|
-
# Check if phase_number contains a decimal
|
|
1266
|
-
if [[ "$PHASE_NUMBER" == *.* ]]; then
|
|
1267
|
-
PARENT_PHASE="${PHASE_NUMBER%%.*}"
|
|
1268
|
-
fi
|
|
1269
|
-
```
|
|
1270
|
-
|
|
1271
|
-
**2. Find parent UAT file:**
|
|
1272
|
-
```bash
|
|
1273
|
-
PARENT_INFO=$(gsd_run query find-phase "${PARENT_PHASE}" --raw)
|
|
1274
|
-
# Extract directory from PARENT_INFO JSON, then find UAT file in that directory
|
|
1275
|
-
```
|
|
1280
|
+
<!-- gsd:section id="gap-closure-artifacts" when="state:gap-closure-phase" -->
|
|
1281
|
+
If `section_manifest` is `null` or `"gap-closure-artifacts"` is in its `included` list: read and execute `gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md`. Otherwise skip — do not read the file.
|
|
1282
|
+
<!-- /gsd:section -->
|
|
1276
1283
|
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
Read the parent UAT file's `## Gaps` section. For each gap entry with `status: failed`:
|
|
1282
|
-
- Update to `status: resolved`
|
|
1283
|
-
|
|
1284
|
-
**4. Update UAT frontmatter:**
|
|
1285
|
-
|
|
1286
|
-
If all gaps now have `status: resolved`:
|
|
1287
|
-
- Update frontmatter `status: diagnosed` → `status: resolved`
|
|
1288
|
-
- Update frontmatter `updated:` timestamp
|
|
1289
|
-
|
|
1290
|
-
**5. Resolve referenced debug sessions:**
|
|
1291
|
-
|
|
1292
|
-
For each gap that has a `debug_session:` field:
|
|
1293
|
-
- Read the debug session file
|
|
1294
|
-
- Update frontmatter `status:` → `resolved`
|
|
1295
|
-
- Update frontmatter `updated:` timestamp
|
|
1296
|
-
- Move to resolved directory:
|
|
1297
|
-
```bash
|
|
1298
|
-
mkdir -p .planning/debug/resolved
|
|
1299
|
-
mv .planning/debug/{slug}.md .planning/debug/resolved/
|
|
1300
|
-
```
|
|
1301
|
-
|
|
1302
|
-
**6. Commit updated artifacts:**
|
|
1303
|
-
```bash
|
|
1304
|
-
gsd_run query commit "docs(phase-${PARENT_PHASE}): resolve UAT gaps and debug sessions after ${PHASE_NUMBER} gap closure" --files .planning/phases/*${PARENT_PHASE}*/*-UAT.md .planning/debug/resolved/*.md
|
|
1305
|
-
```
|
|
1306
|
-
</step>
|
|
1307
|
-
|
|
1308
|
-
<step name="regression_gate">
|
|
1309
|
-
Run prior phases' test suites to catch cross-phase regressions BEFORE verification.
|
|
1310
|
-
|
|
1311
|
-
**Skip if:** This is the first phase (no prior phases), or no prior VERIFICATION.md files exist.
|
|
1312
|
-
|
|
1313
|
-
**Step 1: Discover prior phases' test files**
|
|
1314
|
-
```bash
|
|
1315
|
-
# Find all VERIFICATION.md files from prior phases in current milestone
|
|
1316
|
-
PRIOR_VERIFICATIONS=$(find .planning/phases/ -name "*-VERIFICATION.md" ! -path "*${PHASE_NUMBER}*" 2>/dev/null)
|
|
1317
|
-
```
|
|
1318
|
-
|
|
1319
|
-
**Step 2: Extract test file lists from prior verifications**
|
|
1320
|
-
|
|
1321
|
-
For each VERIFICATION.md found, look for test file references:
|
|
1322
|
-
- Lines containing `test`, `spec`, or `__tests__` paths
|
|
1323
|
-
- The "Test Suite" or "Automated Checks" section
|
|
1324
|
-
- File patterns from `key-files.created` in corresponding SUMMARY.md files that match `*.test.*` or `*.spec.*`
|
|
1325
|
-
|
|
1326
|
-
Collect all unique test file paths into `REGRESSION_FILES`.
|
|
1327
|
-
|
|
1328
|
-
**Step 3: Run regression tests (if any found)** — Read and execute `gsd-core/workflows/execute-phase/steps/regression-gate.md`. It resolves the project test command, normalizes it to a one-shot form (defeating vitest/jest watch mode via the shared `normalize-test-command` helper), runs it under `workflow.test_gate_timeout`, and aborts on timeout with a watch-mode hint (#1857). On `REGRESSION GATE ABORTED` (exit 124), HALT — do not proceed to verification.
|
|
1329
|
-
|
|
1330
|
-
**Step 4: Report results**
|
|
1331
|
-
|
|
1332
|
-
If all tests pass:
|
|
1333
|
-
```
|
|
1334
|
-
✓ Regression gate: {N} prior-phase test files passed — no regressions detected
|
|
1335
|
-
```
|
|
1336
|
-
→ Proceed to verify_phase_goal
|
|
1337
|
-
|
|
1338
|
-
If any tests fail:
|
|
1339
|
-
```
|
|
1340
|
-
## ⚠ Cross-Phase Regression Detected
|
|
1341
|
-
|
|
1342
|
-
Phase {X} execution may have broken functionality from prior phases.
|
|
1343
|
-
|
|
1344
|
-
| Test File | Phase | Status | Detail |
|
|
1345
|
-
|-----------|-------|--------|--------|
|
|
1346
|
-
| {file} | {origin_phase} | FAILED | {first_failure_line} |
|
|
1347
|
-
|
|
1348
|
-
Options:
|
|
1349
|
-
1. Fix regressions before verification (recommended)
|
|
1350
|
-
2. Continue to verification anyway (regressions will compound)
|
|
1351
|
-
3. Abort phase — roll back and re-plan
|
|
1352
|
-
```
|
|
1353
|
-
|
|
1354
|
-
If `TEXT_MODE` is true, present as a plain-text numbered list and ask the user to type their choice number. Otherwise, use AskUserQuestion to present the options.
|
|
1355
|
-
</step>
|
|
1284
|
+
<!-- gsd:section id="regression-gate" when="state:has-prior-phases" -->
|
|
1285
|
+
If `section_manifest` is `null` or `"regression-gate"` is in its `included` list: read and execute `gsd-core/workflows/execute-phase/steps/regression-gate.md`. Otherwise skip — do not read the file.
|
|
1286
|
+
<!-- /gsd:section -->
|
|
1356
1287
|
|
|
1357
1288
|
<step name="verify_phase_goal">
|
|
1358
1289
|
Verify phase achieved its GOAL, not just completed tasks.
|
|
@@ -1372,7 +1303,7 @@ Check must_haves against actual codebase.
|
|
|
1372
1303
|
Cross-reference requirement IDs from PLAN frontmatter against REQUIREMENTS.md — every ID MUST be accounted for.
|
|
1373
1304
|
Create VERIFICATION.md.
|
|
1374
1305
|
|
|
1375
|
-
<
|
|
1306
|
+
<required_reading>
|
|
1376
1307
|
Read these files before verification:
|
|
1377
1308
|
- {phase_dir}/*-PLAN.md (All plans — understand intent, check must_haves)
|
|
1378
1309
|
- {phase_dir}/*-SUMMARY.md (All summaries — cross-reference claimed vs actual)
|
|
@@ -1381,7 +1312,7 @@ ${CONTEXT_WINDOW >= 500000 ? `- {phase_dir}/*-CONTEXT.md (User decisions — ver
|
|
|
1381
1312
|
- {phase_dir}/*-RESEARCH.md (Known pitfalls — check for traps)
|
|
1382
1313
|
- Prior VERIFICATION.md files from earlier phases (regression check)
|
|
1383
1314
|
` : ''}
|
|
1384
|
-
</
|
|
1315
|
+
</required_reading>
|
|
1385
1316
|
|
|
1386
1317
|
${VERIFIER_SKILLS}",
|
|
1387
1318
|
subagent_type="gsd-verifier",
|
|
@@ -1558,12 +1489,13 @@ Copy failure must NOT block phase completion.
|
|
|
1558
1489
|
After `update_roadmap`, moves todos whose `resolves_phase` matches to `completed/`.
|
|
1559
1490
|
|
|
1560
1491
|
```bash
|
|
1492
|
+
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
1561
1493
|
PHASE_NUM="${PHASE_NUMBER}"
|
|
1562
1494
|
PENDING_DIR=".planning/todos/pending"
|
|
1563
1495
|
COMPLETED_DIR=".planning/todos/completed"
|
|
1564
1496
|
mkdir -p "$COMPLETED_DIR"
|
|
1565
1497
|
|
|
1566
|
-
#
|
|
1498
|
+
#2576
|
|
1567
1499
|
normalize_phase_num() {
|
|
1568
1500
|
local p="${1//\"/}"; printf '%s' "$p" | sed 's/^0*\([0-9]\)/\1/'
|
|
1569
1501
|
}
|
|
@@ -1572,7 +1504,6 @@ PHASE_NUM_NORM=$(normalize_phase_num "$PHASE_NUM")
|
|
|
1572
1504
|
CLOSED=()
|
|
1573
1505
|
for TODO_FILE in "$PENDING_DIR"/*.md; do
|
|
1574
1506
|
[ -f "$TODO_FILE" ] || continue
|
|
1575
|
-
# resolves_phase from first frontmatter block
|
|
1576
1507
|
RP=$(awk '/^---/{c++;next} c==1 && /^resolves_phase:/{print $2;exit} c==2{exit}' "$TODO_FILE" 2>/dev/null || true)
|
|
1577
1508
|
RP_NORM=$(normalize_phase_num "$RP")
|
|
1578
1509
|
if [ -n "$RP_NORM" ] && [ "$RP_NORM" = "$PHASE_NUM_NORM" ]; then
|
|
@@ -1591,30 +1522,15 @@ fi
|
|
|
1591
1522
|
**No matches:** skip silently (always additive, non-blocking).
|
|
1592
1523
|
</step>
|
|
1593
1524
|
|
|
1594
|
-
<step name="
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
2. If the file exists and has a `## Validated Requirements` or `## Requirements` section:
|
|
1602
|
-
- Move any requirements validated by this phase from Active → Validated
|
|
1603
|
-
- Add a brief note: `Validated in Phase {X}: {Name}`
|
|
1604
|
-
3. If the file has a `## Current State` or similar section:
|
|
1605
|
-
- Update it to reflect this phase's completion (e.g., "Phase {X} complete — {one-liner}")
|
|
1606
|
-
4. Update the `Last updated:` footer to today's date
|
|
1607
|
-
5. Commit the change:
|
|
1608
|
-
|
|
1609
|
-
```bash
|
|
1610
|
-
gsd_run query commit "docs(phase-{X}): evolve PROJECT.md after phase completion" --files .planning/PROJECT.md
|
|
1611
|
-
```
|
|
1612
|
-
|
|
1613
|
-
**Skip this step if** `.planning/PROJECT.md` does not exist.
|
|
1614
|
-
</step>
|
|
1525
|
+
<step name="delegate_post_completion_to_transition">
|
|
1526
|
+
**#1526 — Delegate post-completion to the transition workflow** (parity: the auto-chain
|
|
1527
|
+
path must run the SAME post-processing as a normal transition). `phase.complete`
|
|
1528
|
+
(`update_roadmap` above) and verification (`verify_phase_goal`) already ran, so invoke
|
|
1529
|
+
transition in **post-completion mode**: SKIP its `verify_completion` and
|
|
1530
|
+
`update_roadmap_and_state` (re-running `phase.complete` would double-write state) and
|
|
1531
|
+
BEGIN at `evolve_project`, running the full set through `offer_next_phase`.
|
|
1615
1532
|
|
|
1616
|
-
|
|
1617
|
-
@~/.claude/gsd-core/references/offer-next.md
|
|
1533
|
+
@~/.claude/gsd-core/workflows/transition.md
|
|
1618
1534
|
</step>
|
|
1619
1535
|
|
|
1620
1536
|
</process>
|
|
@@ -92,6 +92,8 @@ PLAN_START_EPOCH=$(date +%s)
|
|
|
92
92
|
# Count tasks — match <task tag at any indentation level
|
|
93
93
|
TASK_COUNT=$(grep -cE '^\s*<task[[:space:]>]' .planning/phases/XX-name/{phase}-{plan}-PLAN.md 2>/dev/null || echo "0")
|
|
94
94
|
INLINE_THRESHOLD=$(gsd_run query config-get workflow.inline_plan_threshold 2>/dev/null || echo "2")
|
|
95
|
+
USE_WORKTREES=$(gsd_run query config-get workflow.use_worktrees --raw 2>/dev/null || echo "true")
|
|
96
|
+
RUNTIME=$(gsd_run query config-get runtime --default claude --raw 2>/dev/null || echo "claude")
|
|
95
97
|
grep -n "type=\"checkpoint" .planning/phases/XX-name/{phase}-{plan}-PLAN.md
|
|
96
98
|
```
|
|
97
99
|
|
|
@@ -109,13 +111,38 @@ Otherwise: Apply checkpoint-based routing below.
|
|
|
109
111
|
| Verify-only | B (segmented) | Segments between checkpoints. After none/human-verify → SUBAGENT. After decision/human-action → MAIN |
|
|
110
112
|
| Decision | C (main) | Execute entirely in main context |
|
|
111
113
|
|
|
114
|
+
**Resolve isolation now — AFTER the pattern is chosen, and only for a pattern that dispatches
|
|
115
|
+
(#2584/#2652).**
|
|
116
|
+
|
|
117
|
+
- **Pattern C: skip this entirely.** It executes inline in the main context and spawns no
|
|
118
|
+
agent, so there is nothing to isolate. Running the gate here would abort an
|
|
119
|
+
`isolation`-`none` host with a FATAL for a run that was never going to dispatch anything.
|
|
120
|
+
- **Pattern A:** read @gsd-core/references/dispatch-isolation-gate.md and run its
|
|
121
|
+
`Resolve ISOLATION`, `Single-agent dispatch sites`, and `Resolve the harness flag` blocks in
|
|
122
|
+
order; they set `ISOLATION`/`HARNESS_FLAG` via `query dispatch-isolation`. `ISOLATION` — not
|
|
123
|
+
`RUNTIME` — gates the worktree decision. Substitute `{harnessFlag}` in Pattern A's `Agent()`
|
|
124
|
+
with `$HARNESS_FLAG`+comma when `ISOLATION = "harness-worktree"`, else empty.
|
|
125
|
+
`{harnessFlag}` is a template placeholder, not a shell variable.
|
|
126
|
+
- **Pattern B: segments are NOT isolated, and must record that before dispatching.** Each
|
|
127
|
+
segment subagent continues on the working tree the previous segment left behind, so putting
|
|
128
|
+
them in per-agent worktrees would break the sequence. Record `none` before the first segment
|
|
129
|
+
dispatch, or the sentinel still asserts the phase-level `harness-worktree` and the #3045
|
|
130
|
+
`PreToolUse` guard denies every segment dispatch with `exit 2`:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
ISOLATION=none
|
|
134
|
+
gsd_run query dispatch-isolation --raw --force-isolation none >/dev/null 2>&1 || true
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Segment dispatches therefore carry no `{harnessFlag}`.
|
|
138
|
+
|
|
112
139
|
<!-- #2508 runtime-aware-dispatch -->
|
|
113
140
|
|
|
114
141
|
> **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.
|
|
115
142
|
|
|
116
|
-
**Pattern A:** init_agent_tracking → capture `EXPECTED_BASE=$(git rev-parse HEAD)` → print `Spawning executor agent (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)` → spawn Agent(subagent_type="gsd-executor", model=executor_model) with prompt: execute plan at [path], autonomous, all tasks + SUMMARY + commit, follow deviation/auth rules, report: plan name, tasks, SUMMARY path, commit hash → track agent_id → wait → update tracking → report. **Include `
|
|
143
|
+
**Pattern A:** init_agent_tracking → capture `EXPECTED_BASE=$(git rev-parse HEAD)` → **before spawning, run the #2649 pre-dispatch worktree base-check** (mirrors execute-phase #683/#1369 and quick #1941): if `ISOLATION = "harness-worktree"`, run `gsd_run query worktree.base-check --pick shouldDegrade`; if it returns `true`, print its `--pick message` to stderr, emit the `⚠ [#2649] Worktree fork base diverged from orchestrator HEAD — auto-degrading to sequential mode for this plan to avoid a base-mismatch halt.` warning, and treat `ISOLATION` as `"none"` for this dispatch (spawn without `{harnessFlag}`), **then re-record the degrade before spawning** — run `gsd_run query dispatch-isolation --raw --force-isolation none >/dev/null 2>&1 || true`. That re-record is mandatory, not bookkeeping: the resolve step already persisted `harness-worktree` to the run-scoped sentinel, the degrade above happens where the resolver cannot see it, and the shipped `PreToolUse` isolation guard (#3045) reads that sentinel at the instant of the `Agent()` call — a stale `harness-worktree` against a dispatch that correctly omits `{harnessFlag}` is denied with `exit 2`, so the plan does not run at all. See `Re-record after every degrade` in `gsd-core/references/dispatch-isolation-gate.md`. Claude Code's `isolation="worktree"` forks from `origin/HEAD`, not live local HEAD; without this gate a plan whose commit advanced local HEAD past a stale `origin/HEAD` hits the verify-only guard's `exit 42` mid-execution with no auto-degrade. → print `Spawning executor agent (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)` → spawn Agent(subagent_type="gsd-executor", model=executor_model) with prompt: execute plan at [path], autonomous, all tasks + SUMMARY + commit, follow deviation/auth rules, honor checkpoint gate semantics (#3370) — gate="blocking" (the default) is auto-approvable in auto-mode per the executor's own checkpoint protocol, gate="blocking-human" always surfaces to a human; add no instruction overriding that protocol — report: plan name, tasks, SUMMARY path, commit hash → track agent_id → wait → update tracking → report. **Include `{harnessFlag}` only when `ISOLATION = "harness-worktree"` and the #2649 base-check did not degrade** — never hardcode `isolation="worktree"`, which is Claude Code's own literal and wrong on any other harness-worktree host. **When dispatching with `{harnessFlag}`, embed the `<worktree_branch_check>` block from `gsd-core/references/worktree-branch-check.md` into the prompt, substituting `{EXPECTED_BASE}` with the captured base SHA.** That guard is **verify-only and fail-closed** (#48) and stays active as a backstop whether or not the base-check degraded: it asserts a per-agent `agent-*` / `worktree-agent-*` branch and the exact base, forbids `git update-ref` self-recovery (#2924), and on any mismatch prints `FATAL:` and `exit 42` so the orchestrator can recover — the sub-agent never rewrites a worktree it did not create. This supersedes the former self-recovery (#2015), whose destructive base rewrite could fail silently under a deny rule; the base-drift it addressed affects all platforms, and base correction is now the orchestrator's responsibility.
|
|
117
144
|
|
|
118
|
-
**Pattern B:** Execute segment-by-segment. Autonomous segments: spawn subagent for assigned tasks only (no SUMMARY/commit). Checkpoints: main context. After all segments: aggregate, create SUMMARY, commit. See segment_execution.
|
|
145
|
+
**Pattern B:** Execute segment-by-segment. Autonomous segments: spawn subagent for assigned tasks only (no SUMMARY/commit). Checkpoints: main context. After all segments: aggregate, create SUMMARY, commit. See segment_execution. **Segments run unisolated on the main working tree by design** — each continues where the previous one stopped — so dispatch them WITHOUT `{harnessFlag}`, and only after the `ISOLATION=none` re-record above has run (#2652/#3045).
|
|
119
146
|
|
|
120
147
|
**Pattern C:** Execute in main using standard flow (step name="execute").
|
|
121
148
|
|
|
@@ -529,9 +556,14 @@ gsd_run query commit "" --files .planning/codebase/*.md --amend
|
|
|
529
556
|
<step name="offer_next">
|
|
530
557
|
If `USER_SETUP_CREATED=true`: display `⚠️ USER SETUP REQUIRED` with path + env/config tasks at TOP.
|
|
531
558
|
|
|
559
|
+
Get plan/summary counts for the current phase from the single owner (#3218 — LIVE
|
|
560
|
+
counts, i.e. `status: superseded` plans excluded, matching this route's
|
|
561
|
+
"outstanding work" question):
|
|
562
|
+
|
|
532
563
|
```bash
|
|
533
|
-
(
|
|
534
|
-
(
|
|
564
|
+
PHASE_COUNTS=$(gsd_run query find-phase "${PHASE}")
|
|
565
|
+
PLAN_COUNT=$(echo "$PHASE_COUNTS" | jq -r '.plan_count // 0')
|
|
566
|
+
SUMMARY_COUNT=$(echo "$PHASE_COUNTS" | jq -r '.summary_count // 0')
|
|
535
567
|
```
|
|
536
568
|
|
|
537
569
|
| Condition | Route | Action |
|