@opengsd/gsd-core 1.11.0 → 1.13.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-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +78 -42
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +0 -1
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +3 -1
- package/agents/gsd-plan-checker.md +91 -112
- package/agents/gsd-planner.md +20 -4
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +82 -7
- package/agents/gsd-ui-researcher.md +70 -3
- package/agents/gsd-verifier.md +24 -2
- package/bin/install.js +847 -200
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/phase.md +1 -1
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/quick.md +8 -4
- package/commands/gsd/surface.md +18 -8
- package/gsd-core/bin/gsd-tools.cjs +761 -100
- package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
- package/gsd-core/bin/lib/api-coverage.cjs +30 -9
- package/gsd-core/bin/lib/artifacts.cjs +2 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
- package/gsd-core/bin/lib/audit.cjs +163 -41
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +785 -144
- package/gsd-core/bin/lib/capability-state.cjs +25 -4
- package/gsd-core/bin/lib/capability-validator.cjs +321 -18
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +229 -6
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +877 -54
- package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
- package/gsd-core/bin/lib/config-loader.cjs +121 -29
- package/gsd-core/bin/lib/config.cjs +92 -2
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +118 -14
- package/gsd-core/bin/lib/decisions.cjs +213 -1
- package/gsd-core/bin/lib/edge-probe.cjs +23 -2
- package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
- package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +975 -326
- package/gsd-core/bin/lib/gap-checker.cjs +41 -8
- package/gsd-core/bin/lib/git-base-branch.cjs +182 -39
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
- 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 +60 -14
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
- package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
- package/gsd-core/bin/lib/host-integration.cjs +96 -11
- package/gsd-core/bin/lib/init-command-router.cjs +132 -21
- package/gsd-core/bin/lib/init.cjs +252 -56
- package/gsd-core/bin/lib/install-engine.cjs +252 -15
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +78 -1
- package/gsd-core/bin/lib/install-profiles.cjs +100 -18
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +195 -15
- package/gsd-core/bin/lib/learnings.cjs +85 -14
- package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
- package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
- package/gsd-core/bin/lib/markdown-table.cjs +175 -4
- package/gsd-core/bin/lib/milestone.cjs +112 -7
- package/gsd-core/bin/lib/model-catalog.cjs +177 -19
- package/gsd-core/bin/lib/model-resolver.cjs +10 -28
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
- package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
- package/gsd-core/bin/lib/phase-id.cjs +321 -13
- package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
- package/gsd-core/bin/lib/phase-locator.cjs +138 -17
- package/gsd-core/bin/lib/phase.cjs +1175 -115
- package/gsd-core/bin/lib/plan-document.cjs +273 -0
- package/gsd-core/bin/lib/plan-scan.cjs +13 -2
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +165 -34
- package/gsd-core/bin/lib/planning-workspace.cjs +159 -28
- package/gsd-core/bin/lib/probe-core.cjs +4 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- 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/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +62 -14
- package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
- package/gsd-core/bin/lib/roadmap-parser.cjs +577 -41
- package/gsd-core/bin/lib/roadmap.cjs +248 -64
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +329 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +320 -109
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +487 -83
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
- package/gsd-core/bin/lib/shell-command-projection.cjs +75 -8
- package/gsd-core/bin/lib/smart-entry.cjs +19 -31
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +47 -18
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +216 -5
- package/gsd-core/bin/lib/state-md-schema.cjs +231 -0
- package/gsd-core/bin/lib/state-transition.cjs +850 -145
- package/gsd-core/bin/lib/state.cjs +1629 -287
- package/gsd-core/bin/lib/surface.cjs +33 -10
- package/gsd-core/bin/lib/task-command-router.cjs +111 -1
- package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
- package/gsd-core/bin/lib/uat.cjs +2542 -387
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
- package/gsd-core/bin/lib/unusable-input.cjs +13 -0
- package/gsd-core/bin/lib/update-context.cjs +6 -2
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/README.md +43 -5
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -13
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +441 -56
- package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +185 -21
- package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
- package/gsd-core/references/agent-contracts.md +6 -5
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +37 -19
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/edge-probe.md +17 -5
- package/gsd-core/references/execute-mvp-tdd.md +18 -18
- package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/execute-phase-wave-guard.md +11 -9
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +3 -3
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +22 -0
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/nyquist-compliance.md +74 -0
- package/gsd-core/references/offer-next.md +3 -5
- package/gsd-core/references/phase-argument-parsing.md +3 -3
- 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-failing-direction.md +53 -0
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- 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 +76 -3
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +39 -9
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/tdd.md +15 -12
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +2 -2
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +11 -11
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/phase-prompt.md +7 -0
- package/gsd-core/templates/state.md +7 -0
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +3 -1
- package/gsd-core/workflows/add-phase.md +5 -3
- package/gsd-core/workflows/add-tests.md +4 -9
- package/gsd-core/workflows/add-todo.md +2 -2
- package/gsd-core/workflows/ai-integration-phase.md +5 -10
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +14 -3
- package/gsd-core/workflows/audit-milestone.md +11 -9
- package/gsd-core/workflows/audit-uat.md +19 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +12 -26
- package/gsd-core/workflows/check-todos.md +2 -2
- package/gsd-core/workflows/cleanup.md +3 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +16 -14
- package/gsd-core/workflows/code-review-fix.md +3 -1
- package/gsd-core/workflows/code-review.md +192 -69
- package/gsd-core/workflows/complete-milestone.md +28 -14
- package/gsd-core/workflows/debug.md +6 -4
- package/gsd-core/workflows/diagnose-issues.md +17 -7
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +3 -1
- 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 +5 -7
- 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 +3 -1
- 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/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +3 -3
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +2 -2
- package/gsd-core/workflows/do.md +46 -19
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +3 -1
- package/gsd-core/workflows/eval-review.md +5 -10
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +129 -11
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +29 -5
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +4 -2
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +68 -66
- package/gsd-core/workflows/execute-plan.md +25 -20
- package/gsd-core/workflows/explore.md +3 -1
- package/gsd-core/workflows/extract-learnings.md +3 -1
- package/gsd-core/workflows/fast.md +8 -2
- package/gsd-core/workflows/forensics.md +3 -1
- package/gsd-core/workflows/graduation.md +6 -6
- package/gsd-core/workflows/health.md +4 -7
- 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.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +2 -0
- package/gsd-core/workflows/import.md +17 -14
- package/gsd-core/workflows/inbox.md +5 -6
- package/gsd-core/workflows/ingest-docs.md +45 -12
- package/gsd-core/workflows/insert-phase.md +7 -5
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +7 -3
- package/gsd-core/workflows/list-workspaces.md +3 -1
- package/gsd-core/workflows/manager.md +15 -26
- package/gsd-core/workflows/map-codebase.md +3 -1
- package/gsd-core/workflows/milestone-summary.md +3 -1
- package/gsd-core/workflows/mvp-phase.md +3 -3
- package/gsd-core/workflows/new-milestone.md +10 -22
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +17 -29
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +4 -2
- 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 +20 -5
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +4 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +12 -3
- package/gsd-core/workflows/plan-phase.md +251 -54
- package/gsd-core/workflows/plan-review-convergence.md +148 -19
- package/gsd-core/workflows/plant-seed.md +3 -3
- package/gsd-core/workflows/pr-branch.md +195 -51
- package/gsd-core/workflows/profile-user.md +17 -15
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +52 -15
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +38 -5
- package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
- package/gsd-core/workflows/quick/steps/research-phase.md +5 -7
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.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 +33 -32
- package/gsd-core/workflows/reapply-patches.md +2 -0
- package/gsd-core/workflows/remove-phase.md +6 -4
- package/gsd-core/workflows/remove-workspace.md +3 -3
- package/gsd-core/workflows/resume-project.md +14 -14
- package/gsd-core/workflows/review.md +404 -21
- package/gsd-core/workflows/scan.md +3 -1
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +9 -9
- package/gsd-core/workflows/settings-integrations.md +66 -32
- package/gsd-core/workflows/settings.md +4 -6
- package/gsd-core/workflows/ship.md +22 -16
- package/gsd-core/workflows/sketch-wrap-up.md +13 -17
- package/gsd-core/workflows/sketch.md +13 -19
- package/gsd-core/workflows/smart-entry.md +4 -6
- package/gsd-core/workflows/spec-phase.md +31 -4
- package/gsd-core/workflows/spike-wrap-up.md +9 -11
- package/gsd-core/workflows/spike.md +21 -32
- package/gsd-core/workflows/stats.md +4 -2
- package/gsd-core/workflows/sync-skills.md +13 -5
- package/gsd-core/workflows/thread.md +13 -7
- package/gsd-core/workflows/transition.md +7 -5
- package/gsd-core/workflows/ui-phase.md +36 -21
- package/gsd-core/workflows/ui-review.md +7 -11
- package/gsd-core/workflows/ultraplan-phase.md +7 -13
- package/gsd-core/workflows/undo.md +9 -17
- package/gsd-core/workflows/update.md +47 -48
- package/gsd-core/workflows/validate-phase.md +3 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +106 -21
- package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +302 -22
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +77 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +46 -12
- package/hooks/dist/gsd-read-guard.js +18 -7
- package/hooks/dist/gsd-read-injection-scanner.js +22 -13
- package/hooks/dist/gsd-secret-read-guard.js +1079 -0
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +222 -29
- package/hooks/dist/gsd-validate-commit.sh +523 -12
- package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
- package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
- package/hooks/dist/gsd-workflow-guard.js +36 -17
- package/hooks/dist/gsd-worktree-path-guard.js +36 -21
- package/hooks/dist/gsd-write-guard.js +35 -25
- package/hooks/dist/lib/cli-exit.js +560 -0
- package/hooks/dist/lib/exit-code-registry.js +98 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/managed-hooks-registry.cjs +4 -0
- package/hooks/gsd-agent-isolation-guard.js +77 -38
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +302 -22
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +3 -1
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +28 -23
- package/hooks/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +77 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +46 -12
- package/hooks/gsd-read-guard.js +18 -7
- package/hooks/gsd-read-injection-scanner.js +22 -13
- package/hooks/gsd-secret-read-guard.js +1079 -0
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +222 -29
- package/hooks/gsd-validate-commit.sh +523 -12
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +36 -17
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/hooks.json +6 -0
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/managed-hooks-registry.cjs +4 -0
- package/package.json +14 -9
- package/scripts/base64-scan.sh +74 -12
- package/scripts/build-hooks.js +12 -0
- package/scripts/check-glossary-refs.cjs +77 -15
- package/scripts/check-mutation-score-ratchet.cjs +156 -0
- package/scripts/ci-check-job-near-cap.cjs +49 -0
- package/scripts/ci-pr-mergeability.cjs +262 -0
- package/scripts/ci-test-scope.cjs +52 -12
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/docs-guard-registry.cjs +406 -0
- package/scripts/gen-capability-registry.cjs +8 -6
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-loop-host-contract.cjs +189 -4
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +32 -2
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -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-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +198 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +45 -14
- package/scripts/lint-phase-id-drift.cjs +133 -8
- package/scripts/lint-planning-prompt-drift.cjs +38 -1
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-removed-but-needed.cjs +184 -16
- package/scripts/lint-response-language-coverage.cjs +524 -0
- package/scripts/lint-seam-enforcement.cjs +182 -0
- package/scripts/lint-slug-derivation-drift.cjs +921 -0
- package/scripts/lint-source-test-name-collision.cjs +241 -0
- package/scripts/lint-state-write-path-drift.cjs +337 -432
- package/scripts/lint-test-file-count.allowlist.json +124 -4
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +51 -64
- package/scripts/lint-vendored-deps.cjs +208 -35
- package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +83 -14
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +22 -3
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -1
- package/skills/gsd-quick/SKILL.md +8 -4
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -109
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/state-write-path-drift-baseline.json +0 -19
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Planner Coupling — Same-Wave Shared Mutable State
|
|
2
|
+
|
|
3
|
+
> Progressive-disclosure reference for `agents/gsd-planner.md`. The planner agent
|
|
4
|
+
> reads this file when assigning waves (issue #3724). The slim pointer in
|
|
5
|
+
> `agents/gsd-planner.md` → `assign_waves` routes here; the canonical schema row
|
|
6
|
+
> for `coupling_justified` lives in `docs/reference/plan-md.md`. The verifying
|
|
7
|
+
> side is `agents/gsd-plan-checker.md` Dimension 3b (#1954).
|
|
8
|
+
|
|
9
|
+
## The rule
|
|
10
|
+
|
|
11
|
+
`files_modified`/`files_deleted` overlap is not the only coupling between
|
|
12
|
+
same-wave plans. If two plans in the same wave touch the same **mutable
|
|
13
|
+
resource** through their task actions — a config key, DB table/row, migration,
|
|
14
|
+
env var, singleton, cache — with at least one writer, or one plan produces a
|
|
15
|
+
prerequisite the other consumes, the pair is coupled through shared state even
|
|
16
|
+
though no file overlaps: under parallel execution the outcome depends on which
|
|
17
|
+
executor gets there first.
|
|
18
|
+
|
|
19
|
+
Resolve it one of three ways, in order of preference:
|
|
20
|
+
|
|
21
|
+
1. **Declare the edge** — add the producing plan to the consumer's
|
|
22
|
+
`depends_on`. Wave assignment then orders them automatically.
|
|
23
|
+
2. **Re-wave** — move one plan to a later wave when the dependency direction
|
|
24
|
+
is unclear but an ordering is still wanted.
|
|
25
|
+
3. **Justify the pair** — when the coupling is deliberate and genuinely
|
|
26
|
+
order-independent (both orders produce a correct result), record it in
|
|
27
|
+
either plan's frontmatter, one `"plan-id: reason"` entry per coupled peer:
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
coupling_justified: ["03-02: both plans append independent keys to config; order irrelevant"]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The plan-checker's Dimension 3b recognizes the declaration and does not
|
|
34
|
+
flag the pair, so a deliberately coupled plan set passes verification
|
|
35
|
+
without serializing waves it was designed to run in parallel.
|
|
36
|
+
|
|
37
|
+
## Why declare it up front
|
|
38
|
+
|
|
39
|
+
Dimension 3b flags same-wave plan pairs with an undeclared shared-mutable-state
|
|
40
|
+
dependency (advisory severity — it never blocks). Declaring the edge, re-waving,
|
|
41
|
+
or justifying the pair at plan time means the first checker pass comes back
|
|
42
|
+
clean instead of surfacing an advisory the planner then has to interpret.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Stated Failing Direction (#3172)
|
|
2
|
+
|
|
3
|
+
> Reference file for the gsd-planner agent. Loaded on-demand via `@` reference from the
|
|
4
|
+
> `<failing_direction_contract>` block of the planner spawn prompt in
|
|
5
|
+
> `gsd-core/workflows/plan-phase.md` — NOT from `agents/gsd-planner.md`, which is frozen
|
|
6
|
+
> under a 49152-LF-char cap, so planner-side rules are projected onto its spawn contract
|
|
7
|
+
> (the #3297 / #3645 precedent).
|
|
8
|
+
|
|
9
|
+
**Every runnable `<automated>` command needs a `<fails_when>` sibling naming what output
|
|
10
|
+
constitutes failure.** A command with no expressible failure mode is not an acceptance test.
|
|
11
|
+
|
|
12
|
+
```xml
|
|
13
|
+
<verify>
|
|
14
|
+
<automated>npm --prefix apps/api test -- auth.spec.ts</automated>
|
|
15
|
+
<fails_when>non-zero exit, or "0 passed" in the summary line</fails_when>
|
|
16
|
+
</verify>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Why.** #3172: six plans shipped 21 `<automated>` commands that could not run at all — a
|
|
20
|
+
`--lib` target against a binary-only package. They sat inside the very blocks that decide whether
|
|
21
|
+
work is done, so the acceptance criteria for those plans were improvised at execution time by
|
|
22
|
+
three separate executors instead of reviewed at planning time. Cargo happened to exit non-zero,
|
|
23
|
+
so it failed loudly. The identical mistake with a command that exits 0 on a no-op — a test-name
|
|
24
|
+
filter matching nothing — passes green and silently. Naming the failure signal is what makes the
|
|
25
|
+
difference visible while you are still authoring the plan.
|
|
26
|
+
|
|
27
|
+
**The authoring test, applied to yourself:** *if this command were silently doing nothing, what
|
|
28
|
+
in its output would tell me?* If you cannot answer, you do not yet have an acceptance command —
|
|
29
|
+
you have a command. Fix the command, do not invent a statement for it.
|
|
30
|
+
|
|
31
|
+
## Rules
|
|
32
|
+
|
|
33
|
+
- **One statement per runnable command**, placed immediately after it. Within a task, each
|
|
34
|
+
`<fails_when>` binds to the nearest preceding `<automated>`, and the first statement after a
|
|
35
|
+
command is the binding one. Two commands need two statements.
|
|
36
|
+
- **Name an observable signal**, not the word "failure". `non-zero exit`, `"0 passed" in the
|
|
37
|
+
summary`, `the coverage line is absent`, `stderr contains "ECONNREFUSED"` are signals. *"the
|
|
38
|
+
command fails"*, *"it doesn't work"*, *"an error occurs"* are restatements and will be flagged.
|
|
39
|
+
- **Short is fine.** `non-zero exit` is complete. There is no minimum length and no required
|
|
40
|
+
keyword.
|
|
41
|
+
- **`TBD`, `TODO`, `N/A`, `none`, `unknown`, `?`, `-` are rejected outright** as whole values.
|
|
42
|
+
A statement you cannot write is a command you should not ship.
|
|
43
|
+
- **Any characters are safe.** `exit code > 0`, `stderr contains "FAIL" && exit != 0` are ordinary
|
|
44
|
+
prose here — that is exactly why this is an element and not an attribute.
|
|
45
|
+
- **The `MISSING — Wave 0 must create …` sentinel is exempt.** It is not a runnable command, so
|
|
46
|
+
it has no failure mode to state. Do not attach a `<fails_when>` to one.
|
|
47
|
+
|
|
48
|
+
## Where the failing direction comes from
|
|
49
|
+
|
|
50
|
+
Prefer the signal the tool actually emits over one you imagine. When
|
|
51
|
+
`prior_verify_commands` supplies a command a prior phase already proved, the failure signal that
|
|
52
|
+
command produces is the one to state — you have seen its output. When you author a new command,
|
|
53
|
+
name the signal from the tool's documented output shape, not from a guess about it.
|
|
@@ -50,8 +50,22 @@ Choose `mid-flight` when you genuinely need the work to stop before any subseque
|
|
|
50
50
|
|
|
51
51
|
`checkpoint:decision` and `checkpoint:human-action` tasks are still emitted in `end-of-phase` mode. Those gate the work itself (a choice the executor needs from the user, or an auth step only the user can perform), not post-hoc verification of completed work. Only `checkpoint:human-verify` is suppressed.
|
|
52
52
|
|
|
53
|
+
## The tracer feedback gate (executor-side, #3299)
|
|
54
|
+
|
|
55
|
+
This mode is not purely a planner concern. The **tracer feedback gate** — the executor's early integration checkpoint after a `type="tracer"` task, in `workflows/execute-plan.md` and `agents/gsd-executor.md` — synthesizes a `checkpoint:human-verify` at runtime that no planner ever emitted, so planner-side suppression cannot reach it.
|
|
56
|
+
|
|
57
|
+
That gate predates this mode (added by #2294; `end-of-phase` became the default in #3309, whose scope was the planner and verifier only), and until #3299 it branched on auto-mode alone. The result was that under the documented default, an interactive run halted after **every** tracer whose evidence was purely a test verdict, asking the user to retype a result the executor had just computed.
|
|
58
|
+
|
|
59
|
+
The gate now honors `human_verify_mode`.
|
|
60
|
+
|
|
61
|
+
The full precedence chain lives in `gsd-core/references/checkpoints.md` → "Tracer feedback gate (#3299)"; it is evaluated in order, and `gate="blocking-human"` outranks everything. Summary: an interactive `end-of-phase` run with an automated-only `<verify>` re-runs it and continues with no checkpoint (HALT on failure, unconditionally); `mid-flight`, `<human-check>`, and `blocking-human` all still STOP; the auto-mode branch is unchanged.
|
|
62
|
+
|
|
63
|
+
**Why a tracer carrying `<human-check>` still halts rather than deferring to the end-of-phase UAT batch.** Deferring would be the more uniform reading of this mode — `<human-check>` on an `auto` task defers, so arguably it should defer on a tracer too. It deliberately does not, for three reasons. First, and decisively: **the end-of-phase harvest does not cover tracers.** `agents/gsd-verifier.md` collects `<verify><human-check>` blocks from `auto` tasks; deferring a tracer's human evidence without first widening that seam would drop the evidence on the floor entirely — strictly worse than halting. Second, the tracer gate exists to stop expansion being layered onto an unproven slice; deferring its human evidence would let every expansion task build on a slice no human has confirmed, the exact failure the gate was introduced to prevent. Third, the reported defect is scoped to tracers with *no* human-observable evidence, and fail-closed is the safe direction outside that scope. If uniformity is later preferred, the harvest must be widened to tracers in the same change — record that decision here rather than re-deriving it.
|
|
64
|
+
|
|
65
|
+
`workflow.human_verify_mode` is **absent from `SCHEMA_DEFAULTS`** in `src/config.cts`, so `query config-get workflow.human_verify_mode` exits non-zero with `Key not found` on any project whose `config.json` predates #3309 — it does not resolve the documented `end-of-phase` default. Every consumer must therefore pass `--default end-of-phase` explicitly.
|
|
66
|
+
|
|
53
67
|
## Compatibility with other modes
|
|
54
68
|
|
|
55
69
|
- **`workflow.tdd_mode`**: orthogonal. TDD tasks still emit `tdd="true"` and `<behavior>`; the `<verify>` block carries the human-check sub-element when `human_verify_mode = end-of-phase`.
|
|
56
70
|
- **`MVP_MODE`**: orthogonal. Vertical-slice ordering is unchanged. The first task remains a failing end-to-end test; later auto tasks may carry `<verify><human-check>` instead of standalone checkpoint tasks.
|
|
57
|
-
- **`workflow.auto_advance` / `_auto_chain_active`**: in mid-flight mode these auto-approve checkpoint:human-verify halts. In end-of-phase mode there are no halts to auto-approve, so the flags have no effect on
|
|
71
|
+
- **`workflow.auto_advance` / `_auto_chain_active`**: in mid-flight mode these auto-approve checkpoint:human-verify halts. In end-of-phase mode there are no *planner-emitted* halts to auto-approve, so the flags have no effect on the planner's output. They are not inert at execution time, though: the executor-side tracer feedback gate above synthesizes its own checkpoint, and the auto-mode branch takes precedence over `human_verify_mode` there — except for `gate="blocking-human"`, which is evaluated first and STOPs in every mode (#3299).
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Quick-Batch Mode — Planner Reference
|
|
2
|
+
|
|
3
|
+
Triggered when `<planning_context>` declares `**Mode:** quick-batch`
|
|
4
|
+
(#3676, epic #3344, ADR-1239 "Quick-batch binding"). One dispatch = one
|
|
5
|
+
item's plan — the SAME single-plan, 1-3-task scope as `/gsd:quick`'s own
|
|
6
|
+
`quick`/`quick-full` modes, with one fixed difference: **`depends_on` and
|
|
7
|
+
`files_modified` frontmatter are ALWAYS required, regardless of whether
|
|
8
|
+
`--validate` was requested.** This reuses the EXISTING frontmatter grammar
|
|
9
|
+
(the same keys full phase planning already emits — see the frontmatter
|
|
10
|
+
schema table above); it is not a new schema.
|
|
11
|
+
|
|
12
|
+
**Why always, not gated on `--validate`.** The coordinating workflow
|
|
13
|
+
(`gsd-core/workflows/quick-batch.md`) recomputes every item's execution wave
|
|
14
|
+
from these two fields after each DAG layer's planners return (`quick-batch
|
|
15
|
+
update`, wrapping `updateBatchItems`) — without them, every item stays in
|
|
16
|
+
wave 0 forever and the batch cannot parallelize independent items or
|
|
17
|
+
sequence dependent ones correctly. This is load-bearing dispatch input, not
|
|
18
|
+
an optional quality signal.
|
|
19
|
+
|
|
20
|
+
### `depends_on` — reference SIBLING items by `quick_id`, never invent one
|
|
21
|
+
|
|
22
|
+
The `<planning_context>` you receive includes a **full batch task catalog** —
|
|
23
|
+
every item's `quick_id` + description, not just your own. When your item's
|
|
24
|
+
implementation genuinely requires another item's item to land first (shared
|
|
25
|
+
file, prerequisite API, sequencing the user implied), declare it:
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
depends_on: ["260101-abc"] # a quick_id from the task catalog
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- Reference ONLY `quick_id`s from the task catalog you were given. Never
|
|
32
|
+
reference a plan id from a phase, another batch, or a value you invented.
|
|
33
|
+
- Empty array (`depends_on: []`) is the correct, common answer when your item
|
|
34
|
+
is genuinely independent — do not manufacture a dependency to seem
|
|
35
|
+
thorough.
|
|
36
|
+
- A dependency on your OWN `quick_id` (self-reference) or on an id outside
|
|
37
|
+
the catalog is rejected by `quick-batch update` and blocks the whole
|
|
38
|
+
layer's persistence — when uncertain, prefer `[]` over a guess.
|
|
39
|
+
|
|
40
|
+
### `files_modified` — every path your plan's tasks will touch
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
files_modified: ["src/foo.ts", "tests/foo.test.ts"]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Used two ways downstream, both from THIS field (never re-derived from your
|
|
47
|
+
plan's prose): (1) `partitionByFileOverlap` splits same-wave items that
|
|
48
|
+
would touch the same file into separate waves, so two isolated worktrees
|
|
49
|
+
never race on one path; (2) at merge time the coordinator reads it FRESH from
|
|
50
|
+
your PLAN.md (not from what you declared here at planning time — keep the
|
|
51
|
+
frontmatter accurate if you revise the plan) for the advisory scope-
|
|
52
|
+
conformance check.
|
|
53
|
+
|
|
54
|
+
### `files_deleted` — only if your plan removes a file
|
|
55
|
+
|
|
56
|
+
```yaml
|
|
57
|
+
files_deleted: ["legacy/old-module.ts"]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Optional; omit entirely when your plan deletes nothing. If your plan DOES
|
|
61
|
+
delete a file and you omit this, the merge's deletions guard blocks that
|
|
62
|
+
deletion as undeclared — there is no "authorize everything" fallback.
|
|
63
|
+
|
|
64
|
+
### What quick-batch mode does NOT need
|
|
65
|
+
|
|
66
|
+
Same exclusions as `/gsd:quick`'s own modes: no `requirements` (no ROADMAP
|
|
67
|
+
linkage — a quick-batch item is not a phase), no `estimate` block, no
|
|
68
|
+
`user_setup` unless genuinely needed. `must_haves` is required only when the
|
|
69
|
+
calling prompt's own `<constraints>` says so (mirrors `--validate`'s
|
|
70
|
+
existing quick-full behavior) — that instruction rides the prompt, not this
|
|
71
|
+
reference.
|
|
@@ -40,3 +40,50 @@ Use standard PLANNING COMPLETE return format, adding a reviews section:
|
|
|
40
40
|
|---------|--------|
|
|
41
41
|
| {concern} | {why — out of scope, disagree, etc.} |
|
|
42
42
|
```
|
|
43
|
+
|
|
44
|
+
### Step 5: Write the ledger into PLAN.md (#3806)
|
|
45
|
+
|
|
46
|
+
The two tables above are not only the planner's return payload — they are also the **canonical
|
|
47
|
+
Review Dispositions Ledger**, and they belong in the affected PLAN.md itself, in this exact shape.
|
|
48
|
+
`gsd-core/workflows/plan-phase.md` (`<review_incorporation_contract>`) and
|
|
49
|
+
`agents/gsd-plan-checker.md` (Review Incorporation dimension) both point back to this section for
|
|
50
|
+
the ledger's shape rather than restating it — this is the one place it is defined.
|
|
51
|
+
|
|
52
|
+
## Review Dispositions Ledger
|
|
53
|
+
|
|
54
|
+
Add or extend a `## Review Dispositions Ledger` section in the affected PLAN.md, containing one
|
|
55
|
+
`### Round {N} — {REVIEWS_sha}` subsection per reviews-mode round that touched this plan, where
|
|
56
|
+
`{REVIEWS_sha}` is the commit that wrote the REVIEWS.md snapshot being ruled on (the short sha from
|
|
57
|
+
`git log -1 --format=%h -- <phase_dir>/<NN>-REVIEWS.md`, after `workflows/review.md`'s REVIEWS.md
|
|
58
|
+
commit step). Under each round heading, use the two tables from Step 4 above, unchanged in shape:
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
## Review Dispositions Ledger
|
|
62
|
+
|
|
63
|
+
### Round 1 — a1b2c3d
|
|
64
|
+
|
|
65
|
+
### Review Feedback Addressed
|
|
66
|
+
| Concern | Severity | How Addressed |
|
|
67
|
+
|---------|----------|---------------|
|
|
68
|
+
| {concern} | HIGH | Plan {N}, Task {M}: {how} |
|
|
69
|
+
|
|
70
|
+
### Review Feedback Deferred
|
|
71
|
+
| Concern | Reason |
|
|
72
|
+
|---------|--------|
|
|
73
|
+
| {concern} | {why — out of scope, disagree, etc.} |
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Anchoring.** Any reference to a specific REVIEWS.md line cites `L##@{REVIEWS_sha}` (e.g.
|
|
77
|
+
`L32@a1b2c3d`) — a bare line number is meaningless once the next round rewrites REVIEWS.md
|
|
78
|
+
wholesale. `{Concern}` and `{Reason}` stay free text; do not invent a reviewer/severity enum — the
|
|
79
|
+
reviewer roster is capability-owned and open to third-party additions (see each capability's
|
|
80
|
+
`reviewer.reviewsSection`).
|
|
81
|
+
|
|
82
|
+
**Append-only.** A later round never edits or deletes a prior round's tables. To overturn a prior
|
|
83
|
+
round's verdict, add a new row in the current round's table whose Reason/How Addressed names the
|
|
84
|
+
round and concern it supersedes (e.g. "Supersedes Round 1 Deferred: {concern} — now addressed in
|
|
85
|
+
Plan 3").
|
|
86
|
+
|
|
87
|
+
**Out of scope for this contract.** A deterministic lint/check verb that mechanically enforces this
|
|
88
|
+
shape is a separate, later addition (#3806 part 2) — this section defines the format only. Legacy
|
|
89
|
+
PLAN.md content written before this convention existed is not migrated or flagged by it.
|
|
@@ -21,12 +21,43 @@ issues:
|
|
|
21
21
|
- plan: "16-01"
|
|
22
22
|
dimension: "task_completeness"
|
|
23
23
|
severity: "blocker"
|
|
24
|
+
required_property: "Every `auto` task has a `<verify>` separating pass from fail"
|
|
24
25
|
description: "Task 2 missing <verify> element"
|
|
25
26
|
fix_hint: "Add verification command for build output"
|
|
26
27
|
```
|
|
27
28
|
|
|
28
29
|
Group by plan, dimension, severity.
|
|
29
30
|
|
|
31
|
+
**What binds and what does not.** `required_property` (the invariant that must hold),
|
|
32
|
+
`description` (the evidence it does not) and `severity` are binding. `fix_hint` is **one
|
|
33
|
+
example** of a route to that property — an illustration, never an instruction. You address an
|
|
34
|
+
issue by making `required_property` true; the hint's own mechanism is optional.
|
|
35
|
+
|
|
36
|
+
An older checker may return an issue with no `required_property`. Derive it from `dimension`
|
|
37
|
+
+ `description` and state the derived property in your revision summary. Never treat the
|
|
38
|
+
absence of the field as licence to apply `fix_hint` literally.
|
|
39
|
+
|
|
40
|
+
**Prefer the smallest sufficient mechanism.** If a smaller change than the hint makes
|
|
41
|
+
`required_property` true, take it — that fully addresses the issue and must be reported as
|
|
42
|
+
addressed, naming the property satisfied and the mechanism used.
|
|
43
|
+
|
|
44
|
+
### Step 2.5: Constraint Re-check (before any edit)
|
|
45
|
+
|
|
46
|
+
Before editing, re-read the constraints already in force:
|
|
47
|
+
|
|
48
|
+
- Locked decisions in CONTEXT.md (`## Decisions`) and deferred ideas (`## Deferred Ideas`)
|
|
49
|
+
- Active capability / project guidance (CLAUDE.md, `.claude/skills/`, `.agents/skills/`)
|
|
50
|
+
- Constraints the existing plans already encode (chosen mechanism, scope boundary, must_haves)
|
|
51
|
+
|
|
52
|
+
A `fix_hint` conflicts when applying it would contradict any of those. Applying it anyway is
|
|
53
|
+
a contract violation, not a judgement call. When a hint conflicts — or when the property is
|
|
54
|
+
unreachable without breaking a constraint — do NOT edit around it and do NOT burn a revision
|
|
55
|
+
iteration on it: emit `## REVISION_CONFLICT` (Step 7) for that issue, apply every
|
|
56
|
+
non-conflicting issue normally, and return.
|
|
57
|
+
|
|
58
|
+
A hint that merely proposes a *bigger* mechanism than needed is not a conflict. Take the
|
|
59
|
+
smaller route under Step 2 and report it as addressed.
|
|
60
|
+
|
|
30
61
|
### Step 3: Revision Strategy
|
|
31
62
|
|
|
32
63
|
| Dimension | Strategy |
|
|
@@ -38,15 +69,25 @@ Group by plan, dimension, severity.
|
|
|
38
69
|
| scope_sanity | Split into multiple plans |
|
|
39
70
|
| must_haves_derivation | Derive and add must_haves to frontmatter |
|
|
40
71
|
|
|
72
|
+
Each strategy is the usual route, not the only one. Any change that makes the issue's
|
|
73
|
+
`required_property` true is a valid strategy.
|
|
74
|
+
|
|
41
75
|
### Step 4: Make Targeted Updates
|
|
42
76
|
|
|
43
77
|
**DO:** Edit specific flagged sections, preserve working parts, update waves if dependencies change.
|
|
78
|
+
Choose the smallest mechanism that makes each issue's `required_property` true — explicitly
|
|
79
|
+
including a mechanism smaller than, or different from, the one its `fix_hint` names.
|
|
44
80
|
|
|
45
|
-
**DO NOT:** Rewrite entire plans for minor issues, add unnecessary tasks, break existing working
|
|
81
|
+
**DO NOT:** Rewrite entire plans for minor issues, add unnecessary tasks, break existing working
|
|
82
|
+
plans, or apply a `fix_hint` that contradicts a constraint from Step 2.5 — that one goes to
|
|
83
|
+
`## REVISION_CONFLICT` instead.
|
|
46
84
|
|
|
47
85
|
### Step 5: Validate Changes
|
|
48
86
|
|
|
49
|
-
- [ ]
|
|
87
|
+
- [ ] Every flagged issue's `required_property` now holds — reached by its `fix_hint` OR by a
|
|
88
|
+
smaller/different mechanism (both count as addressed), OR raised as `## REVISION_CONFLICT`
|
|
89
|
+
- [ ] No `fix_hint` applied that contradicts a locked decision, capability guidance, or an
|
|
90
|
+
existing plan constraint (Step 2.5)
|
|
50
91
|
- [ ] No new issues introduced
|
|
51
92
|
- [ ] Wave numbers still valid
|
|
52
93
|
- [ ] Dependencies still correct
|
|
@@ -55,7 +96,7 @@ Group by plan, dimension, severity.
|
|
|
55
96
|
### Step 6: Commit
|
|
56
97
|
|
|
57
98
|
```bash
|
|
58
|
-
|
|
99
|
+
gsd_run query commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
|
|
59
100
|
```
|
|
60
101
|
|
|
61
102
|
### Step 7: Return Revision Summary
|
|
@@ -85,3 +126,35 @@ gsd-tools query commit "fix($PHASE): revise plans based on checker feedback" --f
|
|
|
85
126
|
|-------|--------|
|
|
86
127
|
| {issue} | {why - needs user input, architectural change, etc.} |
|
|
87
128
|
```
|
|
129
|
+
|
|
130
|
+
### Step 7b: Return Revision Conflict (when Step 2.5 found one)
|
|
131
|
+
|
|
132
|
+
Emit this INSTEAD OF `## REVISION COMPLETE` when at least one issue could not be addressed
|
|
133
|
+
without contradicting a constraint. Non-conflicting issues you already fixed stay listed under
|
|
134
|
+
`### Changes Made` so the work is not lost. The orchestrator routes this to the user or to the
|
|
135
|
+
configured plan-review convergence loop; it does not count as a failed revision iteration.
|
|
136
|
+
|
|
137
|
+
```markdown
|
|
138
|
+
## REVISION_CONFLICT
|
|
139
|
+
|
|
140
|
+
**Conflicts:** {N} | **Issues addressed anyway:** {M}
|
|
141
|
+
|
|
142
|
+
| Issue | required_property | Conflicts with | Why the hint cannot be applied |
|
|
143
|
+
|-------|-------------------|----------------|-------------------------------|
|
|
144
|
+
| {dimension}/{plan} | {property} | {locked decision D-nn / CLAUDE.md rule / plan constraint} | {one line} |
|
|
145
|
+
|
|
146
|
+
### Alternatives Considered
|
|
147
|
+
|
|
148
|
+
| Issue | Alternative | Satisfies required_property? | Cost of adopting |
|
|
149
|
+
|-------|-------------|------------------------------|------------------|
|
|
150
|
+
| {dimension}/{plan} | {smaller or different mechanism} | {yes / partially — how} | {what it changes} |
|
|
151
|
+
|
|
152
|
+
### Changes Made
|
|
153
|
+
|
|
154
|
+
{table of the non-conflicting issues you DID address, same shape as REVISION COMPLETE}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Every field is one line of plain text.** No newlines inside a cell, and never begin a field with
|
|
158
|
+
`#`, `-`, `|` or a code fence. These fields are appended to a shared markdown file that a later
|
|
159
|
+
reader scans by heading; a field that starts a heading truncates that scan and hides conflicts
|
|
160
|
+
below it.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Verify Command Grounding (#2401)
|
|
2
|
+
|
|
3
|
+
> Reference file for gsd-planner agent. Loaded on-demand via `@` reference.
|
|
4
|
+
|
|
5
|
+
**Inherit the command that already worked.** The planning context carries
|
|
6
|
+
`prior_verify_commands` — the `<automated>` commands from the most recent prior phase that had
|
|
7
|
+
any, surfaced **at every context window**, not only on 1M-class models. When this phase's build
|
|
8
|
+
or test story is the same one a prior phase already proved, **reuse that command verbatim**
|
|
9
|
+
rather than re-deriving a path. Re-invention is what produced `cd ../../frontend && npm run
|
|
10
|
+
lint` against a directory that holds no `package.json`, and cost two revision cycles.
|
|
11
|
+
|
|
12
|
+
Ground every path you do author: a command's `cd` target or `npm --prefix` target must be a
|
|
13
|
+
directory that exists (or that an earlier task in this phase creates) and, for an npm/make
|
|
14
|
+
command, must hold the matching `package.json`/`Makefile`. `npm --prefix <dir> run <script>` is
|
|
15
|
+
preferred over `cd <dir> && npm run <script>` — it does not depend on the executor's cwd. If
|
|
16
|
+
`prior_verify_commands` is empty and you cannot ground a path, say so in the plan instead of
|
|
17
|
+
guessing one.
|
|
@@ -6,11 +6,13 @@ Configuration options for `.planning/` directory behavior.
|
|
|
6
6
|
```json
|
|
7
7
|
"planning": {
|
|
8
8
|
"commit_docs": true,
|
|
9
|
+
"pr_strict": false,
|
|
9
10
|
"search_gitignored": false
|
|
10
11
|
},
|
|
11
12
|
"git": {
|
|
12
13
|
"branching_strategy": "none",
|
|
13
14
|
"base_branch": null,
|
|
15
|
+
"protected_branches": ["develop", "staging"],
|
|
14
16
|
"phase_branch_template": "gsd/phase-{phase}-{slug}",
|
|
15
17
|
"milestone_branch_template": "gsd/{milestone}-{slug}",
|
|
16
18
|
"quick_branch_template": null
|
|
@@ -27,15 +29,18 @@ Configuration options for `.planning/` directory behavior.
|
|
|
27
29
|
| Option | Default | Description |
|
|
28
30
|
|--------|---------|-------------|
|
|
29
31
|
| `commit_docs` | `true` | Whether to commit planning artifacts to git |
|
|
32
|
+
| `pr_strict` | `false` | Filter mode for `/gsd:pr-branch`. `false` keeps structural planning state (STATE.md, ROADMAP.md, MILESTONES.md, PROJECT.md, REQUIREMENTS.md, milestones/) in the PR branch; `true` drops every `.planning/` path |
|
|
30
33
|
| `search_gitignored` | `false` | Add `--no-ignore` to broad rg searches |
|
|
31
34
|
| `git.branching_strategy` | `"none"` | Git branching approach: `"none"`, `"phase"`, or `"milestone"` |
|
|
32
35
|
| `git.base_branch` | `null` (auto-detect) | Target branch for PRs and merges (e.g. `"master"`, `"develop"`). When `null`, auto-detects from `git symbolic-ref refs/remotes/origin/HEAD`, falling back to `"main"`. |
|
|
36
|
+
| `git.protected_branches` | (none) | Optional array of non-empty strings naming additional shared branches that should trigger protected-branch warnings |
|
|
33
37
|
| `git.create_tag` | `true` | Create git tags on milestone completion |
|
|
34
38
|
| `git.phase_branch_template` | `"gsd/phase-{phase}-{slug}"` | Branch template for phase strategy |
|
|
35
39
|
| `git.milestone_branch_template` | `"gsd/{milestone}-{slug}"` | Branch template for milestone strategy |
|
|
36
40
|
| `git.quick_branch_template` | `null` | Optional branch template for quick-task runs |
|
|
37
41
|
| `workflow.use_worktrees` | `true` | Whether executor agents run in isolated git worktrees. Set to `false` to disable worktrees — agents execute sequentially on the main working tree instead. Recommended for solo developers or when worktree merges cause issues. Note: if your branch is ahead of `origin/HEAD` (a diverged milestone or feature branch), GSD auto-degrades to sequential and prints a warning; set `worktree.baseRef:"head"` in `.claude/settings.local.json` to restore parallel execution. See the branch-divergence note below. |
|
|
38
42
|
| `workflow.subagent_timeout` | `300000` | Timeout in milliseconds for parallel subagent tasks (e.g. codebase mapping). Increase for large codebases or slower models. Default: 300000 (5 minutes). |
|
|
43
|
+
| `workflow.inline_plan_threshold` | `2` | Plans with this many tasks or fewer execute inline (Pattern C) instead of spawning a subagent. Avoids ~14K token spawn overhead for small plans. Set to `0` to always spawn subagents. |
|
|
39
44
|
| `workflow.test_command` | `null` | Custom shell command run as the regression/test gate by execute-phase, audit-fix, and post-merge-gate. When unset, GSD auto-detects (Makefile / package.json / Cargo.toml / go.mod / pyproject.toml). Example: `npm test`. |
|
|
40
45
|
| `workflow.build_command` | `null` | Custom shell command run as the build gate by the post-merge gate. When unset, the build step is skipped/auto-detected. Example: `npm run build`. |
|
|
41
46
|
| `workflow.inline_plan_threshold` | `2` | Plans with this many tasks or fewer execute inline (Pattern C) instead of spawning a subagent. Avoids ~14K token spawn overhead for small plans. Set to `0` to always spawn subagents. |
|
|
@@ -45,6 +50,26 @@ Configuration options for `.planning/` directory behavior.
|
|
|
45
50
|
| `response_language` | `null` | Language for user-facing questions and prompts across all phases/subagents (e.g. `"Portuguese"`, `"Japanese"`, `"Spanish"`). When set, all spawned agents include a directive to respond in this language. |
|
|
46
51
|
</config_schema>
|
|
47
52
|
|
|
53
|
+
`git.protected_branches` has no persisted default. When it is absent, only the resolved base branch
|
|
54
|
+
is protected, preserving existing project behavior. Every configured item must be a non-empty
|
|
55
|
+
string. The configured list extends the resolved base branch; it never replaces the base or changes
|
|
56
|
+
the resolution ladder. A match produces an advisory warning at execute-phase and ship and does not
|
|
57
|
+
change `git.branching_strategy: "none"`.
|
|
58
|
+
|
|
59
|
+
Matching is by exact branch name — there is no glob or prefix support, so a git-flow
|
|
60
|
+
layout must name each `release/*` or `hotfix/*` branch it wants protected. An entry that
|
|
61
|
+
is not a non-empty string is ignored with a warning naming it, and the remaining names
|
|
62
|
+
still apply.
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"git": {
|
|
67
|
+
"branching_strategy": "none",
|
|
68
|
+
"protected_branches": ["develop", "staging"]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
48
73
|
<commit_docs_behavior>
|
|
49
74
|
|
|
50
75
|
**When `commit_docs: true` (default):**
|
|
@@ -61,15 +86,15 @@ Configuration options for `.planning/` directory behavior.
|
|
|
61
86
|
|
|
62
87
|
```bash
|
|
63
88
|
# Commit with automatic commit_docs + gitignore checks:
|
|
64
|
-
|
|
89
|
+
gsd_run query commit "docs: update state" --files .planning/STATE.md
|
|
65
90
|
|
|
66
91
|
# Load config via state load (returns JSON):
|
|
67
|
-
INIT=$(
|
|
92
|
+
INIT=$(gsd_run query state.load)
|
|
68
93
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
69
94
|
# commit_docs is available in the JSON output
|
|
70
95
|
|
|
71
96
|
# Or use init commands which include commit_docs:
|
|
72
|
-
INIT=$(
|
|
97
|
+
INIT=$(gsd_run query init.execute-phase "1")
|
|
73
98
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
74
99
|
# commit_docs is included in all init command outputs
|
|
75
100
|
```
|
|
@@ -81,7 +106,7 @@ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
|
81
106
|
**Commit via CLI (handles checks automatically):**
|
|
82
107
|
|
|
83
108
|
```bash
|
|
84
|
-
|
|
109
|
+
gsd_run query commit "docs: update state" --files .planning/STATE.md
|
|
85
110
|
```
|
|
86
111
|
|
|
87
112
|
The CLI checks `commit_docs` config and gitignore status internally — no manual conditionals needed.
|
|
@@ -169,14 +194,14 @@ To use uncommitted mode:
|
|
|
169
194
|
|
|
170
195
|
Use `init execute-phase` which returns all config as JSON:
|
|
171
196
|
```bash
|
|
172
|
-
INIT=$(
|
|
197
|
+
INIT=$(gsd_run query init.execute-phase "1")
|
|
173
198
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
174
199
|
# JSON output includes: branching_strategy, phase_branch_template, milestone_branch_template
|
|
175
200
|
```
|
|
176
201
|
|
|
177
202
|
Or use `state load` for the config values:
|
|
178
203
|
```bash
|
|
179
|
-
INIT=$(
|
|
204
|
+
INIT=$(gsd_run query state.load)
|
|
180
205
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
181
206
|
# Parse branching_strategy, phase_branch_template, milestone_branch_template from JSON
|
|
182
207
|
```
|
|
@@ -242,6 +267,7 @@ Generated from `CONFIG_DEFAULTS` (configuration.cjs) and `VALID_CONFIG_KEYS` (co
|
|
|
242
267
|
| `resolve_model_ids` | boolean\|string | `false` | `false`, `true`, `"omit"` | Map model aliases to full Claude IDs; `"omit"` returns empty string |
|
|
243
268
|
| `context` | string\|null | `null` | `"dev"`, `"research"`, `"review"` | Execution context profile that adjusts agent behavior: `"dev"` for development tasks, `"research"` for investigation/exploration, `"review"` for code review workflows |
|
|
244
269
|
| `review.models.<cli>` | string\|null | `null` | Any model ID string | Per-CLI model override for /gsd:review (e.g., `review.models.gemini`). Falls back to CLI default when null. |
|
|
270
|
+
| `review.max_prompt_tokens` | number\|null | `null` | Any positive integer, or `null` | Central, cross-lane default cap (in estimated tokens) on the assembled review prompt; `null` means no trim. A per-lane `review.max_prompt_tokens_per_reviewer.<slug>` value overrides it for that lane: `-1` means unset (inherits this global default), `0` means "do not trim that lane" (not unset — it is an explicit, standing opt-out). _Alias:_ `max_prompt_tokens` is the flat-key form used in `CONFIG_DEFAULTS`; `review.max_prompt_tokens` is the canonical namespaced form. |
|
|
245
271
|
|
|
246
272
|
### Workflow Fields
|
|
247
273
|
|
|
@@ -263,21 +289,23 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
|
|
|
263
289
|
| `workflow.ui_phase` | boolean | `true` | `true`, `false` | Generate UI-SPEC.md for frontend phases |
|
|
264
290
|
| `workflow.ui_safety_gate` | boolean | `true` | `true`, `false` | Require safety gate approval for UI changes |
|
|
265
291
|
| `workflow.text_mode` | boolean | `false` | `true`, `false` | Use plain-text numbered lists instead of AskUserQuestion menus |
|
|
266
|
-
| `workflow.research_before_questions` | boolean | `false` | `true`, `false` | Run research before interactive questions in discuss phase |
|
|
292
|
+
| `workflow.research_before_questions` | boolean | `false` | `true`, `false` | Run research before interactive questions in discuss phase (also honored on the `/gsd:quick` path, #3894). _Alias:_ `research_before_questions` is the flat-key form used in `CONFIG_DEFAULTS`; `workflow.research_before_questions` is the canonical namespaced form. |
|
|
267
293
|
| `workflow.discuss_mode` | string | `"discuss"` | `"discuss"`, `"assumptions"` | Default mode for discuss-phase: `"discuss"` runs interactive questioning; `"assumptions"` analyzes codebase and surfaces assumptions instead |
|
|
268
294
|
| `workflow.skip_discuss` | boolean | `false` | `true`, `false` | Skip discuss phase entirely |
|
|
269
295
|
| `workflow.use_worktrees` | boolean | `true` | `true`, `false` | Run executor agents in isolated git worktrees |
|
|
270
296
|
| `workflow.subagent_timeout` | number | `300000` | Any positive integer (ms) | Timeout for parallel subagent tasks (default: 5 minutes) |
|
|
297
|
+
| `workflow.inline_plan_threshold` | number | `2` | `0`–`10` | Plans with ≤N tasks execute inline instead of spawning a subagent |
|
|
271
298
|
| `workflow.test_command` | string\|null | `null` | Any shell command | Regression/test gate command run by execute-phase, audit-fix, and post-merge-gate. Unset → GSD auto-detects (Makefile / package.json / Cargo.toml / go.mod / pyproject.toml). |
|
|
272
299
|
| `workflow.build_command` | string\|null | `null` | Any shell command | Build gate command run by the post-merge gate. Unset → build step auto-detected/skipped. |
|
|
273
300
|
| `workflow.mvp_mode` | boolean | `false` | `true`, `false` | Persist the MVP-mode flag in config so every phase defaults to MVP framing without requiring `--mvp` on the CLI. Resolved via the chain: `--mvp` CLI flag → ROADMAP.md `**Mode:** mvp` field → this config value → `false`. When `true`, the planner, executor, verifier, and discovery surfaces (progress, stats, graphify) all treat the phase as an MVP vertical slice (UI → API → DB) of one user-visible capability. |
|
|
274
301
|
| `workflow.context_guard_mode` | string | `"warn"` | `"auto"`, `"warn"`, `"off"` | Context exhaustion guard mode for `execute-phase`. Before each wave, the orchestrator self-assesses context pressure using degradation signals from `context-budget.md`. `"warn"` (default): emit a warning and recommend `/gsd:pause-work` when POOR tier is detected. `"auto"`: automatically invoke `/gsd:pause-work` before the next wave when POOR tier is detected. `"off"`: disable the guard. The guard is heuristic — no programmatic context-% API exists. |
|
|
275
|
-
| `workflow.plan_chunked` | boolean | `false` | `true`, `false` | Enable chunked planning mode. When `true`, the plan-phase orchestrator splits the single long-lived planner Task into a short outline Task followed by N short per-plan Tasks (~3–5 min each). Each plan is committed individually for crash resilience. Particularly useful on Windows where long-lived Tasks may hang on stdio. Also activated by the `--chunked` flag. |
|
|
302
|
+
| `workflow.plan_chunked` | boolean | `false` | `true`, `false` | Enable chunked planning mode. When `true`, the plan-phase orchestrator splits the single long-lived planner Task into a short outline Task followed by N short per-plan Tasks (~3–5 min each). Each plan is committed individually for crash resilience. Particularly useful on Windows where long-lived Tasks may hang on stdio. Also activated by the `--chunked` flag. See `planning.chunked_parallel` below for concurrent per-plan dispatch. |
|
|
276
303
|
| `workflow.specless_probe_fallback` | boolean | `true` | `true`, `false` | Gate the SPEC-less probe fallback in `plan-phase`. When `true` (default), a phase that did not supply a `## Edge Coverage` / `## Prohibitions` SPEC section (header absent or present-but-empty) runs the existing probe protocol — the deterministic `edge-probe.cjs` for edges and an in-planner LLM recall pass for prohibitions — and authors the resulting predicates into PLAN.md `must_haves` (section-level precedence: a SPEC-supplied section is never re-run or overwritten). When `false`, the fallback is skipped but the skip is recorded: plan-phase emits a visible "probe fallback disabled" marker, never a silent skip. |
|
|
277
304
|
| `workflow.code_review_command` | string\|null | `null` | Any shell command | External code-review command integrated into `/gsd:ship`. The diff is piped to the command via stdin; the command must output JSON with a `verdict` field (`"APPROVED"` or `"REVISE"`). Non-zero exit or `"REVISE"` verdict blocks the ship workflow. When unset, the built-in review flow runs. Example: `my-review-tool --review`. |
|
|
278
305
|
| `workflow.inline_plan_threshold` | number | `2` | `0`–`10` | Plans with ≤N tasks execute inline instead of spawning a subagent |
|
|
279
306
|
| `workflow.code_review` | boolean | `true` | `true`, `false` | Enable built-in code review step in the ship workflow |
|
|
280
307
|
| `workflow.code_review_depth` | string | `"standard"` | `"quick"`, `"standard"`, `"deep"` | Depth level for code review analysis in the ship workflow |
|
|
308
|
+
| `workflow.code_review_depth_overrides` | array | `[]` | Array of `{paths, depth}` rule objects | Ordered path-scoped depth rules for `/gsd:code-review` (#2554). Each rule's `paths` are matched against the review's changed-file set by whole-segment directory-path prefix (`src/auth` matches `src/auth/token.ts`, never `src/authfoo/x.ts`); matching is case-sensitive. Glob syntax (`*`, `?`) is a configuration error. One matched file escalates the entire review — depth is not applied per file. Resolution order: `--depth=` flag → strongest matching rule → `workflow.code_review_depth` → `standard`. A malformed rule halts the review with a typed error rather than falling back silently. |
|
|
281
309
|
| `workflow._auto_chain_active` | boolean | `false` | `true`, `false` | Internal: tracks whether autonomous chaining is active |
|
|
282
310
|
| `workflow.security_enforcement` | boolean | `true` | `true`, `false` | Enable threat-model-anchored security verification via `/gsd:secure-phase`. When `false`, security checks are skipped entirely |
|
|
283
311
|
| `workflow.security_asvs_level` | number | `1` | `1`, `2`, `3` | OWASP ASVS verification level. Level 1 = opportunistic, Level 2 = standard, Level 3 = comprehensive. Scales both planner threat-disposition rigor (which threats must be mitigated vs. accepted) and auditor verification depth (grep-level → boundary-placement check → full data-flow trace). See `gsd-core/references/security-asvs-levels.md`. |
|
|
@@ -300,6 +328,7 @@ Set via `git.*` namespace (e.g., `"git": { "branching_strategy": "phase" }`).
|
|
|
300
328
|
|-----|------|---------|----------------|-------------|
|
|
301
329
|
| `git.branching_strategy` | string | `"none"` | `"none"`, `"phase"`, `"milestone"` | Git branching approach for phase/milestone isolation |
|
|
302
330
|
| `git.base_branch` | string\|null | `null` (auto-detect) | Any branch name | Target branch for PRs and merges; auto-detects from `origin/HEAD` when `null` |
|
|
331
|
+
| `git.protected_branches` | array of non-empty strings | (none) | Non-empty branch names | Optional protected names added to the resolved base branch for execute-phase and ship warnings |
|
|
303
332
|
| `git.create_tag` | boolean | `true` | `true`, `false` | Create git tags on milestone completion |
|
|
304
333
|
| `git.phase_branch_template` | string | `"gsd/phase-{phase}-{slug}"` | Template with `{phase}`, `{slug}` | Branch naming template for `phase` strategy |
|
|
305
334
|
| `git.milestone_branch_template` | string | `"gsd/{milestone}-{slug}"` | Template with `{milestone}`, `{slug}` | Branch naming template for `milestone` strategy |
|
|
@@ -375,6 +404,7 @@ These can be set at top level or nested under `planning.*` (e.g., `"planning": {
|
|
|
375
404
|
|-----|------|---------|----------------|-------------|
|
|
376
405
|
| `planning.commit_docs` | boolean | `true` | `true`, `false` | Alias for top-level `commit_docs` |
|
|
377
406
|
| `planning.search_gitignored` | boolean | `false` | `true`, `false` | Alias for top-level `search_gitignored` |
|
|
407
|
+
| `planning.chunked_parallel` | boolean | `false` | `true`, `false` | Opt-in for `workflow.plan_chunked`'s per-plan loop (§8.5.2 of `chunked-planning-mode.md`, #3777). When `true`, the runnable per-plan planners within one outline Wave are dispatched concurrently (one message, `run_in_background=true` each) instead of one at a time, honoring the outline's Wave column as the schedule (`Depends On` is expected to name only an earlier Wave and is not separately parsed — batching strictly by Wave already respects it). Gated on the negotiated `dispatch-capacity` query (#3673): a host that declares no `maxConcurrency` (capacity resolves to `1`) stays serial regardless of this setting. Default `false` is byte-identical to the pre-#3777 serial loop. Trade-off: per-plan commits interleave within a batch instead of strictly one-at-a-time, and a stalled plan's retry no longer blocks sibling plans in the same batch from having already committed. |
|
|
378
408
|
|
|
379
409
|
---
|
|
380
410
|
|
|
@@ -398,7 +428,7 @@ Several config fields affect each other or trigger special behavior:
|
|
|
398
428
|
|
|
399
429
|
8. **`sub_repos` auto-sync** -- On every config load, GSD scans for child directories with `.git` and updates the `sub_repos` array if the filesystem has changed. Legacy `multiRepo: true` is automatically migrated to a detected `sub_repos` array.
|
|
400
430
|
|
|
401
|
-
9. **`workflow.use_worktrees` and branch divergence** -- When `use_worktrees` is `true` (default), executor worktrees are forked from `origin/HEAD` -- by the host's own harness on `dispatch.isolation: harness-worktree` runtimes (Claude Code, Cursor), or by GSD itself on `orchestrator-worktree` runtimes (Codex, OpenCode, Kimi, Kimi Code). The divergence behavior below is identical either way, because the fork base is a property of the repository rather than of whoever creates the worktree. If your current branch has commits that `origin/HEAD` does not (for example an unmerged milestone or feature branch), GSD automatically degrades to sequential execution for that run and prints a one-line `⚠ Worktree base mismatch` warning. To restore parallel execution permanently, set `worktree.baseRef:"head"` in `.claude/settings.local.json` (run `
|
|
431
|
+
9. **`workflow.use_worktrees` and branch divergence** -- When `use_worktrees` is `true` (default), executor worktrees are forked from `origin/HEAD` -- by the host's own harness on `dispatch.isolation: harness-worktree` runtimes (Claude Code, Cursor), or by GSD itself on `orchestrator-worktree` runtimes (Codex, OpenCode, Kimi, Kimi Code). The divergence behavior below is identical either way, because the fork base is a property of the repository rather than of whoever creates the worktree. If your current branch has commits that `origin/HEAD` does not (for example an unmerged milestone or feature branch), GSD automatically degrades to sequential execution for that run and prints a one-line `⚠ Worktree base mismatch` warning. To restore parallel execution permanently, set `worktree.baseRef:"head"` in `.claude/settings.local.json` (run `gsd_run worktree set-baseref`). This makes the harness fork worktrees from the live HEAD instead of `origin/HEAD`. Both fresh installs and upgrades of GSD Core set this automatically (no-clobber) when `use_worktrees` is enabled; you can also run the command manually at any time. Setting `workflow.use_worktrees: false` is the alternative if worktrees are not needed at all. On a runtime whose declared `dispatch.isolation` is `none`, an explicit `true` is a config the execution workflows fail closed on; `/gsd:health` reports it as warning `W025` and `/gsd:settings` offers to repair it (#2486).
|
|
402
432
|
|
|
403
433
|
---
|
|
404
434
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Response-Language Directive (#2529)
|
|
2
|
+
|
|
3
|
+
**If `response_language` is set** (in the init JSON this workflow parses, or in `.planning/config.json`): ALL user-facing output of this workflow MUST be in that language — narration between tool calls, status updates, progress notes, findings, banners, report prose, questions (AskUserQuestion or plain text), and summaries. Technical terms, code, file paths, commands, and identifiers stay in English.
|
|
4
|
+
|
|
5
|
+
Literal English report/banner templates embedded in a workflow are a structural SOURCE, not literal output to copy verbatim — render their prose translated into `{response_language}` while keeping headings' structural markers, table columns, IDs, commands, and file paths unchanged. Exception: blocks a workflow explicitly requires to be emitted byte-for-byte (e.g. pre-rendered checkpoints) are output exactly as rendered.
|
|
6
|
+
|
|
7
|
+
Pass `response_language: {value}` into every spawned subagent prompt so any user-facing output they produce stays in the configured language.
|
|
8
|
+
|
|
9
|
+
Workflows take this contract in one of three forms (REQ-LANG-03): an `@`-reference to this file; their own inline directive naming the same narration class; or, for a fragment loaded by a covered parent, inheritance from that parent. Coverage is enforced by `scripts/lint-response-language-coverage.cjs` — a new workflow cannot ship without one of the three, and the lint checks this file's own wording too, so a weakened directive here uncovers every workflow that imports it rather than passing silently. Workflow-specific directives (e.g. `execute-phase-response-language.md`) take precedence where present.
|
|
@@ -106,3 +106,34 @@ with an argv array and `shell: false`.
|
|
|
106
106
|
- **Shared-adapter caveat:** when ≥2 invoked instances share the same base `cli`, print a
|
|
107
107
|
one-line caveat immediately after the frontmatter (before the first section), e.g.:
|
|
108
108
|
`> Note: opencode-deepseek and opencode-mimo share the opencode adapter; their consensus is cross-model, not cross-tool.`
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Interaction with the convergence loop (#2398)
|
|
113
|
+
|
|
114
|
+
Running 2+ instances changes how `/gsd:plan-review-convergence` counts HIGHs. Its **consensus gate**
|
|
115
|
+
(`plan-review-convergence.md`, step 5a, immediately before the counting rules) engages only when two
|
|
116
|
+
or more reviewers actually ran in a cycle — which is precisely the configuration this file enables.
|
|
117
|
+
|
|
118
|
+
Under that gate, a HIGH raised by exactly one instance is treated by what the claim asserts:
|
|
119
|
+
|
|
120
|
+
- an **existence-class** claim (a symbol, file, flag, commit or ID exists / is absent / says X)
|
|
121
|
+
counts toward `current_high` only if source-grounding confirms it or another reviewer raised the
|
|
122
|
+
same concern;
|
|
123
|
+
- a **judgment-class** claim (a design or correctness property) counts unless that instance's own
|
|
124
|
+
section opens with an evidence-quality discount marker — `[reviewed-without-source-citations]`
|
|
125
|
+
(#3194) or `[reviewed-without-repo-access]` (#2176).
|
|
126
|
+
|
|
127
|
+
Judgment-class findings are deliberately exempt from the corroboration requirement: instances catch
|
|
128
|
+
materially different classes of issue, so demanding two of them independently raise the same
|
|
129
|
+
architectural concern would suppress the findings this feature exists to surface.
|
|
130
|
+
|
|
131
|
+
A suppressed HIGH is still reported, tagged `(single-reviewer, unconfirmed)`. If every instance that
|
|
132
|
+
ran carries a discount marker the gate disengages entirely, so a cycle in which nothing was verified
|
|
133
|
+
can never be counted as converged.
|
|
134
|
+
|
|
135
|
+
**Practical consequence for this file's use case:** instances of uneven reliability are safe to
|
|
136
|
+
configure. A weak instance that returns no `file:line` evidence gets stamped, and its lone
|
|
137
|
+
judgment-class HIGHs stop forcing replan cycles — while any instance that does produce grounded
|
|
138
|
+
evidence keeps full blocking weight, alone, on exactly the architectural findings it was added to
|
|
139
|
+
catch.
|