@opengsd/gsd-core 1.12.0 → 1.14.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-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +458 -0
- package/agents/gsd-code-fixer.md +5 -5
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +345 -0
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +63 -35
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-plan-checker.md +76 -57
- package/agents/gsd-planner.md +14 -0
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-checker.md +19 -3
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +29 -0
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +23 -1
- package/bin/install.js +444 -134
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +1 -0
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +2 -1
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/surface.md +18 -8
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +532 -174
- package/gsd-core/bin/lib/adr-parser.cjs +1 -1
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +39 -22
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +528 -116
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-state.cjs +7 -1
- package/gsd-core/bin/lib/capability-validator.cjs +134 -5
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +198 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/commands.cjs +981 -79
- package/gsd-core/bin/lib/config-loader.cjs +4 -0
- package/gsd-core/bin/lib/config.cjs +153 -38
- package/gsd-core/bin/lib/core-utils.cjs +34 -7
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +343 -28
- package/gsd-core/bin/lib/edge-probe.cjs +14 -1
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +137 -23
- package/gsd-core/bin/lib/gap-checker.cjs +22 -13
- package/gsd-core/bin/lib/git-base-branch.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- 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 +54 -11
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +87 -23
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-integration.cjs +57 -5
- package/gsd-core/bin/lib/init-command-router.cjs +14 -0
- package/gsd-core/bin/lib/init.cjs +539 -60
- package/gsd-core/bin/lib/install-engine.cjs +199 -14
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +45 -0
- package/gsd-core/bin/lib/install-profiles.cjs +36 -14
- package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +33 -4
- package/gsd-core/bin/lib/io.cjs +35 -0
- package/gsd-core/bin/lib/loop-resolver.cjs +64 -39
- package/gsd-core/bin/lib/markdown-table.cjs +123 -0
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +41 -10
- package/gsd-core/bin/lib/model-resolver.cjs +101 -10
- package/gsd-core/bin/lib/phase-command-router.cjs +20 -7
- package/gsd-core/bin/lib/phase-id.cjs +412 -31
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase.cjs +941 -98
- package/gsd-core/bin/lib/plan-document.cjs +10 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +34 -18
- package/gsd-core/bin/lib/planning-snapshot.cjs +206 -30
- package/gsd-core/bin/lib/planning-workspace.cjs +153 -29
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- 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/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +53 -5
- package/gsd-core/bin/lib/review-lane-invocation.cjs +96 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-parser.cjs +555 -41
- package/gsd-core/bin/lib/roadmap.cjs +292 -69
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +260 -43
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +28 -20
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +294 -108
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -47
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +4 -0
- package/gsd-core/bin/lib/smart-entry.cjs +7 -9
- package/gsd-core/bin/lib/state-document.cjs +159 -32
- package/gsd-core/bin/lib/state-md-schema.cjs +44 -27
- package/gsd-core/bin/lib/state-transition.cjs +465 -62
- package/gsd-core/bin/lib/state.cjs +906 -151
- package/gsd-core/bin/lib/surface.cjs +83 -10
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/uat.cjs +1420 -516
- package/gsd-core/bin/lib/update-context.cjs +36 -26
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +316 -23
- package/gsd-core/bin/lib/verify-command-grounding.cjs +1 -1
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +531 -36
- package/gsd-core/bin/lib/workstream-inventory.cjs +21 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +21 -7
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +507 -81
- package/gsd-core/references/agent-contracts.md +3 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe.md +17 -13
- package/gsd-core/references/execute-mvp-tdd.md +18 -16
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +12 -3
- package/gsd-core/references/mvp-concepts.md +2 -2
- 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-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +75 -2
- package/gsd-core/references/planning-config.md +5 -1
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/tdd.md +17 -9
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/worktree-path-safety.md +112 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/phase-prompt.md +4 -0
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/add-backlog.md +2 -0
- package/gsd-core/workflows/add-phase.md +2 -0
- package/gsd-core/workflows/add-tests.md +1 -1
- package/gsd-core/workflows/add-todo.md +4 -3
- package/gsd-core/workflows/ai-integration-phase.md +1 -1
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +2 -0
- package/gsd-core/workflows/audit-milestone.md +2 -0
- package/gsd-core/workflows/audit-uat.md +2 -0
- package/gsd-core/workflows/autonomous.md +15 -10
- package/gsd-core/workflows/check-todos.md +5 -3
- package/gsd-core/workflows/cleanup.md +4 -2
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +22 -13
- package/gsd-core/workflows/code-review-fix.md +5 -3
- package/gsd-core/workflows/code-review.md +211 -43
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +40 -254
- package/gsd-core/workflows/debug.md +1 -1
- package/gsd-core/workflows/diagnose-issues.md +5 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +2 -0
- 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 +2 -0
- 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 +2 -0
- 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.md +1 -1
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +43 -13
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +15 -156
- package/gsd-core/workflows/edit-phase.md +2 -0
- package/gsd-core/workflows/eval-review.md +1 -1
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +20 -3
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +24 -3
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +8 -2
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +78 -159
- package/gsd-core/workflows/execute-plan.md +28 -15
- package/gsd-core/workflows/explore.md +2 -0
- package/gsd-core/workflows/extract-learnings.md +2 -0
- package/gsd-core/workflows/fast.md +6 -0
- package/gsd-core/workflows/forensics.md +2 -0
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +1 -1
- 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.compact.md +398 -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 +3 -1
- package/gsd-core/workflows/import.md +3 -3
- package/gsd-core/workflows/inbox.md +1 -1
- package/gsd-core/workflows/ingest-docs.md +1 -1
- package/gsd-core/workflows/insert-phase.md +2 -0
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +2 -0
- package/gsd-core/workflows/list-workspaces.md +2 -0
- package/gsd-core/workflows/manager.md +3 -3
- package/gsd-core/workflows/map-codebase.md +52 -3
- package/gsd-core/workflows/milestone-summary.md +2 -0
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +55 -13
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project.md +37 -205
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +2 -0
- 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 +19 -4
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +9 -0
- package/gsd-core/workflows/plan-phase.md +144 -185
- package/gsd-core/workflows/plan-review-convergence.md +102 -10
- package/gsd-core/workflows/plant-seed.md +1 -1
- package/gsd-core/workflows/pr-branch.md +30 -10
- package/gsd-core/workflows/profile-user.md +1 -1
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +25 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +37 -2
- package/gsd-core/workflows/quick/steps/research-phase.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 +21 -4
- package/gsd-core/workflows/reapply-patches.md +79 -3
- package/gsd-core/workflows/remove-phase.md +2 -0
- package/gsd-core/workflows/remove-workspace.md +1 -1
- package/gsd-core/workflows/resume-project.md +6 -2
- package/gsd-core/workflows/review.md +215 -10
- package/gsd-core/workflows/scan.md +2 -0
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +2 -0
- package/gsd-core/workflows/settings-integrations.md +9 -8
- package/gsd-core/workflows/settings.md +19 -6
- package/gsd-core/workflows/ship.md +10 -10
- package/gsd-core/workflows/sketch-wrap-up.md +2 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +1 -1
- package/gsd-core/workflows/spec-phase.md +24 -19
- package/gsd-core/workflows/spike-wrap-up.md +2 -0
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +2 -0
- package/gsd-core/workflows/sync-skills.md +12 -4
- package/gsd-core/workflows/thread.md +2 -0
- package/gsd-core/workflows/transition.md +2 -0
- package/gsd-core/workflows/ui-phase.md +26 -5
- package/gsd-core/workflows/ui-review.md +1 -1
- package/gsd-core/workflows/ultraplan-phase.md +2 -0
- package/gsd-core/workflows/undo.md +1 -1
- package/gsd-core/workflows/update.md +48 -43
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work.md +68 -182
- package/hooks/dist/gsd-agent-isolation-guard.js +42 -16
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-context-monitor.js +371 -27
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-node-runner.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +30 -5
- package/hooks/dist/gsd-read-guard.js +2 -0
- package/hooks/dist/gsd-read-injection-scanner.js +5 -5
- package/hooks/dist/gsd-secret-read-guard.js +1105 -0
- package/hooks/dist/gsd-statusline.js +18 -10
- package/hooks/dist/gsd-validate-commit.sh +474 -7
- package/hooks/dist/gsd-workflow-guard.js +2 -1
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-agent-isolation-guard.js +42 -16
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-context-monitor.js +371 -27
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-node-runner.sh +1 -0
- package/hooks/gsd-prompt-guard.js +30 -5
- package/hooks/gsd-read-guard.js +2 -0
- package/hooks/gsd-read-injection-scanner.js +5 -5
- package/hooks/gsd-secret-read-guard.js +1105 -0
- package/hooks/gsd-statusline.js +18 -10
- package/hooks/gsd-validate-commit.sh +474 -7
- package/hooks/gsd-workflow-guard.js +2 -1
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/hooks.json +6 -0
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +13 -9
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +11 -4
- package/scripts/check-contract-drift.cjs +4 -1
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +133 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +17 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +67 -15
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +210 -0
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +276 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lib/suite-detection.cjs +32 -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-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +24 -2
- package/scripts/lint-phase-enumeration-drift.cjs +24 -6
- package/scripts/lint-phase-id-drift.cjs +465 -15
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-response-language-coverage.cjs +530 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-test-file-count.allowlist.json +4 -1
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +1112 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +22 -0
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +1 -0
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +2 -1
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -61,6 +61,10 @@ for the plan-checker gate to be meaningful.
|
|
|
61
61
|
|
|
62
62
|
**Do not create, rename, or switch git branches during plan-phase.** Branch identity is established at discuss-phase and is owned by the user's git workflow. A phase rename in ROADMAP.md is a plan-level change only — it does not mutate git branch names. If `phase_slug` in the init JSON differs from the current branch name, that is expected and correct; leave the branch unchanged.
|
|
63
63
|
|
|
64
|
+
## 0.5. Compact Content Gate
|
|
65
|
+
|
|
66
|
+
Read and follow `gsd-core/references/compact-content-gate.md` now — it states the `workflow.compact_content` check and the resolution rule this spine defers to. When it directs a Read, read `gsd-core/workflows/plan-phase/detail/elaboration.md` in full before continuing past this point; its content elaborates on several steps below.
|
|
67
|
+
|
|
64
68
|
## 1. Initialize
|
|
65
69
|
|
|
66
70
|
Load all context in one call (paths only to minimize orchestrator context):
|
|
@@ -100,7 +104,7 @@ Parse JSON for: `researcher_model`, `planner_model`, `checker_model`, `research_
|
|
|
100
104
|
|
|
101
105
|
**#2517:** omit the `model=` param from an `Agent()` call when its `researcher`/`planner`/`checker`_model is `"inherit"` or empty — passing `model=""` 404s on non-Claude runtimes; omitting inherits the orchestrator model (mirrors execute-phase).
|
|
102
106
|
|
|
103
|
-
**If `response_language` is set:** All user-facing orchestrator output MUST be in `{response_language}`; technical terms, code, paths, and subagent prompts stay in English. Pass `response_language: {value}` into every spawned subagent prompt.
|
|
107
|
+
**If `response_language` is set:** All user-facing orchestrator output — narration between tool calls, status updates, progress notes, findings, questions, prompts, and explanations — MUST be in `{response_language}`; technical terms, code, paths, and subagent prompts stay in English. Pass `response_language: {value}` into every spawned subagent prompt.
|
|
104
108
|
|
|
105
109
|
**File paths (for <required_reading> blocks):** `state_path`, `roadmap_path`, `requirements_path`, `context_path`, `research_path`, `verification_path`, `uat_path`, `reviews_path`. These are null if files don't exist.
|
|
106
110
|
|
|
@@ -124,7 +128,7 @@ In research-only mode, two modifiers control behavior when `RESEARCH.md` already
|
|
|
124
128
|
```bash
|
|
125
129
|
RESEARCH_ONLY=false
|
|
126
130
|
VIEW_ONLY=false
|
|
127
|
-
if [[ "$ARGUMENTS" =~ --research-phase[[:space:]]+([0-9]+(\.[0-9]+)
|
|
131
|
+
if [[ "$ARGUMENTS" =~ --research-phase[[:space:]]+([0-9]+(\.[0-9]+)*) ]]; then
|
|
128
132
|
RESEARCH_ONLY=true
|
|
129
133
|
PHASE="${BASH_REMATCH[1]}"
|
|
130
134
|
fi
|
|
@@ -287,6 +291,43 @@ fi
|
|
|
287
291
|
|
|
288
292
|
If `AI_SPEC_FILE` is non-empty, pass `AI_SPEC_PATH` and `FRAMEWORK_LINE` to the planner in step 8 so it can reference the AI design contract. If it is empty, the active `ai-integration` capability hook in step 5.6 handles any AI-system nudge or `/gsd:ai-integration-phase` dispatch.
|
|
289
293
|
|
|
294
|
+
## 4.6. Context Drift Pre-Check (drift plan:pre gate)
|
|
295
|
+
|
|
296
|
+
Capability-driven dispatch, same lazy-init pattern already used elsewhere in this file for
|
|
297
|
+
`PLAN_PRE_HOOKS_JSON`:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
if [ -z "${PLAN_PRE_HOOKS_JSON:-}" ]; then
|
|
301
|
+
PLAN_PRE_HOOKS_JSON=$(gsd_run loop render-hooks plan:pre --raw)
|
|
302
|
+
fi
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
If `activeHooks` (from `PLAN_PRE_HOOKS_JSON`) has a `kind == "gate"`, `capId == "drift"`,
|
|
306
|
+
`check.query == "verify.context-drift"` entry (`workflow.context_drift_precheck` on), run the
|
|
307
|
+
check before either the research-reuse decision (§5.1) or the pattern-mapper reuse decision
|
|
308
|
+
(§7.8) can fire — both would otherwise silently reuse a stale artifact with zero signal.
|
|
309
|
+
Otherwise skip to §5.
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
DRIFT=$(gsd_run verify context-drift "${PHASE}" 2>/dev/null || echo '{"skipped":true}')
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
If `skipped` is true, continue silently to §5 — nothing to compare (no CONTEXT.md yet, no
|
|
316
|
+
upstream artifacts yet, or the phase directory did not resolve).
|
|
317
|
+
|
|
318
|
+
If `stale_artifacts` is a non-empty array, print `message` verbatim (it names each stale
|
|
319
|
+
artifact and the command to regenerate it). Then:
|
|
320
|
+
|
|
321
|
+
- If `DRIFT.block` is `false` (the default, `workflow.context_drift_action: warn`): continue to
|
|
322
|
+
§5 — this is advisory only, exactly like the codebase-drift pre-check at §5.65.
|
|
323
|
+
- If `DRIFT.block` is `true` (opt-in `workflow.context_drift_action: block`): **exit the
|
|
324
|
+
plan-phase workflow** rather than continuing. Do not spawn the researcher, the planner, or the
|
|
325
|
+
pattern mapper against a premise the user has not yet reconciled. Point the user at re-running
|
|
326
|
+
`/gsd:plan-phase {X}` once the named artifacts are regenerated, or at disabling the check with
|
|
327
|
+
`gsd_run query config-set workflow.context_drift_action warn` if the flag was a false positive.
|
|
328
|
+
|
|
329
|
+
If `stale_artifacts` is empty, continue silently to §5 — nothing to report.
|
|
330
|
+
|
|
290
331
|
## 5. Handle Research
|
|
291
332
|
|
|
292
333
|
**Skip if:** `--gaps` flag or `--skip-research` flag or `--reviews` flag.
|
|
@@ -372,7 +413,8 @@ Agent(
|
|
|
372
413
|
)
|
|
373
414
|
```
|
|
374
415
|
|
|
375
|
-
|
|
416
|
+
<!-- gsd:protected -->
|
|
417
|
+
> **ORCHESTRATOR RULE — ALL RUNTIMES**: 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. Never call `ScheduleWakeup` or any host wake/sleep-scheduling tool to literalize this wait (#4079) — the Agent() call returns on its own; a partial-args wake call surfaces a red validation error.
|
|
376
418
|
|
|
377
419
|
### Handle Researcher Return
|
|
378
420
|
|
|
@@ -547,8 +589,6 @@ map is refreshed first. (`drift_action: auto-remap` stays at `execute:wave:post`
|
|
|
547
589
|
ls "${PHASE_DIR}"/*-PLAN.md 2>/dev/null || true
|
|
548
590
|
```
|
|
549
591
|
|
|
550
|
-
**If exists AND `--reviews` flag:** Skip prompt — go straight to replanning (the purpose of `--reviews` is to replan with review feedback).
|
|
551
|
-
|
|
552
592
|
**If exists AND no `--reviews` flag:** Offer: 1) Add more plans, 2) View existing, 3) Replan from scratch.
|
|
553
593
|
|
|
554
594
|
## 7. Use Context Paths from INIT
|
|
@@ -584,6 +624,11 @@ UI_SPEC_FILE=$(ls "${PHASE_DIR_FOR_SPEC}"/*-UI-SPEC.md 2>/dev/null | head -1)
|
|
|
584
624
|
UI_SPEC_PATH="${UI_SPEC_FILE}"
|
|
585
625
|
```
|
|
586
626
|
|
|
627
|
+
**If plans exist AND the `--reviews` flag is set:** Before replanning from `--reviews`, scan
|
|
628
|
+
`REVIEWS_PATH` for open plan-revision conflicts inside the writer-owned delimiter pair. Go
|
|
629
|
+
straight to replanning with those records included, and flip the matching line to `- [x]` once
|
|
630
|
+
the chosen resolution is applied, using the SAME close gate as step 12 below.
|
|
631
|
+
|
|
587
632
|
## 7.5. Verify Nyquist Artifacts
|
|
588
633
|
|
|
589
634
|
Skip if `nyquist_validation_enabled` is false OR `research_enabled` is false.
|
|
@@ -635,7 +680,8 @@ Agent(
|
|
|
635
680
|
)
|
|
636
681
|
```
|
|
637
682
|
|
|
638
|
-
|
|
683
|
+
<!-- gsd:protected -->
|
|
684
|
+
> **ORCHESTRATOR RULE — ALL RUNTIMES**: 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. Never call `ScheduleWakeup` or any host wake/sleep-scheduling tool to literalize this wait (#4079) — the Agent() call returns on its own; a partial-args wake call surfaces a red validation error.
|
|
639
685
|
|
|
640
686
|
**Handle return:**
|
|
641
687
|
- **`## PATTERN MAPPING COMPLETE`:** Update `PATTERNS_PATH` to the created file path, continue to step 8.
|
|
@@ -745,7 +791,7 @@ ${AGENT_SKILLS_PLANNER}
|
|
|
745
791
|
|
|
746
792
|
For each current actionable finding in REVIEWS.md, the planner MUST either:
|
|
747
793
|
- incorporate it into a PLAN.md task, `<action>`, `<acceptance_criteria>`, `<verify>`, `must_haves`, threat model, or artifact list; or
|
|
748
|
-
- explicitly document a deferral/rejection rationale in the relevant PLAN.md
|
|
794
|
+
- explicitly document a deferral/rejection rationale in the relevant PLAN.md, using the Review Dispositions Ledger in `gsd-core/references/planner-reviews.md`.
|
|
749
795
|
|
|
750
796
|
Historical findings already incorporated, explicitly deferred/rejected in PLAN.md, or marked fully resolved do not require new plan changes.
|
|
751
797
|
</review_incorporation_contract>
|
|
@@ -766,6 +812,7 @@ inherited paths: fix a mirror path, never inherit. Submodule files: check
|
|
|
766
812
|
from within the submodule.
|
|
767
813
|
</tracked_source_paths>
|
|
768
814
|
|
|
815
|
+
<!-- gsd:protected:start -->
|
|
769
816
|
<failing_direction_contract>
|
|
770
817
|
**Stated failing direction (#3172):** Every runnable `<automated>` verify command
|
|
771
818
|
you write MUST be followed by a `<fails_when>` sibling naming what output
|
|
@@ -790,6 +837,7 @@ doing nothing, what in its output would tell me? If you cannot answer, fix the
|
|
|
790
837
|
command — do not invent a statement for it.
|
|
791
838
|
Rules + worked examples: @gsd-core/references/planner-failing-direction.md
|
|
792
839
|
</failing_direction_contract>
|
|
840
|
+
<!-- gsd:protected:end -->
|
|
793
841
|
|
|
794
842
|
**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists — follow project-specific guidelines
|
|
795
843
|
**Project skills:** Check .claude/skills/ or .agents/skills/ directory (if either exists) — read SKILL.md files, plans should account for project skill rules
|
|
@@ -825,6 +873,7 @@ ${SPECLESS_FALLBACK_DISABLED ? `
|
|
|
825
873
|
|
|
826
874
|
</planning_context>
|
|
827
875
|
|
|
876
|
+
<!-- gsd:protected:start -->
|
|
828
877
|
<downstream_consumer>
|
|
829
878
|
Output consumed by /gsd:execute-phase. Plans need:
|
|
830
879
|
- Frontmatter (wave, depends_on, files_modified, autonomous)
|
|
@@ -836,6 +885,7 @@ Output consumed by /gsd:execute-phase. Plans need:
|
|
|
836
885
|
- If a `-UI-SPEC.md` exists (resolved above as `UI_SPEC_PATH`) with a `## UI Considerations` section, lift it by the **identical rule** as `## Edge Coverage` above — resolved (explicit) → `must_haves.truths` string, resolved (backstop) → flat scalar `{ statement, verification: backstop }`, `unresolved` → explicit planner assumption (no new verb — ADR-550 #1278/#1154; #1867). Read it from `UI_SPEC_PATH` (the SPEC glob excludes `-UI-SPEC.md`).
|
|
837
886
|
- **"Artifacts this phase produces" section (MANDATORY)** — list every symbol this phase creates: decorators, classes, functions, CLI flags, struct/dataclass fields, new file paths. The plan-review-convergence source-grounding pass reads this section to exclude newly-created symbols from drift verification; omitting it causes new symbols to be flagged for acknowledgement.
|
|
838
887
|
</downstream_consumer>
|
|
888
|
+
<!-- gsd:protected:end -->
|
|
839
889
|
|
|
840
890
|
<deep_work_rules>
|
|
841
891
|
## Anti-Shallow Execution Rules (MANDATORY)
|
|
@@ -868,6 +918,7 @@ Every task MUST include these fields — they are NOT optional:
|
|
|
868
918
|
**Why this matters:** Executor agents work from the plan text. Vague instructions like "update the config to match production" produce shallow one-line changes. Concrete instructions like "add DATABASE_URL, set POOL_SIZE=20, add REDIS_URL, and read config/runtime.ts before editing" produce complete work without turning the planner into the executor.
|
|
869
919
|
</deep_work_rules>
|
|
870
920
|
|
|
921
|
+
<!-- gsd:protected:start -->
|
|
871
922
|
<quality_gate>
|
|
872
923
|
- [ ] PLAN.md files created in phase directory
|
|
873
924
|
- [ ] Each plan has valid frontmatter
|
|
@@ -883,6 +934,7 @@ Every task MUST include these fields — they are NOT optional:
|
|
|
883
934
|
- [ ] Every UI-SPEC ## UI Considerations resolved consideration is represented in a plan's must_haves (no silent drops)
|
|
884
935
|
- [ ] Every SPEC ## Prohibitions resolved item is represented in a plan's must_haves.prohibitions (no silent drops)
|
|
885
936
|
</quality_gate>
|
|
937
|
+
<!-- gsd:protected:end -->
|
|
886
938
|
```
|
|
887
939
|
|
|
888
940
|
**If `CHUNKED_MODE` is `false` (default):** Spawn the planner as a single long-lived Agent:
|
|
@@ -919,93 +971,18 @@ If `section_manifest` is `null` or `"chunked-planning-mode"` is in its `included
|
|
|
919
971
|
**Triggered when:** Agent() returns but the return contains no recognized marker (`## PLANNING COMPLETE`, `## PHASE SPLIT RECOMMENDED`, `## ⚠ Source Audit`, `## CHECKPOINT REACHED`, `## PLANNING INCONCLUSIVE`).
|
|
920
972
|
|
|
921
973
|
```bash
|
|
922
|
-
# #3218: this asks "did the planner write files to disk at all" — a
|
|
923
|
-
# planner-produced-nothing check, not outstanding-work counting — so it
|
|
924
|
-
# takes the PHYSICAL set (`plan_count_all`, status:superseded INCLUDED): a
|
|
925
|
-
# superseded plan is still a file the planner wrote, and this check must not
|
|
926
|
-
# read "nothing written" just because every plan happens to be superseded.
|
|
927
974
|
DISK_PLANS=$(gsd_run query find-phase "${PHASE_NUMBER}" | jq -r '.plan_count_all // 0')
|
|
928
975
|
```
|
|
929
976
|
|
|
930
|
-
|
|
931
|
-
truncated (the Windows stdio hang pattern — the subagent finished but the return never
|
|
932
|
-
arrived). Display:
|
|
933
|
-
|
|
934
|
-
```text
|
|
935
|
-
◆ Planner wrote {DISK_PLANS} plan(s) to disk but did not emit a PLANNING COMPLETE marker.
|
|
936
|
-
This is a known Windows stdio hang pattern — work is likely recoverable.
|
|
937
|
-
|
|
938
|
-
Plans found on disk:
|
|
939
|
-
{ls output of *-PLAN.md}
|
|
940
|
-
```
|
|
941
|
-
|
|
942
|
-
Offer 3 options:
|
|
943
|
-
1. **Accept plans** — treat as `## PLANNING COMPLETE` and continue through step 9 `## PLANNING COMPLETE` handling (so `--skip-verify` / `plan_checker_enabled=false` are honored — may skip to step 13 rather than step 10)
|
|
944
|
-
2. **Retry planner** — re-spawn the planner with the same prompt (return to step 8)
|
|
945
|
-
3. **Stop** — exit; user can re-run `/gsd:plan-phase {N}` to resume
|
|
946
|
-
|
|
947
|
-
**If `DISK_PLANS` is 0 and no marker:** The planner produced no output. Treat as
|
|
948
|
-
`## PLANNING INCONCLUSIVE` and handle accordingly.
|
|
977
|
+
If `DISK_PLANS` is greater than 0 (a known Windows stdio hang pattern — the planner wrote plans to disk but the return never arrived), offer: 1) Accept plans (treat as `## PLANNING COMPLETE`), 2) Retry planner (return to step 8), 3) Stop. If it is 0 and no marker, treat as `## PLANNING INCONCLUSIVE`. Full banner text: `gsd-core/workflows/plan-phase/detail/elaboration.md` § 9a.
|
|
949
978
|
|
|
950
979
|
## 9b. Handle Phase Split Recommendation
|
|
951
980
|
|
|
952
|
-
When the planner returns `## PHASE SPLIT RECOMMENDED`,
|
|
953
|
-
|
|
954
|
-
**Extract from planner return:**
|
|
955
|
-
- Proposed sub-phases (e.g., "17a: processing core (D-01 to D-19)", "17b: billing + config UX (D-20 to D-27)")
|
|
956
|
-
- Which source items (REQ-IDs, D-XX decisions, RESEARCH items) go in each sub-phase
|
|
957
|
-
- Why the split is necessary (context cost estimate, file count)
|
|
958
|
-
|
|
959
|
-
**Present to user:**
|
|
960
|
-
```
|
|
961
|
-
## Phase {X} exceeds context budget for full-fidelity implementation
|
|
962
|
-
|
|
963
|
-
The planner found {N} source items that exceed the context budget when
|
|
964
|
-
planned at full fidelity. Instead of reducing scope, we recommend splitting:
|
|
965
|
-
|
|
966
|
-
**Option 1: Split into sub-phases**
|
|
967
|
-
- Phase {X}a: {name} — {items} ({N} source items, ~{P}% context)
|
|
968
|
-
- Phase {X}b: {name} — {items} ({M} source items, ~{Q}% context)
|
|
969
|
-
|
|
970
|
-
**Option 2: Proceed anyway** (planner will attempt all, quality may degrade past 50% context)
|
|
971
|
-
|
|
972
|
-
**Option 3: Prioritize** — you choose which items to implement now,
|
|
973
|
-
rest become a follow-up phase
|
|
974
|
-
```
|
|
975
|
-
|
|
976
|
-
Use AskUserQuestion with these 3 options.
|
|
977
|
-
|
|
978
|
-
**If "Split":** Use `/gsd:phase --insert` to create the sub-phases, then replan each.
|
|
979
|
-
**If "Proceed":** Return to planner with instruction to attempt all items at full fidelity, accepting more plans/tasks.
|
|
980
|
-
**If "Prioritize":** Use AskUserQuestion (multiSelect) to let user pick which items are "now" vs "later". Create CONTEXT.md for each sub-phase with the selected items.
|
|
981
|
+
When the planner returns `## PHASE SPLIT RECOMMENDED`, the phase's source items exceed the context budget for full-fidelity implementation. Extract the planner's proposed sub-phase groupings and present the user three options via AskUserQuestion: Split into sub-phases (use `/gsd:phase --insert`, then replan each), Proceed anyway (return to planner accepting degraded quality), or Prioritize (AskUserQuestion multiSelect to choose now vs. later, create CONTEXT.md per sub-phase). Full banner text: `gsd-core/workflows/plan-phase/detail/elaboration.md` § 9b.
|
|
981
982
|
|
|
982
983
|
## 9c. Handle Source Audit Gaps
|
|
983
984
|
|
|
984
|
-
When the planner returns `## ⚠ Source Audit: Unplanned Items Found`,
|
|
985
|
-
|
|
986
|
-
**Extract from planner return:**
|
|
987
|
-
- Each unplanned item with its source artifact and section
|
|
988
|
-
- The planner's suggested options (A: add plan, B: split phase, C: defer with confirmation)
|
|
989
|
-
|
|
990
|
-
**Present each gap to user.** For each unplanned item:
|
|
991
|
-
|
|
992
|
-
```
|
|
993
|
-
## ⚠ Unplanned: {item description}
|
|
994
|
-
|
|
995
|
-
Source: {RESEARCH.md / REQUIREMENTS.md / ROADMAP goal / CONTEXT.md}
|
|
996
|
-
Details: {why the planner flagged this}
|
|
997
|
-
|
|
998
|
-
Options:
|
|
999
|
-
1. Add a plan to cover this item (recommended)
|
|
1000
|
-
2. Split phase — move to a sub-phase with related items
|
|
1001
|
-
3. Defer — add to backlog (developer confirms this is intentional)
|
|
1002
|
-
```
|
|
1003
|
-
|
|
1004
|
-
Use AskUserQuestion for each gap (or batch if multiple gaps).
|
|
1005
|
-
|
|
1006
|
-
**If "Add plan":** Return to planner (step 8) with instruction to add plans covering the missing items, preserving existing plans.
|
|
1007
|
-
**If "Split":** Use `/gsd:phase --insert` for overflow items, then replan.
|
|
1008
|
-
**If "Defer":** Record in CONTEXT.md `## Deferred Ideas` with developer's confirmation. Proceed to step 10.
|
|
985
|
+
When the planner returns `## ⚠ Source Audit: Unplanned Items Found`, items from REQUIREMENTS.md, RESEARCH.md, ROADMAP goal, or CONTEXT.md decisions have no corresponding plan. Present each gap to the user with three options: Add a plan (return to planner, step 8), Split phase (`/gsd:phase --insert`, then replan), or Defer (record in CONTEXT.md `## Deferred Ideas` with developer confirmation, proceed to step 10). Full banner text: `gsd-core/workflows/plan-phase/detail/elaboration.md` § 9c.
|
|
1009
986
|
|
|
1010
987
|
## 10. Spawn gsd-plan-checker Agent
|
|
1011
988
|
|
|
@@ -1110,52 +1087,17 @@ Agent(
|
|
|
1110
1087
|
- **`stalled`:** Automatically surface 11a's recovery choice (Accept verification / Retry checker / Stop) — no manual interrupt needed.
|
|
1111
1088
|
- **Empty / truncated / no recognized marker:** → Filesystem fallback (step 11a).
|
|
1112
1089
|
|
|
1113
|
-
**Thinking partner for architectural tradeoffs (conditional):**
|
|
1114
|
-
If `features.thinking_partner` is enabled, scan the checker's issues for architectural tradeoff keywords
|
|
1115
|
-
("architecture", "approach", "strategy", "pattern", "vs", "alternative"). If found:
|
|
1116
|
-
|
|
1117
|
-
```
|
|
1118
|
-
The plan-checker flagged an architectural decision point:
|
|
1119
|
-
{issue description}
|
|
1120
|
-
|
|
1121
|
-
Brief analysis:
|
|
1122
|
-
- Option A: {approach_from_plan} — {pros/cons}
|
|
1123
|
-
- Option B: {alternative_approach} — {pros/cons}
|
|
1124
|
-
- Recommendation: {choice} aligned with {phase_goal}
|
|
1125
|
-
|
|
1126
|
-
Apply this to the revision? [Yes] / [No, I'll decide]
|
|
1127
|
-
```
|
|
1128
|
-
|
|
1129
|
-
If yes: include the recommendation in the revision prompt. If no: proceed to revision loop as normal.
|
|
1130
|
-
If thinking_partner disabled: skip this block entirely.
|
|
1090
|
+
**Thinking partner for architectural tradeoffs (conditional):** If `features.thinking_partner` is enabled and the checker's issues contain architectural tradeoff keywords ("architecture", "approach", "strategy", "pattern", "vs", "alternative"), present a brief Option A/B analysis with a recommendation and ask "Apply this to the revision? [Yes] / [No, I'll decide]". If disabled, skip. Full prompt template: `gsd-core/workflows/plan-phase/detail/elaboration.md` § 11 thinking-partner.
|
|
1131
1091
|
|
|
1132
1092
|
## 11a. Filesystem Fallback (Checker)
|
|
1133
1093
|
|
|
1134
1094
|
**Triggered when:** Checker Agent() returns but the return contains neither `## VERIFICATION PASSED` nor `## ISSUES FOUND`.
|
|
1135
1095
|
|
|
1136
1096
|
```bash
|
|
1137
|
-
# #3218: this asks "did the planner write files to disk at all" — a
|
|
1138
|
-
# planner-produced-nothing check, not outstanding-work counting — so it
|
|
1139
|
-
# takes the PHYSICAL set (`plan_count_all`, status:superseded INCLUDED): a
|
|
1140
|
-
# superseded plan is still a file the planner wrote, and this check must not
|
|
1141
|
-
# read "nothing written" just because every plan happens to be superseded.
|
|
1142
1097
|
DISK_PLANS=$(gsd_run query find-phase "${PHASE_NUMBER}" | jq -r '.plan_count_all // 0')
|
|
1143
1098
|
```
|
|
1144
1099
|
|
|
1145
|
-
|
|
1146
|
-
Windows stdio hang pattern — the subagent finished but the return never arrived). Display:
|
|
1147
|
-
|
|
1148
|
-
```text
|
|
1149
|
-
◆ Checker return was empty or truncated. {DISK_PLANS} plan(s) exist on disk.
|
|
1150
|
-
This is a known Windows stdio hang pattern — checker may have completed without returning.
|
|
1151
|
-
```
|
|
1152
|
-
|
|
1153
|
-
Offer 3 options:
|
|
1154
|
-
1. **Accept verification** — treat as `## VERIFICATION PASSED` and continue to step 13
|
|
1155
|
-
2. **Retry checker** — re-spawn the checker with the same prompt (return to step 10)
|
|
1156
|
-
3. **Stop** — exit; user can re-run `/gsd:plan-phase {N}` to resume
|
|
1157
|
-
|
|
1158
|
-
**If `DISK_PLANS` is 0:** No plans on disk — something is seriously wrong. Display error and stop.
|
|
1100
|
+
If `DISK_PLANS` is greater than 0 (plans exist on disk; a known Windows stdio hang pattern), offer: 1) Accept verification (treat as `## VERIFICATION PASSED`, continue to step 13), 2) Retry checker (return to step 10), 3) Stop. If it is 0, something is seriously wrong — display error and stop. Full banner text: `gsd-core/workflows/plan-phase/detail/elaboration.md` § 11a.
|
|
1159
1101
|
|
|
1160
1102
|
## 12. Revision Loop (Max 3 Iterations)
|
|
1161
1103
|
|
|
@@ -1165,9 +1107,9 @@ Track `stall_reentry_count` (starts at 0; incremented each time "Adjust approach
|
|
|
1165
1107
|
|
|
1166
1108
|
**If iteration_count < 3:**
|
|
1167
1109
|
|
|
1168
|
-
Parse issue count from checker return: count BLOCKER + WARNING entries in the YAML issues block (structured output from gsd-plan-checker). If the checker's return contains no YAML issues block (i.e., the plan was approved with no issues), treat `issue_count` as 0 and skip the stall check — the plan passed. Proceed to step 13.
|
|
1110
|
+
Parse issue count from checker return: count BLOCKER + WARNING entries in the YAML issues block (structured output from gsd-plan-checker); an entry whose severity is missing or unrecognized counts as a BLOCKER (fail closed). If the checker's return contains no YAML issues block (i.e., the plan was approved with no issues), treat `issue_count` as 0 and skip the stall check — the plan passed. Proceed to step 13 — likewise when every entry in the block is explicitly INFO (display them as advisories). Advisory format: `ℹ advisory — {dimension}: {description}` per INFO entry, listed once before the step-13 output.
|
|
1169
1111
|
|
|
1170
|
-
Display: `Revision iteration {N}/3 -- {blocker_count} blockers, {warning_count} warnings`
|
|
1112
|
+
Display (only when entering the revision loop — skip if the paragraph above already proceeded to step 13): `Revision iteration {N}/3 -- {blocker_count} blockers, {warning_count} warnings`
|
|
1171
1113
|
|
|
1172
1114
|
**Stall detection:** If `issue_count >= prev_issue_count`:
|
|
1173
1115
|
Display: `Revision loop stalled — issue count not decreasing ({issue_count} issues remain after {N} iterations)`
|
|
@@ -1207,9 +1149,14 @@ ${AGENT_SKILLS_PLANNER}
|
|
|
1207
1149
|
</revision_context>
|
|
1208
1150
|
|
|
1209
1151
|
<instructions>
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1152
|
+
`required_property` + evidence + severity BIND. `fix_hint` is ONE non-binding example route: a
|
|
1153
|
+
smaller or different mechanism reaching the same property resolves it — say which. Re-check CONTEXT.md's locked decisions, capability guidance, and existing plan constraints
|
|
1154
|
+
BEFORE editing; if a hint would contradict one, or the
|
|
1155
|
+
property is unreachable without breaking one, return `## REVISION_CONFLICT` with the conflict and
|
|
1156
|
+
the alternatives rather than applying or working around it. Full contract:
|
|
1157
|
+
`gsd-core/references/planner-revision.md`.
|
|
1158
|
+
|
|
1159
|
+
Do NOT replan from scratch unless fundamental. Return what changed.
|
|
1213
1160
|
</instructions>
|
|
1214
1161
|
```
|
|
1215
1162
|
|
|
@@ -1225,82 +1172,92 @@ Agent(
|
|
|
1225
1172
|
|
|
1226
1173
|
**ORCHESTRATOR RULE — ALL RUNTIMES:** (7.99; no marker, mtimes only) `TS=$(date +%s)`; repeat `PLANNER_STALL_RESULT=$(gsd_stall_watch "$TS" "{outputFile}" "${PHASE_DIR}"'/*-PLAN.md')` while waiting/active — `stalled` -> 1) Accept as revised, to step 13, 2) Retry, 3) Stop.
|
|
1227
1174
|
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
**If iteration_count >= 3:**
|
|
1231
|
-
|
|
1232
|
-
Display: `Max iterations reached. {N} issues remain:` + issue list
|
|
1233
|
-
|
|
1234
|
-
Offer: 1) Force proceed, 2) Provide guidance and retry, 3) Abandon
|
|
1235
|
-
|
|
1236
|
-
## 12.5. Plan Bounce (Optional External Refinement)
|
|
1237
|
-
|
|
1238
|
-
**Skip if:** `--skip-bounce` flag, `--gaps` flag, or bounce is not activated.
|
|
1175
|
+
**If the planner returns `## REVISION_CONFLICT`:** follow the shared Conflict Return protocol in
|
|
1176
|
+
`gsd-core/references/revision-loop.md`, with this workflow's bindings:
|
|
1239
1177
|
|
|
1240
|
-
**Activation:** Bounce runs when `--bounce` flag is present OR `workflow.plan_bounce` config is `true`. The `--skip-bounce` flag always wins (disables bounce even if config enables it). The `--gaps` flag also disables bounce (gap-closure mode should not modify plans externally).
|
|
1241
|
-
|
|
1242
|
-
**Prerequisites:** `workflow.plan_bounce_script` must be set to a valid script path. If bounce is activated but no script is configured, display warning and skip:
|
|
1243
|
-
```
|
|
1244
|
-
⚠ Plan bounce activated but no script configured.
|
|
1245
|
-
Set workflow.plan_bounce_script to the path of your refinement script.
|
|
1246
|
-
Skipping bounce step.
|
|
1247
|
-
```
|
|
1248
|
-
|
|
1249
|
-
**Read pass count:**
|
|
1250
1178
|
```bash
|
|
1251
|
-
|
|
1252
|
-
|
|
1179
|
+
if ! CONVERGENCE_ENABLED=$(gsd_run query config-get workflow.plan_review_convergence --raw 2>/dev/null); then
|
|
1180
|
+
echo "BLOCKED: cannot read workflow.plan_review_convergence." >&2
|
|
1181
|
+
exit 1
|
|
1182
|
+
fi
|
|
1183
|
+
REVIEWS_FILE="${REVIEWS_PATH}"
|
|
1184
|
+
if [ "${CONVERGENCE_ENABLED}" = "true" ] && [ -n "${REVIEWS_FILE}" ] && [ ! -f "${REVIEWS_FILE}" ]; then
|
|
1185
|
+
echo "BLOCKED: cannot persist plan-revision conflict -- REVIEWS_PATH not a regular file: ${REVIEWS_FILE}" >&2
|
|
1186
|
+
exit 1
|
|
1187
|
+
fi
|
|
1253
1188
|
```
|
|
1254
1189
|
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1190
|
+
- Counter not spent: `iteration_count`.
|
|
1191
|
+
- Record channel: `$REVIEWS_FILE`'s `## Plan-Revision Conflicts` section. plan-phase wrote the
|
|
1192
|
+
line, so plan-phase closes it.
|
|
1193
|
+
- After re-spawning, return to this step, not the checker.
|
|
1194
|
+
- Escalates via the iteration cap on repeated `required_property`, and on the THIRD conflict
|
|
1195
|
+
return of this loop whatever property it names.
|
|
1196
|
+
- Sanitize-then-insert is real shell; fields reach `awk` via `ENVIRON`, never `-v` (decodes
|
|
1197
|
+
literal `\n` as a real newline). Export the row's
|
|
1198
|
+
`CONFLICT_DIMENSION/_PLAN/_PROPERTY/_CONSTRAINT/_ALTERNATIVES`, then run:
|
|
1258
1199
|
|
|
1259
|
-
|
|
1260
|
-
|
|
1200
|
+
```bash
|
|
1201
|
+
if [ "${CONVERGENCE_ENABLED}" = "true" ] && [ -n "${REVIEWS_FILE}" ]; then
|
|
1202
|
+
san() { printf '%s' "$1" | tr '\r\n\t' ' ' | sed -E 's/^[[:space:]]*[#|`-]+[[:space:]]*//'; }
|
|
1203
|
+
LINE="- [ ] REVISION_CONFLICT $(san "${CONFLICT_DIMENSION}")/$(san "${CONFLICT_PLAN}") — required_property: $(san "${CONFLICT_PROPERTY}") | conflicts with: $(san "${CONFLICT_CONSTRAINT}") | alternatives: $(san "${CONFLICT_ALTERNATIVES}")"
|
|
1204
|
+
END='<!-- gsd:plan-revision-conflicts:end -->'
|
|
1205
|
+
TMP=$(mktemp "${REVIEWS_FILE}.XXXXXX")
|
|
1206
|
+
if ! LINE="$LINE" END="$END" awk '
|
|
1207
|
+
{ cur = $0; sub(/\r$/, "", cur) }
|
|
1208
|
+
cur == ENVIRON["LINE"] { seen = 1 }
|
|
1209
|
+
cur == ENVIRON["END"] && !ins { if (!seen) print ENVIRON["LINE"]; ins = 1 }
|
|
1210
|
+
{ print }
|
|
1211
|
+
END { if (!ins) exit 2 }
|
|
1212
|
+
' "${REVIEWS_FILE}" > "${TMP}"; then
|
|
1213
|
+
rm -f "${TMP}"
|
|
1214
|
+
echo "BLOCKED: no end delimiter in '${REVIEWS_FILE}'." >&2
|
|
1215
|
+
exit 1
|
|
1216
|
+
fi
|
|
1217
|
+
mv "${TMP}" "${REVIEWS_FILE}"
|
|
1218
|
+
fi
|
|
1261
1219
|
```
|
|
1262
1220
|
|
|
1263
|
-
**
|
|
1221
|
+
**Otherwise (revised plans, not `## REVISION_CONFLICT`):** if this re-spawn followed a
|
|
1222
|
+
resolved conflict, close its record — nothing persists across fences, so export `REVIEWS_FILE`,
|
|
1223
|
+
the same `CONFLICT_DIMENSION`/`CONFLICT_PLAN` used to open it, and `CONFLICT_RESOLUTION` (a
|
|
1224
|
+
one-line summary). Then run:
|
|
1264
1225
|
|
|
1265
|
-
1. **Backup:** Copy `*-PLAN.md` to `*-PLAN.pre-bounce.md`
|
|
1266
1226
|
```bash
|
|
1267
|
-
|
|
1227
|
+
if [ "${CONVERGENCE_ENABLED}" = "true" ] && [ -n "${REVIEWS_FILE}" ]; then
|
|
1228
|
+
san() { printf '%s' "$1" | tr '\r\n\t' ' ' | sed -E 's/^[[:space:]]*[#|`-]+[[:space:]]*//'; }
|
|
1229
|
+
PREFIX="- [ ] REVISION_CONFLICT $(san "${CONFLICT_DIMENSION}")/$(san "${CONFLICT_PLAN}") — "
|
|
1230
|
+
RES=$(printf '%s' "${CONFLICT_RESOLUTION}" | tr '\r\n\t' ' ')
|
|
1231
|
+
TMP=$(mktemp "${REVIEWS_FILE}.XXXXXX")
|
|
1232
|
+
if ! PREFIX="$PREFIX" RES="$RES" awk '
|
|
1233
|
+
{ cur = $0; sub(/\r$/, "", cur) }
|
|
1234
|
+
!d && index(cur, ENVIRON["PREFIX"]) == 1 { print "- [x]" substr(cur, 6) " | resolved: " ENVIRON["RES"]; d = 1; next }
|
|
1235
|
+
{ print }
|
|
1236
|
+
END { if (!d) exit 2 }
|
|
1237
|
+
' "${REVIEWS_FILE}" > "${TMP}"; then
|
|
1238
|
+
rm -f "${TMP}"
|
|
1239
|
+
echo "BLOCKED: no open conflict '${CONFLICT_DIMENSION}/${CONFLICT_PLAN}' in '${REVIEWS_FILE}'." >&2
|
|
1240
|
+
exit 1
|
|
1241
|
+
fi
|
|
1242
|
+
mv "${TMP}" "${REVIEWS_FILE}"
|
|
1243
|
+
fi
|
|
1268
1244
|
```
|
|
1269
1245
|
|
|
1270
|
-
|
|
1271
|
-
```bash
|
|
1272
|
-
"${BOUNCE_SCRIPT}" "${PLAN_FILE}" "${BOUNCE_PASSES}"
|
|
1273
|
-
```
|
|
1246
|
+
Spawn checker again (step 10), then increment `iteration_count`.
|
|
1274
1247
|
|
|
1275
|
-
|
|
1276
|
-
After the script returns, check that the bounced file still has valid YAML frontmatter (opening and closing `---` delimiters with parseable content between them). If the bounced plan breaks YAML frontmatter validation, restore the original from the pre-bounce.md backup and continue to the next plan:
|
|
1277
|
-
```
|
|
1278
|
-
⚠ Bounced plan ${PLAN_FILE} has broken YAML frontmatter — restoring original from pre-bounce backup.
|
|
1279
|
-
```
|
|
1248
|
+
**If iteration_count >= 3:**
|
|
1280
1249
|
|
|
1281
|
-
|
|
1282
|
-
```
|
|
1283
|
-
⚠ Bounce script failed for ${PLAN_FILE} (exit code ${EXIT_CODE}) — restoring original from pre-bounce backup.
|
|
1284
|
-
```
|
|
1250
|
+
Recount BLOCKER + WARNING by the same rule — an entry whose severity is missing or unrecognized counts as a BLOCKER (fail closed). If `issue_count` is 0 — PASSED, or every entry in the block is explicitly INFO — display any advisories and proceed to step 13; the gate below fires on everything else (#3724).
|
|
1285
1251
|
|
|
1286
|
-
|
|
1252
|
+
Display: `Max iterations reached. {N} issues remain:` + issue list
|
|
1287
1253
|
|
|
1288
|
-
|
|
1289
|
-
```
|
|
1290
|
-
⚠ Bounced plan ${PLAN_FILE} failed checker validation — restoring original from pre-bounce backup.
|
|
1291
|
-
```
|
|
1254
|
+
Offer: 1) Force proceed, 2) Provide guidance and retry, 3) Abandon
|
|
1292
1255
|
|
|
1293
|
-
|
|
1294
|
-
```bash
|
|
1295
|
-
gsd_run query commit "refactor(${padded_phase}): bounce plans through external refinement" --files "${PHASE_DIR}/*-PLAN.md"
|
|
1296
|
-
```
|
|
1256
|
+
## 12.5. Plan Bounce (Optional External Refinement)
|
|
1297
1257
|
|
|
1298
|
-
|
|
1299
|
-
```
|
|
1300
|
-
Plan bounce complete: {survived}/{total} plans refined
|
|
1301
|
-
```
|
|
1258
|
+
**Skip if:** `--skip-bounce`, `--gaps`, or bounce not activated (`--bounce` flag or `workflow.plan_bounce` config; `--skip-bounce` always wins). Requires `workflow.plan_bounce_script` set to a valid script path — warn and skip if bounce is activated with no script configured.
|
|
1302
1259
|
|
|
1303
|
-
|
|
1260
|
+
For each `*-PLAN.md`: back it up to `*-PLAN.pre-bounce.md`, invoke `${BOUNCE_SCRIPT}` with the plan file and `workflow.plan_bounce_passes` (default 2), validate the result's YAML frontmatter integrity, and restore from backup on either broken frontmatter or a non-zero script exit. After all plans are bounced, re-run the plan checker (step 10) on the modified plans, restoring any that fail. Commit surviving bounced plans if at least one survived (`refactor(${padded_phase}): bounce plans through external refinement`), display a `{survived}/{total}` summary, and remove all `*-PLAN.pre-bounce.md` backups. Exact banner text, messages, and commands: `gsd-core/workflows/plan-phase/detail/elaboration.md` § 12.5.
|
|
1304
1261
|
|
|
1305
1262
|
## 13. Requirements Coverage Gate
|
|
1306
1263
|
|
|
@@ -1604,6 +1561,7 @@ Verification: {Passed | Passed with override | Skipped}
|
|
|
1604
1561
|
Read `gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md` if plan-phase freezes on Windows during agent spawning (stdio deadlocks with MCP servers, anthropics/claude-code#28126) — it covers force-kill, orphaned-node cleanup, stale task-dir cleanup, reducing the MCP server count, and the `--skip-research` fallback.
|
|
1605
1562
|
</windows_troubleshooting>
|
|
1606
1563
|
|
|
1564
|
+
<!-- gsd:protected:start -->
|
|
1607
1565
|
<success_criteria>
|
|
1608
1566
|
- [ ] .planning/ directory validated
|
|
1609
1567
|
- [ ] Phase validated against roadmap
|
|
@@ -1619,3 +1577,4 @@ Read `gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md` if plan-ph
|
|
|
1619
1577
|
- [ ] User sees status between agent spawns
|
|
1620
1578
|
- [ ] User knows next steps
|
|
1621
1579
|
</success_criteria>
|
|
1580
|
+
<!-- gsd:protected:end -->
|