@opengsd/gsd-core 1.9.1 → 1.11.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 +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +35 -47
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +27 -240
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +45 -159
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +55 -405
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
<step name="forensic_audit">
|
|
2
|
+
**Forensic Integrity Audit** — only runs when `--forensic` is present in ARGUMENTS.
|
|
3
|
+
|
|
4
|
+
If `--forensic` is NOT present in ARGUMENTS: skip this step entirely. Default progress behavior (standard report + routing) is unchanged.
|
|
5
|
+
|
|
6
|
+
If `--forensic` IS present: after the standard report and routing suggestion have been displayed, append the following audit section.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Forensic Integrity Audit
|
|
11
|
+
|
|
12
|
+
Running 7 deep checks against project state...
|
|
13
|
+
|
|
14
|
+
Run each check in order. For each check, emit ✓ (pass) or ⚠ (warning) with concrete evidence when a problem is found.
|
|
15
|
+
|
|
16
|
+
**Check 1 — STATE vs artifact consistency**
|
|
17
|
+
|
|
18
|
+
Read STATE.md `status` / `stopped_at` fields (from the STATE snapshot already loaded). Compare against the artifact count from the roadmap analysis. If STATE.md claims the current phase is pending/mid-flight but the artifact count shows it as complete (all PLAN.md files have matching SUMMARY.md files), flag inconsistency. Emit:
|
|
19
|
+
- ✓ `STATE.md consistent with artifact count` — if both agree
|
|
20
|
+
- ⚠ `STATE.md claims [status] but artifact count shows phase complete` — with the specific values
|
|
21
|
+
|
|
22
|
+
**Check 2 — Orphaned handoff files**
|
|
23
|
+
|
|
24
|
+
Check for existence of:
|
|
25
|
+
```bash
|
|
26
|
+
ls .planning/HANDOFF.json .planning/phases/*/.continue-here.md .planning/phases/*/*HANDOFF*.md 2>/dev/null || true
|
|
27
|
+
```
|
|
28
|
+
Also check `.planning/continue-here.md`.
|
|
29
|
+
|
|
30
|
+
Emit:
|
|
31
|
+
- ✓ `No orphaned handoff files` — if none found
|
|
32
|
+
- ⚠ `Orphaned handoff files found` — list each file path, add: `→ Work was paused mid-flight. Read the handoff before continuing.`
|
|
33
|
+
|
|
34
|
+
**Check 3 — Deferred scope drift**
|
|
35
|
+
|
|
36
|
+
Search phase artifacts (CONTEXT.md, DISCUSSION-LOG.md, BUG-BRIEF.md, VERIFICATION.md, SUMMARY.md, HANDOFF.md files under `.planning/phases/`) for patterns:
|
|
37
|
+
```bash
|
|
38
|
+
grep -rl "defer to Phase\|future phase\|out of scope Phase\|deferred to Phase" .planning/phases/ 2>/dev/null || true
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
For each match, extract the referenced phase number. Cross-reference against ROADMAP.md phase list. If the referenced phase number is NOT in ROADMAP.md, flag as deferred scope not captured.
|
|
42
|
+
|
|
43
|
+
Emit:
|
|
44
|
+
- ✓ `All deferred scope captured in ROADMAP` — if no mismatches
|
|
45
|
+
- ⚠ `Deferred scope references phase(s) not in ROADMAP` — list: file, reference text, missing phase number
|
|
46
|
+
|
|
47
|
+
**Check 4 — Memory-flagged pending work**
|
|
48
|
+
|
|
49
|
+
Check if `.planning/MEMORY.md` or `.planning/memory/` exists:
|
|
50
|
+
```bash
|
|
51
|
+
ls .planning/MEMORY.md .planning/memory/*.md 2>/dev/null || true
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
If found, grep for entries containing: `pending`, `status`, `deferred`, `not yet run`, `backfill`, `blocking`.
|
|
55
|
+
|
|
56
|
+
Emit:
|
|
57
|
+
- ✓ `No memory entries flagging pending work` — if none found or no MEMORY.md
|
|
58
|
+
- ⚠ `Memory entries flag pending/deferred work` — list the matching lines (max 5, truncated at 80 chars)
|
|
59
|
+
|
|
60
|
+
**Check 5 — Blocking operational todos**
|
|
61
|
+
|
|
62
|
+
Check for pending todos:
|
|
63
|
+
```bash
|
|
64
|
+
ls .planning/todos/pending/*.md 2>/dev/null || true
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
For files found, scan for keywords indicating operational blockers: `script`, `credential`, `API key`, `manual`, `verification`, `setup`, `configure`, `run `.
|
|
68
|
+
|
|
69
|
+
Emit:
|
|
70
|
+
- ✓ `No blocking operational todos` — if no pending todos or none match operational keywords
|
|
71
|
+
- ⚠ `Blocking operational todos found` — list the file names and matching keywords (max 5)
|
|
72
|
+
|
|
73
|
+
**Check 6 — Uncommitted code**
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git status --porcelain 2>/dev/null | grep -v "^??" | grep -v "^.planning\/" | grep -v "^\.\." | head -10
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
If output is non-empty (modified/staged files outside `.planning/`), flag as uncommitted code.
|
|
80
|
+
|
|
81
|
+
Emit:
|
|
82
|
+
- ✓ `Working tree clean` — if no modified files outside `.planning/`
|
|
83
|
+
- ⚠ `Uncommitted changes in source files` — list up to 10 file paths
|
|
84
|
+
|
|
85
|
+
**Check 7 — Unresolved deferred items**
|
|
86
|
+
|
|
87
|
+
Glob every phase directory's SCOPE BOUNDARY log (executor writes out-of-scope discoveries here per `agents/gsd-executor.md`):
|
|
88
|
+
```bash
|
|
89
|
+
ls .planning/phases/*/deferred-items.md 2>/dev/null || true
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
For each `deferred-items.md` found, read its entries (bullet list, one entry per top-level `- ` line, continuation lines indented beneath it). An entry is RESOLVED only if it carries an explicit `status: resolved` field (case-insensitive) on one of its lines; every other entry — including one with no `status:` field at all — is UNRESOLVED and must be surfaced (fail-safe: never silently drop a possibly-open item).
|
|
93
|
+
|
|
94
|
+
Emit:
|
|
95
|
+
- ✓ `No unresolved deferred items` — if no `deferred-items.md` files exist, or every entry in every file is `status: resolved`
|
|
96
|
+
- ⚠ `Unresolved deferred items found` — list each file's phase directory and its unresolved entry text (max 5 per file, truncated at 80 chars)
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
After all 7 checks, display the verdict:
|
|
101
|
+
|
|
102
|
+
**If all 7 checks passed:**
|
|
103
|
+
```
|
|
104
|
+
### Verdict: CLEAN
|
|
105
|
+
|
|
106
|
+
The standard progress report is trustworthy — proceed with the routing suggestion above.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**If 1 or more checks failed:**
|
|
110
|
+
```
|
|
111
|
+
### Verdict: N INTEGRITY ISSUE(S) FOUND
|
|
112
|
+
|
|
113
|
+
The standard progress report may not reflect true project state.
|
|
114
|
+
Review the flagged items above before acting on the routing suggestion.
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Then for each failed check, add a concrete next action:
|
|
118
|
+
- Check 2 (orphaned handoff): `Read the handoff file(s) and resume from where work was paused: /gsd:resume-work ${GSD_WS}`
|
|
119
|
+
- Check 3 (deferred scope): `Add the missing phases to ROADMAP.md or update the deferred references`
|
|
120
|
+
- Check 4 (memory pending): `Review the flagged memory entries and resolve or clear them`
|
|
121
|
+
- Check 5 (blocking todos): `Complete the operational steps in .planning/todos/pending/ before continuing`
|
|
122
|
+
- Check 6 (uncommitted code): `Commit or stash the uncommitted changes before advancing`
|
|
123
|
+
- Check 7 (unresolved deferred items): `Address each deferred item and mark it status: resolved in its deferred-items.md, or fold it into the roadmap`
|
|
124
|
+
- Check 1 (STATE inconsistency): `Run /gsd:verify-work ${PHASE} ${GSD_WS} to reconcile state`
|
|
125
|
+
</step>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<step name="mvp_display">
|
|
2
|
+
**MVP-mode display (when phase has `**Mode:** mvp` in ROADMAP.md).**
|
|
3
|
+
|
|
4
|
+
`init.progress` already resolved `phase_mvp_mode` for the current phase (progress has no `--mvp` CLI flag — mode is inherited from the planned phase), and this step is only read at all when that same fact is `true` (`section_manifest`'s `mvp-display` inclusion gates on it) — so there is no need to re-resolve `MVP_MODE` here via a fresh `gsd_run query phase.mvp-mode` call; that would gate this section on a fact its own body recomputes, which is circular and self-disabling. Simply consume `$phase_mvp_mode` (already extracted from init JSON in `init_context`) as `true` for the remainder of this step.
|
|
5
|
+
|
|
6
|
+
The per-phase progress block adds a **user-flow status** sub-block sourced from the phase's PLAN.md task names. Each task whose name reads like a user-visible capability (e.g., "Register flow", "Login flow", "Password reset") is rendered as a status line:
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
Phase 1 — User Auth MVP
|
|
10
|
+
✅ Walking Skeleton complete ← from SKELETON.md existence
|
|
11
|
+
✅ Register flow working ← from PLAN.md task with summary
|
|
12
|
+
✅ Login flow working ← from PLAN.md task with summary
|
|
13
|
+
🔄 Password reset (in progress) ← from PLAN.md task without summary
|
|
14
|
+
⬜ Email verification ← from PLAN.md task not yet started
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**User-flow filter:** Tasks whose names are technical-sounding ("Wire DB schema", "Create migration", "Bump deps") are NOT rendered as user-flow status lines. Heuristic: a task name is user-flow-shaped if it ends in "flow", "page", "screen", or starts with a verb the user would recognize ("Register", "Login", "Upload", "View"). Tasks that fail the heuristic still count toward the standard task progress total but don't appear in the user-flow sub-block.
|
|
18
|
+
</step>
|
|
@@ -13,11 +13,12 @@ Read all files referenced by the invoking prompt's execution_context before star
|
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
_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 "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; 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
|
|
16
|
-
|
|
16
|
+
FORENSIC_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--forensic([[:space:]]|$) ]]; then FORENSIC_PARAM="--forensic"; fi
|
|
17
|
+
INIT=$(gsd_run query init.progress $FORENSIC_PARAM)
|
|
17
18
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
18
19
|
```
|
|
19
20
|
|
|
20
|
-
Extract from init JSON: `project_exists`, `roadmap_exists`, `state_exists`, `phases`, `current_phase`, `next_phase`, `milestone_version`, `completed_count`, `phase_count`, `paused_at`, `state_path`, `roadmap_path`, `project_path`, `config_path`.
|
|
21
|
+
Extract from init JSON: `project_exists`, `roadmap_exists`, `state_exists`, `phases`, `current_phase`, `next_phase`, `milestone_version`, `completed_count`, `phase_count`, `paused_at`, `state_path`, `roadmap_path`, `project_path`, `config_path`, `phase_mvp_mode`.
|
|
21
22
|
|
|
22
23
|
```bash
|
|
23
24
|
DISCUSS_MODE=$(gsd_run query config-get workflow.discuss_mode 2>/dev/null || echo "discuss")
|
|
@@ -104,7 +105,7 @@ PROGRESS_BAR=$(gsd_run query progress.bar --raw)
|
|
|
104
105
|
|
|
105
106
|
Present:
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
````
|
|
108
109
|
# [Project Name]
|
|
109
110
|
|
|
110
111
|
**Progress:** {PROGRESS_BAR}
|
|
@@ -150,34 +151,13 @@ Render `Open Windows` only when `$WINDOWS_OPEN` is greater than `0` (or `$WINDOW
|
|
|
150
151
|
|
|
151
152
|
## What's Next
|
|
152
153
|
[Next phase/plan objective from roadmap analyze]
|
|
153
|
-
|
|
154
|
+
````
|
|
154
155
|
|
|
155
156
|
</step>
|
|
156
157
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
Resolve `MVP_MODE` per phase via the centralized resolver. progress has no `--mvp` CLI flag (mode is inherited from the planned phase), so we omit `--cli-flag`:
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
MVP_MODE=$(gsd_run query phase.mvp-mode "${PHASE_NUMBER}" --pick active)
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
When `MVP_MODE=true`, the per-phase progress block adds a **user-flow status** sub-block sourced from the phase's PLAN.md task names. Each task whose name reads like a user-visible capability (e.g., "Register flow", "Login flow", "Password reset") is rendered as a status line:
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
Phase 1 — User Auth MVP
|
|
170
|
-
✅ Walking Skeleton complete ← from SKELETON.md existence
|
|
171
|
-
✅ Register flow working ← from PLAN.md task with summary
|
|
172
|
-
✅ Login flow working ← from PLAN.md task with summary
|
|
173
|
-
🔄 Password reset (in progress) ← from PLAN.md task without summary
|
|
174
|
-
⬜ Email verification ← from PLAN.md task not yet started
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**User-flow filter:** Tasks whose names are technical-sounding ("Wire DB schema", "Create migration", "Bump deps") are NOT rendered as user-flow status lines. Heuristic: a task name is user-flow-shaped if it ends in "flow", "page", "screen", or starts with a verb the user would recognize ("Register", "Login", "Upload", "View"). Tasks that fail the heuristic still count toward the standard task progress total but don't appear in the user-flow sub-block.
|
|
178
|
-
|
|
179
|
-
When `MVP_MODE=false` (mode is null, absent, or the phase has no `**Mode:**` line), fall back to the standard display path — no behavioral change.
|
|
180
|
-
</step>
|
|
158
|
+
<!-- gsd:section id="mvp-display" when="state:phase-mvp-mode" -->
|
|
159
|
+
If `section_manifest` is `null` or `"mvp-display"` is in its `included` list: read and execute `gsd-core/workflows/progress/steps/mvp-display.md`. Otherwise skip — do not read the file.
|
|
160
|
+
<!-- /gsd:section -->
|
|
181
161
|
|
|
182
162
|
<step name="route">
|
|
183
163
|
**Determine next action based on verified counts.**
|
|
@@ -201,8 +181,14 @@ if [ -z "$ROADMAP" ]; then
|
|
|
201
181
|
else
|
|
202
182
|
for PHASE_NUM in $(echo "$ROADMAP" | jq -r '.phases[] | (.number // .phase_number)'); do
|
|
203
183
|
PHASE_DATA=$(echo "$ROADMAP" | jq --arg n "$PHASE_NUM" '.phases[] | select((.number // .phase_number) == ($n | tonumber))')
|
|
204
|
-
|
|
205
|
-
|
|
184
|
+
# #3218: $PHASE_DATA is a `.phases[]` entry from `roadmap.analyze`, which
|
|
185
|
+
# emits `plan_count`/`summary_count` SCALARS (src/roadmap.cts) — it has
|
|
186
|
+
# never emitted `.plans`/`.summaries` ARRAYS. Reading those absent keys
|
|
187
|
+
# (even with a `// []` fallback) always produced 0, permanently disabling
|
|
188
|
+
# this resume-incomplete-phase check. Read the scalars the producer
|
|
189
|
+
# actually emits.
|
|
190
|
+
PLAN_COUNT=$(echo "$PHASE_DATA" | jq '.plan_count // 0')
|
|
191
|
+
SUMMARY_COUNT=$(echo "$PHASE_DATA" | jq '.summary_count // 0')
|
|
206
192
|
if [ "${PLAN_COUNT:-0}" -gt "${SUMMARY_COUNT:-0}" ]; then
|
|
207
193
|
INCOMPLETE_PHASE="$PHASE_NUM"
|
|
208
194
|
break
|
|
@@ -233,11 +219,13 @@ Then exit the route step. Do NOT run Steps 1 through Routes A-F.
|
|
|
233
219
|
|
|
234
220
|
**Step 1: Count plans, summaries, and issues in current phase**
|
|
235
221
|
|
|
236
|
-
|
|
222
|
+
Get plan/summary counts for the current phase from the single owner (#3218 — LIVE
|
|
223
|
+
counts, i.e. `status: superseded` plans excluded, matching "outstanding work"):
|
|
237
224
|
|
|
238
225
|
```bash
|
|
239
|
-
(
|
|
240
|
-
(
|
|
226
|
+
PHASE_COUNTS=$(gsd_run query find-phase "${CURRENT_PHASE}")
|
|
227
|
+
X=$(echo "$PHASE_COUNTS" | jq -r '.plan_count // 0')
|
|
228
|
+
Y=$(echo "$PHASE_COUNTS" | jq -r '.summary_count // 0')
|
|
241
229
|
(ls -1 .planning/phases/[current-phase-dir]/*-UAT.md 2>/dev/null || true) | wc -l
|
|
242
230
|
```
|
|
243
231
|
|
|
@@ -470,7 +458,17 @@ UAT.md exists with `status: partial` — testing session ended before all items
|
|
|
470
458
|
All plans have summaries, but canonical verification has not passed. The phase is implementation-complete, not phase-complete.
|
|
471
459
|
|
|
472
460
|
```
|
|
473
|
-
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## Verification Report Missing
|
|
464
|
+
|
|
465
|
+
**Phase {phase}** has all plans summarized, but no canonical `*-VERIFICATION.md` exists yet. ${VERIFICATION_NEXT_ACTION}
|
|
466
|
+
|
|
467
|
+
`/clear` then:
|
|
468
|
+
|
|
469
|
+
`/gsd:execute-phase {phase} ${GSD_WS}` — resumes at the verification gates
|
|
470
|
+
|
|
471
|
+
---
|
|
474
472
|
```
|
|
475
473
|
|
|
476
474
|
---
|
|
@@ -480,7 +478,17 @@ All plans have summaries, but canonical verification has not passed. The phase i
|
|
|
480
478
|
VERIFICATION.md has an unexpected status. The phase is implementation-complete, not phase-complete.
|
|
481
479
|
|
|
482
480
|
```
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## Verification Status Unexpected
|
|
484
|
+
|
|
485
|
+
**Phase {phase}** has all plans summarized, but its `*-VERIFICATION.md` reports an unexpected status. ${VERIFICATION_NEXT_ACTION}
|
|
486
|
+
|
|
487
|
+
`/clear` then:
|
|
488
|
+
|
|
483
489
|
`/gsd:execute-phase {phase} ${GSD_WS}` — regenerate verification
|
|
490
|
+
|
|
491
|
+
---
|
|
484
492
|
```
|
|
485
493
|
|
|
486
494
|
---
|
|
@@ -678,131 +686,9 @@ Ready to plan the next milestone.
|
|
|
678
686
|
- Handoff file exists → mention it, offer `/gsd:resume-work ${GSD_WS}`
|
|
679
687
|
</step>
|
|
680
688
|
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
If `--forensic` is NOT present in ARGUMENTS: skip this step entirely. Default progress behavior (standard report + routing) is unchanged.
|
|
685
|
-
|
|
686
|
-
If `--forensic` IS present: after the standard report and routing suggestion have been displayed, append the following audit section.
|
|
687
|
-
|
|
688
|
-
---
|
|
689
|
-
|
|
690
|
-
## Forensic Integrity Audit
|
|
691
|
-
|
|
692
|
-
Running 7 deep checks against project state...
|
|
693
|
-
|
|
694
|
-
Run each check in order. For each check, emit ✓ (pass) or ⚠ (warning) with concrete evidence when a problem is found.
|
|
695
|
-
|
|
696
|
-
**Check 1 — STATE vs artifact consistency**
|
|
697
|
-
|
|
698
|
-
Read STATE.md `status` / `stopped_at` fields (from the STATE snapshot already loaded). Compare against the artifact count from the roadmap analysis. If STATE.md claims the current phase is pending/mid-flight but the artifact count shows it as complete (all PLAN.md files have matching SUMMARY.md files), flag inconsistency. Emit:
|
|
699
|
-
- ✓ `STATE.md consistent with artifact count` — if both agree
|
|
700
|
-
- ⚠ `STATE.md claims [status] but artifact count shows phase complete` — with the specific values
|
|
701
|
-
|
|
702
|
-
**Check 2 — Orphaned handoff files**
|
|
703
|
-
|
|
704
|
-
Check for existence of:
|
|
705
|
-
```bash
|
|
706
|
-
ls .planning/HANDOFF.json .planning/phases/*/.continue-here.md .planning/phases/*/*HANDOFF*.md 2>/dev/null || true
|
|
707
|
-
```
|
|
708
|
-
Also check `.planning/continue-here.md`.
|
|
709
|
-
|
|
710
|
-
Emit:
|
|
711
|
-
- ✓ `No orphaned handoff files` — if none found
|
|
712
|
-
- ⚠ `Orphaned handoff files found` — list each file path, add: `→ Work was paused mid-flight. Read the handoff before continuing.`
|
|
713
|
-
|
|
714
|
-
**Check 3 — Deferred scope drift**
|
|
715
|
-
|
|
716
|
-
Search phase artifacts (CONTEXT.md, DISCUSSION-LOG.md, BUG-BRIEF.md, VERIFICATION.md, SUMMARY.md, HANDOFF.md files under `.planning/phases/`) for patterns:
|
|
717
|
-
```bash
|
|
718
|
-
grep -rl "defer to Phase\|future phase\|out of scope Phase\|deferred to Phase" .planning/phases/ 2>/dev/null || true
|
|
719
|
-
```
|
|
720
|
-
|
|
721
|
-
For each match, extract the referenced phase number. Cross-reference against ROADMAP.md phase list. If the referenced phase number is NOT in ROADMAP.md, flag as deferred scope not captured.
|
|
722
|
-
|
|
723
|
-
Emit:
|
|
724
|
-
- ✓ `All deferred scope captured in ROADMAP` — if no mismatches
|
|
725
|
-
- ⚠ `Deferred scope references phase(s) not in ROADMAP` — list: file, reference text, missing phase number
|
|
726
|
-
|
|
727
|
-
**Check 4 — Memory-flagged pending work**
|
|
728
|
-
|
|
729
|
-
Check if `.planning/MEMORY.md` or `.planning/memory/` exists:
|
|
730
|
-
```bash
|
|
731
|
-
ls .planning/MEMORY.md .planning/memory/*.md 2>/dev/null || true
|
|
732
|
-
```
|
|
733
|
-
|
|
734
|
-
If found, grep for entries containing: `pending`, `status`, `deferred`, `not yet run`, `backfill`, `blocking`.
|
|
735
|
-
|
|
736
|
-
Emit:
|
|
737
|
-
- ✓ `No memory entries flagging pending work` — if none found or no MEMORY.md
|
|
738
|
-
- ⚠ `Memory entries flag pending/deferred work` — list the matching lines (max 5, truncated at 80 chars)
|
|
739
|
-
|
|
740
|
-
**Check 5 — Blocking operational todos**
|
|
741
|
-
|
|
742
|
-
Check for pending todos:
|
|
743
|
-
```bash
|
|
744
|
-
ls .planning/todos/pending/*.md 2>/dev/null || true
|
|
745
|
-
```
|
|
746
|
-
|
|
747
|
-
For files found, scan for keywords indicating operational blockers: `script`, `credential`, `API key`, `manual`, `verification`, `setup`, `configure`, `run `.
|
|
748
|
-
|
|
749
|
-
Emit:
|
|
750
|
-
- ✓ `No blocking operational todos` — if no pending todos or none match operational keywords
|
|
751
|
-
- ⚠ `Blocking operational todos found` — list the file names and matching keywords (max 5)
|
|
752
|
-
|
|
753
|
-
**Check 6 — Uncommitted code**
|
|
754
|
-
|
|
755
|
-
```bash
|
|
756
|
-
git status --porcelain 2>/dev/null | grep -v "^??" | grep -v "^.planning\/" | grep -v "^\.\." | head -10
|
|
757
|
-
```
|
|
758
|
-
|
|
759
|
-
If output is non-empty (modified/staged files outside `.planning/`), flag as uncommitted code.
|
|
760
|
-
|
|
761
|
-
Emit:
|
|
762
|
-
- ✓ `Working tree clean` — if no modified files outside `.planning/`
|
|
763
|
-
- ⚠ `Uncommitted changes in source files` — list up to 10 file paths
|
|
764
|
-
|
|
765
|
-
**Check 7 — Unresolved deferred items**
|
|
766
|
-
|
|
767
|
-
Glob every phase directory's SCOPE BOUNDARY log (executor writes out-of-scope discoveries here per `agents/gsd-executor.md`):
|
|
768
|
-
```bash
|
|
769
|
-
ls .planning/phases/*/deferred-items.md 2>/dev/null || true
|
|
770
|
-
```
|
|
771
|
-
|
|
772
|
-
For each `deferred-items.md` found, read its entries (bullet list, one entry per top-level `- ` line, continuation lines indented beneath it). An entry is RESOLVED only if it carries an explicit `status: resolved` field (case-insensitive) on one of its lines; every other entry — including one with no `status:` field at all — is UNRESOLVED and must be surfaced (fail-safe: never silently drop a possibly-open item).
|
|
773
|
-
|
|
774
|
-
Emit:
|
|
775
|
-
- ✓ `No unresolved deferred items` — if no `deferred-items.md` files exist, or every entry in every file is `status: resolved`
|
|
776
|
-
- ⚠ `Unresolved deferred items found` — list each file's phase directory and its unresolved entry text (max 5 per file, truncated at 80 chars)
|
|
777
|
-
|
|
778
|
-
---
|
|
779
|
-
|
|
780
|
-
After all 7 checks, display the verdict:
|
|
781
|
-
|
|
782
|
-
**If all 7 checks passed:**
|
|
783
|
-
```
|
|
784
|
-
### Verdict: CLEAN
|
|
785
|
-
|
|
786
|
-
The standard progress report is trustworthy — proceed with the routing suggestion above.
|
|
787
|
-
```
|
|
788
|
-
|
|
789
|
-
**If 1 or more checks failed:**
|
|
790
|
-
```
|
|
791
|
-
### Verdict: N INTEGRITY ISSUE(S) FOUND
|
|
792
|
-
|
|
793
|
-
The standard progress report may not reflect true project state.
|
|
794
|
-
Review the flagged items above before acting on the routing suggestion.
|
|
795
|
-
```
|
|
796
|
-
|
|
797
|
-
Then for each failed check, add a concrete next action:
|
|
798
|
-
- Check 2 (orphaned handoff): `Read the handoff file(s) and resume from where work was paused: /gsd:resume-work ${GSD_WS}`
|
|
799
|
-
- Check 3 (deferred scope): `Add the missing phases to ROADMAP.md or update the deferred references`
|
|
800
|
-
- Check 4 (memory pending): `Review the flagged memory entries and resolve or clear them`
|
|
801
|
-
- Check 5 (blocking todos): `Complete the operational steps in .planning/todos/pending/ before continuing`
|
|
802
|
-
- Check 6 (uncommitted code): `Commit or stash the uncommitted changes before advancing`
|
|
803
|
-
- Check 7 (unresolved deferred items): `Address each deferred item and mark it status: resolved in its deferred-items.md, or fold it into the roadmap`
|
|
804
|
-
- Check 1 (STATE inconsistency): `Run /gsd:verify-work ${PHASE} ${GSD_WS} to reconcile state`
|
|
805
|
-
</step>
|
|
689
|
+
<!-- gsd:section id="forensic-audit" when="flag:--forensic" -->
|
|
690
|
+
If `section_manifest` is `null` or `"forensic-audit"` is in its `included` list: read and execute `gsd-core/workflows/progress/steps/forensic-audit.md`. Otherwise skip — do not read the file.
|
|
691
|
+
<!-- /gsd:section -->
|
|
806
692
|
|
|
807
693
|
</process>
|
|
808
694
|
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
**Step 4.5: Discussion phase (only when `$DISCUSS_MODE`)**
|
|
2
|
+
|
|
3
|
+
Skip this step entirely if NOT `$DISCUSS_MODE`.
|
|
4
|
+
|
|
5
|
+
Display banner:
|
|
6
|
+
```
|
|
7
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
8
|
+
GSD ► DISCUSSING QUICK TASK
|
|
9
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
10
|
+
|
|
11
|
+
◆ Surfacing gray areas for: ${DESCRIPTION}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**4.5a. Identify gray areas**
|
|
15
|
+
|
|
16
|
+
Analyze `$DESCRIPTION` to identify 2-4 gray areas — implementation decisions that would change the outcome and that the user should weigh in on.
|
|
17
|
+
|
|
18
|
+
Use the domain-aware heuristic to generate phase-specific (not generic) gray areas:
|
|
19
|
+
- Something users **SEE** → layout, density, interactions, states
|
|
20
|
+
- Something users **CALL** → responses, errors, auth, versioning
|
|
21
|
+
- Something users **RUN** → output format, flags, modes, error handling
|
|
22
|
+
- Something users **READ** → structure, tone, depth, flow
|
|
23
|
+
- Something being **ORGANIZED** → criteria, grouping, naming, exceptions
|
|
24
|
+
|
|
25
|
+
Each gray area should be a concrete decision point, not a vague category. Example: "Loading behavior" not "UX".
|
|
26
|
+
|
|
27
|
+
**4.5b. Present gray areas**
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
AskUserQuestion(
|
|
31
|
+
header: "Gray Areas",
|
|
32
|
+
question: "Which areas need clarification before planning?",
|
|
33
|
+
options: [
|
|
34
|
+
{ label: "${area_1}", description: "${why_it_matters_1}" },
|
|
35
|
+
{ label: "${area_2}", description: "${why_it_matters_2}" },
|
|
36
|
+
{ label: "${area_3}", description: "${why_it_matters_3}" },
|
|
37
|
+
{ label: "All clear", description: "Skip discussion — I know what I want" }
|
|
38
|
+
],
|
|
39
|
+
multiSelect: true
|
|
40
|
+
)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If user selects "All clear" → skip to Step 5 (no CONTEXT.md written).
|
|
44
|
+
|
|
45
|
+
**4.5c. Discuss selected areas**
|
|
46
|
+
|
|
47
|
+
For each selected area, ask 1-2 focused questions via AskUserQuestion:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
AskUserQuestion(
|
|
51
|
+
header: "${area_name}",
|
|
52
|
+
question: "${specific_question_about_this_area}",
|
|
53
|
+
options: [
|
|
54
|
+
{ label: "${concrete_choice_1}", description: "${what_this_means}" },
|
|
55
|
+
{ label: "${concrete_choice_2}", description: "${what_this_means}" },
|
|
56
|
+
{ label: "${concrete_choice_3}", description: "${what_this_means}" },
|
|
57
|
+
{ label: "You decide", description: "Claude's discretion" }
|
|
58
|
+
],
|
|
59
|
+
multiSelect: false
|
|
60
|
+
)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Rules:
|
|
64
|
+
- Options must be concrete choices, not abstract categories
|
|
65
|
+
- Highlight recommended choice where you have a clear opinion
|
|
66
|
+
- If user selects "Other" with freeform text, switch to plain text follow-up (per questioning.md freeform rule)
|
|
67
|
+
- If user selects "You decide", capture as Claude's Discretion in CONTEXT.md
|
|
68
|
+
- Max 2 questions per area — this is lightweight, not a deep dive
|
|
69
|
+
|
|
70
|
+
Collect all decisions into `$DECISIONS`.
|
|
71
|
+
|
|
72
|
+
**4.5d. Write CONTEXT.md**
|
|
73
|
+
|
|
74
|
+
Write `${QUICK_DIR}/${quick_id}-CONTEXT.md` using the standard context template structure:
|
|
75
|
+
|
|
76
|
+
```markdown
|
|
77
|
+
# Quick Task ${quick_id}: ${DESCRIPTION} - Context
|
|
78
|
+
|
|
79
|
+
**Gathered:** ${date}
|
|
80
|
+
**Status:** Ready for planning
|
|
81
|
+
|
|
82
|
+
<domain>
|
|
83
|
+
## Task Boundary
|
|
84
|
+
|
|
85
|
+
${DESCRIPTION}
|
|
86
|
+
|
|
87
|
+
</domain>
|
|
88
|
+
|
|
89
|
+
<decisions>
|
|
90
|
+
## Implementation Decisions
|
|
91
|
+
|
|
92
|
+
### ${area_1_name}
|
|
93
|
+
- ${decision_from_discussion}
|
|
94
|
+
|
|
95
|
+
### ${area_2_name}
|
|
96
|
+
- ${decision_from_discussion}
|
|
97
|
+
|
|
98
|
+
### Claude's Discretion
|
|
99
|
+
${areas_where_user_said_you_decide_or_areas_not_discussed}
|
|
100
|
+
|
|
101
|
+
</decisions>
|
|
102
|
+
|
|
103
|
+
<specifics>
|
|
104
|
+
## Specific Ideas
|
|
105
|
+
|
|
106
|
+
${any_specific_references_or_examples_from_discussion}
|
|
107
|
+
|
|
108
|
+
[If none: "No specific requirements — open to standard approaches"]
|
|
109
|
+
|
|
110
|
+
</specifics>
|
|
111
|
+
|
|
112
|
+
<canonical_refs>
|
|
113
|
+
## Canonical References
|
|
114
|
+
|
|
115
|
+
${any_specs_adrs_or_docs_referenced_during_discussion}
|
|
116
|
+
|
|
117
|
+
[If none: "No external specs — requirements fully captured in decisions above"]
|
|
118
|
+
|
|
119
|
+
</canonical_refs>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Note: Quick task CONTEXT.md omits `<code_context>` and `<deferred>` sections (no codebase scouting, no phase scope to defer to). Keep it lean. The `<canonical_refs>` section is included when external docs were referenced — omit it only if no external docs apply.
|
|
123
|
+
|
|
124
|
+
Report: `Context captured: ${QUICK_DIR}/${quick_id}-CONTEXT.md`
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
**Step 5.5: Plan-checker loop (only when `$VALIDATE_MODE`)**
|
|
2
|
+
|
|
3
|
+
Skip this step entirely if NOT `$VALIDATE_MODE`.
|
|
4
|
+
|
|
5
|
+
Display banner:
|
|
6
|
+
```
|
|
7
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
8
|
+
GSD ► CHECKING PLAN
|
|
9
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
10
|
+
|
|
11
|
+
◆ Spawning plan checker... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Checker prompt:
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
<verification_context>
|
|
18
|
+
**Mode:** quick-full
|
|
19
|
+
**Task Description:** ${DESCRIPTION}
|
|
20
|
+
|
|
21
|
+
<required_reading>
|
|
22
|
+
- ${QUICK_DIR}/${quick_id}-PLAN.md (Plan to verify)
|
|
23
|
+
</required_reading>
|
|
24
|
+
|
|
25
|
+
${AGENT_SKILLS_CHECKER}
|
|
26
|
+
|
|
27
|
+
**Scope:** This is a quick task, not a full phase. Skip checks that require a ROADMAP phase goal.
|
|
28
|
+
</verification_context>
|
|
29
|
+
|
|
30
|
+
<check_dimensions>
|
|
31
|
+
- Requirement coverage: Does the plan address the task description?
|
|
32
|
+
- Task completeness: Do tasks have files, action, verify, done fields?
|
|
33
|
+
- Key links: Are referenced files real?
|
|
34
|
+
- Scope sanity: Is this appropriately sized for a quick task (1-3 tasks)?
|
|
35
|
+
- must_haves derivation: Are must_haves traceable to the task description?
|
|
36
|
+
|
|
37
|
+
Skip: cross-plan deps (single plan), ROADMAP alignment
|
|
38
|
+
${DISCUSS_MODE ? '- Context compliance: Does the plan honor locked decisions from CONTEXT.md?' : '- Skip: context compliance (no CONTEXT.md)'}
|
|
39
|
+
</check_dimensions>
|
|
40
|
+
|
|
41
|
+
<expected_output>
|
|
42
|
+
- ## VERIFICATION PASSED — all checks pass
|
|
43
|
+
- ## ISSUES FOUND — structured issue list
|
|
44
|
+
</expected_output>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Agent(
|
|
49
|
+
prompt=checker_prompt,
|
|
50
|
+
subagent_type="gsd-plan-checker",
|
|
51
|
+
model="{checker_model}",
|
|
52
|
+
description="Check quick plan: ${DESCRIPTION}"
|
|
53
|
+
)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
|
|
57
|
+
|
|
58
|
+
**Handle checker return:**
|
|
59
|
+
|
|
60
|
+
- **`## VERIFICATION PASSED`:** Display confirmation, proceed to step 6.
|
|
61
|
+
- **`## ISSUES FOUND`:** Display issues, check iteration count, enter revision loop.
|
|
62
|
+
|
|
63
|
+
**Revision loop (max 2 iterations):**
|
|
64
|
+
|
|
65
|
+
Track `iteration_count` (starts at 1 after initial plan + check).
|
|
66
|
+
|
|
67
|
+
**If iteration_count < 2:**
|
|
68
|
+
|
|
69
|
+
Display: `Sending back to planner for revision... (iteration ${N}/2)`
|
|
70
|
+
|
|
71
|
+
Revision prompt:
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
<revision_context>
|
|
75
|
+
**Mode:** quick-full (revision)
|
|
76
|
+
|
|
77
|
+
<required_reading>
|
|
78
|
+
- ${QUICK_DIR}/${quick_id}-PLAN.md (Existing plan)
|
|
79
|
+
</required_reading>
|
|
80
|
+
|
|
81
|
+
${AGENT_SKILLS_PLANNER}
|
|
82
|
+
|
|
83
|
+
**Checker issues:** ${structured_issues_from_checker}
|
|
84
|
+
|
|
85
|
+
</revision_context>
|
|
86
|
+
|
|
87
|
+
<instructions>
|
|
88
|
+
Make targeted updates to address checker issues.
|
|
89
|
+
Do NOT replan from scratch unless issues are fundamental.
|
|
90
|
+
Return what changed.
|
|
91
|
+
</instructions>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Agent(
|
|
96
|
+
prompt=revision_prompt,
|
|
97
|
+
subagent_type="gsd-planner",
|
|
98
|
+
model="{planner_model}",
|
|
99
|
+
description="Revise quick plan: ${DESCRIPTION}"
|
|
100
|
+
)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
|
|
104
|
+
|
|
105
|
+
After planner returns → spawn checker again, increment iteration_count.
|
|
106
|
+
|
|
107
|
+
**If iteration_count >= 2:**
|
|
108
|
+
|
|
109
|
+
Display: `Max iterations reached. ${N} issues remain:` + issue list
|
|
110
|
+
|
|
111
|
+
Offer: 1) Force proceed, 2) Abort
|