@opengsd/gsd-core 1.10.0 → 1.12.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/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +12 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +22 -14
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +5 -3
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +23 -2
- package/agents/gsd-plan-checker.md +50 -53
- package/agents/gsd-planner.md +50 -50
- 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 +63 -4
- package/agents/gsd-ui-researcher.md +41 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +13 -4
- package/bin/install.js +1448 -1103
- package/commands/gsd/code-review.md +1 -1
- 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/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/quick.md +9 -5
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1035 -138
- package/gsd-core/bin/lib/active-workstream-store.cjs +146 -22
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +392 -32
- package/gsd-core/bin/lib/api-coverage.cjs +33 -14
- package/gsd-core/bin/lib/artifacts.cjs +5 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +32 -15
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +1026 -268
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +845 -130
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-state.cjs +18 -3
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +700 -40
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +216 -42
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +735 -0
- package/gsd-core/bin/lib/command-aliases.cjs +22 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +1172 -108
- package/gsd-core/bin/lib/commonjs-marker.cjs +12 -6
- package/gsd-core/bin/lib/complexity-trigger.cjs +1192 -0
- package/gsd-core/bin/lib/config-loader.cjs +187 -23
- package/gsd-core/bin/lib/config.cjs +102 -3
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +208 -33
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/edge-probe.cjs +9 -1
- 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/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +899 -229
- package/gsd-core/bin/lib/gap-checker.cjs +95 -10
- package/gsd-core/bin/lib/git-base-branch.cjs +276 -39
- package/gsd-core/bin/lib/gsd2-import.cjs +10 -1
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +149 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +268 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +187 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +451 -0
- package/gsd-core/bin/lib/host-integration.cjs +39 -6
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +118 -21
- package/gsd-core/bin/lib/init.cjs +439 -168
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +811 -259
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +235 -0
- package/gsd-core/bin/lib/install-profiles.cjs +212 -61
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-report.cjs +3 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +148 -38
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +170 -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/markdown-sectionizer.cjs +2 -1
- package/gsd-core/bin/lib/markdown-table.cjs +183 -22
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +842 -73
- package/gsd-core/bin/lib/model-catalog.cjs +232 -16
- package/gsd-core/bin/lib/model-resolver.cjs +193 -68
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +18 -9
- package/gsd-core/bin/lib/phase-id.cjs +514 -40
- package/gsd-core/bin/lib/phase-lifecycle.cjs +52 -19
- package/gsd-core/bin/lib/phase-locator.cjs +262 -34
- package/gsd-core/bin/lib/phase.cjs +1038 -214
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +72 -1
- package/gsd-core/bin/lib/plan-document.cjs +263 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +98 -3
- 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-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +894 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +112 -6
- package/gsd-core/bin/lib/probe-core.cjs +5 -2
- package/gsd-core/bin/lib/profile-output.cjs +1 -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/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +766 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +11 -6
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +22 -13
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +421 -66
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +59 -11
- package/gsd-core/bin/lib/roadmap-parser.cjs +1006 -184
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +442 -96
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +702 -52
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +459 -55
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +69 -3
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +402 -58
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +96 -8
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +342 -7
- package/gsd-core/bin/lib/smart-entry.cjs +133 -23
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +52 -19
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +338 -8
- package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
- package/gsd-core/bin/lib/state-transition.cjs +846 -176
- package/gsd-core/bin/lib/state.cjs +2589 -369
- package/gsd-core/bin/lib/surface.cjs +33 -11
- 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/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +67 -23
- package/gsd-core/bin/lib/uat.cjs +1761 -167
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +51 -12
- package/gsd-core/bin/lib/unusable-input.cjs +37 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +75 -0
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +272 -9
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify.cjs +453 -918
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +53 -32
- package/gsd-core/bin/lib/workstream-inventory.cjs +63 -10
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/workstream.cjs +2 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +341 -18
- package/gsd-core/bin/shared/config-defaults.manifest.json +8 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +12 -1
- 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/references/agent-contracts.md +44 -26
- 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 +39 -21
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/edge-probe.md +8 -0
- package/gsd-core/references/execute-mvp-tdd.md +4 -6
- package/gsd-core/references/execute-phase-between-wave-reset.md +15 -14
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +17 -11
- package/gsd-core/references/failing-direction.md +78 -0
- 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 +5 -4
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +61 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- 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/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planner-revision.md +1 -1
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +44 -13
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +1 -1
- package/gsd-core/references/tdd.md +1 -3
- 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 +5 -5
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -17
- 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/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +5 -4
- package/gsd-core/templates/state.md +11 -4
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +3 -3
- package/gsd-core/workflows/add-tests.md +3 -8
- package/gsd-core/workflows/add-todo.md +1 -1
- package/gsd-core/workflows/ai-integration-phase.md +13 -20
- package/gsd-core/workflows/audit-fix.md +12 -3
- package/gsd-core/workflows/audit-milestone.md +9 -9
- package/gsd-core/workflows/audit-uat.md +17 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +11 -27
- package/gsd-core/workflows/check-todos.md +1 -1
- package/gsd-core/workflows/cleanup.md +64 -5
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +14 -4
- package/gsd-core/workflows/code-review-fix.md +38 -11
- package/gsd-core/workflows/code-review.md +159 -52
- package/gsd-core/workflows/complete-milestone.md +151 -23
- package/gsd-core/workflows/debug.md +12 -8
- package/gsd-core/workflows/diagnose-issues.md +47 -15
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -8
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/text.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +3 -6
- package/gsd-core/workflows/docs-update.md +5 -4
- package/gsd-core/workflows/edit-phase.md +27 -2
- package/gsd-core/workflows/eval-review.md +7 -14
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +142 -15
- 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 +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +24 -4
- 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 +2 -2
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase.md +72 -100
- package/gsd-core/workflows/execute-plan.md +52 -15
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/extract-learnings.md +1 -1
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +5 -5
- package/gsd-core/workflows/health.md +76 -10
- package/gsd-core/workflows/import.md +18 -15
- package/gsd-core/workflows/inbox.md +4 -5
- package/gsd-core/workflows/ingest-docs.md +49 -16
- package/gsd-core/workflows/insert-phase.md +5 -5
- package/gsd-core/workflows/list-seeds.md +5 -3
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +12 -23
- package/gsd-core/workflows/map-codebase.md +1 -1
- package/gsd-core/workflows/milestone-summary.md +1 -1
- package/gsd-core/workflows/mvp-phase.md +8 -5
- package/gsd-core/workflows/new-milestone.md +22 -29
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +26 -40
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +14 -2
- package/gsd-core/workflows/pause-work.md +1 -1
- 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 +1 -1
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +3 -3
- package/gsd-core/workflows/plan-phase.md +162 -59
- package/gsd-core/workflows/plan-review-convergence.md +96 -11
- package/gsd-core/workflows/plant-seed.md +2 -2
- package/gsd-core/workflows/pr-branch.md +187 -51
- package/gsd-core/workflows/profile-user.md +16 -14
- package/gsd-core/workflows/progress.md +61 -18
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +5 -7
- package/gsd-core/workflows/quick/steps/quick-verification.md +28 -9
- package/gsd-core/workflows/quick/steps/research-phase.md +4 -6
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick.md +55 -44
- package/gsd-core/workflows/remove-phase.md +4 -4
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +8 -12
- package/gsd-core/workflows/review.md +219 -20
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings-advanced.md +7 -9
- package/gsd-core/workflows/settings-integrations.md +64 -31
- package/gsd-core/workflows/settings.md +69 -7
- package/gsd-core/workflows/ship.md +116 -50
- package/gsd-core/workflows/sketch-wrap-up.md +11 -17
- package/gsd-core/workflows/sketch.md +12 -18
- package/gsd-core/workflows/smart-entry.md +3 -5
- package/gsd-core/workflows/spec-phase.md +53 -13
- package/gsd-core/workflows/spike-wrap-up.md +7 -11
- package/gsd-core/workflows/spike.md +20 -31
- package/gsd-core/workflows/stats.md +2 -2
- package/gsd-core/workflows/sync-skills.md +64 -9
- package/gsd-core/workflows/thread.md +11 -7
- package/gsd-core/workflows/transition.md +49 -14
- package/gsd-core/workflows/ui-phase.md +15 -21
- package/gsd-core/workflows/ui-review.md +8 -12
- package/gsd-core/workflows/ultraplan-phase.md +5 -13
- package/gsd-core/workflows/undo.md +8 -16
- package/gsd-core/workflows/update.md +7 -11
- 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 +66 -25
- package/hooks/dist/gsd-agent-isolation-guard.js +158 -30
- package/hooks/dist/gsd-check-update-worker.js +56 -13
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +19 -10
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +2 -3
- 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 +83 -3
- package/hooks/dist/gsd-cursor-subagent-stop.js +6 -3
- 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 +76 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +37 -27
- package/hooks/dist/gsd-read-guard.js +16 -7
- package/hooks/dist/gsd-read-injection-scanner.js +55 -32
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +231 -24
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-validate-commit.sh +80 -6
- 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 +162 -46
- 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 +92 -59
- 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 +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +9 -0
- package/hooks/dist/managed-hooks-registry.cjs +3 -0
- package/hooks/gsd-agent-isolation-guard.js +158 -30
- package/hooks/gsd-check-update-worker.js +56 -13
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +19 -10
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +2 -3
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +83 -3
- package/hooks/gsd-cursor-subagent-stop.js +6 -3
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +76 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +37 -27
- package/hooks/gsd-read-guard.js +16 -7
- package/hooks/gsd-read-injection-scanner.js +55 -32
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +231 -24
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-validate-commit.sh +80 -6
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +162 -46
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +9 -0
- package/hooks/managed-hooks-registry.cjs +3 -0
- package/package.json +28 -11
- package/pi/gsd.cjs +19 -5
- package/scripts/base64-scan.sh +74 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +5 -0
- package/scripts/changeset/lint.cjs +60 -5
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -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 +64 -14
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/docs-guard-registry.cjs +396 -0
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-registry.cjs +11 -21
- package/scripts/gen-context-index.cjs +2 -11
- 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-health-docs.cjs +390 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-inventory-manifest.cjs +50 -4
- package/scripts/gen-loop-host-contract.cjs +138 -25
- package/scripts/gen-registry.cjs +3 -14
- 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/alias-drift-families.cjs +46 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +308 -0
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +1 -26
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +193 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +38 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +461 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +492 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +471 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +488 -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-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +950 -0
- package/scripts/lint-test-file-count.allowlist.json +137 -8
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +830 -0
- package/scripts/lint-vendored-deps.cjs +297 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +100 -14
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +24 -7
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +0 -1
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +9 -5
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -107
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -574
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1051
|
@@ -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.
|
|
@@ -162,24 +162,18 @@ Derive plans from actual work. Granularity determines compression tolerance, not
|
|
|
162
162
|
Run `/clear` first for a fresh context window, then execute: `/gsd:execute-phase {phase}`
|
|
163
163
|
```
|
|
164
164
|
|
|
165
|
-
## Gap Closure
|
|
165
|
+
## Gap Closure Return (artifact-based — #3440)
|
|
166
166
|
|
|
167
|
-
|
|
168
|
-
## GAP CLOSURE PLANS CREATED
|
|
167
|
+
Gap-closure completion has **no completion marker**: nothing consumes one. The return contract is the artifacts themselves — `verify-work.md` spawns you in `--gaps` mode, and your output is complete when the fix plans are on disk carrying `gap_closure: true` in their frontmatter; the spawning workflow detects the files (never a return string), and `/gsd:execute-phase {phase} --gaps-only` consumes them. (The former `GAP CLOSURE PLANS CREATED` completion marker was retired as vestigial — it had no dispatch branch anywhere.)
|
|
169
168
|
|
|
170
169
|
**Phase:** {phase-name}
|
|
171
170
|
**Closing:** {N} gaps from {VERIFICATION|UAT}.md
|
|
172
171
|
|
|
173
|
-
### Plans
|
|
174
|
-
|
|
175
172
|
| Plan | Gaps Addressed | Files |
|
|
176
173
|
|------|----------------|-------|
|
|
177
174
|
| {phase}-04 | [gap truths] | [files] |
|
|
178
175
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
Execute: `/gsd:execute-phase {phase} --gaps-only`
|
|
182
|
-
```
|
|
176
|
+
**Next step for the orchestrator:** `/gsd:execute-phase {phase} --gaps-only`
|
|
183
177
|
|
|
184
178
|
## Checkpoint Reached / Revision Complete
|
|
185
179
|
|
|
@@ -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).
|
|
@@ -121,7 +121,7 @@ The executor agent reads `<precondition>` before any other task work:
|
|
|
121
121
|
|---|---|
|
|
122
122
|
| **Absent** | No visible change — execute the task exactly as today. Back-compat for every existing plan. |
|
|
123
123
|
| **Met** | No visible change — proceed with the task. The precondition is logged in the SUMMARY only if it was non-trivial to verify. |
|
|
124
|
-
| **Unmet** | STOP — return a `checkpoint:human-verify` (use `checkpoint_return_format`) with `**Blocked by:** Precondition not met: <precondition text>`. Do NOT partial-commit the task. Unmet preconditions are NEVER auto-approved — a missing prerequisite is not a verification step a human can rubber-stamp, it is a fact the executor cannot establish on its own. |
|
|
124
|
+
| **Unmet** | STOP — return a `checkpoint:human-verify` reporting `**Gate:** blocking-human` (use `checkpoint_return_format`) with `**Blocked by:** Precondition not met: <precondition text>`. Do NOT partial-commit the task. Unmet preconditions are NEVER auto-approved — a missing prerequisite is not a verification step a human can rubber-stamp, it is a fact the executor cannot establish on its own. |
|
|
125
125
|
|
|
126
126
|
## Plan-structure validation
|
|
127
127
|
|
|
@@ -7,7 +7,7 @@ Triggered when orchestrator sets Mode to `reviews`. Replanning from scratch with
|
|
|
7
7
|
**Execution contract:** REVIEWS.md is audit trail and feedback input, not a second execution contract. /gsd:execute-phase primarily consumes PLAN.md plus the normal phase context. Every current actionable review finding must therefore be incorporated into the relevant PLAN.md or explicitly deferred/rejected in that PLAN.md.
|
|
8
8
|
|
|
9
9
|
### Step 1: Load REVIEWS.md
|
|
10
|
-
Read the reviews file from `<
|
|
10
|
+
Read the reviews file from `<required_reading>`. Parse:
|
|
11
11
|
- Per-reviewer feedback (strengths, concerns, suggestions)
|
|
12
12
|
- Consensus Summary (agreed concerns = highest priority to address)
|
|
13
13
|
- Divergent Views (investigate, make a judgment call)
|
|
@@ -55,7 +55,7 @@ Group by plan, dimension, severity.
|
|
|
55
55
|
### Step 6: Commit
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
|
-
|
|
58
|
+
gsd_run query commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
### Step 7: Return Revision Summary
|
|
@@ -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,16 +29,19 @@ 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). |
|
|
39
|
-
| `workflow.
|
|
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. |
|
|
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. |
|
|
42
47
|
| `manager.flags.discuss` | `""` | Flags passed to `/gsd:discuss-phase` when dispatched from manager (e.g. `"--auto --analyze"`) |
|
|
@@ -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,25 +86,27 @@ 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
|
```
|
|
76
101
|
|
|
77
102
|
**Auto-detection:** If `.planning/` is gitignored, `commit_docs` is automatically `false` regardless of config.json. This prevents git errors when users have `.planning/` in `.gitignore`.
|
|
78
103
|
|
|
104
|
+
**Per-phase override:** `phase_commit_docs.<phase-id>` (e.g. `phase_commit_docs.03`) overrides `commit_docs` for one phase only, and wins over both the explicit config value and gitignore auto-detection — see `docs/CONFIGURATION.md#per-phase-override-phase_commit_docs` for the full precedence chain and examples.
|
|
105
|
+
|
|
79
106
|
**Commit via CLI (handles checks automatically):**
|
|
80
107
|
|
|
81
108
|
```bash
|
|
82
|
-
|
|
109
|
+
gsd_run query commit "docs: update state" --files .planning/STATE.md
|
|
83
110
|
```
|
|
84
111
|
|
|
85
112
|
The CLI checks `commit_docs` config and gitignore status internally — no manual conditionals needed.
|
|
@@ -167,14 +194,14 @@ To use uncommitted mode:
|
|
|
167
194
|
|
|
168
195
|
Use `init execute-phase` which returns all config as JSON:
|
|
169
196
|
```bash
|
|
170
|
-
INIT=$(
|
|
197
|
+
INIT=$(gsd_run query init.execute-phase "1")
|
|
171
198
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
172
199
|
# JSON output includes: branching_strategy, phase_branch_template, milestone_branch_template
|
|
173
200
|
```
|
|
174
201
|
|
|
175
202
|
Or use `state load` for the config values:
|
|
176
203
|
```bash
|
|
177
|
-
INIT=$(
|
|
204
|
+
INIT=$(gsd_run query state.load)
|
|
178
205
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
179
206
|
# Parse branching_strategy, phase_branch_template, milestone_branch_template from JSON
|
|
180
207
|
```
|
|
@@ -240,6 +267,7 @@ Generated from `CONFIG_DEFAULTS` (configuration.cjs) and `VALID_CONFIG_KEYS` (co
|
|
|
240
267
|
| `resolve_model_ids` | boolean\|string | `false` | `false`, `true`, `"omit"` | Map model aliases to full Claude IDs; `"omit"` returns empty string |
|
|
241
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 |
|
|
242
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. |
|
|
243
271
|
|
|
244
272
|
### Workflow Fields
|
|
245
273
|
|
|
@@ -261,12 +289,13 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
|
|
|
261
289
|
| `workflow.ui_phase` | boolean | `true` | `true`, `false` | Generate UI-SPEC.md for frontend phases |
|
|
262
290
|
| `workflow.ui_safety_gate` | boolean | `true` | `true`, `false` | Require safety gate approval for UI changes |
|
|
263
291
|
| `workflow.text_mode` | boolean | `false` | `true`, `false` | Use plain-text numbered lists instead of AskUserQuestion menus |
|
|
264
|
-
| `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. |
|
|
265
293
|
| `workflow.discuss_mode` | string | `"discuss"` | `"discuss"`, `"assumptions"` | Default mode for discuss-phase: `"discuss"` runs interactive questioning; `"assumptions"` analyzes codebase and surfaces assumptions instead |
|
|
266
294
|
| `workflow.skip_discuss` | boolean | `false` | `true`, `false` | Skip discuss phase entirely |
|
|
267
295
|
| `workflow.use_worktrees` | boolean | `true` | `true`, `false` | Run executor agents in isolated git worktrees |
|
|
268
296
|
| `workflow.subagent_timeout` | number | `300000` | Any positive integer (ms) | Timeout for parallel subagent tasks (default: 5 minutes) |
|
|
269
|
-
| `workflow.
|
|
297
|
+
| `workflow.inline_plan_threshold` | number | `2` | `0`–`10` | Plans with ≤N tasks execute inline instead of spawning a subagent |
|
|
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). |
|
|
270
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. |
|
|
271
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. |
|
|
272
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,7 +304,8 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
|
|
|
275
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`. |
|
|
276
305
|
| `workflow.inline_plan_threshold` | number | `2` | `0`–`10` | Plans with ≤N tasks execute inline instead of spawning a subagent |
|
|
277
306
|
| `workflow.code_review` | boolean | `true` | `true`, `false` | Enable built-in code review step in the ship workflow |
|
|
278
|
-
| `workflow.code_review_depth` | string | `"standard"` | `"
|
|
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. |
|
|
279
309
|
| `workflow._auto_chain_active` | boolean | `false` | `true`, `false` | Internal: tracks whether autonomous chaining is active |
|
|
280
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 |
|
|
281
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`. |
|
|
@@ -298,6 +328,7 @@ Set via `git.*` namespace (e.g., `"git": { "branching_strategy": "phase" }`).
|
|
|
298
328
|
|-----|------|---------|----------------|-------------|
|
|
299
329
|
| `git.branching_strategy` | string | `"none"` | `"none"`, `"phase"`, `"milestone"` | Git branching approach for phase/milestone isolation |
|
|
300
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 |
|
|
301
332
|
| `git.create_tag` | boolean | `true` | `true`, `false` | Create git tags on milestone completion |
|
|
302
333
|
| `git.phase_branch_template` | string | `"gsd/phase-{phase}-{slug}"` | Template with `{phase}`, `{slug}` | Branch naming template for `phase` strategy |
|
|
303
334
|
| `git.milestone_branch_template` | string | `"gsd/{milestone}-{slug}"` | Template with `{milestone}`, `{slug}` | Branch naming template for `milestone` strategy |
|
|
@@ -362,7 +393,7 @@ Set via `manager.*` namespace (e.g., `"manager": { "flags": { "discuss": "--auto
|
|
|
362
393
|
|-----|------|---------|----------------|-------------|
|
|
363
394
|
| `parallelization` | boolean\|object | `true` | `true`, `false`, `{ "enabled": true }` | Enable parallel wave execution; object form allows additional sub-keys |
|
|
364
395
|
| `model_overrides` | object\|null | `null` | `{ "<agent-type>": "<model-id>" }` | Override model selection per agent type |
|
|
365
|
-
| `agent_skills` | object | `{}` | `{ "<agent-type>": "<skill-set>" }` | Assign skill sets to specific agent types |
|
|
396
|
+
| `agent_skills` | object | `{}` | `{ "<agent-type>": "<skill-set>" }` or `{ "<agent-type>": ["<skill-set>", "<skill-set>", ...] }` | Assign skill sets to specific agent types. Each value is a single skill-set path (string) or an array of skill-set paths — the array form assigns multiple skill sets to one agent type. Paths cannot be comma-joined into one string; each path must be its own array element |
|
|
366
397
|
| `sub_repos` | array | `[]` | Array of relative path strings | Child directories with independent `.git` repos (auto-detected) |
|
|
367
398
|
|
|
368
399
|
### Planning Fields
|
|
@@ -380,7 +411,7 @@ These can be set at top level or nested under `planning.*` (e.g., `"planning": {
|
|
|
380
411
|
|
|
381
412
|
Several config fields affect each other or trigger special behavior:
|
|
382
413
|
|
|
383
|
-
1. **`commit_docs`
|
|
414
|
+
1. **`commit_docs` resolution chain** -- Four tiers, highest wins: (1) `phase_commit_docs.<phase-id>` for the phase being committed, (2) an explicit `commit_docs` (or `planning.commit_docs`) value in config.json, (3) `.gitignore` auto-detection (`.planning/` in `.gitignore` resolves to `false`), (4) the manifest default (`true`). Precedence: per-phase → explicit config → gitignore auto-detect → default.
|
|
384
415
|
|
|
385
416
|
2. **`branching_strategy` controls branch templates** -- The `phase_branch_template` and `milestone_branch_template` fields are only used when `branching_strategy` is set to `"phase"` or `"milestone"` respectively. When `branching_strategy` is `"none"`, all template fields are ignored.
|
|
386
417
|
|
|
@@ -396,7 +427,7 @@ Several config fields affect each other or trigger special behavior:
|
|
|
396
427
|
|
|
397
428
|
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.
|
|
398
429
|
|
|
399
|
-
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 `
|
|
430
|
+
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).
|
|
400
431
|
|
|
401
432
|
---
|
|
402
433
|
|
|
@@ -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.
|
|
@@ -70,7 +70,7 @@ issues. You must reduce the count or the loop will terminate.
|
|
|
70
70
|
If issues persist after 3 revision cycles:
|
|
71
71
|
|
|
72
72
|
1. Present remaining issues to the user
|
|
73
|
-
2. Use gate prompt (pattern: yes-no from `references/gate-prompts.md`):
|
|
73
|
+
2. Use gate prompt (pattern: yes-no from `gsd-core/references/gate-prompts.md`):
|
|
74
74
|
question: "Issues remain after 3 revision attempts. Proceed with current output?"
|
|
75
75
|
header: "Proceed?"
|
|
76
76
|
options:
|
|
@@ -19,7 +19,7 @@ preserves named-dispatch behavior on older GSD installs that lack the query.
|
|
|
19
19
|
|
|
20
20
|
The persona rides `${AGENT_SKILLS_<ROLE>}` (Phase 3 / #2510) regardless of the
|
|
21
21
|
resolved type — on non-Claude runtimes with no `agent_skills` config,
|
|
22
|
-
`
|
|
22
|
+
`gsd_run query agent-skills <role>` returns the installed agent prompt as
|
|
23
23
|
the block. So a coder dispatch with the planner persona injected gives kimi-code
|
|
24
24
|
the planner's behavior in the coder built-in's process.
|
|
25
25
|
|
|
@@ -127,7 +127,7 @@ verification: backstop }` in `must_haves.truths`, NOT a prose note (the verifier
|
|
|
127
127
|
deterministically on the `verification: backstop` field; a parenthetical is unparseable — the #1110
|
|
128
128
|
fragility; flat scalar `verification:` key, never a nested object, ADR-550 #1278). A `backstop` truth
|
|
129
129
|
the verifier cannot confirm with explicit evidence abstains → `human_needed` (reason
|
|
130
|
-
`insufficient_spec`), never a silent pass (#1154; `references/honest-verifier.md`). **Never
|
|
130
|
+
`insufficient_spec`), never a silent pass (#1154; `gsd-core/references/honest-verifier.md`). **Never
|
|
131
131
|
auto-dismiss** (a wrong dismissal is the exact silent failure this eliminates). An `unclassified` row
|
|
132
132
|
stays **`unresolved`** (#1110) — never auto-resolved with backstop — and is surfaced to the planner as a flagged
|
|
133
133
|
assumption. Pass `$COVERAGE` (+ the gate's `$SPECLESS_FALLBACK_DISABLED` note) into the gsd-planner
|
|
@@ -289,9 +289,7 @@ When `workflow.tdd_mode` is enabled, the execute-phase orchestrator inserts a co
|
|
|
289
289
|
### Review Checkpoint Format
|
|
290
290
|
|
|
291
291
|
```
|
|
292
|
-
|
|
293
|
-
TDD REVIEW — Phase {X}
|
|
294
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
292
|
+
### TDD REVIEW — Phase {X}
|
|
295
293
|
|
|
296
294
|
TDD Plans: {count} | Gate violations: {count}
|
|
297
295
|
|
|
@@ -2,14 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
Visual patterns for user-facing GSD output. Orchestrators @-reference this file.
|
|
4
4
|
|
|
5
|
+
## Separators and Banners
|
|
6
|
+
|
|
7
|
+
**Never emit a fixed-width run of box-drawing characters.** A run of `━`, `─` or
|
|
8
|
+
`═` is ordinary text to the host that renders your output. In a narrower pane it
|
|
9
|
+
wraps, leaving orphan glyphs on a second line and coming apart from the heading it
|
|
10
|
+
was meant to frame. Markdown adapts to the available width; a 53-character rule
|
|
11
|
+
does not.
|
|
12
|
+
|
|
13
|
+
Three forms, and nothing else:
|
|
14
|
+
|
|
15
|
+
| Need | Emit |
|
|
16
|
+
|---|---|
|
|
17
|
+
| A titled section — stage, phase, checkpoint, completion, error | `### {TITLE}` (ATX heading) |
|
|
18
|
+
| A break between two sections | `---` on its own line, **with a blank line above it** |
|
|
19
|
+
| A framed panel of rows | `### {TITLE}` followed by the rows as plain lines |
|
|
20
|
+
|
|
21
|
+
**The blank line above `---` is load-bearing, not cosmetic.** A `---` placed
|
|
22
|
+
directly under a line of text is parsed as a setext heading underline for that
|
|
23
|
+
line, not as a thematic break — the rule silently swallows the line above it. A
|
|
24
|
+
blank line is what makes it a thematic break. (A blank line *after* `---` is
|
|
25
|
+
optional: a thematic break is a leaf block, so whatever follows starts a new
|
|
26
|
+
block either way. Add one where it reads better.)
|
|
27
|
+
|
|
28
|
+
**A stage banner is a heading alone — do not put a `---` above it.** An ATX
|
|
29
|
+
heading already separates, and it cannot be misparsed the way a bare `---` can.
|
|
30
|
+
|
|
31
|
+
### Why this is unconditional, not per-runtime
|
|
32
|
+
|
|
33
|
+
The alternative considered was a `rendersMarkdown` capability key, keeping
|
|
34
|
+
line-art for terminal-oriented runtimes and Markdown for Markdown hosts. It was
|
|
35
|
+
rejected: it needs a new descriptor key across every runtime plus the resolver,
|
|
36
|
+
and it leaves two output conventions to keep in sync forever — the divergence
|
|
37
|
+
class this repo already has a defect entry for. A heading and a thematic break
|
|
38
|
+
carry the same structure in a plain terminal that a rule pair did, without
|
|
39
|
+
committing to a width, so the second convention buys nothing. If a runtime ever
|
|
40
|
+
turns up that genuinely needs line-art, add the key then, against that evidence.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
5
44
|
## Stage Banners
|
|
6
45
|
|
|
7
46
|
Use for major workflow transitions.
|
|
8
47
|
|
|
9
48
|
```
|
|
10
|
-
|
|
11
|
-
GSD ► {STAGE NAME}
|
|
12
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
49
|
+
### GSD ► {STAGE NAME}
|
|
13
50
|
```
|
|
14
51
|
|
|
15
52
|
**Stage names (uppercase):**
|
|
@@ -25,20 +62,18 @@ Use for major workflow transitions.
|
|
|
25
62
|
|
|
26
63
|
---
|
|
27
64
|
|
|
28
|
-
## Checkpoint
|
|
65
|
+
## Checkpoint Panels
|
|
29
66
|
|
|
30
|
-
User action required.
|
|
67
|
+
User action required.
|
|
31
68
|
|
|
32
69
|
```
|
|
33
|
-
|
|
34
|
-
║ CHECKPOINT: {Type} ║
|
|
35
|
-
╚══════════════════════════════════════════════════════════════╝
|
|
70
|
+
### CHECKPOINT: {Type}
|
|
36
71
|
|
|
37
72
|
{Content}
|
|
38
73
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
**→ {ACTION PROMPT}**
|
|
42
77
|
```
|
|
43
78
|
|
|
44
79
|
**Types:**
|
|
@@ -60,6 +95,9 @@ User action required. 62-character width.
|
|
|
60
95
|
🎉 Milestone complete (only in banner)
|
|
61
96
|
```
|
|
62
97
|
|
|
98
|
+
Status symbols are single characters, not runs — they do not wrap and are
|
|
99
|
+
unaffected by the separator rule above.
|
|
100
|
+
|
|
63
101
|
---
|
|
64
102
|
|
|
65
103
|
## Progress Display
|
|
@@ -79,6 +117,9 @@ Tasks: 2/4 complete
|
|
|
79
117
|
Plans: 3/5 complete
|
|
80
118
|
```
|
|
81
119
|
|
|
120
|
+
The bar itself is a fixed 10-cell gauge, not a separator; it is intentionally
|
|
121
|
+
fixed-width and stays as it is.
|
|
122
|
+
|
|
82
123
|
---
|
|
83
124
|
|
|
84
125
|
## Spawning Indicators
|
|
@@ -104,7 +145,7 @@ Plans: 3/5 complete
|
|
|
104
145
|
Always at end of major completions.
|
|
105
146
|
|
|
106
147
|
```
|
|
107
|
-
|
|
148
|
+
---
|
|
108
149
|
|
|
109
150
|
## ▶ Next Up
|
|
110
151
|
|
|
@@ -114,23 +155,19 @@ Always at end of major completions.
|
|
|
114
155
|
|
|
115
156
|
`{copy-paste command}`
|
|
116
157
|
|
|
117
|
-
|
|
158
|
+
---
|
|
118
159
|
|
|
119
160
|
**Also available:**
|
|
120
161
|
- `/gsd-alternative-1` — description
|
|
121
162
|
- `/gsd-alternative-2` — description
|
|
122
|
-
|
|
123
|
-
───────────────────────────────────────────────────────────────
|
|
124
163
|
```
|
|
125
164
|
|
|
126
165
|
---
|
|
127
166
|
|
|
128
|
-
## Error
|
|
167
|
+
## Error Panel
|
|
129
168
|
|
|
130
169
|
```
|
|
131
|
-
|
|
132
|
-
║ ERROR ║
|
|
133
|
-
╚══════════════════════════════════════════════════════════════╝
|
|
170
|
+
### ERROR
|
|
134
171
|
|
|
135
172
|
{Error description}
|
|
136
173
|
|
|
@@ -149,14 +186,21 @@ Always at end of major completions.
|
|
|
149
186
|
| 3 | ○ | 0/2 | 0% |
|
|
150
187
|
```
|
|
151
188
|
|
|
189
|
+
Table rules use ASCII `-`, never box-drawing characters.
|
|
190
|
+
|
|
152
191
|
---
|
|
153
192
|
|
|
154
193
|
## Anti-Patterns
|
|
155
194
|
|
|
156
|
-
-
|
|
157
|
-
-
|
|
195
|
+
- Fixed-width runs of `━`, `─` or `═` as separators — they wrap in a narrow pane
|
|
196
|
+
- Box panels drawn with double-line box characters (U+2554, U+2557, U+255A, U+255D, U+2551, U+2560, U+2563) — the borders wrap independently of their contents. They are named here by code point rather than shown, because the guard below rejects the characters themselves anywhere in shipped content.
|
|
197
|
+
- A `---` directly under a line of text with no blank line between — that is a setext heading underline, not a break, and it swallows the line above
|
|
198
|
+
- Boxing a heading between two rules — the heading is the separator
|
|
199
|
+
- Mixing banner styles (`===`, `***`)
|
|
158
200
|
- Skipping `GSD ►` prefix in banners
|
|
159
201
|
- Random emoji (`🚀`, `✨`, `💫`)
|
|
160
202
|
- Missing Next Up block after completions
|
|
161
203
|
|
|
204
|
+
Enforced by `tests/responsive-separators.test.cjs`.
|
|
205
|
+
|
|
162
206
|
</ui_patterns>
|
|
@@ -69,5 +69,5 @@ closed). The **open subset is prose-owned in [domain-probes.md](./domain-probes.
|
|
|
69
69
|
real-time/offline/optimistic-UI, deep accessibility (WCAG breadth), i18n / RTL depth, and
|
|
70
70
|
emerging interaction paradigms (gesture/voice/reduced-motion/print) are open-ended and
|
|
71
71
|
cue-triggered — they do not belong in this closed taxonomy. This probe **complements** the
|
|
72
|
-
`gsd-ui-checker`
|
|
72
|
+
`gsd-ui-checker` seven quality dimensions (it adds a state-coverage axis); it does not change the
|
|
73
73
|
BLOCK/FLAG/PASS enum or the dimensions themselves.
|