@opengsd/gsd-core 1.9.0 → 1.10.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 +131 -34
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-executor.md +7 -5
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-plan-checker.md +9 -0
- package/agents/gsd-planner.md +5 -8
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-verifier.md +14 -70
- package/bin/install.js +503 -341
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/plan-phase.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +607 -63
- package/gsd-core/bin/lib/active-workstream-store.cjs +25 -0
- package/gsd-core/bin/lib/agent-install-check.cjs +38 -6
- package/gsd-core/bin/lib/api-coverage.cjs +120 -0
- package/gsd-core/bin/lib/audit.cjs +89 -1
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-registry.cjs +96 -110
- package/gsd-core/bin/lib/capability-validator.cjs +12 -2
- package/gsd-core/bin/lib/check-command-router.cjs +43 -1
- package/gsd-core/bin/lib/command-aliases.cjs +72 -0
- package/gsd-core/bin/lib/commands.cjs +26 -25
- package/gsd-core/bin/lib/commonjs-marker.cjs +136 -0
- package/gsd-core/bin/lib/config-loader.cjs +1 -0
- package/gsd-core/bin/lib/config.cjs +12 -1
- 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 +91 -12
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/frontmatter.cjs +84 -12
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +58 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +27 -4
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1021 -57
- package/gsd-core/bin/lib/install-engine.cjs +64 -10
- package/gsd-core/bin/lib/install-profiles.cjs +27 -1
- 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 +87 -1
- package/gsd-core/bin/lib/io.cjs +28 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +6 -0
- 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.cjs +106 -51
- package/gsd-core/bin/lib/phase-id.cjs +63 -0
- package/gsd-core/bin/lib/phase-locator.cjs +138 -45
- package/gsd-core/bin/lib/phase.cjs +260 -25
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +232 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +4 -0
- package/gsd-core/bin/lib/project-root.cjs +48 -0
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +80 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +99 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +30 -6
- package/gsd-core/bin/lib/roadmap-command-router.cjs +42 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +100 -18
- package/gsd-core/bin/lib/roadmap.cjs +37 -7
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +195 -62
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +15 -3
- package/gsd-core/bin/lib/runtime-homes.cjs +154 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +105 -41
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +113 -27
- package/gsd-core/bin/lib/smart-entry.cjs +12 -0
- package/gsd-core/bin/lib/state-transition.cjs +73 -8
- package/gsd-core/bin/lib/state.cjs +151 -62
- package/gsd-core/bin/lib/surface.cjs +12 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +11 -1
- package/gsd-core/bin/lib/uat.cjs +320 -21
- package/gsd-core/bin/lib/unusable-input.cjs +9 -0
- package/gsd-core/bin/lib/verification.cjs +29 -12
- package/gsd-core/bin/lib/verify.cjs +29 -5
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +181 -18
- package/gsd-core/bin/lib/workstream-inventory.cjs +519 -27
- package/gsd-core/bin/lib/workstream.cjs +6 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +276 -118
- package/gsd-core/bin/shared/config-schema.manifest.json +2 -0
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/specless-probe-fallback.md +7 -6
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/worktree-branch-check.md +2 -2
- 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/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 +32 -69
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +83 -0
- package/gsd-core/workflows/code-review.md +42 -145
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +23 -81
- package/gsd-core/workflows/debug.md +9 -12
- package/gsd-core/workflows/diagnose-issues.md +22 -0
- package/gsd-core/workflows/discovery-phase.md +4 -4
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +5 -16
- 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/execute-phase/steps/executor-isolation-dispatch.md +34 -2
- 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-worktree-gate.md +19 -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 +65 -137
- package/gsd-core/workflows/execute-plan.md +1 -1
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/ingest-docs.md +2 -1
- 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 +21 -38
- 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 +13 -226
- 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 +49 -193
- 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 +11 -153
- 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 +46 -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 +20 -390
- 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 +15 -8
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +17 -14
- 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 +49 -11
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +8 -21
- package/gsd-core/workflows/ui-phase.md +8 -7
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +18 -7
- package/gsd-core/workflows/verify-phase.md +4 -7
- 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 +8 -58
- package/hooks/dist/gsd-agent-isolation-guard.js +428 -0
- package/hooks/dist/gsd-check-update-worker.js +14 -5
- package/hooks/dist/gsd-cursor-subagent-start.js +532 -26
- package/hooks/dist/gsd-read-injection-scanner.js +7 -0
- package/hooks/dist/gsd-statusline.js +72 -6
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/isolation-sentinel.js +268 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +428 -0
- package/hooks/gsd-check-update-worker.js +14 -5
- package/hooks/gsd-cursor-subagent-start.js +532 -26
- package/hooks/gsd-read-injection-scanner.js +7 -0
- package/hooks/gsd-statusline.js +72 -6
- 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/isolation-sentinel.js +268 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +14 -5
- package/pi/gsd.cjs +57 -12
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +9 -2
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-context-index.cjs +448 -0
- package/scripts/gen-inventory-manifest.cjs +101 -1
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +39 -15
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lint-allow-test-rule-refs.allowlist.json +17 -31
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- 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-example-parser-parity.cjs +395 -0
- package/scripts/lint-test-file-count.allowlist.json +27 -1
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/prompt-injection-scan.sh +27 -6
- package/scripts/registry-schema.cjs +323 -94
- package/scripts/run-tests.cjs +3 -2
- package/scripts/validate-registry.cjs +10 -6
- package/skills/gsd-autonomous/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-plan-phase/SKILL.md +2 -2
- package/vscode/package.json +1 -1
- package/scripts/gen-emitted-baseline.cjs +0 -145
|
@@ -68,7 +68,12 @@ Load all context in one call (paths only to minimize orchestrator context):
|
|
|
68
68
|
```bash
|
|
69
69
|
_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
|
|
70
70
|
GRAN_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--granularity[[:space:]]+([^[:space:]-][^[:space:]]*) ]]; then GRAN_PARAM="--granularity ${BASH_REMATCH[2]}"; fi
|
|
71
|
-
|
|
71
|
+
PRD_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--prd[[:space:]]+([^[:space:]-][^[:space:]]*) ]]; then PRD_PARAM="--prd ${BASH_REMATCH[2]}"; fi
|
|
72
|
+
INGEST_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--ingest[[:space:]]+([^[:space:]-][^[:space:]]*) ]]; then INGEST_PARAM="--ingest ${BASH_REMATCH[2]}"; fi
|
|
73
|
+
RESEARCH_PHASE_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--research-phase[[:space:]]+([^[:space:]-][^[:space:]]*) ]]; then RESEARCH_PHASE_PARAM="--research-phase ${BASH_REMATCH[2]}"; fi
|
|
74
|
+
REVIEWS_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--reviews([[:space:]]|$) ]]; then REVIEWS_PARAM="--reviews"; fi
|
|
75
|
+
CHUNKED_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--chunked([[:space:]]|$) ]]; then CHUNKED_PARAM="--chunked"; fi
|
|
76
|
+
INIT=$(gsd_run query init.plan-phase "$PHASE" $GRAN_PARAM $PRD_PARAM $INGEST_PARAM $RESEARCH_PHASE_PARAM $REVIEWS_PARAM $CHUNKED_PARAM)
|
|
72
77
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
73
78
|
AGENT_SKILLS_RESEARCHER=$(gsd_run query agent-skills gsd-phase-researcher)
|
|
74
79
|
AGENT_SKILLS_PLANNER=$(gsd_run query agent-skills gsd-planner)
|
|
@@ -182,23 +187,9 @@ if [[ "$ARGUMENTS" =~ --chunked ]] || [[ "$CHUNKED_CFG" == "true" ]]; then
|
|
|
182
187
|
fi
|
|
183
188
|
```
|
|
184
189
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
**If `--reviews` AND `--gaps`:** Error — cannot combine `--reviews` with `--gaps`. These are conflicting modes.
|
|
190
|
-
|
|
191
|
-
**If `--reviews` AND `has_reviews` is false (no REVIEWS.md in phase dir):**
|
|
192
|
-
|
|
193
|
-
Error:
|
|
194
|
-
```
|
|
195
|
-
No REVIEWS.md found for Phase {N}. Run reviews first:
|
|
196
|
-
|
|
197
|
-
/gsd:review --phase {N}
|
|
198
|
-
|
|
199
|
-
Then re-run /gsd:plan-phase {N} --reviews
|
|
200
|
-
```
|
|
201
|
-
Exit workflow.
|
|
190
|
+
<!-- gsd:section id="reviews-prerequisite" when="flag:--reviews" -->
|
|
191
|
+
If `section_manifest` is `null` or `"reviews-prerequisite"` is in its `included` list: read and execute `gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md`. Otherwise skip — do not read the file.
|
|
192
|
+
<!-- /gsd:section -->
|
|
202
193
|
|
|
203
194
|
## 3. Validate Phase
|
|
204
195
|
|
|
@@ -213,28 +204,13 @@ Now that `PHASE` is finalized, resolve MVP mode:
|
|
|
213
204
|
MVP_MODE=$(gsd_run query phase.mvp-mode "${PHASE}" $MVP_FLAG_ARG --pick active)
|
|
214
205
|
```
|
|
215
206
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
**If `--prd <filepath>` provided:**
|
|
207
|
+
<!-- gsd:section id="prd-express-gate" when="flag:--prd" -->
|
|
208
|
+
If `section_manifest` is `null` or `"prd-express-gate"` is in its `included` list: read and execute `gsd-core/workflows/plan-phase/steps/prd-express-gate.md`. Otherwise skip — do not read the file.
|
|
209
|
+
<!-- /gsd:section -->
|
|
221
210
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
**Skip if:** No `--ingest` flag in arguments.
|
|
227
|
-
|
|
228
|
-
**If `--ingest <path-or-glob>` provided:**
|
|
229
|
-
|
|
230
|
-
1. Display banner: `GSD ► ADR Ingest Express Path` with `{INGEST_PATH}` and `{INGEST_FORMAT}`.
|
|
231
|
-
2. Parse each resolved ADR through `gsd-core/bin/lib/adr-parser.cjs` (`--input`, `--format`) and collect normalized records.
|
|
232
|
-
3. Status gate: reject `superseded`/`rejected`/`deprecated`; warn on `proposed`; missing status defaults to `accepted`.
|
|
233
|
-
4. Empty-decisions fallback: if all parsed ADRs have zero `decisions[]`, emit `ADR ingest produced no locked decisions; fall back to discuss-phase for this phase.` and exit with `/gsd:discuss-phase {N}` guidance.
|
|
234
|
-
5. Generate CONTEXT.md using `<domain>`, `<decisions>`, `<canonical_refs>`, `<specifics>`, `<deferred>`, `<scope_fence>`, map `consequences_positive[]` to Success Criteria and `consequences_negative[]` to Risk Summary, and include `**Source:** ADR Ingest Express Path ({INGEST_PATH})`.
|
|
235
|
-
6. Commit with `gsd-tools.cjs query commit "docs(${padded_phase}): generate context from ADR ingest" --files "${phase_dir}/${padded_phase}-CONTEXT.md"` and set `context_content`; continue to step 5.
|
|
236
|
-
|
|
237
|
-
**Effect:** This bypasses step 4 (Load CONTEXT.md) since CONTEXT.md was synthesized from ADR input.
|
|
211
|
+
<!-- gsd:section id="adr-ingest-express-path" when="flag:--ingest" -->
|
|
212
|
+
If `section_manifest` is `null` or `"adr-ingest-express-path"` is in its `included` list: read and execute `gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md`. Otherwise skip — do not read the file.
|
|
213
|
+
<!-- /gsd:section -->
|
|
238
214
|
|
|
239
215
|
## 4. Load CONTEXT.md
|
|
240
216
|
|
|
@@ -305,22 +281,9 @@ If `AI_SPEC_FILE` is non-empty, pass `AI_SPEC_PATH` and `FRAMEWORK_LINE` to the
|
|
|
305
281
|
|
|
306
282
|
**Skip if:** `--gaps` flag or `--skip-research` flag or `--reviews` flag.
|
|
307
283
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
Three branches in research-only mode (`--research-phase <N>`):
|
|
313
|
-
|
|
314
|
-
1. **`--view`**: print `RESEARCH.md` to stdout, no spawn, exit. If `RESEARCH.md` is missing, error with: `--view requires an existing RESEARCH.md; drop --view to spawn the researcher.`
|
|
315
|
-
2. **`--research`** (force-refresh): re-spawn researcher unconditionally — fall through to "Spawn gsd-phase-researcher" below.
|
|
316
|
-
3. **Neither flag AND `has_research=true`:** auto-use the existing research and exit cleanly — do not prompt, do not re-spawn. Emit `RESEARCH.md already exists for Phase ${PHASE}, using it. To force-refresh, re-invoke with --research; to print, re-invoke with --view. Path: ${research_path}` then exit. The explicit-flag escape hatches cover any deviation; this matches §5.1's promptless auto-use of existing research, removing the §5.0/§5.1 inconsistency (#159).
|
|
317
|
-
|
|
318
|
-
```bash
|
|
319
|
-
if [[ "$VIEW_ONLY" == "true" ]]; then
|
|
320
|
-
[[ -f "$research_path" ]] || { echo "Error: --view requires an existing RESEARCH.md (Phase ${PHASE}). Drop --view to spawn the researcher."; exit 1; }
|
|
321
|
-
cat "$research_path"; exit 0
|
|
322
|
-
fi
|
|
323
|
-
```
|
|
284
|
+
<!-- gsd:section id="research-only-modifiers" when="flag:--research-phase" -->
|
|
285
|
+
If `section_manifest` is `null` or `"research-only-modifiers"` is in its `included` list: read and execute `gsd-core/workflows/plan-phase/steps/research-only-modifiers.md`. Otherwise skip — do not read the file.
|
|
286
|
+
<!-- /gsd:section -->
|
|
324
287
|
|
|
325
288
|
### 5.1. Standard Research Decision
|
|
326
289
|
|
|
@@ -408,23 +371,9 @@ Agent(
|
|
|
408
371
|
- **`## RESEARCH COMPLETE`:** Display confirmation, continue to step 6
|
|
409
372
|
- **`## RESEARCH BLOCKED`:** Display blocker, offer: 1) Provide context, 2) Skip research, 3) Abort
|
|
410
373
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
**If `RESEARCH_ONLY=true`:** the user invoked `/gsd:plan-phase --research-phase <N>` for research-only mode. Do **not** continue to Section 5.5+ (validation strategy, planner, plan-checker, verification, gaps, bounce, post-planning-gaps). Print the research-complete summary and exit cleanly:
|
|
416
|
-
|
|
417
|
-
```text
|
|
418
|
-
✓ Research-only mode complete (#3042)
|
|
419
|
-
|
|
420
|
-
Phase: ${PHASE}
|
|
421
|
-
RESEARCH.md: ${research_path}
|
|
422
|
-
|
|
423
|
-
Re-run /gsd:plan-phase ${PHASE} to plan the phase using this research,
|
|
424
|
-
or /gsd:plan-phase ${PHASE} --research to refresh research and plan.
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
This exits the workflow. The planner / plan-checker / verifier blocks below are skipped.
|
|
374
|
+
<!-- gsd:section id="research-only-early-exit" when="flag:--research-phase" -->
|
|
375
|
+
If `section_manifest` is `null` or `"research-only-early-exit"` is in its `included` list: read and execute `gsd-core/workflows/plan-phase/steps/research-only-early-exit.md`. Otherwise skip — do not read the file.
|
|
376
|
+
<!-- /gsd:section -->
|
|
428
377
|
|
|
429
378
|
## 5.5. Create Validation Strategy
|
|
430
379
|
|
|
@@ -612,8 +561,8 @@ PATTERNS_PATH=$(_gsd_field "$INIT" patterns_path)
|
|
|
612
561
|
SPIKE_FINDINGS_PATH=$(ls ./.claude/skills/spike-findings-*/SKILL.md 2>/dev/null | head -1 || true)
|
|
613
562
|
SKETCH_FINDINGS_PATH=$(ls ./.claude/skills/sketch-findings-*/SKILL.md 2>/dev/null | head -1 || true)
|
|
614
563
|
|
|
615
|
-
# Resolve the phase SPEC (carries the ## Edge Coverage section the planner lifts
|
|
616
|
-
#
|
|
564
|
+
# Resolve the phase SPEC (carries the ## Edge Coverage section the planner lifts resolved
|
|
565
|
+
# edges from). UNCONDITIONAL — must NOT live in §4.5 Check AI-SPEC, which is skipped
|
|
617
566
|
# on non-AI phases; gating it there silently starves the planner of the SPEC (#550 review).
|
|
618
567
|
# Glob the plain phase SPEC, excluding the -AI-SPEC.md / -UI-SPEC.md variants.
|
|
619
568
|
PHASE_DIR_FOR_SPEC=$(_gsd_field "$INIT" phase_dir)
|
|
@@ -718,6 +667,12 @@ after `$SPEC_FILE` (Step 7), before the gsd-planner spawn (Step 8).
|
|
|
718
667
|
disabled or no requirement IDs; §A deterministic edge probe → `$COVERAGE` when `EDGE_ABSENT`; §B
|
|
719
668
|
prohibition recall in the planner). Pass `$COVERAGE` and `$SPECLESS_FALLBACK_DISABLED` into Step 8.
|
|
720
669
|
|
|
670
|
+
## 7.99. Bounded Stall-Detection Helpers (#2650)
|
|
671
|
+
|
|
672
|
+
Read+execute `gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md` (defines
|
|
673
|
+
`gsd_stall_should_recover`/`gsd_stall_watch`, and how `{outputFile}` below is bound;
|
|
674
|
+
independent of the teams-status guard above, AC2).
|
|
675
|
+
|
|
721
676
|
## 8. Spawn gsd-planner Agent
|
|
722
677
|
|
|
723
678
|
Display banner:
|
|
@@ -748,7 +703,7 @@ Planner prompt:
|
|
|
748
703
|
- {reviews_path} (Cross-AI Review Feedback - if --reviews; actionable findings must be incorporated or explicitly deferred/rejected in PLAN.md)
|
|
749
704
|
- {AI_SPEC_PATH} (AI Design Contract — framework and evaluation strategy, if exists)
|
|
750
705
|
- {UI_SPEC_PATH} (UI Design Contract — visual/interaction specs, if exists)
|
|
751
|
-
- {SPEC_PATH} (Phase SPEC — carries the ## Edge Coverage section to lift
|
|
706
|
+
- {SPEC_PATH} (Phase SPEC — carries the ## Edge Coverage section to lift resolved edges from, if exists)
|
|
752
707
|
- {SPIKE_FINDINGS_PATH} (Spike Findings — validated patterns, constraints, landmines from experiments, if exists)
|
|
753
708
|
- {SKETCH_FINDINGS_PATH} (Sketch Findings — validated design decisions, CSS patterns, visual direction, if exists)
|
|
754
709
|
- {API_SURFACE_PATH} (API Surface — HINT ONLY, when intel capability is active; see <intel_surface_hint> below)
|
|
@@ -820,9 +775,9 @@ Output consumed by /gsd:execute-phase. Plans need:
|
|
|
820
775
|
- Tasks in XML format with read_first and acceptance_criteria fields (MANDATORY on every task)
|
|
821
776
|
- Verification criteria
|
|
822
777
|
- must_haves for goal-backward verification
|
|
823
|
-
- If the SPEC has an `## Edge Coverage` section, lift every
|
|
778
|
+
- If the SPEC has an `## Edge Coverage` section, lift every resolved (verification: explicit) edge's acceptance criterion into `must_haves.truths` as a plain string, and every resolved (verification: backstop) edge **as a structured flat-scalar marker** — an object item `{ statement: <the check>, verification: backstop }`, NOT a prose note (the verifier branches deterministically on the `verification: backstop` field; a parenthetical is unparseable — the #1110 fragility). Use a flat scalar `verification:` continuation key, never a nested object (ADR-550 #1278). At verify time a `backstop` truth the verifier cannot confirm with explicit evidence abstains → `human_needed` (reason `insufficient_spec`), never a silent pass (#1154; see `references/honest-verifier.md`). `unresolved` edges are explicit assumptions — surface them in the plan, do not silently drop them. **Otherwise** (`EDGE_ABSENT`): apply the SAME lift to the fallback report `{COVERAGE}` (per §C of `references/specless-probe-fallback.md`); a SPEC-supplied section is never re-run.
|
|
824
779
|
- If the SPEC has a `## Prohibitions` section, lift every resolved prohibition into the `must_haves.prohibitions:` sibling block (NOT `truths` — ADR-550 D3) with `statement`+`status`+`verification`, via the single `projectProhibitions` serializer (Hyrum — no second serializer); unresolved -> flagged assumptions, don't drop; never put a must-NOT under `truths`. **Otherwise** (`PROHIB_ABSENT`), author the recalled prohibitions into the SAME block via the SAME `projectProhibitions` contract but **descriptor-less** (no `check_*`) so each disposes flagged-unverified; never auto-dismiss. Section-level precedence + no-silent-drop equality apply (§C).
|
|
825
|
-
- 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 —
|
|
780
|
+
- 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`).
|
|
826
781
|
- **"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.
|
|
827
782
|
</downstream_consumer>
|
|
828
783
|
|
|
@@ -868,8 +823,8 @@ Every task MUST include these fields — they are NOT optional:
|
|
|
868
823
|
- [ ] Waves assigned for parallel execution
|
|
869
824
|
- [ ] must_haves derived from phase goal
|
|
870
825
|
- [ ] Every PLAN.md includes an "Artifacts this phase produces" section listing symbols created by this phase (decorators, classes, functions, CLI flags, struct/dataclass fields, new file paths)
|
|
871
|
-
- [ ] Every SPEC ## Edge Coverage
|
|
872
|
-
- [ ] Every UI-SPEC ## UI Considerations
|
|
826
|
+
- [ ] Every SPEC ## Edge Coverage resolved edge is represented in a plan's must_haves (no silent drops)
|
|
827
|
+
- [ ] Every UI-SPEC ## UI Considerations resolved consideration is represented in a plan's must_haves (no silent drops)
|
|
873
828
|
- [ ] Every SPEC ## Prohibitions resolved item is represented in a plan's must_haves.prohibitions (no silent drops)
|
|
874
829
|
</quality_gate>
|
|
875
830
|
```
|
|
@@ -881,120 +836,18 @@ Agent(
|
|
|
881
836
|
prompt=filled_prompt,
|
|
882
837
|
subagent_type="gsd-planner",
|
|
883
838
|
model="{planner_model}",
|
|
884
|
-
description="Plan Phase {phase}"
|
|
839
|
+
description="Plan Phase {phase}",
|
|
840
|
+
run_in_background=true
|
|
885
841
|
)
|
|
886
842
|
```
|
|
887
843
|
|
|
888
|
-
|
|
844
|
+
**ORCHESTRATOR RULE — ALL RUNTIMES:** `TS=$(date +%s)`; repeat `PLANNER_STALL_RESULT=$(gsd_stall_watch "$TS" "{outputFile}" "${PHASE_DIR}"'/*-PLAN.md' "## PLANNING COMPLETE" "## PHASE SPLIT RECOMMENDED" "## ⚠ Source Audit" "## CHECKPOINT REACHED" "## PLANNING INCONCLUSIVE")` while waiting/active — `marker_received` -> step 9; `stalled` -> 9a.
|
|
889
845
|
|
|
890
846
|
**If `CHUNKED_MODE` is `true`:** Skip the Agent() call above — proceed to step 8.5 instead.
|
|
891
847
|
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
Chunked mode splits the single planner run into a short outline run + N short per-plan
|
|
897
|
-
runs (~3–5 min each), committing each plan individually for crash resilience. Rerunning
|
|
898
|
-
`/gsd:plan-phase {N} --chunked` resumes from the last committed plan.
|
|
899
|
-
|
|
900
|
-
For recovering plans from a prior *non-chunked* run, use step 6's "Add more plans" or
|
|
901
|
-
proceed to `/gsd:execute-phase` — don't start a fresh chunked run over them.
|
|
902
|
-
|
|
903
|
-
### 8.5.1 Outline Phase (outline-only mode, ~2 min)
|
|
904
|
-
|
|
905
|
-
**Resume detection:** If `${PHASE_DIR}/${PADDED_PHASE}-PLAN-OUTLINE.md` exists and contains
|
|
906
|
-
the `## OUTLINE COMPLETE` marker (written by the outline agent — #2762), skip to 8.5.2.
|
|
907
|
-
|
|
908
|
-
```bash
|
|
909
|
-
OUTLINE_FILE="${PHASE_DIR}/${PADDED_PHASE}-PLAN-OUTLINE.md"
|
|
910
|
-
if [[ -f "$OUTLINE_FILE" ]] && grep -q "^## OUTLINE COMPLETE" "$OUTLINE_FILE"; then
|
|
911
|
-
# reuse existing outline — skip to 8.5.2
|
|
912
|
-
fi
|
|
913
|
-
```
|
|
914
|
-
|
|
915
|
-
Display:
|
|
916
|
-
```text
|
|
917
|
-
◆ Chunked mode: spawning outline planner... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
918
|
-
```
|
|
919
|
-
|
|
920
|
-
Spawn the planner in **outline-only** mode — it must write only the outline manifest, not any
|
|
921
|
-
PLAN.md files:
|
|
922
|
-
|
|
923
|
-
```javascript
|
|
924
|
-
Agent(
|
|
925
|
-
prompt="{same planning_context as step 8, plus:}
|
|
926
|
-
|
|
927
|
-
**Chunked mode: outline-only.**
|
|
928
|
-
Do NOT write any PLAN.md files in this Task.
|
|
929
|
-
Write only: {PHASE_DIR}/{PADDED_PHASE}-PLAN-OUTLINE.md
|
|
930
|
-
|
|
931
|
-
The outline must be a markdown table with columns:
|
|
932
|
-
Plan ID | Objective | Wave | Depends On | Requirements
|
|
933
|
-
|
|
934
|
-
End the file with a final line `## OUTLINE COMPLETE` — §8.5.1's resume-check greps
|
|
935
|
-
the file for it, so it MUST be written here, not just returned.
|
|
936
|
-
Return: ## OUTLINE COMPLETE with plan count.",
|
|
937
|
-
subagent_type="gsd-planner",
|
|
938
|
-
model="{planner_model}",
|
|
939
|
-
description="Outline Phase {phase} (chunked)"
|
|
940
|
-
)
|
|
941
|
-
```
|
|
942
|
-
|
|
943
|
-
> **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.
|
|
944
|
-
|
|
945
|
-
Handle return:
|
|
946
|
-
- **`## OUTLINE COMPLETE`:** Read `PLAN-OUTLINE.md`, extract plan list. Continue to 8.5.2.
|
|
947
|
-
- **Any other return or empty:** Display error. Offer: 1) Retry outline, 2) Stop.
|
|
948
|
-
|
|
949
|
-
### 8.5.2 Per-Plan Tasks (single-plan mode, ~3-5 min each)
|
|
950
|
-
|
|
951
|
-
For each plan entry extracted from `PLAN-OUTLINE.md`:
|
|
952
|
-
|
|
953
|
-
1. **Resume check:** Skip if `${PHASE_DIR}/{plan_id}-PLAN.md` exists with valid frontmatter
|
|
954
|
-
(resume safety) — UNLESS `--reviews` is set, whose purpose is to REPLAN with review
|
|
955
|
-
feedback (§6), so existing plans are overwritten, not skipped (#2762).
|
|
956
|
-
|
|
957
|
-
```bash
|
|
958
|
-
PLAN_FILE="${PHASE_DIR}/${plan_id}-PLAN.md"
|
|
959
|
-
if [[ -f "$PLAN_FILE" ]] && head -1 "$PLAN_FILE" | grep -q '^---' && [[ "$ARGUMENTS" != *"--reviews"* ]]; then
|
|
960
|
-
continue # resume safety — NOT under --reviews (replan)
|
|
961
|
-
fi
|
|
962
|
-
```
|
|
963
|
-
|
|
964
|
-
2. Display:
|
|
965
|
-
```text
|
|
966
|
-
◆ Chunked mode: planning {plan_id} ({k}/{N})... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
967
|
-
```
|
|
968
|
-
|
|
969
|
-
3. Spawn the planner in **single-plan** mode — it must write exactly one PLAN.md file:
|
|
970
|
-
```javascript
|
|
971
|
-
Agent(
|
|
972
|
-
prompt="{same planning_context as step 8, plus:}
|
|
973
|
-
|
|
974
|
-
**Chunked mode: single-plan.**
|
|
975
|
-
Write exactly ONE plan file: {PHASE_DIR}/{plan_id}-PLAN.md
|
|
976
|
-
Plan to write: {plan_id} — {objective}
|
|
977
|
-
Wave: {wave} | Depends on: {depends_on}
|
|
978
|
-
Phase requirement IDs to cover in this plan: {plan_requirements}
|
|
979
|
-
|
|
980
|
-
Return: ## PLAN COMPLETE with the plan ID.",
|
|
981
|
-
subagent_type="gsd-planner",
|
|
982
|
-
model="{planner_model}",
|
|
983
|
-
description="Plan {plan_id} (chunked {k}/{N})"
|
|
984
|
-
)
|
|
985
|
-
```
|
|
986
|
-
|
|
987
|
-
> **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.
|
|
988
|
-
|
|
989
|
-
4. **Verify disk:** Check `${PHASE_DIR}/{plan_id}-PLAN.md` exists. If missing: offer 1) Retry, 2) Stop.
|
|
990
|
-
|
|
991
|
-
5. **Commit per-plan:**
|
|
992
|
-
```bash
|
|
993
|
-
gsd_run query commit "docs(${PADDED_PHASE}): plan ${plan_id} (chunked)" --files "${PHASE_DIR}/${plan_id}-PLAN.md"
|
|
994
|
-
```
|
|
995
|
-
|
|
996
|
-
After all N plans are written and committed, treat this as `## PLANNING COMPLETE` and continue
|
|
997
|
-
to step 9.
|
|
848
|
+
<!-- gsd:section id="chunked-planning-mode" when="state:chunked-mode" -->
|
|
849
|
+
If `section_manifest` is `null` or `"chunked-planning-mode"` is in its `included` list: read and execute `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md`. Otherwise skip — do not read the file.
|
|
850
|
+
<!-- /gsd:section -->
|
|
998
851
|
|
|
999
852
|
## 9. Handle Planner Return
|
|
1000
853
|
|
|
@@ -1146,16 +999,18 @@ Agent(
|
|
|
1146
999
|
prompt=checker_prompt,
|
|
1147
1000
|
subagent_type="gsd-plan-checker",
|
|
1148
1001
|
model="{checker_model}",
|
|
1149
|
-
description="Verify Phase {phase} plans"
|
|
1002
|
+
description="Verify Phase {phase} plans",
|
|
1003
|
+
run_in_background=true
|
|
1150
1004
|
)
|
|
1151
1005
|
```
|
|
1152
1006
|
|
|
1153
|
-
|
|
1007
|
+
**ORCHESTRATOR RULE — ALL RUNTIMES:** `TS=$(date +%s)`; repeat `CHECKER_STALL_RESULT=$(gsd_stall_watch "$TS" "{outputFile}" "${PHASE_DIR}"'/*-PLAN.md' "## VERIFICATION PASSED" "## ISSUES FOUND")` while waiting/active.
|
|
1154
1008
|
|
|
1155
1009
|
## 11. Handle Checker Return
|
|
1156
1010
|
|
|
1157
|
-
-
|
|
1158
|
-
-
|
|
1011
|
+
- **`marker_received` + `## VERIFICATION PASSED`:** Display confirmation, proceed to step 13.
|
|
1012
|
+
- **`marker_received` + `## ISSUES FOUND`:** Display issues, check iteration count, proceed to step 12.
|
|
1013
|
+
- **`stalled`:** Automatically surface 11a's recovery choice (Accept verification / Retry checker / Stop) — no manual interrupt needed.
|
|
1159
1014
|
- **Empty / truncated / no recognized marker:** → Filesystem fallback (step 11a).
|
|
1160
1015
|
|
|
1161
1016
|
**Thinking partner for architectural tradeoffs (conditional):**
|
|
@@ -1261,11 +1116,12 @@ Agent(
|
|
|
1261
1116
|
prompt=revision_prompt,
|
|
1262
1117
|
subagent_type="gsd-planner",
|
|
1263
1118
|
model="{planner_model}",
|
|
1264
|
-
description="Revise Phase {phase} plans"
|
|
1119
|
+
description="Revise Phase {phase} plans",
|
|
1120
|
+
run_in_background=true
|
|
1265
1121
|
)
|
|
1266
1122
|
```
|
|
1267
1123
|
|
|
1268
|
-
|
|
1124
|
+
**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.
|
|
1269
1125
|
|
|
1270
1126
|
After planner returns -> spawn checker again (step 10), increment iteration_count.
|
|
1271
1127
|
|
|
@@ -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>
|