@opengsd/gsd-core 1.11.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 +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 +17 -9
- 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 +15 -55
- package/agents/gsd-planner.md +6 -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 +63 -4
- package/agents/gsd-ui-researcher.md +41 -3
- package/agents/gsd-verifier.md +1 -1
- package/bin/install.js +609 -134
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/quick.md +8 -4
- package/gsd-core/bin/gsd-tools.cjs +567 -51
- 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-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +336 -95
- package/gsd-core/bin/lib/capability-state.cjs +18 -3
- package/gsd-core/bin/lib/capability-validator.cjs +205 -18
- package/gsd-core/bin/lib/check-command-router.cjs +145 -5
- 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 +410 -4
- 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 +543 -44
- package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
- package/gsd-core/bin/lib/config-loader.cjs +118 -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 +84 -7
- 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/frontmatter.cjs +840 -305
- package/gsd-core/bin/lib/gap-checker.cjs +27 -3
- package/gsd-core/bin/lib/git-base-branch.cjs +174 -39
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +6 -3
- 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 +39 -6
- package/gsd-core/bin/lib/init-command-router.cjs +118 -21
- package/gsd-core/bin/lib/init.cjs +120 -41
- package/gsd-core/bin/lib/install-engine.cjs +68 -3
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +33 -1
- package/gsd-core/bin/lib/install-profiles.cjs +78 -4
- 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 +10 -7
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +160 -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-table.cjs +52 -4
- package/gsd-core/bin/lib/milestone.cjs +90 -5
- 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-estimation.cjs +17 -8
- package/gsd-core/bin/lib/phase-id.cjs +70 -4
- 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 +405 -84
- package/gsd-core/bin/lib/plan-document.cjs +263 -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 +18 -14
- package/gsd-core/bin/lib/planning-workspace.cjs +56 -0
- 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/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 +9 -9
- package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
- package/gsd-core/bin/lib/roadmap-parser.cjs +79 -16
- package/gsd-core/bin/lib/roadmap.cjs +74 -19
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +96 -8
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +34 -1
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +287 -55
- 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 +71 -8
- package/gsd-core/bin/lib/smart-entry.cjs +12 -22
- 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 +186 -0
- package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
- package/gsd-core/bin/lib/state-transition.cjs +517 -101
- package/gsd-core/bin/lib/state.cjs +946 -163
- package/gsd-core/bin/lib/surface.cjs +10 -2
- 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/uat-predicate.cjs +58 -20
- package/gsd-core/bin/lib/uat.cjs +1376 -125
- 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/validate-command-router.cjs +2 -2
- 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.cjs +14 -1
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify.cjs +95 -40
- 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 +177 -21
- package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +5 -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/references/agent-contracts.md +3 -2
- 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 +8 -0
- package/gsd-core/references/execute-mvp-tdd.md +1 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
- package/gsd-core/references/execute-phase-wave-guard.md +11 -9
- 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 +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/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-human-verify-mode.md +15 -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 +37 -8
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/runtime-aware-dispatch.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 +2 -2
- 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 +3 -0
- package/gsd-core/templates/state.md +7 -0
- 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 +4 -9
- 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 +10 -26
- package/gsd-core/workflows/check-todos.md +1 -1
- package/gsd-core/workflows/cleanup.md +2 -2
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +1 -1
- package/gsd-core/workflows/code-review-fix.md +1 -1
- package/gsd-core/workflows/code-review.md +121 -40
- package/gsd-core/workflows/complete-milestone.md +15 -10
- package/gsd-core/workflows/debug.md +5 -3
- package/gsd-core/workflows/diagnose-issues.md +12 -6
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +3 -7
- 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 +2 -2
- 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 +1 -1
- package/gsd-core/workflows/eval-review.md +4 -9
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +113 -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 +22 -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 +38 -54
- package/gsd-core/workflows/execute-plan.md +17 -12
- package/gsd-core/workflows/explore.md +1 -1
- package/gsd-core/workflows/extract-learnings.md +1 -1
- package/gsd-core/workflows/fast.md +2 -2
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +5 -5
- package/gsd-core/workflows/health.md +3 -6
- package/gsd-core/workflows/import.md +14 -11
- package/gsd-core/workflows/inbox.md +4 -5
- package/gsd-core/workflows/ingest-docs.md +44 -11
- 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 +2 -2
- package/gsd-core/workflows/new-milestone.md +9 -21
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +12 -26
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +2 -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 +121 -42
- package/gsd-core/workflows/plan-review-convergence.md +46 -9
- 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 +27 -12
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -3
- package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
- package/gsd-core/workflows/quick/steps/research-phase.md +2 -4
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick.md +20 -29
- 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 +193 -15
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +2 -2
- package/gsd-core/workflows/settings-advanced.md +7 -9
- package/gsd-core/workflows/settings-integrations.md +64 -31
- package/gsd-core/workflows/settings.md +3 -5
- package/gsd-core/workflows/ship.md +12 -6
- 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 +23 -1
- 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 +1 -1
- package/gsd-core/workflows/thread.md +11 -7
- package/gsd-core/workflows/transition.md +5 -5
- package/gsd-core/workflows/ui-phase.md +10 -16
- package/gsd-core/workflows/ui-review.md +6 -10
- package/gsd-core/workflows/ultraplan-phase.md +5 -13
- package/gsd-core/workflows/undo.md +8 -16
- package/gsd-core/workflows/update.md +6 -10
- package/gsd-core/workflows/validate-phase.md +2 -2
- 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 +57 -18
- package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
- 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 +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 +76 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +16 -7
- package/hooks/dist/gsd-read-guard.js +16 -7
- package/hooks/dist/gsd-read-injection-scanner.js +17 -8
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +215 -26
- 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 +34 -16
- 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-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/managed-hooks-registry.cjs +3 -0
- package/hooks/gsd-agent-isolation-guard.js +77 -38
- 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 +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 +76 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +16 -7
- package/hooks/gsd-read-guard.js +16 -7
- package/hooks/gsd-read-injection-scanner.js +17 -8
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +215 -26
- 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 +34 -16
- 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-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/managed-hooks-registry.cjs +3 -0
- package/package.json +12 -7
- package/scripts/base64-scan.sh +74 -12
- package/scripts/build-hooks.js +5 -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 +45 -12
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/docs-guard-registry.cjs +396 -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 +134 -1
- 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/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 +193 -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 +21 -8
- package/scripts/lint-planning-prompt-drift.cjs +38 -1
- package/scripts/lint-removed-but-needed.cjs +184 -16
- 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 +122 -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/mutation-matrix.cjs +599 -50
- package/scripts/prompt-injection-scan.sh +75 -14
- 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-import/SKILL.md +1 -1
- package/skills/gsd-quick/SKILL.md +8 -4
- 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,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).
|
|
@@ -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,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,11 +289,12 @@ 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. |
|
|
@@ -278,6 +305,7 @@ Set via `workflow.*` namespace in config.json (e.g., `"workflow": { "research":
|
|
|
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 |
|
|
@@ -398,7 +427,7 @@ Several config fields affect each other or trigger special behavior:
|
|
|
398
427
|
|
|
399
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.
|
|
400
429
|
|
|
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 `
|
|
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).
|
|
402
431
|
|
|
403
432
|
---
|
|
404
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.
|
|
@@ -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
|
|
|
@@ -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.
|
|
@@ -34,7 +34,7 @@ Reference: `gsd-core/references/questioning.md` for the full anti-pattern list.
|
|
|
34
34
|
|
|
35
35
|
## State Management Anti-Patterns
|
|
36
36
|
|
|
37
|
-
15. **No direct Write/Edit to STATE.md or ROADMAP.md for mutations.** Always use `
|
|
37
|
+
15. **No direct Write/Edit to STATE.md or ROADMAP.md for mutations.** Always use `gsd_run query` for registered state/roadmap handlers (e.g. `state.update`, `state.advance-plan`, `roadmap.update-plan-progress`), or legacy `node …/gsd-tools.cjs` for CLI-only commands. Direct Write tool usage bypasses safe update logic and is unsafe in multi-session environments. Exception: first-time creation of STATE.md from template is allowed.
|
|
38
38
|
|
|
39
39
|
## Behavioral Rules
|
|
40
40
|
|
|
@@ -53,7 +53,7 @@ Reference: `gsd-core/references/questioning.md` for the full anti-pattern list.
|
|
|
53
53
|
## GSD-Specific Rules
|
|
54
54
|
|
|
55
55
|
24. **Do not** check for `mode === 'auto'` or `mode === 'autonomous'` -- GSD uses `yolo` config flag. Check `yolo: true` for autonomous mode, absence or `false` for interactive mode.
|
|
56
|
-
25. **Prefer `
|
|
56
|
+
25. **Prefer `gsd_run query`** for orchestration when a handler exists; when shelling out to the legacy CLI, go through the same `gsd_run` launcher rather than naming the shim file. The shim is not on PATH under any name ending in `.cjs`, and an agent that meets the bare filename falls back to searching the filesystem for it — on Git Bash for Windows that is a full-drive `find.exe` traversal (#3809). `gsd_run` resolves the CommonJS shim itself across every runtime home.
|
|
57
57
|
26. **Plan files MUST follow `{padded_phase}-{NN}-PLAN.md` pattern** (e.g., `01-01-PLAN.md`). Never use `PLAN-01.md`, `plan-01.md`, or any other variation -- gsd-tools detection depends on this exact pattern.
|
|
58
58
|
27. **Do not start executing the next plan before writing the SUMMARY.md for the current plan** -- downstream plans may reference it via `@` includes.
|
|
59
59
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Verify Command Path Resolvability (#2401)
|
|
2
|
+
|
|
3
|
+
> Reference file for gsd-plan-checker agent. Loaded on-demand via `@` reference.
|
|
4
|
+
|
|
5
|
+
**Question:** Does each `<automated>` command's target directory actually resolve from the
|
|
6
|
+
executor's cwd (the project root)? Format sanity above asks whether the *pattern* can match;
|
|
7
|
+
this asks whether the command can *run at all*.
|
|
8
|
+
|
|
9
|
+
**Do not hand-reason the filesystem.** #2401 is precisely the failure of doing so: this
|
|
10
|
+
checker flagged a bad `cd ../../frontend` (correct), then prescribed two successively-wrong
|
|
11
|
+
replacement paths — the second citing a `package.json` that did not exist. Consume the
|
|
12
|
+
deterministic probe result, never re-derive it yourself.
|
|
13
|
+
|
|
14
|
+
`gsd-core/workflows/plan-phase.md` already runs the probe **before** spawning this checker and
|
|
15
|
+
interpolates the result into the verification prompt as `{VERIFY_PATHS}`, inside a
|
|
16
|
+
`<verify_command_path_probe>` block. This dimension reads that already-supplied JSON — it never
|
|
17
|
+
invokes `gsd_run check verify-command-paths` itself. If `{VERIFY_PATHS}` is absent from the
|
|
18
|
+
prompt, treat this dimension as silent (nothing to check) rather than trying to run the probe.
|
|
19
|
+
|
|
20
|
+
The probe never executes command text (PLAN.md is untrusted, LLM-authored). It recognizes two
|
|
21
|
+
grounded forms — a leading `cd <literal>` chain and `npm --prefix <literal>` — and refuses to
|
|
22
|
+
guess at anything else.
|
|
23
|
+
|
|
24
|
+
**Process:** for each row in `.commands`, act on `severity` only:
|
|
25
|
+
|
|
26
|
+
| `severity` | `reason` | Action |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `blocker` | `missing_dir` / `no_manifest` | **BLOCKER** — quote `rawTarget` and `target` verbatim |
|
|
29
|
+
| `warning` | `dynamic_path` / `outside_root` / `script_missing` / `manifest_unreadable` | **WARNING** |
|
|
30
|
+
| `none` | — | silent |
|
|
31
|
+
|
|
32
|
+
Rules:
|
|
33
|
+
- **Report, never prescribe.** State the target that failed to resolve and what was missing.
|
|
34
|
+
Choosing the replacement is the planner's job — it now receives the prior phase's proven
|
|
35
|
+
commands (see `prior_verify_commands` in the planning context).
|
|
36
|
+
- `status: pending_creation` means an earlier task in this phase creates that directory. **Not
|
|
37
|
+
a finding.** Say nothing.
|
|
38
|
+
- `unresolvable` means the probe could not ground the path (a variable, glob, substitution, or
|
|
39
|
+
`~`). That is a WARNING, never a BLOCKER — and never a licence to guess the literal path.
|
|
40
|
+
- A non-empty `readError` means the probe **could not look**. Report that as a WARNING in its
|
|
41
|
+
own words; it is not a clean bill of health.
|
|
42
|
+
- `MISSING …` sentinels are Dimension 8's business — this dimension stays silent on them.
|
|
@@ -14,7 +14,7 @@ The user-flow form mirrors what a real user does: open, fill, click, see. No HTT
|
|
|
14
14
|
## When this framing applies
|
|
15
15
|
|
|
16
16
|
The framing fires when:
|
|
17
|
-
- The phase under verification has `**Mode:** mvp` in ROADMAP.md (parsed via `
|
|
17
|
+
- The phase under verification has `**Mode:** mvp` in ROADMAP.md (parsed via `gsd_run query roadmap.get-phase --pick mode`).
|
|
18
18
|
- AND the phase has a user-story-formatted goal (set by `/gsd mvp-phase` per Phase 2): "As a [user role], I want to [capability], so that [outcome]."
|
|
19
19
|
|
|
20
20
|
If the phase has `mode: mvp` but the goal is NOT in user-story format, the verifier surfaces this as a discrepancy and asks the user to run `/gsd mvp-phase` to reformat the goal — same pattern as the planner agent under MVP_MODE (per `gsd-core/references/planner-mvp-mode.md`).
|
|
@@ -109,19 +109,19 @@ This ensures workstream scope chains automatically through the workflow:
|
|
|
109
109
|
## CLI Usage
|
|
110
110
|
|
|
111
111
|
```bash
|
|
112
|
-
# All
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
# All gsd_run query commands accept --ws
|
|
113
|
+
gsd_run query state.json --ws feature-a
|
|
114
|
+
gsd_run query find-phase 3 --ws feature-b
|
|
115
115
|
|
|
116
116
|
# Session-local switching without --ws on every command
|
|
117
|
-
GSD_SESSION_KEY=my-terminal-a
|
|
118
|
-
GSD_SESSION_KEY=my-terminal-a
|
|
119
|
-
GSD_SESSION_KEY=my-terminal-b
|
|
120
|
-
GSD_SESSION_KEY=my-terminal-b
|
|
117
|
+
GSD_SESSION_KEY=my-terminal-a gsd_run query workstream.set feature-a
|
|
118
|
+
GSD_SESSION_KEY=my-terminal-a gsd_run query state.json
|
|
119
|
+
GSD_SESSION_KEY=my-terminal-b gsd_run query workstream.set feature-b
|
|
120
|
+
GSD_SESSION_KEY=my-terminal-b gsd_run query state.json
|
|
121
121
|
|
|
122
122
|
# Workstream CRUD
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
123
|
+
gsd_run query workstream.create <name>
|
|
124
|
+
gsd_run query workstream.list
|
|
125
|
+
gsd_run query workstream.status <name>
|
|
126
|
+
gsd_run query workstream.complete <name>
|
|
127
127
|
```
|
|
@@ -18,7 +18,7 @@ These files live directly at `.planning/` — not inside phase subdirectories.
|
|
|
18
18
|
| `REQUIREMENTS.md` | `requirements.md` | `/gsd:new-milestone` | Functional requirements with traceability |
|
|
19
19
|
| `MILESTONES.md` | `milestone.md` | `/gsd:complete-milestone` | Log of completed milestones with accomplishments |
|
|
20
20
|
| `BACKLOG.md` | *(inline)* | `/gsd-add-backlog` | Pending ideas and deferred work |
|
|
21
|
-
| `LEARNINGS.md` | *(inline)* | `/gsd:extract-learnings`, `/gsd:execute-phase` | Phase retrospective learnings for future plans |
|
|
21
|
+
| `LEARNINGS.md` | *(inline)* | `/gsd:extract-learnings`, `/gsd:execute-phase` (gated: `features.global_learnings`) | Phase retrospective learnings for future plans |
|
|
22
22
|
| `THREADS.md` | *(inline)* | `/gsd:thread` | Persistent discussion threads |
|
|
23
23
|
| `config.json` | `config.json` | `/gsd:new-project`, `/gsd:health --repair` | Project-specific GSD configuration |
|
|
24
24
|
| `CLAUDE.md` | `claude-md.md` | `/gsd-profile` | Auto-assembled Claude Code context file |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
phase: {N}
|
|
3
|
-
slug: {phase-slug}
|
|
2
|
+
phase: "{N}"
|
|
3
|
+
slug: "{phase-slug}"
|
|
4
4
|
status: draft
|
|
5
5
|
# threats_open = count of OPEN threats at or above workflow.security_block_on severity (the blocking gate)
|
|
6
6
|
threats_open: 0
|
|
7
7
|
asvs_level: 1
|
|
8
|
-
created: {date}
|
|
8
|
+
created: "{date}"
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Phase {N} — Security
|