@opengsd/gsd-core 1.11.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +78 -42
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +0 -1
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +3 -1
- package/agents/gsd-plan-checker.md +91 -112
- package/agents/gsd-planner.md +20 -4
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +82 -7
- package/agents/gsd-ui-researcher.md +70 -3
- package/agents/gsd-verifier.md +24 -2
- package/bin/install.js +847 -200
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/phase.md +1 -1
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/quick.md +8 -4
- package/commands/gsd/surface.md +18 -8
- package/gsd-core/bin/gsd-tools.cjs +761 -100
- package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
- package/gsd-core/bin/lib/api-coverage.cjs +30 -9
- package/gsd-core/bin/lib/artifacts.cjs +2 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
- package/gsd-core/bin/lib/audit.cjs +163 -41
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +785 -144
- package/gsd-core/bin/lib/capability-state.cjs +25 -4
- package/gsd-core/bin/lib/capability-validator.cjs +321 -18
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +229 -6
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +877 -54
- package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
- package/gsd-core/bin/lib/config-loader.cjs +121 -29
- package/gsd-core/bin/lib/config.cjs +92 -2
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +118 -14
- package/gsd-core/bin/lib/decisions.cjs +213 -1
- package/gsd-core/bin/lib/edge-probe.cjs +23 -2
- package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
- package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +975 -326
- package/gsd-core/bin/lib/gap-checker.cjs +41 -8
- package/gsd-core/bin/lib/git-base-branch.cjs +182 -39
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +60 -14
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
- package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
- package/gsd-core/bin/lib/host-integration.cjs +96 -11
- package/gsd-core/bin/lib/init-command-router.cjs +132 -21
- package/gsd-core/bin/lib/init.cjs +252 -56
- package/gsd-core/bin/lib/install-engine.cjs +252 -15
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +78 -1
- package/gsd-core/bin/lib/install-profiles.cjs +100 -18
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +195 -15
- package/gsd-core/bin/lib/learnings.cjs +85 -14
- package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
- package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
- package/gsd-core/bin/lib/markdown-table.cjs +175 -4
- package/gsd-core/bin/lib/milestone.cjs +112 -7
- package/gsd-core/bin/lib/model-catalog.cjs +177 -19
- package/gsd-core/bin/lib/model-resolver.cjs +10 -28
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
- package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
- package/gsd-core/bin/lib/phase-id.cjs +321 -13
- package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
- package/gsd-core/bin/lib/phase-locator.cjs +138 -17
- package/gsd-core/bin/lib/phase.cjs +1175 -115
- package/gsd-core/bin/lib/plan-document.cjs +273 -0
- package/gsd-core/bin/lib/plan-scan.cjs +13 -2
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +165 -34
- package/gsd-core/bin/lib/planning-workspace.cjs +159 -28
- package/gsd-core/bin/lib/probe-core.cjs +4 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +62 -14
- package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
- package/gsd-core/bin/lib/roadmap-parser.cjs +577 -41
- package/gsd-core/bin/lib/roadmap.cjs +248 -64
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +329 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +320 -109
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +487 -83
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
- package/gsd-core/bin/lib/shell-command-projection.cjs +75 -8
- package/gsd-core/bin/lib/smart-entry.cjs +19 -31
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +47 -18
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +216 -5
- package/gsd-core/bin/lib/state-md-schema.cjs +231 -0
- package/gsd-core/bin/lib/state-transition.cjs +850 -145
- package/gsd-core/bin/lib/state.cjs +1629 -287
- package/gsd-core/bin/lib/surface.cjs +33 -10
- package/gsd-core/bin/lib/task-command-router.cjs +111 -1
- package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
- package/gsd-core/bin/lib/uat.cjs +2542 -387
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
- package/gsd-core/bin/lib/unusable-input.cjs +13 -0
- package/gsd-core/bin/lib/update-context.cjs +6 -2
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/README.md +43 -5
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -13
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +441 -56
- package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +185 -21
- package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
- package/gsd-core/references/agent-contracts.md +6 -5
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +37 -19
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/edge-probe.md +17 -5
- package/gsd-core/references/execute-mvp-tdd.md +18 -18
- package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/execute-phase-wave-guard.md +11 -9
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +3 -3
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +22 -0
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/nyquist-compliance.md +74 -0
- package/gsd-core/references/offer-next.md +3 -5
- package/gsd-core/references/phase-argument-parsing.md +3 -3
- package/gsd-core/references/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +76 -3
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +39 -9
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/tdd.md +15 -12
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +2 -2
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +11 -11
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/phase-prompt.md +7 -0
- package/gsd-core/templates/state.md +7 -0
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +3 -1
- package/gsd-core/workflows/add-phase.md +5 -3
- package/gsd-core/workflows/add-tests.md +4 -9
- package/gsd-core/workflows/add-todo.md +2 -2
- package/gsd-core/workflows/ai-integration-phase.md +5 -10
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +14 -3
- package/gsd-core/workflows/audit-milestone.md +11 -9
- package/gsd-core/workflows/audit-uat.md +19 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +12 -26
- package/gsd-core/workflows/check-todos.md +2 -2
- package/gsd-core/workflows/cleanup.md +3 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +16 -14
- package/gsd-core/workflows/code-review-fix.md +3 -1
- package/gsd-core/workflows/code-review.md +192 -69
- package/gsd-core/workflows/complete-milestone.md +28 -14
- package/gsd-core/workflows/debug.md +6 -4
- package/gsd-core/workflows/diagnose-issues.md +17 -7
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +3 -1
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -7
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +3 -1
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +3 -3
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +2 -2
- package/gsd-core/workflows/do.md +46 -19
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +3 -1
- package/gsd-core/workflows/eval-review.md +5 -10
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +129 -11
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +29 -5
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +4 -2
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +68 -66
- package/gsd-core/workflows/execute-plan.md +25 -20
- package/gsd-core/workflows/explore.md +3 -1
- package/gsd-core/workflows/extract-learnings.md +3 -1
- package/gsd-core/workflows/fast.md +8 -2
- package/gsd-core/workflows/forensics.md +3 -1
- package/gsd-core/workflows/graduation.md +6 -6
- package/gsd-core/workflows/health.md +4 -7
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +2 -0
- package/gsd-core/workflows/import.md +17 -14
- package/gsd-core/workflows/inbox.md +5 -6
- package/gsd-core/workflows/ingest-docs.md +45 -12
- package/gsd-core/workflows/insert-phase.md +7 -5
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +7 -3
- package/gsd-core/workflows/list-workspaces.md +3 -1
- package/gsd-core/workflows/manager.md +15 -26
- package/gsd-core/workflows/map-codebase.md +3 -1
- package/gsd-core/workflows/milestone-summary.md +3 -1
- package/gsd-core/workflows/mvp-phase.md +3 -3
- package/gsd-core/workflows/new-milestone.md +10 -22
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +17 -29
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +4 -2
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +20 -5
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +4 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +12 -3
- package/gsd-core/workflows/plan-phase.md +251 -54
- package/gsd-core/workflows/plan-review-convergence.md +148 -19
- package/gsd-core/workflows/plant-seed.md +3 -3
- package/gsd-core/workflows/pr-branch.md +195 -51
- package/gsd-core/workflows/profile-user.md +17 -15
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +52 -15
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +38 -5
- package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
- package/gsd-core/workflows/quick/steps/research-phase.md +5 -7
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +33 -32
- package/gsd-core/workflows/reapply-patches.md +2 -0
- package/gsd-core/workflows/remove-phase.md +6 -4
- package/gsd-core/workflows/remove-workspace.md +3 -3
- package/gsd-core/workflows/resume-project.md +14 -14
- package/gsd-core/workflows/review.md +404 -21
- package/gsd-core/workflows/scan.md +3 -1
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +9 -9
- package/gsd-core/workflows/settings-integrations.md +66 -32
- package/gsd-core/workflows/settings.md +4 -6
- package/gsd-core/workflows/ship.md +22 -16
- package/gsd-core/workflows/sketch-wrap-up.md +13 -17
- package/gsd-core/workflows/sketch.md +13 -19
- package/gsd-core/workflows/smart-entry.md +4 -6
- package/gsd-core/workflows/spec-phase.md +31 -4
- package/gsd-core/workflows/spike-wrap-up.md +9 -11
- package/gsd-core/workflows/spike.md +21 -32
- package/gsd-core/workflows/stats.md +4 -2
- package/gsd-core/workflows/sync-skills.md +13 -5
- package/gsd-core/workflows/thread.md +13 -7
- package/gsd-core/workflows/transition.md +7 -5
- package/gsd-core/workflows/ui-phase.md +36 -21
- package/gsd-core/workflows/ui-review.md +7 -11
- package/gsd-core/workflows/ultraplan-phase.md +7 -13
- package/gsd-core/workflows/undo.md +9 -17
- package/gsd-core/workflows/update.md +47 -48
- package/gsd-core/workflows/validate-phase.md +3 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +106 -21
- package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +302 -22
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +77 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +46 -12
- package/hooks/dist/gsd-read-guard.js +18 -7
- package/hooks/dist/gsd-read-injection-scanner.js +22 -13
- package/hooks/dist/gsd-secret-read-guard.js +1079 -0
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +222 -29
- package/hooks/dist/gsd-validate-commit.sh +523 -12
- package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
- package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
- package/hooks/dist/gsd-workflow-guard.js +36 -17
- package/hooks/dist/gsd-worktree-path-guard.js +36 -21
- package/hooks/dist/gsd-write-guard.js +35 -25
- package/hooks/dist/lib/cli-exit.js +560 -0
- package/hooks/dist/lib/exit-code-registry.js +98 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/managed-hooks-registry.cjs +4 -0
- package/hooks/gsd-agent-isolation-guard.js +77 -38
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +302 -22
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +3 -1
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +28 -23
- package/hooks/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +77 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +46 -12
- package/hooks/gsd-read-guard.js +18 -7
- package/hooks/gsd-read-injection-scanner.js +22 -13
- package/hooks/gsd-secret-read-guard.js +1079 -0
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +222 -29
- package/hooks/gsd-validate-commit.sh +523 -12
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +36 -17
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/hooks.json +6 -0
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/managed-hooks-registry.cjs +4 -0
- package/package.json +14 -9
- package/scripts/base64-scan.sh +74 -12
- package/scripts/build-hooks.js +12 -0
- package/scripts/check-glossary-refs.cjs +77 -15
- package/scripts/check-mutation-score-ratchet.cjs +156 -0
- package/scripts/ci-check-job-near-cap.cjs +49 -0
- package/scripts/ci-pr-mergeability.cjs +262 -0
- package/scripts/ci-test-scope.cjs +52 -12
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/docs-guard-registry.cjs +406 -0
- package/scripts/gen-capability-registry.cjs +8 -6
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-loop-host-contract.cjs +189 -4
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +32 -2
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +198 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +45 -14
- package/scripts/lint-phase-id-drift.cjs +133 -8
- package/scripts/lint-planning-prompt-drift.cjs +38 -1
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-removed-but-needed.cjs +184 -16
- package/scripts/lint-response-language-coverage.cjs +524 -0
- package/scripts/lint-seam-enforcement.cjs +182 -0
- package/scripts/lint-slug-derivation-drift.cjs +921 -0
- package/scripts/lint-source-test-name-collision.cjs +241 -0
- package/scripts/lint-state-write-path-drift.cjs +337 -432
- package/scripts/lint-test-file-count.allowlist.json +124 -4
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +51 -64
- package/scripts/lint-vendored-deps.cjs +208 -35
- package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +83 -14
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +22 -3
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -1
- package/skills/gsd-quick/SKILL.md +8 -4
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -109
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/state-write-path-drift-baseline.json +0 -19
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
**If `response_language` is set:** User-facing orchestrator output (questions, narration, report-template prose) in `{response_language}`; technical terms, code, file paths, and subagent prompts stay in English. Pass `response_language: {value}` into every spawned subagent prompt so any user-facing output they produce stays in the configured language.
|
|
4
4
|
|
|
5
|
+
**The `gsd-verifier` subagent has no workflow file of its own (#2529):** the `verify_phase_goal` step reaches it by dispatch, not by reading a workflow, so there is no file in which to place a directive — the dispatch prompt is the only place its coverage can live. That prompt MUST carry this line verbatim, immediately after `Create VERIFICATION.md.`:
|
|
6
|
+
|
|
7
|
+
`Use response_language {response_language} for all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code and paths.`
|
|
8
|
+
|
|
9
|
+
It lives here rather than inline in `workflows/execute-phase.md` for the same reason the rest of this file does — that workflow is held under the frozen byte ceiling named below, and this `@-reference` is eager, so the orchestrator loads this instruction with the workflow either way.
|
|
10
|
+
|
|
5
11
|
The literal report templates embedded in this workflow (`## Execution Plan`, `## Phase {X}: {Name} Execution Complete`, `## ⚠ Phase {X}: {Name} — Gaps Found`, etc.) are a structural source, not literal output to copy verbatim — render their prose translated into `{response_language}` while keeping headings' structural markers, table columns, IDs, commands, and file paths unchanged.
|
|
6
12
|
|
|
7
13
|
This directive was extracted from `workflows/execute-phase.md` to keep that file under the frozen pre-phase-6 byte ceiling (ADR-857 Phase 6 capstone, `tests/claude-orchestration.test.cjs`). The `@-reference` is eager, so the runtime still loads this content alongside the workflow — the extraction is purely a file-size discipline, not a lazy-load optimization.
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
if [ "$ISOLATION" = "harness-worktree" ] && [ "${USE_WORKTREES:-true}" != "false" ]; then
|
|
16
|
-
_WAVE_DEGRADE=$(gsd_run query worktree.base-check --pick shouldDegrade 2>/dev/null || true)
|
|
16
|
+
_WAVE_DEGRADE=$(gsd_run query worktree.base-check --mode "$ISOLATION" --pick shouldDegrade 2>/dev/null || true)
|
|
17
17
|
if [ "$_WAVE_DEGRADE" = "true" ]; then
|
|
18
|
-
_WAVE_DEGRADE_MSG=$(gsd_run query worktree.base-check --pick message 2>/dev/null || true)
|
|
18
|
+
_WAVE_DEGRADE_MSG=$(gsd_run query worktree.base-check --mode "$ISOLATION" --pick message 2>/dev/null || true)
|
|
19
19
|
[ -n "$_WAVE_DEGRADE_MSG" ] && printf '%s\n' "$_WAVE_DEGRADE_MSG" >&2
|
|
20
20
|
echo "⚠ [#1369] Worktree fork base diverged from orchestrator HEAD (wave merges advanced HEAD past origin/HEAD). Auto-degrading to sequential mode for this wave to avoid base-mismatch halts." >&2
|
|
21
21
|
# Both must move together (#2652): dispatch keys on ISOLATION.
|
|
@@ -27,11 +27,13 @@
|
|
|
27
27
|
|
|
28
28
|
If `shouldDegrade` is `true`, override `USE_WORKTREES=false` for **this wave only** —
|
|
29
29
|
all plans in this wave execute sequentially on the main working tree. Later waves re-run
|
|
30
|
-
this check and may re-enable worktree isolation
|
|
31
|
-
`git fetch` or
|
|
30
|
+
this check and may re-enable worktree isolation once `origin/HEAD` matches HEAD again
|
|
31
|
+
(e.g. via `git fetch` or a push that advances it).
|
|
32
32
|
|
|
33
|
-
**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
**Why `worktree.baseRef:"head"` does not avoid this degrade (#48, #3659):** the runtime
|
|
34
|
+
harness does not read project-settings `baseRef` — an isolated dispatch always forks from
|
|
35
|
+
`origin/HEAD` regardless of the setting, so the check compares against the real fork base
|
|
36
|
+
and degrades whenever HEAD has diverged. Parallel worktrees return once HEAD is
|
|
37
|
+
merged/pushed so `origin/HEAD` matches it. The setting still restores parallel execution
|
|
38
|
+
on runtimes where GSD itself creates the worktrees (orchestrator-managed isolation:
|
|
39
|
+
Codex, OpenCode, Kimi, Kimi Code). See #683 for the base-ref configuration detail.
|
|
@@ -69,6 +69,48 @@
|
|
|
69
69
|
- MAYBE → Rule 4 (ask the user)
|
|
70
70
|
- NO → Out of scope (log to deferred-items.md)
|
|
71
71
|
|
|
72
|
+
### Writing `deferred-items.md`
|
|
73
|
+
|
|
74
|
+
The file has no template — write it by hand, as a Markdown list under a
|
|
75
|
+
`## Deferred Items` heading. What counts as one entry:
|
|
76
|
+
|
|
77
|
+
- One entry per top-level list item. `-`, `*` and `+` all count, and so does a
|
|
78
|
+
dot-terminated ordered marker (`1.`) when the list starts at `0.` or `1.`, or
|
|
79
|
+
continues a list already open at that level — a sentence that merely opens
|
|
80
|
+
with a number (`2026. was a bad year`) is prose, not an item, and so is a
|
|
81
|
+
list numbered from `2.` upward until its first `0.`/`1.` line. `1)` is not a
|
|
82
|
+
marker here, and neither is an ordinal past nine digits (`999999999.`
|
|
83
|
+
counts, `1234567890.` does not).
|
|
84
|
+
- Continuation lines indent beneath their entry. Fields go on those lines:
|
|
85
|
+
`status: resolved`, or the bolded `**Status:** resolved` convention. **The
|
|
86
|
+
BARE key is lower-case only** — write `Status: resolved` without the bold and
|
|
87
|
+
the field is not read, so the entry stays open with no warning. Bold it or
|
|
88
|
+
lower-case it. The bolded form matches the key case-insensitively, and the
|
|
89
|
+
VALUE is case-insensitive in both forms.
|
|
90
|
+
- A `* * *` or `- - -` separator closes the list rather than opening an entry,
|
|
91
|
+
and nothing inside a fenced code block is an entry or a field — at any indent,
|
|
92
|
+
including one deeper than CommonMark's three-space cap, which is what a fence
|
|
93
|
+
written under a nested bullet looks like. A fence that is never closed runs to
|
|
94
|
+
the end of its own entry and no further, so an unclosed delimiter cannot hide
|
|
95
|
+
the entries after it — a closed pair of delimiters is a fence, whatever sits
|
|
96
|
+
between them.
|
|
97
|
+
|
|
98
|
+
An entry is RESOLVED only if it carries an explicit `status: resolved`. Anything
|
|
99
|
+
else — including an entry with no `status:` at all — stays open and will surface
|
|
100
|
+
in `audit-open`, `audit-uat` and `complete-milestone`. That is deliberate: the
|
|
101
|
+
scanner never silently drops a possibly-open item. What it reads as something
|
|
102
|
+
other than an item is the short list above — a fenced line, a separator, and an
|
|
103
|
+
ordered list numbered from `2.` upward at a paragraph position — and nothing
|
|
104
|
+
else.
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
## Deferred Items
|
|
108
|
+
|
|
109
|
+
- Retry budget is hardcoded at 3
|
|
110
|
+
status: open
|
|
111
|
+
**What:** `fetchWithRetry` ignores the configured budget.
|
|
112
|
+
```
|
|
113
|
+
|
|
72
114
|
## Checkpoint Examples
|
|
73
115
|
|
|
74
116
|
### Good checkpoint placement
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Check 8f — Stated Failing Direction (#3172)
|
|
2
|
+
|
|
3
|
+
> Reference file for gsd-plan-checker agent. Loaded on-demand via `@` reference.
|
|
4
|
+
|
|
5
|
+
**Question:** For each runnable `<automated>` command, does the plan say what output constitutes
|
|
6
|
+
failure?
|
|
7
|
+
|
|
8
|
+
Checks 8a–8d ask whether an acceptance command is *present*, and Verify Command Path
|
|
9
|
+
Resolvability asks whether its target *resolves*. This one asks whether the command is
|
|
10
|
+
**falsifiable at all**. A command with no expressible failure mode is not an acceptance test —
|
|
11
|
+
it reads as rigour and delivers none.
|
|
12
|
+
|
|
13
|
+
#3172: a planner emitted 21 `<automated>` commands that could not run. Cargo exited non-zero, so
|
|
14
|
+
that instance failed loudly — luck, not design. The same class of error with a command that
|
|
15
|
+
exits 0 on a no-op passes green and silently. Requiring a stated failing direction is the only
|
|
16
|
+
shape that catches the silent case, because it forces the plan to name the failure signal rather
|
|
17
|
+
than assume the command has one.
|
|
18
|
+
|
|
19
|
+
## The contract
|
|
20
|
+
|
|
21
|
+
```xml
|
|
22
|
+
<verify>
|
|
23
|
+
<automated>npm --prefix apps/api test -- auth.spec.ts</automated>
|
|
24
|
+
<fails_when>non-zero exit, or "0 passed" in the summary line</fails_when>
|
|
25
|
+
</verify>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Within one `<task>`, each `<fails_when>` binds to the nearest **preceding** `<automated>`; a
|
|
29
|
+
command's binding statement is the **first** one that follows it. N runnable commands need N
|
|
30
|
+
statements.
|
|
31
|
+
|
|
32
|
+
## Do not hand-reason this
|
|
33
|
+
|
|
34
|
+
`gsd-core/workflows/plan-phase.md` runs the deterministic probe **before** spawning this checker
|
|
35
|
+
and interpolates the result into the verification prompt as `{FAILING_DIRECTIONS}`, inside a
|
|
36
|
+
`<failing_direction_probe>` block. This check reads that already-supplied JSON — it never invokes
|
|
37
|
+
`gsd_run check verify-failure-directions` itself. If `{FAILING_DIRECTIONS}` is absent from the
|
|
38
|
+
prompt, treat this check as silent (nothing to check) rather than trying to run the probe.
|
|
39
|
+
|
|
40
|
+
The probe never executes command text (PLAN.md is untrusted, LLM-authored). It is a **presence**
|
|
41
|
+
recognizer: it proves a statement exists and is not a placeholder. It does not judge whether the
|
|
42
|
+
statement names the *right* signal — that judgment is yours, below.
|
|
43
|
+
|
|
44
|
+
## Process — act on `severity` only
|
|
45
|
+
|
|
46
|
+
| `severity` | `status` | Action |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| `blocker` | `missing` | **BLOCKER** — quote the `command` verbatim: it has no stated failing direction |
|
|
49
|
+
| `blocker` | `empty` | **BLOCKER** — a `<fails_when>` is present but blank |
|
|
50
|
+
| `blocker` | `placeholder` | **BLOCKER** — quote the placeholder text; `TBD` is not a failure signal |
|
|
51
|
+
| `warning` | `orphan` | **WARNING** — a `<fails_when>` that follows no command; it satisfies nothing |
|
|
52
|
+
| `none` | `ok` / `sentinel` | silent |
|
|
53
|
+
|
|
54
|
+
Rules:
|
|
55
|
+
|
|
56
|
+
- **Report, never prescribe.** State which command has no stated failure mode. Do **not** author
|
|
57
|
+
the statement for the planner. A prescribed statement is copied verbatim and carries zero
|
|
58
|
+
information — that reproduces #3172 one level up, exactly as the #2401 probe refuses to
|
|
59
|
+
prescribe a replacement path.
|
|
60
|
+
- `status: sentinel` is a `MISSING — Wave 0 must create …` placeholder command. It is not
|
|
61
|
+
runnable, so it has no failure mode to state. **Not a finding.** Say nothing; checks 8a/8d
|
|
62
|
+
own it.
|
|
63
|
+
- A non-empty `readError` means the probe **could not look**. Report that as a WARNING in its own
|
|
64
|
+
words; it is not a clean bill of health.
|
|
65
|
+
- **Your added judgment, on `ok` rows only:** a statement that is present, non-empty and
|
|
66
|
+
non-placeholder can still be vacuous — *"the command fails"*, *"it doesn't work"*, *"an error
|
|
67
|
+
occurs"* restate the word "failure" without naming an observable signal. Raise those as a
|
|
68
|
+
**WARNING**, naming what a usable statement looks like (an exit code, a string in the output, a
|
|
69
|
+
missing line). Do **not** escalate a vacuous statement to BLOCKER: the deterministic layer owns
|
|
70
|
+
the blockers so that a BLOCKER is always reproducible, and prose judgment stays advisory.
|
|
71
|
+
- **Length is not a signal.** `<fails_when>non-zero exit</fails_when>` is a complete failing
|
|
72
|
+
direction. There is no minimum length, word count, or required keyword.
|
|
73
|
+
|
|
74
|
+
## Not in scope
|
|
75
|
+
|
|
76
|
+
A command that runs successfully and asserts nothing (a test-name filter matching zero tests and
|
|
77
|
+
exiting 0) is the adjacent **vacuous pass** problem. It is explicitly out of scope for this
|
|
78
|
+
check — see the issue's "Out of scope". Do not report it here.
|
|
@@ -17,13 +17,13 @@ last_calibrated: 2026-03-24
|
|
|
17
17
|
> ```yaml
|
|
18
18
|
> issues:
|
|
19
19
|
> - dimension: task_completeness
|
|
20
|
-
> severity:
|
|
21
|
-
>
|
|
22
|
-
>
|
|
23
|
-
>
|
|
20
|
+
> severity: blocker
|
|
21
|
+
> required_property: "Every task action names its target files, and any functions it creates"
|
|
22
|
+
> description: "Task T1 action says 'implement the authentication feature' without naming target files, functions to create, or middleware to apply. Executor cannot determine what to build."
|
|
23
|
+
> fix_hint: "Specify: create authMiddleware in src/middleware/auth.js, apply to routes in src/routes/api.js lines 12-45, verify with integration test"
|
|
24
24
|
> ```
|
|
25
25
|
|
|
26
|
-
**Why this is good:** The checker cited the specific dimension (task_completeness), quoted the problematic text, explained why it is a blocker (executor cannot determine what to build), and gave a concrete
|
|
26
|
+
**Why this is good:** The checker stated the invariant that failed (`required_property`), cited the specific dimension (task_completeness), quoted the problematic text as evidence, explained why it is a blocker (executor cannot determine what to build), and gave a concrete example route with file paths and function names. The finding is actionable -- and because the binding payload is the property rather than the example, the planner may satisfy it a different way.
|
|
27
27
|
|
|
28
28
|
### Example 2: BLOCKER for same-wave file conflict between two plans
|
|
29
29
|
|
|
@@ -34,13 +34,13 @@ last_calibrated: 2026-03-24
|
|
|
34
34
|
> ```yaml
|
|
35
35
|
> issues:
|
|
36
36
|
> - dimension: dependency_correctness
|
|
37
|
-
> severity:
|
|
38
|
-
>
|
|
39
|
-
>
|
|
40
|
-
>
|
|
37
|
+
> severity: blocker
|
|
38
|
+
> required_property: "Same-wave plans never modify the same file without a declared dependency"
|
|
39
|
+
> description: "Plans 01 and 02 both modify gsd-core/workflows/execute-phase.md in wave 1 with no depends_on relationship. Concurrent execution will cause merge conflicts or lost changes."
|
|
40
|
+
> fix_hint: "Either move Plan 02 to wave 2 with depends_on: ['01'] or consolidate the file changes into a single plan"
|
|
41
41
|
> ```
|
|
42
42
|
|
|
43
|
-
**Why this is good:** The checker identified a real structural problem -- two plans modifying the same file in the same wave without a dependency relationship. It cited dependency_correctness, named both plans
|
|
43
|
+
**Why this is good:** The checker identified a real structural problem -- two plans modifying the same file in the same wave without a dependency relationship. It stated the property that must hold, cited dependency_correctness, named both plans and the conflicting file, and offered two example routes -- neither of which binds, since either makes the property true.
|
|
44
44
|
|
|
45
45
|
## Negative Examples
|
|
46
46
|
|
|
@@ -64,10 +64,10 @@ last_calibrated: 2026-03-24
|
|
|
64
64
|
> ```yaml
|
|
65
65
|
> issues:
|
|
66
66
|
> - dimension: scope_sanity
|
|
67
|
-
> severity:
|
|
68
|
-
>
|
|
69
|
-
>
|
|
70
|
-
>
|
|
67
|
+
> severity: info
|
|
68
|
+
> required_property: "Each plan stays within the per-plan context budget"
|
|
69
|
+
> description: "Plan has 3 tasks -- consider splitting into smaller plans for faster iteration"
|
|
70
|
+
> fix_hint: "Split tasks into separate plans"
|
|
71
71
|
> ```
|
|
72
72
|
|
|
73
|
-
**Why this is bad:** The checker flagged a non-issue. scope_sanity allows 2-3 tasks per plan -- 3 tasks is within limits. The checker applied a personal preference ("smaller is better") rather than the documented threshold. This wastes planner time on false positives and erodes trust in the checker's judgment. A correct check would produce no issue for this plan.
|
|
73
|
+
**Why this is bad:** The checker flagged a non-issue. The `required_property` it states is already satisfied, which is the tell: scope_sanity allows 2-3 tasks per plan -- 3 tasks is within limits. The checker applied a personal preference ("smaller is better") rather than the documented threshold. This wastes planner time on false positives and erodes trust in the checker's judgment. A correct check would produce no issue for this plan.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Reusable prompt patterns for structured gate checks in workflows and agents.
|
|
4
4
|
|
|
5
|
-
**For checkpoint
|
|
5
|
+
**For checkpoint format details, see `gsd-core/references/ui-brand.md`** -- a checkpoint is a `### CHECKPOINT: {Type}` heading followed by its content, then a `---` break and the bolded action prompt. Never a fixed-width drawn border: it wraps in a narrow pane.
|
|
6
6
|
|
|
7
7
|
## Rules
|
|
8
8
|
|
|
@@ -51,7 +51,7 @@ Phases:
|
|
|
51
51
|
What to commit:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
|
|
54
|
+
gsd_run query commit "docs: initialize [project-name] ([N] phases)" --files .planning/
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
</format>
|
|
@@ -136,7 +136,7 @@ SUMMARY: .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md
|
|
|
136
136
|
What to commit:
|
|
137
137
|
|
|
138
138
|
```bash
|
|
139
|
-
|
|
139
|
+
gsd_run query commit "docs({phase}-{plan}): complete [plan-name] plan" --files .planning/phases/XX-name/{phase}-{plan}-PLAN.md .planning/phases/XX-name/{phase}-{plan}-SUMMARY.md .planning/STATE.md .planning/ROADMAP.md
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
**Note:** Code files NOT included - already committed per-task.
|
|
@@ -156,7 +156,7 @@ Current: [task name]
|
|
|
156
156
|
What to commit:
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
|
-
|
|
159
|
+
gsd_run query commit "wip: [phase-name] paused at task [X]/[Y]" --files .planning/
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
</format>
|
|
@@ -279,7 +279,7 @@ Set `commit_docs: false` so planning docs stay local and are not committed to an
|
|
|
279
279
|
|
|
280
280
|
1. **Auto-detection:** During `/gsd:new-project`, directories with their own `.git` folder are detected and offered for selection as sub-repos. On subsequent runs, `loadConfig` auto-syncs the `sub_repos` list with the filesystem — adding newly created repos and removing deleted ones. This means `config.json` may be rewritten automatically when repos change on disk.
|
|
281
281
|
2. **File grouping:** Code files are grouped by their sub-repo prefix (e.g., `backend/src/api/users.ts` belongs to the `backend/` repo).
|
|
282
|
-
3. **Independent commits:** Each sub-repo receives its own atomic commit via `
|
|
282
|
+
3. **Independent commits:** Each sub-repo receives its own atomic commit via `gsd_run commit-to-subrepo`. File paths are made relative to the sub-repo root before staging.
|
|
283
283
|
4. **Planning stays local:** The `.planning/` directory is not committed; it acts as cross-repo coordination.
|
|
284
284
|
|
|
285
285
|
### Commit Routing
|
|
@@ -287,7 +287,7 @@ Set `commit_docs: false` so planning docs stay local and are not committed to an
|
|
|
287
287
|
Instead of the standard `commit` command, use `commit-to-subrepo` when `sub_repos` is configured:
|
|
288
288
|
|
|
289
289
|
```bash
|
|
290
|
-
|
|
290
|
+
gsd_run query commit-to-subrepo "feat(02-01): add user API" \
|
|
291
291
|
--files backend/src/api/users.ts backend/src/types/user.ts frontend/src/components/UserForm.tsx
|
|
292
292
|
```
|
|
293
293
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Git Planning Commit
|
|
2
2
|
|
|
3
|
-
Commit planning artifacts via `
|
|
3
|
+
Commit planning artifacts via `gsd_run query commit`, which checks `commit_docs` config and gitignore status.
|
|
4
4
|
|
|
5
5
|
## Commit via CLI
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ Pass the message first, then file paths via `--files`. Both `commit` and `commit
|
|
|
9
9
|
Always use this for `.planning/` files — it handles `commit_docs` and gitignore checks automatically:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
|
|
12
|
+
gsd_run query commit "docs({scope}): {description}" --files .planning/STATE.md .planning/ROADMAP.md
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
The CLI will return `skipped` (with reason) if `commit_docs` is `false`, `.planning/` is gitignored, or a per-phase `phase_commit_docs.<phase-id>` override resolves `false` for the phase being committed. No manual conditional checks needed.
|
|
@@ -19,7 +19,7 @@ The CLI will return `skipped` (with reason) if `commit_docs` is `false`, `.plann
|
|
|
19
19
|
To fold `.planning/` file changes into the previous commit:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
|
|
22
|
+
gsd_run query commit "" --files .planning/codebase/*.md --amend
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
## Commit Message Patterns
|
|
@@ -4,5 +4,5 @@ Use this bootstrap block when a workflow must call `gsd-tools` from the active w
|
|
|
4
4
|
Keep this resolver centralized; workflows should reference this file instead of copying the shell probe.
|
|
5
5
|
|
|
6
6
|
```bash
|
|
7
|
-
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$
|
|
7
|
+
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; _gsd_at() { for _p; do if [ -f "$_p" ]; then GSD_TOOLS="$_p"; return 0; fi; done; return 1; }; if _gsd_at "${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif unset -f gsd_run; _G="$(command -v gsd_run)"; then GSD_TOOLS="$_G"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif _gsd_at "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd_run is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; GSD_IDENTITY_STATUS=unverified; case "$(gsd_run runtime-identity --raw 2>/dev/null || true)" in '{"packageName":"@opengsd/gsd-core"'*'}') GSD_IDENTITY_STATUS=ok;; esac; export GSD_IDENTITY_STATUS; [ "$GSD_IDENTITY_STATUS" = ok ] || echo "WARNING: \"$GSD_TOOLS\" did not prove it is @opengsd/gsd-core - it is either a different package or an @opengsd/gsd-core older than the runtime-identity verb. See docs/how-to/diagnose-a-foreign-gsd-tools.md" >&2; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
8
8
|
```
|
|
@@ -96,3 +96,25 @@ Honor `onError` if the check itself errors: `skip` means treat as non-blocking a
|
|
|
96
96
|
|
|
97
97
|
If `activeHooks` is absent, null, or an empty array, skip silently and continue to the next
|
|
98
98
|
step in the workflow. No output to the user is needed.
|
|
99
|
+
|
|
100
|
+
## The `execute:task` point (a different shape)
|
|
101
|
+
|
|
102
|
+
`execute:task` exists below wave granularity — it is evaluated once per task, inside the
|
|
103
|
+
`execute:wave:pre` / `execute:wave:post` bracket, immediately before that task's `read_first`
|
|
104
|
+
gate. It is **not** one of the 12 points documented above, does not appear in `steps` /
|
|
105
|
+
`contributions` / `gates`, and is never dispatched through `gsd_run loop render-hooks <point>` or
|
|
106
|
+
this file's `activeHooks` envelope.
|
|
107
|
+
|
|
108
|
+
Instead, a capability declares task-content resolution directly in its manifest body via
|
|
109
|
+
`taskContentResolver` (`trackerPrefix` + a bounded `invoke`) — see
|
|
110
|
+
[Capability manifest reference](../../docs/reference/capability-manifest.md). `execute-plan.md`'s
|
|
111
|
+
per-task loop calls `gsd_run task resolve-content --plan <path> --task-id <tracker-id> --raw`
|
|
112
|
+
directly, an unconditional, required subprocess invocation with a real, binding exit code —
|
|
113
|
+
never a prose-dispatched `step`/`gate` entry chosen from an `activeHooks` array.
|
|
114
|
+
|
|
115
|
+
This point always runs — there is no `when` config gate and no autonomous-mode elision. That is
|
|
116
|
+
deliberate, not an oversight: the twelve points above are best-effort prose dispatch, which
|
|
117
|
+
`execute:task`'s hard-halt safety property cannot be built on top of (a missed dispatch is
|
|
118
|
+
indistinguishable from a legitimate resolver-empty fallback). See
|
|
119
|
+
[ADR-3646](../../docs/adr/3646-per-task-content-resolution-seam.md) for the full rationale,
|
|
120
|
+
including why a `kind: "gate"` shape was rejected outright.
|
|
@@ -228,7 +228,7 @@ the next spawn. `effort` (claude runtime) has its own cascade
|
|
|
228
228
|
install time into the `effort:` frontmatter key of
|
|
229
229
|
`~/.claude/agents/gsd-*.md` — Claude Code's Agent tool has no per-spawn
|
|
230
230
|
effort parameter, so per-agent frontmatter is the only channel. An effort
|
|
231
|
-
config change has no effect until `
|
|
231
|
+
config change has no effect until `gsd_run effort sync --apply`
|
|
232
232
|
re-syncs the agent files. Codex agents instead pin
|
|
233
233
|
`model_reasoning_effort` in `~/.codex/agents/*.toml` at install time.
|
|
234
234
|
|
|
@@ -12,7 +12,7 @@ Canonical domain terms for the concepts named below live in [CONTEXT.md](../../C
|
|
|
12
12
|
| `gsd-core/references/skeleton-template.md` | **Template.** Shape of `SKELETON.md` for new-project Phase 1 under `--mvp`. | `gsd-planner` agent when the Walking Skeleton gate fires |
|
|
13
13
|
| `gsd-core/references/user-story-template.md` | **Template.** Format and slot definitions for `As a / I want to / So that`. | `gsd-mvp-phase` workflow during interactive prompting; `gsd-planner` when emitting the `## Phase Goal` header |
|
|
14
14
|
| `gsd-core/references/spidr-splitting.md` | **Splitting discipline.** Five-axis decomposition (Spike, Paths, Interfaces, Data, Rules) for stories too large for one phase. | `gsd-mvp-phase` workflow when the user story exceeds size threshold |
|
|
15
|
-
| `gsd-core/references/execute-mvp-tdd.md` | **Gate.**
|
|
15
|
+
| `gsd-core/references/execute-mvp-tdd.md` | **Gate.** TDD runtime gate semantics: when it fires, what it checks, halt-and-report protocol, end-of-phase blocking escalation, Behavior-Adding Task definition. | `gsd-executor` agent when `TDD_MODE=true` (#4011) |
|
|
16
16
|
| `gsd-core/references/verify-mvp-mode.md` | **UAT framing.** Three-section UAT structure (user-flow → technical → coverage), anti-patterns, `User Flow Coverage` section in VERIFICATION.md. | `gsd-verifier` agent when the phase under verification has `mode: mvp` |
|
|
17
17
|
|
|
18
18
|
## Concept-to-file map
|
|
@@ -33,7 +33,7 @@ If you're looking for the canonical statement of a concept, this is where to fin
|
|
|
33
33
|
|
|
34
34
|
- **`--mvp` and `--prd <file>` together on Phase 1.** Both paths converge at the planner spawn. The PRD express path creates `CONTEXT.md` from the PRD file and continues to the research step; the Walking Skeleton gate fires independently when Phase 1 + new project + `--mvp`. The planner therefore receives both `WALKING_SKELETON=true` and PRD-derived context. This is intentional: the PRD informs what the skeleton should prove.
|
|
35
35
|
- **`MVP_MODE` is all-or-nothing per phase, not per task.** A phase is either MVP-mode or standard. Mixed-mode phases are not supported (PRD #2826 Q1).
|
|
36
|
-
- **`TDD_MODE` is independent of `MVP_MODE`.** TDD can be on without MVP, MVP can be on without TDD.
|
|
36
|
+
- **`TDD_MODE` is independent of `MVP_MODE`.** TDD can be on without MVP, MVP can be on without TDD. The TDD runtime gate activates on `TDD_MODE` alone (#4011); MVP mode remains free to imply TDD without being required by it.
|
|
37
37
|
- **The `gsd-roadmapper` agent makes the MVP/standard decision once at project init** based on `PROJECT_MODE`. Per-phase opt-in/out happens later via `/gsd:mvp-phase` or `/gsd-edit-phase`.
|
|
38
38
|
|
|
39
39
|
## Tests
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Dimension 8 — Nyquist Compliance (checks 8a–8e)
|
|
2
|
+
|
|
3
|
+
> Reference file for gsd-plan-checker agent. Loaded on-demand via `@` reference.
|
|
4
|
+
> Extracted from `agents/gsd-plan-checker.md` in #3172 to stay under the agent's
|
|
5
|
+
> LARGE size cap. Checks 8a-8e are moved unchanged; the only edit is to the
|
|
6
|
+
> Dimension 8 Output table, which gains a `Failing Direction` column and a
|
|
7
|
+
> stated/runnable tally so check 8f's result is reported alongside them.
|
|
8
|
+
> Check 8f itself lives in its own reference:
|
|
9
|
+
> @gsd-core/references/failing-direction.md
|
|
10
|
+
|
|
11
|
+
**Skip if:** `workflow.nyquist_validation` is explicitly set to `false` in config.json
|
|
12
|
+
(absent key = enabled), phase has no RESEARCH.md, or RESEARCH.md has no "Validation
|
|
13
|
+
Architecture" section. Output: "Dimension 8: SKIPPED (nyquist_validation disabled or not
|
|
14
|
+
applicable)"
|
|
15
|
+
|
|
16
|
+
## Check 8e — VALIDATION.md Existence (Gate)
|
|
17
|
+
|
|
18
|
+
Before running checks 8a-8d, verify VALIDATION.md exists:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
ls "${PHASE_DIR}"/*-VALIDATION.md 2>/dev/null
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**If missing:** **BLOCKING FAIL** — "VALIDATION.md not found for phase {N}. Re-run
|
|
25
|
+
`/gsd:plan-phase {N} --research` to regenerate."
|
|
26
|
+
Skip checks 8a-8d entirely. Report Dimension 8 as FAIL with this single issue.
|
|
27
|
+
|
|
28
|
+
**If exists:** Proceed to checks 8a-8d.
|
|
29
|
+
|
|
30
|
+
## Check 8a — Automated Verify Presence
|
|
31
|
+
|
|
32
|
+
For each `<task>` in each plan:
|
|
33
|
+
- `<verify>` must contain `<automated>` command, OR a Wave 0 dependency that creates the test
|
|
34
|
+
first
|
|
35
|
+
- If `<automated>` is absent with no Wave 0 dependency → **BLOCKING FAIL**
|
|
36
|
+
- If `<automated>` says "MISSING", a Wave 0 task must reference the same test file path →
|
|
37
|
+
**BLOCKING FAIL** if link broken
|
|
38
|
+
|
|
39
|
+
## Check 8b — Feedback Latency Assessment
|
|
40
|
+
|
|
41
|
+
For each `<automated>` command:
|
|
42
|
+
- Full E2E suite (playwright, cypress, selenium) → **WARNING** — suggest faster unit/smoke test
|
|
43
|
+
- Watch mode flags (`--watchAll`) → **BLOCKING FAIL**
|
|
44
|
+
- Delays > 30 seconds → **WARNING**
|
|
45
|
+
|
|
46
|
+
## Check 8c — Sampling Continuity
|
|
47
|
+
|
|
48
|
+
Map tasks to waves. Per wave, any consecutive window of 3 implementation tasks must have ≥2
|
|
49
|
+
with `<automated>` verify. 3 consecutive without → **BLOCKING FAIL**.
|
|
50
|
+
|
|
51
|
+
## Check 8d — Wave 0 Completeness
|
|
52
|
+
|
|
53
|
+
For each `<automated>MISSING</automated>` reference:
|
|
54
|
+
- Wave 0 task must exist with matching `<files>` path
|
|
55
|
+
- Wave 0 plan must execute before dependent task
|
|
56
|
+
- Missing match → **BLOCKING FAIL**
|
|
57
|
+
|
|
58
|
+
## Dimension 8 Output
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
## Dimension 8: Nyquist Compliance
|
|
62
|
+
|
|
63
|
+
| Task | Plan | Wave | Automated Command | Failing Direction | Status |
|
|
64
|
+
|------|------|------|-------------------|-------------------|--------|
|
|
65
|
+
| {task} | {plan} | {wave} | `{command}` | `{fails_when}` / ❌ | ✅ / ❌ |
|
|
66
|
+
|
|
67
|
+
Sampling: Wave {N}: {X}/{Y} verified → ✅ / ❌
|
|
68
|
+
Wave 0: {test file} → ✅ present / ❌ MISSING
|
|
69
|
+
Failing directions: {stated}/{runnable} → ✅ / ❌
|
|
70
|
+
Overall: ✅ PASS / ❌ FAIL
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
If FAIL: return to planner with specific fixes. Same revision loop as other dimensions
|
|
74
|
+
(max 3 loops).
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
extraction restores byte-budget headroom the frozen ceiling exists to provide.
|
|
5
5
|
-->
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
**Exception:** If `gaps_found`, the `verify_phase_goal` step already presents the gap-closure path (`/gsd:plan-phase {X} --gaps`). No additional routing needed — skip auto-advance.
|
|
9
8
|
|
|
10
9
|
**No-transition check (spawned by auto-advance chain):**
|
|
@@ -41,10 +40,9 @@ STOP. Do not proceed to auto-advance or transition.
|
|
|
41
40
|
**If `--auto` flag present OR `AUTO_MODE` is true (AND verification passed with no gaps):**
|
|
42
41
|
|
|
43
42
|
```
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
╚══════════════════════════════════════════╝
|
|
43
|
+
### AUTO-ADVANCING → TRANSITION
|
|
44
|
+
|
|
45
|
+
Phase {X} verified, continuing chain
|
|
48
46
|
```
|
|
49
47
|
|
|
50
48
|
Execute the transition workflow inline (do NOT use Agent — orchestrator context is ~10-15%, transition needs phase completion data already in context):
|
|
@@ -14,7 +14,7 @@ From `$ARGUMENTS`:
|
|
|
14
14
|
The `find-phase` command handles normalization and validation in one step:
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
PHASE_INFO=$(
|
|
17
|
+
PHASE_INFO=$(gsd_run query find-phase "${PHASE}")
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
Returns JSON with:
|
|
@@ -45,7 +45,7 @@ fi
|
|
|
45
45
|
Use `roadmap get-phase` to validate phase exists:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
PHASE_CHECK=$(
|
|
48
|
+
PHASE_CHECK=$(gsd_run query roadmap.get-phase "${PHASE}" --pick found)
|
|
49
49
|
if [ "$PHASE_CHECK" = "false" ]; then
|
|
50
50
|
echo "ERROR: Phase ${PHASE} not found in roadmap"
|
|
51
51
|
exit 1
|
|
@@ -57,5 +57,5 @@ fi
|
|
|
57
57
|
Use `find-phase` for directory lookup:
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
|
-
PHASE_DIR=$(
|
|
60
|
+
PHASE_DIR=$(gsd_run query find-phase "${PHASE}" --raw)
|
|
61
61
|
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Plan-Checker Examples
|
|
2
|
+
|
|
3
|
+
> Progressive-disclosure reference for `agents/gsd-plan-checker.md`. The checker
|
|
4
|
+
> inlines this file from its `<examples>` block via `@`; the calibrated few-shot
|
|
5
|
+
> set lives separately in `gsd-core/references/few-shot-examples/plan-checker.md`.
|
|
6
|
+
|
|
7
|
+
## Scope Exceeded (most common miss)
|
|
8
|
+
|
|
9
|
+
**Plan 01 analysis:**
|
|
10
|
+
```
|
|
11
|
+
Tasks: 5
|
|
12
|
+
Files modified: 12
|
|
13
|
+
- prisma/schema.prisma
|
|
14
|
+
- src/app/api/auth/login/route.ts
|
|
15
|
+
- src/app/api/auth/logout/route.ts
|
|
16
|
+
- src/app/api/auth/refresh/route.ts
|
|
17
|
+
- src/middleware.ts
|
|
18
|
+
- src/lib/auth.ts
|
|
19
|
+
- src/lib/jwt.ts
|
|
20
|
+
- src/components/LoginForm.tsx
|
|
21
|
+
- src/components/LogoutButton.tsx
|
|
22
|
+
- src/app/login/page.tsx
|
|
23
|
+
- src/app/dashboard/page.tsx
|
|
24
|
+
- src/types/auth.ts
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
5 tasks exceeds 2-3 target, 12 files is high, auth is complex domain → quality degradation risk.
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
issue:
|
|
31
|
+
dimension: scope_sanity
|
|
32
|
+
severity: blocker
|
|
33
|
+
required_property: "Each plan stays within the per-plan context budget"
|
|
34
|
+
description: "Plan 01 has 5 tasks with 12 files - exceeds context budget"
|
|
35
|
+
plan: "01"
|
|
36
|
+
metrics:
|
|
37
|
+
tasks: 5
|
|
38
|
+
files: 12
|
|
39
|
+
estimated_context: "~80%"
|
|
40
|
+
fix_hint: "Split into: 01 (schema + API), 02 (middleware + lib), 03 (UI components)"
|
|
41
|
+
```
|
|
@@ -228,3 +228,28 @@ test -f src/i18n/en.json && test -f src/i18n/de.json || { echo "missing input fi
|
|
|
228
228
|
```
|
|
229
229
|
|
|
230
230
|
**When `|| echo "default"` is acceptable:** only when absence is semantically the default AND the result is NOT used in a comparison that should detect absence.
|
|
231
|
+
|
|
232
|
+
## External Review Before PR Open (#4107)
|
|
233
|
+
|
|
234
|
+
Apply this ordering only when opening the PR is known to trigger automatic external review and the plan also has internal review lanes.
|
|
235
|
+
|
|
236
|
+
**Bad:**
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
Wave 1: Open PR; automatic external review starts
|
|
240
|
+
Wave 2: Run internal review
|
|
241
|
+
Wave 3: Apply accepted fixes
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
The external reviewer spends its first pass on a diff the plan already expects to change.
|
|
245
|
+
|
|
246
|
+
**Good:**
|
|
247
|
+
|
|
248
|
+
```text
|
|
249
|
+
Wave 1: Run internal review
|
|
250
|
+
Wave 2: Apply accepted fixes
|
|
251
|
+
Wave 3: If applicable, re-check the open-time property; then immediately open PR
|
|
252
|
+
Wave 4+: Run post-open CI, external review, and tracking work
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Nothing may intervene between an applicable re-check and the open. Post-open work may follow; "immediately" constrains only that gap. Opening-time properties do not justify an early PR.
|
|
@@ -23,7 +23,11 @@ Return:
|
|
|
23
23
|
| {padded_phase}-02 | [brief objective] | 1 | none | REQ-003 |
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
The orchestrator reads this table,
|
|
26
|
+
The orchestrator reads this table, groups rows by `Wave` (ascending, blank treated as `1`), then
|
|
27
|
+
spawns one single-plan Task per row — one Wave at a time, serially across Waves. Within a Wave,
|
|
28
|
+
Tasks are spawned one at a time by default, or together (`run_in_background=true` on each, issued
|
|
29
|
+
in one message) when `planning.chunked_parallel: true` and the host's negotiated dispatch capacity
|
|
30
|
+
supports it (#3777; see `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md` §8.5.2).
|
|
27
31
|
|
|
28
32
|
### single-plan
|
|
29
33
|
|