@opengsd/gsd-core 1.12.0 → 1.14.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 +1 -1
- package/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +458 -0
- package/agents/gsd-code-fixer.md +5 -5
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +345 -0
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +63 -35
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-plan-checker.md +76 -57
- package/agents/gsd-planner.md +14 -0
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-checker.md +19 -3
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +29 -0
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +23 -1
- package/bin/install.js +444 -134
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +1 -0
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +2 -1
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/surface.md +18 -8
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +532 -174
- package/gsd-core/bin/lib/adr-parser.cjs +1 -1
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +39 -22
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +528 -116
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-state.cjs +7 -1
- package/gsd-core/bin/lib/capability-validator.cjs +134 -5
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +198 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/commands.cjs +981 -79
- package/gsd-core/bin/lib/config-loader.cjs +4 -0
- package/gsd-core/bin/lib/config.cjs +153 -38
- package/gsd-core/bin/lib/core-utils.cjs +34 -7
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +343 -28
- package/gsd-core/bin/lib/edge-probe.cjs +14 -1
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +137 -23
- package/gsd-core/bin/lib/gap-checker.cjs +22 -13
- package/gsd-core/bin/lib/git-base-branch.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +54 -11
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +87 -23
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-integration.cjs +57 -5
- package/gsd-core/bin/lib/init-command-router.cjs +14 -0
- package/gsd-core/bin/lib/init.cjs +539 -60
- package/gsd-core/bin/lib/install-engine.cjs +199 -14
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +45 -0
- package/gsd-core/bin/lib/install-profiles.cjs +36 -14
- package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +33 -4
- package/gsd-core/bin/lib/io.cjs +35 -0
- package/gsd-core/bin/lib/loop-resolver.cjs +64 -39
- package/gsd-core/bin/lib/markdown-table.cjs +123 -0
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +41 -10
- package/gsd-core/bin/lib/model-resolver.cjs +101 -10
- package/gsd-core/bin/lib/phase-command-router.cjs +20 -7
- package/gsd-core/bin/lib/phase-id.cjs +412 -31
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase.cjs +941 -98
- package/gsd-core/bin/lib/plan-document.cjs +10 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +34 -18
- package/gsd-core/bin/lib/planning-snapshot.cjs +206 -30
- package/gsd-core/bin/lib/planning-workspace.cjs +153 -29
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +53 -5
- package/gsd-core/bin/lib/review-lane-invocation.cjs +96 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-parser.cjs +555 -41
- package/gsd-core/bin/lib/roadmap.cjs +292 -69
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +260 -43
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +28 -20
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +294 -108
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -47
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +4 -0
- package/gsd-core/bin/lib/smart-entry.cjs +7 -9
- package/gsd-core/bin/lib/state-document.cjs +159 -32
- package/gsd-core/bin/lib/state-md-schema.cjs +44 -27
- package/gsd-core/bin/lib/state-transition.cjs +465 -62
- package/gsd-core/bin/lib/state.cjs +906 -151
- package/gsd-core/bin/lib/surface.cjs +83 -10
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/uat.cjs +1420 -516
- package/gsd-core/bin/lib/update-context.cjs +36 -26
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +316 -23
- package/gsd-core/bin/lib/verify-command-grounding.cjs +1 -1
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +531 -36
- package/gsd-core/bin/lib/workstream-inventory.cjs +21 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +21 -7
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +507 -81
- package/gsd-core/references/agent-contracts.md +3 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe.md +17 -13
- package/gsd-core/references/execute-mvp-tdd.md +18 -16
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +12 -3
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +75 -2
- package/gsd-core/references/planning-config.md +5 -1
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/tdd.md +17 -9
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/worktree-path-safety.md +112 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/phase-prompt.md +4 -0
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/add-backlog.md +2 -0
- package/gsd-core/workflows/add-phase.md +2 -0
- package/gsd-core/workflows/add-tests.md +1 -1
- package/gsd-core/workflows/add-todo.md +4 -3
- package/gsd-core/workflows/ai-integration-phase.md +1 -1
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +2 -0
- package/gsd-core/workflows/audit-milestone.md +2 -0
- package/gsd-core/workflows/audit-uat.md +2 -0
- package/gsd-core/workflows/autonomous.md +15 -10
- package/gsd-core/workflows/check-todos.md +5 -3
- package/gsd-core/workflows/cleanup.md +4 -2
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +22 -13
- package/gsd-core/workflows/code-review-fix.md +5 -3
- package/gsd-core/workflows/code-review.md +211 -43
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +40 -254
- package/gsd-core/workflows/debug.md +1 -1
- package/gsd-core/workflows/diagnose-issues.md +5 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +43 -13
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +15 -156
- package/gsd-core/workflows/edit-phase.md +2 -0
- package/gsd-core/workflows/eval-review.md +1 -1
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +20 -3
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +24 -3
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +8 -2
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +78 -159
- package/gsd-core/workflows/execute-plan.md +28 -15
- package/gsd-core/workflows/explore.md +2 -0
- package/gsd-core/workflows/extract-learnings.md +2 -0
- package/gsd-core/workflows/fast.md +6 -0
- package/gsd-core/workflows/forensics.md +2 -0
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +1 -1
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.compact.md +398 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +3 -1
- package/gsd-core/workflows/import.md +3 -3
- package/gsd-core/workflows/inbox.md +1 -1
- package/gsd-core/workflows/ingest-docs.md +1 -1
- package/gsd-core/workflows/insert-phase.md +2 -0
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +2 -0
- package/gsd-core/workflows/list-workspaces.md +2 -0
- package/gsd-core/workflows/manager.md +3 -3
- package/gsd-core/workflows/map-codebase.md +52 -3
- package/gsd-core/workflows/milestone-summary.md +2 -0
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +55 -13
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project.md +37 -205
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +2 -0
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +19 -4
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +9 -0
- package/gsd-core/workflows/plan-phase.md +144 -185
- package/gsd-core/workflows/plan-review-convergence.md +102 -10
- package/gsd-core/workflows/plant-seed.md +1 -1
- package/gsd-core/workflows/pr-branch.md +30 -10
- package/gsd-core/workflows/profile-user.md +1 -1
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +25 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +37 -2
- package/gsd-core/workflows/quick/steps/research-phase.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +21 -4
- package/gsd-core/workflows/reapply-patches.md +79 -3
- package/gsd-core/workflows/remove-phase.md +2 -0
- package/gsd-core/workflows/remove-workspace.md +1 -1
- package/gsd-core/workflows/resume-project.md +6 -2
- package/gsd-core/workflows/review.md +215 -10
- package/gsd-core/workflows/scan.md +2 -0
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +2 -0
- package/gsd-core/workflows/settings-integrations.md +9 -8
- package/gsd-core/workflows/settings.md +19 -6
- package/gsd-core/workflows/ship.md +10 -10
- package/gsd-core/workflows/sketch-wrap-up.md +2 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +1 -1
- package/gsd-core/workflows/spec-phase.md +24 -19
- package/gsd-core/workflows/spike-wrap-up.md +2 -0
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +2 -0
- package/gsd-core/workflows/sync-skills.md +12 -4
- package/gsd-core/workflows/thread.md +2 -0
- package/gsd-core/workflows/transition.md +2 -0
- package/gsd-core/workflows/ui-phase.md +26 -5
- package/gsd-core/workflows/ui-review.md +1 -1
- package/gsd-core/workflows/ultraplan-phase.md +2 -0
- package/gsd-core/workflows/undo.md +1 -1
- package/gsd-core/workflows/update.md +48 -43
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work.md +68 -182
- package/hooks/dist/gsd-agent-isolation-guard.js +42 -16
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-context-monitor.js +371 -27
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-node-runner.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +30 -5
- package/hooks/dist/gsd-read-guard.js +2 -0
- package/hooks/dist/gsd-read-injection-scanner.js +5 -5
- package/hooks/dist/gsd-secret-read-guard.js +1105 -0
- package/hooks/dist/gsd-statusline.js +18 -10
- package/hooks/dist/gsd-validate-commit.sh +474 -7
- package/hooks/dist/gsd-workflow-guard.js +2 -1
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-agent-isolation-guard.js +42 -16
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-context-monitor.js +371 -27
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-node-runner.sh +1 -0
- package/hooks/gsd-prompt-guard.js +30 -5
- package/hooks/gsd-read-guard.js +2 -0
- package/hooks/gsd-read-injection-scanner.js +5 -5
- package/hooks/gsd-secret-read-guard.js +1105 -0
- package/hooks/gsd-statusline.js +18 -10
- package/hooks/gsd-validate-commit.sh +474 -7
- package/hooks/gsd-workflow-guard.js +2 -1
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/hooks.json +6 -0
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +13 -9
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +11 -4
- package/scripts/check-contract-drift.cjs +4 -1
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +133 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +17 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +67 -15
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +210 -0
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +276 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lib/suite-detection.cjs +32 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +24 -2
- package/scripts/lint-phase-enumeration-drift.cjs +24 -6
- package/scripts/lint-phase-id-drift.cjs +465 -15
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-response-language-coverage.cjs +530 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-test-file-count.allowlist.json +4 -1
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +1112 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +22 -0
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +1 -0
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +2 -1
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -25,6 +25,9 @@ Orchestrator coordinates, not executes. Each subagent loads the full execute-pla
|
|
|
25
25
|
instead of spawning parallel agents. Only attempt parallel spawning if the user
|
|
26
26
|
explicitly requests it — and in that case, rely on the spot-check fallback in step 3
|
|
27
27
|
to detect completion.
|
|
28
|
+
- **Codex:** native subagent sessions can end abnormally (`turn_aborted`) after the plan
|
|
29
|
+
work is already committed. Completion is decided by the step-4 artifact reconciliation
|
|
30
|
+
(SUMMARY + matching recent commits), not by the session's terminal state (#4217).
|
|
28
31
|
- **Other runtimes:** If `Agent`/`agent` tool is genuinely unavailable (e.g. a backgrounded
|
|
29
32
|
Claude Code agent per #853, or a non-Claude runtime), use sequential inline execution as
|
|
30
33
|
the fallback for executor parallelization only. If `Agent` IS available (top-level Claude
|
|
@@ -64,6 +67,8 @@ Always use the exact name from this list — do not fall back to 'general-purpos
|
|
|
64
67
|
|
|
65
68
|
<process>
|
|
66
69
|
|
|
70
|
+
**Compact Content Gate.** Read and follow `gsd-core/references/compact-content-gate.md` now — it states the `workflow.compact_content` check and the resolution rule this spine defers to. When it directs a Read, read `gsd-core/workflows/execute-phase/detail/elaboration.md` in full before continuing past this point; its content elaborates on two steps below (check_interactive_mode, cross_ai_delegation).
|
|
71
|
+
|
|
67
72
|
<step name="parse_args" priority="first">
|
|
68
73
|
Parse `$ARGUMENTS` before loading any context:
|
|
69
74
|
|
|
@@ -182,9 +187,19 @@ TDD_MODE=$(gsd_run loop render-hooks execute:post --active-cap tdd)
|
|
|
182
187
|
Before trusting `STATE.md` or dispatching any executor, derive `CURRENT_PLAN_ID`
|
|
183
188
|
from the active incomplete plan in `INIT`, then search recent history:
|
|
184
189
|
```bash
|
|
185
|
-
CURRENT_PLAN_ID="{phase_number}-{plan_padded}"
|
|
186
190
|
SUMMARY_PATH="{phase_dir}/{plan_padded}-SUMMARY.md"
|
|
187
|
-
|
|
191
|
+
# #4003: no padding rule in the commit protocol, so zero-strip both components and
|
|
192
|
+
# match ANCHORED at the commit scope; bound to the latest reachable tag (milestone marker).
|
|
193
|
+
PHASE_NUMBER="{phase_number}"
|
|
194
|
+
# #4619: {phase_number} may be decimal (01.1) or N-segment (23.1.2) — $((10#...))
|
|
195
|
+
# is a hard shell syntax error on a non-integer, so zero-strip only the LEADING
|
|
196
|
+
# integer segment and keep the rest as an escaped-dot string for the ERE below.
|
|
197
|
+
PHASE_INT=${PHASE_NUMBER%%.*}; PHASE_FRAC=${PHASE_NUMBER#"$PHASE_INT"}
|
|
198
|
+
PHASE_N="$((10#$PHASE_INT))${PHASE_FRAC//./\\.}"
|
|
199
|
+
PLAN_N=$((10#{plan_padded}))
|
|
200
|
+
PLAN_SCOPE_RE="^[a-z]+\((0*${PHASE_N})-(0*${PLAN_N})\):"
|
|
201
|
+
MILESTONE_BASE=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
|
202
|
+
PLAN_COMMITS=$(git log --oneline -E ${MILESTONE_BASE:+"$MILESTONE_BASE..HEAD"} --grep="${PLAN_SCOPE_RE}" -30)
|
|
188
203
|
```
|
|
189
204
|
If production commits exist and `SUMMARY.md is missing` (no `.planning/async-jobs/*.json` manifest matches it: a match is a legal `external_job_waiting` deferral - reconcile per `docs/reference/planning-artifacts.md`, never re-dispatch), stop before spawning a
|
|
190
205
|
new executor; continuing risks duplicate work and stale `STATE.md`/ROADMAP progress.
|
|
@@ -194,15 +209,24 @@ Offer these recovery options:
|
|
|
194
209
|
- `mark-and-skip` — record the anomaly and move on only with explicit confirmation.
|
|
195
210
|
</step>
|
|
196
211
|
|
|
197
|
-
**
|
|
212
|
+
**TDD gate.** Task-scoped enforcement runs inside plan execution (immediately before each implementation step), where `TASK_FILE`, `PLAN_ID`, and `TASK_ID` are defined. #4011: the gate keys on `TDD_MODE` ALONE — a discipline gate coupled to the product-scope `MVP_MODE` flag was silently inert on every non-MVP phase, contradicting `gsd-core/references/tdd.md`'s contract that `workflow.tdd_mode` binds for all `type: tdd` plans. MVP mode remains free to imply TDD; it is no longer required by it. Keep the same predicate and RED-commit contract:
|
|
198
213
|
```bash
|
|
199
|
-
if [ "$
|
|
214
|
+
if [ "$TDD_MODE" = "true" ]; then
|
|
200
215
|
IS_BEHAVIOR_ADDING=$(gsd_run query task.is-behavior-adding "$TASK_FILE" --pick is_behavior_adding)
|
|
201
216
|
if [ "$IS_BEHAVIOR_ADDING" = "true" ]; then
|
|
202
|
-
|
|
217
|
+
# #4003: same anchored scope and milestone bound as safe_resume_gate — a padded
|
|
218
|
+
# literal grep hard-halts on a correct unpadded RED commit.
|
|
219
|
+
# #4619: PHASE_NUMBER may be decimal/N-segment; zero-strip only the leading
|
|
220
|
+
# integer segment, escape the rest for the ERE below.
|
|
221
|
+
PHASE_INT=${PHASE_NUMBER%%.*}; PHASE_FRAC=${PHASE_NUMBER#"$PHASE_INT"}
|
|
222
|
+
PHASE_N="$((10#$PHASE_INT))${PHASE_FRAC//./\\.}"
|
|
223
|
+
PLAN_N=$((10#${PLAN_ID}))
|
|
224
|
+
PLAN_SCOPE_RE="^[a-z]+\((0*${PHASE_N})-(0*${PLAN_N})\):" # TDD gate's own scope check
|
|
225
|
+
TDD_MILESTONE_BASE=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
|
226
|
+
RED_COMMIT=$(git log --oneline -E ${TDD_MILESTONE_BASE:+"$TDD_MILESTONE_BASE..HEAD"} --grep="${PLAN_SCOPE_RE}" -- "**/*.test.*" "**/*.spec.*" "tests/" | head -1)
|
|
203
227
|
if [ -z "$RED_COMMIT" ]; then
|
|
204
228
|
gsd_run query state.update last_gate_trip "${PLAN_ID}/${TASK_ID}" || true
|
|
205
|
-
echo "
|
|
229
|
+
echo "TDD GATE TRIPPED: missing RED commit for ${PLAN_ID}/${TASK_ID}"
|
|
206
230
|
exit 1
|
|
207
231
|
fi
|
|
208
232
|
fi
|
|
@@ -236,43 +260,7 @@ Write these answers inline before continuing. If a blocking anti-pattern cannot
|
|
|
236
260
|
</step>
|
|
237
261
|
|
|
238
262
|
<step name="check_interactive_mode">
|
|
239
|
-
**Parse `--interactive` flag from $ARGUMENTS.**
|
|
240
|
-
|
|
241
|
-
**If `--interactive` flag present:** Switch to interactive execution mode.
|
|
242
|
-
|
|
243
|
-
Interactive mode executes plans sequentially **inline** (no subagent spawning) with user
|
|
244
|
-
checkpoints between tasks. The user can review, modify, or redirect work at any point.
|
|
245
|
-
|
|
246
|
-
**Interactive execution flow:**
|
|
247
|
-
|
|
248
|
-
1. Load plan inventory as normal (discover_and_group_plans)
|
|
249
|
-
2. For each plan (sequentially, ignoring wave grouping):
|
|
250
|
-
|
|
251
|
-
a. **Present the plan to the user:**
|
|
252
|
-
```
|
|
253
|
-
## Plan {plan_id}: {plan_name}
|
|
254
|
-
|
|
255
|
-
Objective: {from plan file}
|
|
256
|
-
Tasks: {task_count}
|
|
257
|
-
|
|
258
|
-
Options:
|
|
259
|
-
- Execute (proceed with all tasks)
|
|
260
|
-
- Review first (show task breakdown before starting)
|
|
261
|
-
- Skip (move to next plan)
|
|
262
|
-
- Stop (end execution, save progress)
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
b. **If "Review first":** Read and display the full plan file. Ask again: Execute, Modify, Skip.
|
|
266
|
-
|
|
267
|
-
c. **If "Execute":** Read and follow `~/.claude/gsd-core/workflows/execute-plan.md` **inline**
|
|
268
|
-
(do NOT spawn a subagent). Execute tasks one at a time.
|
|
269
|
-
|
|
270
|
-
d. **After each task:** Pause briefly. If the user intervenes (types anything), stop and address
|
|
271
|
-
their feedback before continuing. Otherwise proceed to next task.
|
|
272
|
-
|
|
273
|
-
e. **After plan complete:** Show results, commit, create SUMMARY.md, then present next plan.
|
|
274
|
-
|
|
275
|
-
3. After all plans: proceed to verification (same as normal mode).
|
|
263
|
+
**Parse `--interactive` flag from $ARGUMENTS.** If present, switch to interactive execution mode: plans run sequentially **inline** (no subagent spawning, ignoring wave grouping), reading `execute-plan.md` directly rather than dispatching `gsd-executor`. **Once per plan** (not per task), present a 4-option menu (execute / review-first / skip / stop) before starting that plan's tasks. Once executing, tasks run one at a time with only a brief pause after each — the agent stops mid-plan only if the user actually types something, it does not re-show the menu. After all plans, proceed to verification as normal. Full flow (the exact presentation format, the review-first sub-branch): `gsd-core/workflows/execute-phase/detail/elaboration.md` § 1.
|
|
276
264
|
|
|
277
265
|
**Skip to handle_branching step** (interactive plans execute inline after grouping).
|
|
278
266
|
</step>
|
|
@@ -408,74 +396,11 @@ Report:
|
|
|
408
396
|
</step>
|
|
409
397
|
|
|
410
398
|
<step name="cross_ai_delegation">
|
|
411
|
-
**Optional step 2.5 — Delegate plans to an external AI runtime.**
|
|
412
|
-
|
|
413
|
-
This step runs after plan discovery and before normal wave execution. It identifies plans
|
|
414
|
-
that should be delegated to an external AI command and executes them via stdin-based prompt
|
|
415
|
-
delivery. Plans handled here are removed from the execute_waves plan list so the normal
|
|
416
|
-
executor skips them.
|
|
417
|
-
|
|
418
|
-
**Activation logic:**
|
|
419
|
-
|
|
420
|
-
1. If `CROSS_AI_DISABLED` is true (`--no-cross-ai` flag): skip this step entirely.
|
|
421
|
-
2. If `CROSS_AI_FORCE` is true (`--cross-ai` flag): mark ALL incomplete plans for cross-AI execution.
|
|
422
|
-
3. Otherwise: check each plan's frontmatter for `cross_ai: true` AND verify config
|
|
423
|
-
`workflow.cross_ai_execution` is `true`. Plans matching both conditions are marked for cross-AI.
|
|
424
|
-
|
|
425
|
-
```bash
|
|
426
|
-
CROSS_AI_ENABLED=$(gsd_run query config-get workflow.cross_ai_execution --raw 2>/dev/null || echo "false")
|
|
427
|
-
CROSS_AI_CMD=$(gsd_run query config-get workflow.cross_ai_command --raw 2>/dev/null || echo "")
|
|
428
|
-
CROSS_AI_TIMEOUT=$(gsd_run query config-get workflow.cross_ai_timeout --raw 2>/dev/null || echo "300")
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
**If no plans are marked for cross-AI:** Skip to execute_waves.
|
|
432
|
-
|
|
433
|
-
**If plans are marked but `cross_ai_command` is empty:** Error — tell user to set
|
|
434
|
-
`workflow.cross_ai_command` via `gsd_run query config-set workflow.cross_ai_command "<command>"`.
|
|
435
|
-
|
|
436
|
-
**For each cross-AI plan (sequentially):**
|
|
437
|
-
|
|
438
|
-
1. **Construct the task prompt** from the plan file:
|
|
439
|
-
- Extract `<objective>` and `<tasks>` sections from the PLAN.md
|
|
440
|
-
- Append PROJECT.md context (project name, description, tech stack)
|
|
441
|
-
- Format as a self-contained execution prompt
|
|
442
|
-
|
|
443
|
-
2. **Check for dirty working tree before execution:**
|
|
444
|
-
```bash
|
|
445
|
-
if ! git diff --quiet HEAD 2>/dev/null; then
|
|
446
|
-
echo "WARNING: dirty working tree detected — the external AI command may produce uncommitted changes that conflict with existing modifications"
|
|
447
|
-
fi
|
|
448
|
-
```
|
|
399
|
+
**Optional step 2.5 — Delegate plans to an external AI runtime.** Runs after plan discovery, before wave execution. Activates when `--cross-ai` forces all incomplete plans, `--no-cross-ai` disables it entirely, or (default) a plan's `cross_ai: true` frontmatter agrees with the `workflow.cross_ai_execution` config. If no plan is marked, skip to execute_waves; if marked but `workflow.cross_ai_command` is unset, error and tell the user to set it.
|
|
449
400
|
|
|
450
|
-
|
|
451
|
-
Never shell-interpolate the prompt — always pipe via stdin to prevent injection:
|
|
452
|
-
```bash
|
|
453
|
-
echo "$TASK_PROMPT" | gsd_run run-with-timeout "${CROSS_AI_TIMEOUT}" -- ${CROSS_AI_CMD} > "$CANDIDATE_SUMMARY" 2>"$ERROR_LOG"
|
|
454
|
-
EXIT_CODE=$?
|
|
455
|
-
```
|
|
401
|
+
For each marked plan: build a self-contained prompt from the plan's `<objective>`/`<tasks>` plus PROJECT.md context, warn on a dirty working tree, then run the configured command **wrapped in `gsd_run run-with-timeout "${CROSS_AI_TIMEOUT}"` (config `workflow.cross_ai_timeout`, default 300s) — never run it unbounded** — with the prompt piped to **stdin, never shell-interpolated, to prevent injection**. On success (exit 0): validate the captured SUMMARY output is non-empty and structurally valid before writing it as the plan's SUMMARY.md, update STATE/ROADMAP, mark handled. On failure (non-zero exit, or the summary fails that validation): show the error, warn about possible partial edits, and offer **retry** / **skip** (falls back to the normal executor) / **abort**. Successfully handled plans are removed from execute_waves' list; skipped-to-fallback plans remain in it.
|
|
456
402
|
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
**Success (exit 0 + valid summary):**
|
|
460
|
-
- Read `$CANDIDATE_SUMMARY` and validate it contains meaningful content
|
|
461
|
-
(not empty, has at least a heading and description — a valid SUMMARY.md structure)
|
|
462
|
-
- Write it as the plan's SUMMARY.md file
|
|
463
|
-
- Update STATE.md plan status to complete
|
|
464
|
-
- Update ROADMAP.md progress
|
|
465
|
-
- Mark plan as handled — skip it in execute_waves
|
|
466
|
-
|
|
467
|
-
**Failure (non-zero exit or invalid summary):**
|
|
468
|
-
- Display the error output and exit code
|
|
469
|
-
- Warn: "The external command may have left uncommitted changes or partial edits
|
|
470
|
-
in the working tree. Review `git status` and `git diff` before proceeding."
|
|
471
|
-
- Offer three choices:
|
|
472
|
-
- **retry** — run the same plan through cross-AI again
|
|
473
|
-
- **skip** — fall back to normal executor for this plan (re-add to execute_waves list)
|
|
474
|
-
- **abort** — stop execution entirely, preserve state for resume
|
|
475
|
-
|
|
476
|
-
5. **After all cross-AI plans processed:** Remove successfully handled plans from the
|
|
477
|
-
incomplete plan list so execute_waves skips them. Any skipped-to-fallback plans remain
|
|
478
|
-
in the list for normal executor processing.
|
|
403
|
+
Exact bash and per-branch wording: `gsd-core/workflows/execute-phase/detail/elaboration.md` § 2.
|
|
479
404
|
</step>
|
|
480
405
|
|
|
481
406
|
<step name="execute_waves">
|
|
@@ -653,7 +578,9 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
653
578
|
WAVE_PRE_HOOKS_JSON=$(gsd_run loop render-hooks execute:wave:pre --raw)
|
|
654
579
|
```
|
|
655
580
|
|
|
656
|
-
**Contribution dispatch:** inject every `kind == "contribution"` fragment per @gsd-core/references/loop-hook-dispatch.md (skip when none); one naming an alternate wave dispatch replaces step 3's inline loop.
|
|
581
|
+
**Contribution dispatch:** inject every `kind == "contribution"` fragment per @gsd-core/references/loop-hook-dispatch.md (skip when none); one naming an alternate wave dispatch replaces step 3's inline loop.
|
|
582
|
+
|
|
583
|
+
**Step dispatch:** `kind == "step"` per @gsd-core/references/loop-hook-dispatch.md; never blocks or redirects executor spawning. ⚠ Validate `ref.command` in-context before any shell use.
|
|
657
584
|
|
|
658
585
|
3. **Spawn executor agents:**
|
|
659
586
|
|
|
@@ -664,8 +591,12 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
664
591
|
|
|
665
592
|
Pass paths only — executors read files themselves.
|
|
666
593
|
|
|
594
|
+
**Substitute `{plan_id}` in the prompt below with this plan's `id` field** from the `phase-plan-index` JSON loaded in step 1 (the same field referred to elsewhere in this workflow as `plan.id`) — unmodified and un-truncated, never a paraphrase. The guard hooks compare this value verbatim against the sentinel the per-plan gate wrote (`per-plan-worktree-gate.md`'s `plan_id`); a paraphrase or an omission costs the dispatch its recorded isolation decision.
|
|
595
|
+
|
|
667
596
|
**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.
|
|
668
597
|
|
|
598
|
+
**TDD-applicability resolution (#4266/#4272).** Run `gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md`.
|
|
599
|
+
|
|
669
600
|
**Worktree mode** (`USE_WORKTREES` and `USE_WORKTREES_FOR_PLAN` not `false`):
|
|
670
601
|
|
|
671
602
|
Before spawning, capture the current HEAD:
|
|
@@ -712,6 +643,7 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
712
643
|
prompt="
|
|
713
644
|
<objective>
|
|
714
645
|
Execute plan {plan_number} of phase {phase_number}-{phase_name}.
|
|
646
|
+
[gsd:dispatch phase="{phase_number}" plan="{plan_id}"]
|
|
715
647
|
Commit each task atomically. Create SUMMARY.md.
|
|
716
648
|
Do NOT update STATE.md or ROADMAP.md — the orchestrator owns those writes after all worktree agents in the wave complete.
|
|
717
649
|
</objective>
|
|
@@ -746,7 +678,7 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
746
678
|
- `~/.claude/gsd-core/workflows/execute-plan.md`
|
|
747
679
|
- `~/.claude/gsd-core/templates/summary.md`
|
|
748
680
|
- `~/.claude/gsd-core/references/checkpoints.md`
|
|
749
|
-
- `~/.claude/gsd-core/references/tdd.md`
|
|
681
|
+
${TDD_APPLICABLE ? '- `~/.claude/gsd-core/references/tdd.md`' : ''} # #3990/#4265: type: tdd, tdd="true", or workflow.tdd_mode
|
|
750
682
|
- `~/.claude/gsd-core/references/worktree-path-safety.md`
|
|
751
683
|
${CONTEXT_WINDOW < 200000 ? '' : '- `~/.claude/gsd-core/references/executor-examples.md`'}
|
|
752
684
|
</execution_context>
|
|
@@ -791,20 +723,29 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
791
723
|
|
|
792
724
|
> **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.
|
|
793
725
|
|
|
794
|
-
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above to spawn executor agent(s), 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.
|
|
726
|
+
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above to spawn executor agent(s), 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. While waiting, run the step-4 completion surveillance; if the child's session ends abnormally — including `turn_aborted` — reconcile artifacts per `execute-phase/steps/completion-reconciliation.md` before classifying the plan (#4217).
|
|
795
727
|
|
|
796
728
|
**Orchestrator-managed worktree dispatch** (`ISOLATION=orchestrator-worktree`): read and execute `execute-phase/steps/executor-isolation-dispatch.md`. GSD creates each worktree (`worktree create`) and spawns the executor into it; the orchestrator performs every git operation. Merge-back and cleanup are the existing manifest-scoped gauntlet, unchanged.
|
|
797
729
|
|
|
798
730
|
**Sequential mode** (`USE_WORKTREES_FOR_PLAN` is `false` — either project-level `USE_WORKTREES=false`, or per-plan submodule intersection forced it false in step 2.5):
|
|
799
731
|
|
|
800
|
-
Omit `isolation="worktree"` from the Agent call.
|
|
732
|
+
Omit `isolation="worktree"` from the Agent call. Before composing the prompt, read and execute
|
|
733
|
+
`execute-phase/steps/sequential-root-pin.md` (#4254) — it owns the sequential root-pin build-time
|
|
734
|
+
embed and the wave serialization rules.
|
|
735
|
+
|
|
736
|
+
Replace the `<parallel_execution>` block with:
|
|
801
737
|
|
|
802
738
|
```
|
|
803
739
|
<sequential_execution>
|
|
804
740
|
You are running as a SEQUENTIAL executor agent on the main working tree.
|
|
805
741
|
Use normal git commits (with hooks). Do NOT use --no-verify.
|
|
742
|
+
Run the `<project_root_pin>` guard before your first Edit/Write and before every commit (#4254).
|
|
806
743
|
REQUIRED ORDER: Write SUMMARY.md → commit → only then any narration. No text between Write and commit (truncation risk; #2070 rescue is not primary defense).
|
|
807
744
|
</sequential_execution>
|
|
745
|
+
|
|
746
|
+
<project_root_pin>
|
|
747
|
+
{ORCHESTRATOR build-time embed: bound step-0p guard per sequential-root-pin.md — never this note}
|
|
748
|
+
</project_root_pin>
|
|
808
749
|
```
|
|
809
750
|
|
|
810
751
|
The sequential mode Agent prompt uses the same structure as worktree mode but with these differences in success_criteria — since there is only one agent writing at a time, there are no shared-file conflicts:
|
|
@@ -819,8 +760,6 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
819
760
|
</success_criteria>
|
|
820
761
|
```
|
|
821
762
|
|
|
822
|
-
When worktrees are disabled for a plan (per-plan or project-level), that plan's executor runs on the main working tree. If **any** plan in the current wave dropped to sequential mode, execute the affected plan(s) **one at a time** to avoid concurrent writes to the main working tree — plans in the same wave that retained worktree isolation can still run in parallel alongside the sequential ones, but two non-worktree plans in the same wave must serialize. When the project-level `USE_WORKTREES=false`, all plans in the wave serialize regardless of the `PARALLELIZATION` setting.
|
|
823
|
-
|
|
824
763
|
4. **Wait for all agents in wave to complete.**
|
|
825
764
|
|
|
826
765
|
**Plan-complete heartbeat (#2410):** as each executor returns (or is verified
|
|
@@ -833,25 +772,9 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
833
772
|
[checkpoint] phase {PHASE_NUMBER} wave {N}/{M} plan {plan_id} checkpoint ({P}/{Q} plans done)
|
|
834
773
|
```
|
|
835
774
|
|
|
836
|
-
**Completion
|
|
837
|
-
|
|
838
|
-
If a spawned agent does not return a completion signal but appears to have finished
|
|
839
|
-
its work, do NOT block indefinitely. Instead, verify completion via spot-checks:
|
|
840
|
-
|
|
841
|
-
```bash
|
|
842
|
-
# For each plan in this wave, check if the executor finished:
|
|
843
|
-
SUMMARY_EXISTS=$(test -f "{phase_dir}/{plan_number}-{plan_padded}-SUMMARY.md" && echo "true" || echo "false")
|
|
844
|
-
COMMITS_FOUND=$(git log --oneline --all --grep="{phase_number}-{plan_padded}" --since="1 hour ago" | head -1)
|
|
845
|
-
COMMITS_SINCE_DISPATCH=$(git log "${EXPECTED_BRANCH}" --since="${DISPATCH_TS}" --oneline | head -1)
|
|
846
|
-
```
|
|
847
|
-
|
|
848
|
-
**If SUMMARY.md exists AND commits are found:** The agent completed successfully —
|
|
849
|
-
treat as done and proceed to step 5. Log: `"✓ {Plan ID} completed (verified via spot-check — completion signal not received)"`
|
|
775
|
+
**Completion reconciliation (EVERY runtime — any spawn whose terminal response may not arrive):**
|
|
850
776
|
|
|
851
|
-
|
|
852
|
-
running or may have failed silently. Check `git log --oneline -5` for recent
|
|
853
|
-
activity. If commits are still appearing, wait longer. If no activity, report
|
|
854
|
-
the plan as failed and route to the failure handler in step 6.
|
|
777
|
+
If a spawned agent does not return a normal terminal completion response — or its session ends abnormally (interrupted, aborted, closed, killed, timed out, `turn_aborted`, including ends the orchestrator itself initiated) — do NOT block indefinitely and do NOT classify the plan as failed yet. Read and execute `gsd-core/workflows/execute-phase/steps/completion-reconciliation.md` — reconcile the plan artifacts FIRST, classify SECOND: SUMMARY present AND matching recent commits → complete (proceed to step 5, do NOT re-dispatch); no completion evidence → the failure handler. Verify, never wait.
|
|
855
778
|
|
|
856
779
|
**Configurable stall surveillance (#3212):** Every `${EXECUTOR_STALL_INTERVAL_MINUTES}`
|
|
857
780
|
minutes while waiting, inspect `git log "${EXPECTED_BRANCH}" --since="${DISPATCH_TS}"`
|
|
@@ -860,10 +783,9 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
860
783
|
ask for one recovery path: `continue waiting`, `kill and retry`, or
|
|
861
784
|
`kill and switch to inline execution`.
|
|
862
785
|
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
default: the completion signal may never arrive. Verify, never wait.
|
|
786
|
+
**A working executor is never steered (#4218).** The threshold measures time WITHOUT
|
|
787
|
+
PROGRESS, not total runtime. Before treating an executor as stalled — and before sending it
|
|
788
|
+
any message — read and execute `execute-phase/steps/executor-progress-policy.md`.
|
|
867
789
|
|
|
868
790
|
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:
|
|
869
791
|
```bash
|
|
@@ -1025,7 +947,7 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
1025
947
|
|
|
1026
948
|
**Contribution dispatch:** inject every `kind == "contribution"` fragment per @gsd-core/references/loop-hook-dispatch.md (skip when none), before the gates below.
|
|
1027
949
|
|
|
1028
|
-
**Step dispatch:** dispatch every `kind == "step"` hook per @gsd-core/references/loop-hook-dispatch.md (skip when none) — not one shape of one. A step here is advisory: it never blocks wave completion. ⚠ **Validate `ref.command` in-context before any shell use** (third-party manifest input) — loop-hook-dispatch.md § `step`.
|
|
950
|
+
**Step dispatch:** dispatch every `kind == "step"` hook per @gsd-core/references/loop-hook-dispatch.md (skip when none) — not one shape of one. A step here is advisory: it never blocks wave completion. ⚠ **Validate `ref.command` in-context before any shell use** (third-party manifest input) — loop-hook-dispatch.md § `step`. **`ref.skill == "code-review"` (#3661):** the generic contract's bare skill dispatch carries no phase argument, but `code-review.md`'s `initialize` step requires one (`PHASE_ARG="${1}"`) or it reports "Phase not found" and exits — pass it explicitly, mirroring step `code_review_gate` below: `Skill(skill="gsd-code-review", args="${PHASE_NUMBER}")`.
|
|
1029
951
|
|
|
1030
952
|
**For each active entry where `kind == "gate"`** (process in array order): read and execute `gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md` for the full evaluation contract (check validation, `onError`, blocking semantics, mapper spawn). When all active gates are processed without a blocking halt, continue to step 5.8.
|
|
1031
953
|
|
|
@@ -1097,6 +1019,7 @@ increases monotonically across waves. `{status}` is `complete` (success),
|
|
|
1097
1019
|
if [ -n "$RETRY_AFTER" ]; then RETRY_HINT=" Provider hinted retry-after: ${RETRY_AFTER}s"; else RETRY_HINT=""; fi
|
|
1098
1020
|
```
|
|
1099
1021
|
One classifier branch handles sentinels across Claude/Copilot/Codex/Gemini. Reference: `docs/research/provider-rate-limit-signals.md`.
|
|
1022
|
+
**Abnormal ends reconcile first (#4217):** an abnormal session end (`turn_aborted`-class) routes through the step-4 artifact reconciliation BEFORE classifying the failure — artifacts decide.
|
|
1100
1023
|
**Step 7.1 — `class == "quota-exceeded"`:** follow the quota-recovery fragment below.
|
|
1101
1024
|
**Step 7.2 — `class == "classify-handoff-bug"`:**
|
|
1102
1025
|
If error contains `classifyHandoffIfNeeded is not defined`, treat as Claude runtime bug. Run the same step-5 spot-checks; PASS => treat as success, FAIL => fall through.
|
|
@@ -1123,6 +1046,7 @@ When executor returns a checkpoint AND `AUTO_MODE` is `true`:
|
|
|
1123
1046
|
- **decision** → Auto-spawn continuation agent with `{user_response}` = first option from checkpoint details. Log `⚡ Auto-selected: [option]`. **Except `blocking-human`.**
|
|
1124
1047
|
- **human-action** → Present to user (existing behavior below). Auth gates cannot be automated.
|
|
1125
1048
|
|
|
1049
|
+
<!-- gsd:protected -->
|
|
1126
1050
|
**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`.
|
|
1127
1051
|
|
|
1128
1052
|
**Standard flow (not auto-mode, human-action, or blocking-human):**
|
|
@@ -1245,16 +1169,16 @@ CHECK_EXIT=$?
|
|
|
1245
1169
|
|
|
1246
1170
|
**Gate evaluation** uses the same two-step contract as `execute:wave:post` above.
|
|
1247
1171
|
|
|
1248
|
-
**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 `
|
|
1172
|
+
**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 `TDD_MODE=true` AND `GATE_RESULT.block == true` (one or more TDD plans miss a RED or GREEN gate commit; #4011 — no MVP condition), the end-of-phase TDD review escalates from advisory to **blocking under TDD** — refuse to mark the phase complete and present:
|
|
1249
1173
|
|
|
1250
1174
|
```
|
|
1251
|
-
Phase blocked: {N} TDD plan(s) violate the RED→GREEN gate sequence under
|
|
1175
|
+
Phase blocked: {N} TDD plan(s) violate the RED→GREEN gate sequence under TDD.
|
|
1252
1176
|
Resolve and re-run /gsd execute-phase, or override with /gsd execute-phase {phase} --force-mvp-gate to ship anyway.
|
|
1253
1177
|
```
|
|
1254
1178
|
|
|
1255
|
-
(`--force-mvp-gate` is the documented, not-yet-implemented escape hatch.) Outside
|
|
1179
|
+
(`--force-mvp-gate` is the documented, not-yet-implemented escape hatch.) Outside TDD mode, TDD-review violations remain advisory (table shown, execution continues).
|
|
1256
1180
|
|
|
1257
|
-
**Proceed rule:** If `
|
|
1181
|
+
**Proceed rule:** If `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.
|
|
1258
1182
|
</step>
|
|
1259
1183
|
|
|
1260
1184
|
<!-- gsd:section id="gap-closure-artifacts" when="state:gap-closure-phase" -->
|
|
@@ -1300,7 +1224,7 @@ ${VERIFIER_SKILLS}",
|
|
|
1300
1224
|
)
|
|
1301
1225
|
```
|
|
1302
1226
|
|
|
1303
|
-
> **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.
|
|
1227
|
+
> **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. If the session ends abnormally (`turn_aborted`), reconcile via the `verification.status` query below — the session's terminal state is not evidence of failure (#4217).
|
|
1304
1228
|
|
|
1305
1229
|
Read status via the canonical query (scoped to frontmatter, covers missing/unknown cases):
|
|
1306
1230
|
```bash
|
|
@@ -1468,42 +1392,37 @@ Copy failure must NOT block phase completion.
|
|
|
1468
1392
|
</step>
|
|
1469
1393
|
|
|
1470
1394
|
<step name="close_phase_todos">
|
|
1471
|
-
**Auto-close
|
|
1472
|
-
|
|
1473
|
-
After `update_roadmap`, moves todos whose `resolves_phase` matches to `completed/`.
|
|
1395
|
+
**Auto-close todos whose `resolves_phase` matches this phase (#2433)**, after `update_roadmap`.
|
|
1474
1396
|
|
|
1475
1397
|
```bash
|
|
1476
1398
|
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
1477
|
-
PHASE_NUM="${PHASE_NUMBER}"
|
|
1478
1399
|
PENDING_DIR=".planning/todos/pending"
|
|
1479
1400
|
COMPLETED_DIR=".planning/todos/completed"
|
|
1480
1401
|
mkdir -p "$COMPLETED_DIR"
|
|
1481
|
-
|
|
1402
|
+
PHASE_NUM="${PHASE_NUMBER}"
|
|
1482
1403
|
#2576
|
|
1483
1404
|
normalize_phase_num() {
|
|
1484
|
-
|
|
1405
|
+
printf '%s' "${1//\"/}" | sed 's/^0*\([0-9]\)/\1/'
|
|
1485
1406
|
}
|
|
1486
1407
|
PHASE_NUM_NORM=$(normalize_phase_num "$PHASE_NUM")
|
|
1487
|
-
|
|
1488
1408
|
CLOSED=()
|
|
1489
1409
|
for TODO_FILE in "$PENDING_DIR"/*.md; do
|
|
1490
1410
|
[ -f "$TODO_FILE" ] || continue
|
|
1491
1411
|
RP=$(awk '/^---/{c++;next} c==1 && /^resolves_phase:/{print $2;exit} c==2{exit}' "$TODO_FILE" 2>/dev/null || true)
|
|
1492
1412
|
RP_NORM=$(normalize_phase_num "$RP")
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
fi
|
|
1413
|
+
[ -n "$RP_NORM" ] && [ "$RP_NORM" = "$PHASE_NUM_NORM" ] || continue
|
|
1414
|
+
mv "$TODO_FILE" "$COMPLETED_DIR/"
|
|
1415
|
+
CLOSED+=("$(basename "$TODO_FILE")")
|
|
1497
1416
|
done
|
|
1498
|
-
|
|
1499
1417
|
if [ ${#CLOSED[@]} -gt 0 ]; then
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1418
|
+
ADDED=(); REMOVED=()
|
|
1419
|
+
for f in "${CLOSED[@]}"; do ADDED+=("$COMPLETED_DIR/$f"); REMOVED+=("$PENDING_DIR/$f"); done
|
|
1420
|
+
gsd_run query commit "docs(phase-${PHASE_NUMBER}): close ${#CLOSED[@]} resolved todo(s)" --files "${ADDED[@]}" .planning/STATE.md --files-removed "${REMOVED[@]}" || true
|
|
1421
|
+
echo "◆ Closed ${#CLOSED[@]} todo(s) for Phase ${PHASE_NUMBER}:"; printf ' ✓ %s\n' "${CLOSED[@]}"
|
|
1503
1422
|
fi
|
|
1504
1423
|
```
|
|
1505
1424
|
|
|
1506
|
-
|
|
1425
|
+
No matches: skip silently, never blocks.
|
|
1507
1426
|
</step>
|
|
1508
1427
|
|
|
1509
1428
|
<step name="delegate_post_completion_to_transition">
|
|
@@ -50,7 +50,7 @@ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
|
50
50
|
|
|
51
51
|
Extract from init JSON: `executor_model`, `commit_docs`, `sub_repos`, `phase_dir`, `phase_number`, `plans`, `summaries`, `incomplete_plans`, `state_path`, `config_path`, `response_language`.
|
|
52
52
|
|
|
53
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
53
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
54
54
|
|
|
55
55
|
If `.planning/` missing: error.
|
|
56
56
|
</step>
|
|
@@ -67,7 +67,7 @@ Find first PLAN without matching SUMMARY. Decimal phases supported (`01.1-hotfix
|
|
|
67
67
|
**Exclude `external_job_waiting` plans from selection.** When choosing the first PLAN that lacks a matching SUMMARY, skip any plan whose `plan_id` matches an async-job manifest in `.planning/async-jobs/` (any status) — that plan is `external_job_waiting` or awaiting reconciliation, never work to (re-)dispatch (re-dispatching would duplicate the external job). Reconcile via the manifest / safe_resume_gate instead.
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
|
-
PHASE=$(echo "$PLAN_PATH" | grep -oE '[0-9]+(\.[0-9]+)
|
|
70
|
+
PHASE=$(echo "$PLAN_PATH" | grep -oE '[0-9]+(\.[0-9]+)*-[0-9]+')
|
|
71
71
|
# config settings can be fetched via gsd_run query config-get if needed
|
|
72
72
|
```
|
|
73
73
|
|
|
@@ -292,13 +292,13 @@ End with: **Total deviations:** N auto-fixed (breakdown). **Impact:** assessment
|
|
|
292
292
|
For `type: tdd` plans — RED-GREEN-REFACTOR:
|
|
293
293
|
|
|
294
294
|
1. **Infrastructure** (first TDD plan only): detect project, install framework, config, verify empty suite
|
|
295
|
-
2. **
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
295
|
+
2. **Cycle (#3990: stated ONCE; #4267: cited correctly):** execute RED → GREEN → REFACTOR
|
|
296
|
+
exactly as specified in the canonical `~/.claude/gsd-core/references/tdd.md` reference — the
|
|
297
|
+
"Red-Green-Refactor Cycle" section's commit-scope contract (`test({phase}-{plan})` →
|
|
298
|
+
`feat({phase}-{plan})` → `refactor({phase}-{plan})`, RED must fail, GREEN must pass, REFACTOR
|
|
299
|
+
commits only on change), the "Gate Enforcement Rules" section's "Fail-Fast Rules" subsection,
|
|
300
|
+
and the "Error Handling" section. The reference is the single source; do not improvise a
|
|
301
|
+
variant.
|
|
302
302
|
</tdd_plan_execution>
|
|
303
303
|
|
|
304
304
|
<precommit_failure_handling>
|
|
@@ -400,7 +400,7 @@ fi
|
|
|
400
400
|
grep -A 50 "^user_setup:" .planning/phases/XX-name/{phase}-{plan}-PLAN.md | head -50
|
|
401
401
|
```
|
|
402
402
|
|
|
403
|
-
If user_setup exists: create `{phase}-USER-SETUP.md` using template `~/.claude/gsd-core/templates/user-setup.md
|
|
403
|
+
If user_setup exists: create `{phase}-USER-SETUP.md` using the template at `~/.claude/gsd-core/templates/user-setup.md` (or its `~/.claude/gsd-core/templates/user-setup.compact.md` variant — resolve per `~/.claude/gsd-core/references/compact-content-gate.md` §"Streams 1b and 4"). Per service: env vars table, account setup checklist, dashboard config, local dev notes, verification commands. Status "Incomplete". Set `USER_SETUP_CREATED=true`. If empty/missing: skip.
|
|
404
404
|
</step>
|
|
405
405
|
|
|
406
406
|
<step name="create_summary">
|
|
@@ -409,7 +409,7 @@ emit narrative output between the Write tool call and the commit tool call.
|
|
|
409
409
|
Truncation at this boundary is a known failure mode (see #2070 rescue logic in
|
|
410
410
|
execute-phase.md step 5.5).
|
|
411
411
|
|
|
412
|
-
Create `{phase}-{plan}-SUMMARY.md` at `.planning/phases/XX-name/`. Use `~/.claude/gsd-core/templates/summary.md
|
|
412
|
+
Create `{phase}-{plan}-SUMMARY.md` at `.planning/phases/XX-name/`. Use the template at `~/.claude/gsd-core/templates/summary.md` (or `summary.compact.md` — same `compact-content-gate.md` resolution as the USER-SETUP template above).
|
|
413
413
|
|
|
414
414
|
**Frontmatter:** phase, plan, subsystem, tags | requires/provides/affects | tech-stack.added/patterns | key-files.created/modified | key-decisions | requirements-completed (**MUST** copy `requirements` array from PLAN.md frontmatter verbatim) | duration ($DURATION), completed ($PLAN_END_TIME date).
|
|
415
415
|
|
|
@@ -547,8 +547,21 @@ fi
|
|
|
547
547
|
If .planning/codebase/ doesn't exist: skip.
|
|
548
548
|
|
|
549
549
|
```bash
|
|
550
|
-
|
|
551
|
-
|
|
550
|
+
# #4459: a phase number is unique within a MILESTONE, not a repository. The
|
|
551
|
+
# former commit-subject grep had no milestone bound, and its `--reverse |
|
|
552
|
+
# head -1` deliberately selected the OLDEST matching subject — on a
|
|
553
|
+
# milestone that reuses this phase number, that drags in the PREVIOUS
|
|
554
|
+
# milestone's same-numbered phase's commits too. The phase's own directory
|
|
555
|
+
# is the unique identity: base = the parent of the first commit that added
|
|
556
|
+
# anything under the phase directory — the same anchor code-review.md's
|
|
557
|
+
# structural-pre-pass step already uses for the identical problem (#3995).
|
|
558
|
+
PHASE_START=$(git log --format="%H" --diff-filter=A -- ".planning/phases/XX-name" 2>/dev/null | tail -1)
|
|
559
|
+
if [ -n "$PHASE_START" ] && git rev-parse "${PHASE_START}^" >/dev/null 2>&1; then
|
|
560
|
+
DIFF_BASE="${PHASE_START}^"
|
|
561
|
+
else
|
|
562
|
+
DIFF_BASE="${PHASE_START:-HEAD}"
|
|
563
|
+
fi
|
|
564
|
+
git diff --name-only ${DIFF_BASE}..HEAD 2>/dev/null || true
|
|
552
565
|
```
|
|
553
566
|
|
|
554
567
|
Update only structural changes: new src/ dir → STRUCTURE.md | deps → STACK.md | file pattern → CONVENTIONS.md | API client → INTEGRATIONS.md | config → STACK.md | renamed → update paths. Skip code-only/bugfix/content changes.
|
|
@@ -589,7 +602,7 @@ All routes: `/clear` first for fresh context.
|
|
|
589
602
|
- USER-SETUP.md generated if user_setup in frontmatter
|
|
590
603
|
- SUMMARY.md created with substantive content
|
|
591
604
|
- STATE.md updated (position, decisions, issues, session) — unless parallel mode (orchestrator handles)
|
|
592
|
-
- ROADMAP.md updated —
|
|
605
|
+
- ROADMAP.md updated — same exception
|
|
593
606
|
- If codebase map exists: map updated with execution changes (or skipped if no significant changes)
|
|
594
|
-
- If USER-SETUP.md created:
|
|
607
|
+
- If USER-SETUP.md created: surfaced in completion output
|
|
595
608
|
</success_criteria>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@~/.claude/gsd-core/references/response-language-directive.md
|
|
2
|
+
|
|
1
3
|
<purpose>
|
|
2
4
|
Socratic ideation workflow. Guides the developer through exploring an idea via probing questions,
|
|
3
5
|
offers mid-conversation research when useful, then routes crystallized outputs to GSD artifacts.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@~/.claude/gsd-core/references/response-language-directive.md
|
|
2
|
+
|
|
1
3
|
<purpose>
|
|
2
4
|
Extract decisions, lessons learned, patterns discovered, and surprises encountered from completed phase artifacts into a structured LEARNINGS.md file. Captures institutional knowledge that would otherwise be lost between phases.
|
|
3
5
|
</purpose>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@~/.claude/gsd-core/references/response-language-directive.md
|
|
2
|
+
|
|
1
3
|
<purpose>
|
|
2
4
|
Execute a trivial task inline without subagent overhead. No PLAN.md, no Task spawning,
|
|
3
5
|
no research, no plan checking. Just: understand → do → commit → log.
|
|
@@ -83,6 +85,10 @@ the root cause of #2133.
|
|
|
83
85
|
```bash
|
|
84
86
|
# Detect whether STATE.md has a Quick Tasks Completed table
|
|
85
87
|
if grep -q "Quick Tasks Completed" .planning/STATE.md 2>/dev/null; then
|
|
88
|
+
# #3730: bring a legacy pre-registry table onto the canonical schema BEFORE
|
|
89
|
+
# appending — silent no-op when already canonical, so this runs harmlessly
|
|
90
|
+
# on every fast task and migrates exactly once, on the first.
|
|
91
|
+
gsd_run quick-tasks-migrate || true
|
|
86
92
|
gsd_run quick-tasks-append --task "$TASK" || echo "⚠ fast.md log_to_state: could not append Quick Tasks row (see message above); continuing."
|
|
87
93
|
fi
|
|
88
94
|
```
|
|
@@ -28,7 +28,7 @@ GRADUATION_WINDOW=$(gsd_run query config-get features.graduation_window --raw 2>
|
|
|
28
28
|
GRADUATION_THRESHOLD=$(gsd_run query config-get features.graduation_threshold --raw 2>/dev/null || echo "3")
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
31
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
32
32
|
|
|
33
33
|
**Skip silently (print nothing) if:**
|
|
34
34
|
- `features.graduation` is `false`
|
|
@@ -12,7 +12,7 @@ _GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-pars
|
|
|
12
12
|
RESPONSE_LANGUAGE=$(gsd_run query config-get response_language --raw --default "" 2>/dev/null || echo "")
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
**If `response_language` is set:** All user-facing questions, prompts, and explanations
|
|
15
|
+
**If `response_language` is set:** All user-facing output of this workflow — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be presented in `{response_language}`. Technical terms, code, file paths, and subagent prompts stay in English — only user-facing output is translated.
|
|
16
16
|
|
|
17
17
|
<step name="parse_args">
|
|
18
18
|
**Parse arguments:**
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
<purpose>
|
|
2
4
|
One-liner refresher for returning users. Output ONLY the `<reference>` content below. No additions.
|
|
3
5
|
</purpose>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers.
|
|
2
|
+
|
|
1
3
|
<purpose>
|
|
2
4
|
One-page newcomer-oriented tour of GSD Core. Output ONLY the `<reference>` content below. No additions.
|
|
3
5
|
</purpose>
|