@opengsd/gsd-core 1.9.1 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +35 -47
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +27 -240
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +45 -159
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +55 -405
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -131,7 +131,11 @@ If `$VALIDATE_MODE` only:
|
|
|
131
131
|
**Step 2: Initialize**
|
|
132
132
|
|
|
133
133
|
```bash
|
|
134
|
-
|
|
134
|
+
DISCUSS_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--discuss([[:space:]]|$) ]]; then DISCUSS_PARAM="--discuss"; fi
|
|
135
|
+
RESEARCH_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--research([[:space:]]|$) ]]; then RESEARCH_PARAM="--research"; fi
|
|
136
|
+
VALIDATE_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--validate([[:space:]]|$) ]]; then VALIDATE_PARAM="--validate"; fi
|
|
137
|
+
FULL_PARAM=""; if [[ "$ARGUMENTS" =~ (^|[[:space:]])--full([[:space:]]|$) ]]; then FULL_PARAM="--full"; fi
|
|
138
|
+
INIT=$(gsd_run query init.quick "$DESCRIPTION" $DISCUSS_PARAM $RESEARCH_PARAM $VALIDATE_PARAM $FULL_PARAM)
|
|
135
139
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
136
140
|
AGENT_SKILLS_PLANNER=$(gsd_run query agent-skills gsd-planner)
|
|
137
141
|
AGENT_SKILLS_EXECUTOR=$(gsd_run query agent-skills gsd-executor)
|
|
@@ -150,12 +154,16 @@ PROJECT_PATH="$(dirname "${quick_dir}")/PROJECT.md"
|
|
|
150
154
|
```bash
|
|
151
155
|
USE_WORKTREES=$(gsd_run query config-get workflow.use_worktrees --raw 2>/dev/null || echo "true")
|
|
152
156
|
RUNTIME=$(gsd_run query config-get runtime --default claude --raw 2>/dev/null || echo "claude")
|
|
153
|
-
if [ "$RUNTIME" != "claude" ] && [ "$USE_WORKTREES" != "false" ]; then
|
|
154
|
-
echo "FATAL: git worktree isolation (isolation=\"worktree\") is unsupported on runtime '$RUNTIME' — it would run executor agents unisolated against the main checkout. Set workflow.use_worktrees=false." >&2
|
|
155
|
-
exit 1
|
|
156
|
-
fi
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
+
**Resolve isolation now (#2584/#2652).** Read @gsd-core/references/dispatch-isolation-gate.md
|
|
160
|
+
and run its `Resolve ISOLATION`, `Single-agent dispatch sites`, and `Resolve the harness flag`
|
|
161
|
+
blocks in order; they set `ISOLATION`/`HARNESS_FLAG` via `query dispatch-isolation`.
|
|
162
|
+
`ISOLATION` — not `RUNTIME` — gates every worktree decision below. Substitute `{harnessFlag}`
|
|
163
|
+
in Step 6's `Agent()` with `$HARNESS_FLAG`+comma when `ISOLATION = "harness-worktree"`, else
|
|
164
|
+
empty. `{harnessFlag}`
|
|
165
|
+
is a template placeholder, not a shell variable.
|
|
166
|
+
|
|
159
167
|
If `USE_WORKTREES` is not `"false"`, run a startup orphan sweep before spawning any executors. This reaps locked worktrees whose lock-owner process is dead, whose branch is merged into the default branch, and whose lock file mtime is older than 5 minutes. Running it at startup prevents accumulation of orphaned worktrees from prior sessions that exited without cleanup (#3707).
|
|
160
168
|
|
|
161
169
|
```bash
|
|
@@ -276,205 +284,15 @@ Store `$QUICK_DIR` for use in orchestration.
|
|
|
276
284
|
|
|
277
285
|
---
|
|
278
286
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
Display banner:
|
|
284
|
-
```
|
|
285
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
286
|
-
GSD ► DISCUSSING QUICK TASK
|
|
287
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
288
|
-
|
|
289
|
-
◆ Surfacing gray areas for: ${DESCRIPTION}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
**4.5a. Identify gray areas**
|
|
293
|
-
|
|
294
|
-
Analyze `$DESCRIPTION` to identify 2-4 gray areas — implementation decisions that would change the outcome and that the user should weigh in on.
|
|
295
|
-
|
|
296
|
-
Use the domain-aware heuristic to generate phase-specific (not generic) gray areas:
|
|
297
|
-
- Something users **SEE** → layout, density, interactions, states
|
|
298
|
-
- Something users **CALL** → responses, errors, auth, versioning
|
|
299
|
-
- Something users **RUN** → output format, flags, modes, error handling
|
|
300
|
-
- Something users **READ** → structure, tone, depth, flow
|
|
301
|
-
- Something being **ORGANIZED** → criteria, grouping, naming, exceptions
|
|
302
|
-
|
|
303
|
-
Each gray area should be a concrete decision point, not a vague category. Example: "Loading behavior" not "UX".
|
|
304
|
-
|
|
305
|
-
**4.5b. Present gray areas**
|
|
306
|
-
|
|
307
|
-
```
|
|
308
|
-
AskUserQuestion(
|
|
309
|
-
header: "Gray Areas",
|
|
310
|
-
question: "Which areas need clarification before planning?",
|
|
311
|
-
options: [
|
|
312
|
-
{ label: "${area_1}", description: "${why_it_matters_1}" },
|
|
313
|
-
{ label: "${area_2}", description: "${why_it_matters_2}" },
|
|
314
|
-
{ label: "${area_3}", description: "${why_it_matters_3}" },
|
|
315
|
-
{ label: "All clear", description: "Skip discussion — I know what I want" }
|
|
316
|
-
],
|
|
317
|
-
multiSelect: true
|
|
318
|
-
)
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
If user selects "All clear" → skip to Step 5 (no CONTEXT.md written).
|
|
322
|
-
|
|
323
|
-
**4.5c. Discuss selected areas**
|
|
324
|
-
|
|
325
|
-
For each selected area, ask 1-2 focused questions via AskUserQuestion:
|
|
326
|
-
|
|
327
|
-
```
|
|
328
|
-
AskUserQuestion(
|
|
329
|
-
header: "${area_name}",
|
|
330
|
-
question: "${specific_question_about_this_area}",
|
|
331
|
-
options: [
|
|
332
|
-
{ label: "${concrete_choice_1}", description: "${what_this_means}" },
|
|
333
|
-
{ label: "${concrete_choice_2}", description: "${what_this_means}" },
|
|
334
|
-
{ label: "${concrete_choice_3}", description: "${what_this_means}" },
|
|
335
|
-
{ label: "You decide", description: "Claude's discretion" }
|
|
336
|
-
],
|
|
337
|
-
multiSelect: false
|
|
338
|
-
)
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
Rules:
|
|
342
|
-
- Options must be concrete choices, not abstract categories
|
|
343
|
-
- Highlight recommended choice where you have a clear opinion
|
|
344
|
-
- If user selects "Other" with freeform text, switch to plain text follow-up (per questioning.md freeform rule)
|
|
345
|
-
- If user selects "You decide", capture as Claude's Discretion in CONTEXT.md
|
|
346
|
-
- Max 2 questions per area — this is lightweight, not a deep dive
|
|
347
|
-
|
|
348
|
-
Collect all decisions into `$DECISIONS`.
|
|
349
|
-
|
|
350
|
-
**4.5d. Write CONTEXT.md**
|
|
351
|
-
|
|
352
|
-
Write `${QUICK_DIR}/${quick_id}-CONTEXT.md` using the standard context template structure:
|
|
353
|
-
|
|
354
|
-
```markdown
|
|
355
|
-
# Quick Task ${quick_id}: ${DESCRIPTION} - Context
|
|
356
|
-
|
|
357
|
-
**Gathered:** ${date}
|
|
358
|
-
**Status:** Ready for planning
|
|
359
|
-
|
|
360
|
-
<domain>
|
|
361
|
-
## Task Boundary
|
|
362
|
-
|
|
363
|
-
${DESCRIPTION}
|
|
364
|
-
|
|
365
|
-
</domain>
|
|
366
|
-
|
|
367
|
-
<decisions>
|
|
368
|
-
## Implementation Decisions
|
|
369
|
-
|
|
370
|
-
### ${area_1_name}
|
|
371
|
-
- ${decision_from_discussion}
|
|
372
|
-
|
|
373
|
-
### ${area_2_name}
|
|
374
|
-
- ${decision_from_discussion}
|
|
375
|
-
|
|
376
|
-
### Claude's Discretion
|
|
377
|
-
${areas_where_user_said_you_decide_or_areas_not_discussed}
|
|
378
|
-
|
|
379
|
-
</decisions>
|
|
380
|
-
|
|
381
|
-
<specifics>
|
|
382
|
-
## Specific Ideas
|
|
383
|
-
|
|
384
|
-
${any_specific_references_or_examples_from_discussion}
|
|
385
|
-
|
|
386
|
-
[If none: "No specific requirements — open to standard approaches"]
|
|
387
|
-
|
|
388
|
-
</specifics>
|
|
389
|
-
|
|
390
|
-
<canonical_refs>
|
|
391
|
-
## Canonical References
|
|
392
|
-
|
|
393
|
-
${any_specs_adrs_or_docs_referenced_during_discussion}
|
|
394
|
-
|
|
395
|
-
[If none: "No external specs — requirements fully captured in decisions above"]
|
|
396
|
-
|
|
397
|
-
</canonical_refs>
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
Note: Quick task CONTEXT.md omits `<code_context>` and `<deferred>` sections (no codebase scouting, no phase scope to defer to). Keep it lean. The `<canonical_refs>` section is included when external docs were referenced — omit it only if no external docs apply.
|
|
401
|
-
|
|
402
|
-
Report: `Context captured: ${QUICK_DIR}/${quick_id}-CONTEXT.md`
|
|
287
|
+
<!-- gsd:section id="discussion-phase" when="flag:--discuss" -->
|
|
288
|
+
If `section_manifest` is `null` or `"discussion-phase"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/discussion-phase.md`. Otherwise skip — do not read the file.
|
|
289
|
+
<!-- /gsd:section -->
|
|
403
290
|
|
|
404
291
|
---
|
|
405
292
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
Display banner:
|
|
411
|
-
```
|
|
412
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
413
|
-
GSD ► RESEARCHING QUICK TASK
|
|
414
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
415
|
-
|
|
416
|
-
◆ Investigating approaches for: ${DESCRIPTION} (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
Spawn a single focused researcher (not 4 parallel researchers like full phases — quick tasks need targeted research, not broad domain surveys):
|
|
420
|
-
|
|
421
|
-
<!-- #2517 model-omit-on-inherit -->
|
|
422
|
-
|
|
423
|
-
> **Model omission (#2517).** Omit the `model` parameter entirely when the value it would carry (`planner_model`, `checker_model`, `executor_model`, `reviewer_model`, `verifier_model`) is `"inherit"` or empty. An empty value 404s on runtimes without native tier aliases — the default on non-Claude runtimes. Omitting it inherits the orchestrator's model. See @gsd-core/references/model-profile-resolution.md.
|
|
424
|
-
|
|
425
|
-
```
|
|
426
|
-
Agent(
|
|
427
|
-
prompt="
|
|
428
|
-
<research_context>
|
|
429
|
-
|
|
430
|
-
**Mode:** quick-task
|
|
431
|
-
**Task:** ${DESCRIPTION}
|
|
432
|
-
**Output:** ${QUICK_DIR}/${quick_id}-RESEARCH.md
|
|
433
|
-
|
|
434
|
-
<files_to_read>
|
|
435
|
-
- ${STATE_PATH} (Project state — what's already built)
|
|
436
|
-
- ${PROJECT_PATH} (Project context)
|
|
437
|
-
- ./CLAUDE.md or ./.claude/CLAUDE.md (if exists — project-specific guidelines)
|
|
438
|
-
${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + quick_id + '-CONTEXT.md (User decisions — research should align with these)' : ''}
|
|
439
|
-
</files_to_read>
|
|
440
|
-
|
|
441
|
-
${AGENT_SKILLS_PLANNER}
|
|
442
|
-
|
|
443
|
-
</research_context>
|
|
444
|
-
|
|
445
|
-
<focus>
|
|
446
|
-
This is a quick task, not a full phase. Research should be concise and targeted:
|
|
447
|
-
1. Best libraries/patterns for this specific task
|
|
448
|
-
2. Common pitfalls and how to avoid them
|
|
449
|
-
3. Integration points with existing codebase
|
|
450
|
-
4. Any constraints or gotchas worth knowing before planning
|
|
451
|
-
|
|
452
|
-
Do NOT produce a full domain survey. Target 1-2 pages of actionable findings.
|
|
453
|
-
</focus>
|
|
454
|
-
|
|
455
|
-
<!-- #2508 runtime-aware-dispatch -->
|
|
456
|
-
|
|
457
|
-
> **Runtime-aware dispatch (#2508 Phase 4).** GSD workflows dispatch specialized subagents by role. Before dispatching on a built-in-only runtime (kimi-code — three built-ins only), resolve the role to a built-in via `gsd_run query resolve-dispatch-type --requested <role> --raw`. On named-dispatch runtimes (Claude/OpenCode/…) the role is returned unchanged; on kimi-code it maps to `coder`/`explore`/`plan` by role-suffix. The persona rides `${AGENT_SKILLS_<ROLE>}` (Phase 3) regardless. See @gsd-core/references/runtime-aware-dispatch.md.
|
|
458
|
-
|
|
459
|
-
<output>
|
|
460
|
-
Write research to: ${QUICK_DIR}/${quick_id}-RESEARCH.md
|
|
461
|
-
Use standard research format but keep it lean — skip sections that don't apply.
|
|
462
|
-
Return: ## RESEARCH COMPLETE with file path
|
|
463
|
-
</output>
|
|
464
|
-
",
|
|
465
|
-
subagent_type="gsd-phase-researcher",
|
|
466
|
-
model="{planner_model}",
|
|
467
|
-
description="Research: ${DESCRIPTION}"
|
|
468
|
-
)
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
|
|
472
|
-
|
|
473
|
-
After researcher returns:
|
|
474
|
-
1. Verify research exists at `${QUICK_DIR}/${quick_id}-RESEARCH.md`
|
|
475
|
-
2. Report: "Research complete: ${QUICK_DIR}/${quick_id}-RESEARCH.md"
|
|
476
|
-
|
|
477
|
-
If research file not found, warn but continue: "Research agent did not produce output — proceeding to planning without research."
|
|
293
|
+
<!-- gsd:section id="research-phase" when="flag:--research" -->
|
|
294
|
+
If `section_manifest` is `null` or `"research-phase"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/research-phase.md`. Otherwise skip — do not read the file.
|
|
295
|
+
<!-- /gsd:section -->
|
|
478
296
|
|
|
479
297
|
---
|
|
480
298
|
|
|
@@ -495,12 +313,12 @@ Agent(
|
|
|
495
313
|
**Directory:** ${QUICK_DIR}
|
|
496
314
|
**Description:** ${DESCRIPTION}
|
|
497
315
|
|
|
498
|
-
<
|
|
316
|
+
<required_reading>
|
|
499
317
|
- ${STATE_PATH} (Project State)
|
|
500
318
|
- ./CLAUDE.md or ./.claude/CLAUDE.md (if exists — follow project-specific guidelines)
|
|
501
319
|
${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + quick_id + '-CONTEXT.md (User decisions — locked, do not revisit)' : ''}
|
|
502
320
|
${RESEARCH_MODE ? '- ' + QUICK_DIR + '/' + quick_id + '-RESEARCH.md (Research findings — use to inform implementation choices)' : ''}
|
|
503
|
-
</
|
|
321
|
+
</required_reading>
|
|
504
322
|
|
|
505
323
|
${AGENT_SKILLS_PLANNER}
|
|
506
324
|
|
|
@@ -539,156 +357,15 @@ If plan not found, error: "Planner failed to create ${quick_id}-PLAN.md"
|
|
|
539
357
|
|
|
540
358
|
---
|
|
541
359
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
Display banner:
|
|
547
|
-
```
|
|
548
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
549
|
-
GSD ► CHECKING PLAN
|
|
550
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
551
|
-
|
|
552
|
-
◆ Spawning plan checker... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
Checker prompt:
|
|
556
|
-
|
|
557
|
-
```markdown
|
|
558
|
-
<verification_context>
|
|
559
|
-
**Mode:** quick-full
|
|
560
|
-
**Task Description:** ${DESCRIPTION}
|
|
561
|
-
|
|
562
|
-
<files_to_read>
|
|
563
|
-
- ${QUICK_DIR}/${quick_id}-PLAN.md (Plan to verify)
|
|
564
|
-
</files_to_read>
|
|
565
|
-
|
|
566
|
-
${AGENT_SKILLS_CHECKER}
|
|
567
|
-
|
|
568
|
-
**Scope:** This is a quick task, not a full phase. Skip checks that require a ROADMAP phase goal.
|
|
569
|
-
</verification_context>
|
|
570
|
-
|
|
571
|
-
<check_dimensions>
|
|
572
|
-
- Requirement coverage: Does the plan address the task description?
|
|
573
|
-
- Task completeness: Do tasks have files, action, verify, done fields?
|
|
574
|
-
- Key links: Are referenced files real?
|
|
575
|
-
- Scope sanity: Is this appropriately sized for a quick task (1-3 tasks)?
|
|
576
|
-
- must_haves derivation: Are must_haves traceable to the task description?
|
|
577
|
-
|
|
578
|
-
Skip: cross-plan deps (single plan), ROADMAP alignment
|
|
579
|
-
${DISCUSS_MODE ? '- Context compliance: Does the plan honor locked decisions from CONTEXT.md?' : '- Skip: context compliance (no CONTEXT.md)'}
|
|
580
|
-
</check_dimensions>
|
|
581
|
-
|
|
582
|
-
<expected_output>
|
|
583
|
-
- ## VERIFICATION PASSED — all checks pass
|
|
584
|
-
- ## ISSUES FOUND — structured issue list
|
|
585
|
-
</expected_output>
|
|
586
|
-
```
|
|
587
|
-
|
|
588
|
-
```
|
|
589
|
-
Agent(
|
|
590
|
-
prompt=checker_prompt,
|
|
591
|
-
subagent_type="gsd-plan-checker",
|
|
592
|
-
model="{checker_model}",
|
|
593
|
-
description="Check quick plan: ${DESCRIPTION}"
|
|
594
|
-
)
|
|
595
|
-
```
|
|
596
|
-
|
|
597
|
-
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
|
|
598
|
-
|
|
599
|
-
**Handle checker return:**
|
|
600
|
-
|
|
601
|
-
- **`## VERIFICATION PASSED`:** Display confirmation, proceed to step 6.
|
|
602
|
-
- **`## ISSUES FOUND`:** Display issues, check iteration count, enter revision loop.
|
|
603
|
-
|
|
604
|
-
**Revision loop (max 2 iterations):**
|
|
605
|
-
|
|
606
|
-
Track `iteration_count` (starts at 1 after initial plan + check).
|
|
607
|
-
|
|
608
|
-
**If iteration_count < 2:**
|
|
609
|
-
|
|
610
|
-
Display: `Sending back to planner for revision... (iteration ${N}/2)`
|
|
611
|
-
|
|
612
|
-
Revision prompt:
|
|
613
|
-
|
|
614
|
-
```markdown
|
|
615
|
-
<revision_context>
|
|
616
|
-
**Mode:** quick-full (revision)
|
|
617
|
-
|
|
618
|
-
<files_to_read>
|
|
619
|
-
- ${QUICK_DIR}/${quick_id}-PLAN.md (Existing plan)
|
|
620
|
-
</files_to_read>
|
|
621
|
-
|
|
622
|
-
${AGENT_SKILLS_PLANNER}
|
|
623
|
-
|
|
624
|
-
**Checker issues:** ${structured_issues_from_checker}
|
|
625
|
-
|
|
626
|
-
</revision_context>
|
|
627
|
-
|
|
628
|
-
<instructions>
|
|
629
|
-
Make targeted updates to address checker issues.
|
|
630
|
-
Do NOT replan from scratch unless issues are fundamental.
|
|
631
|
-
Return what changed.
|
|
632
|
-
</instructions>
|
|
633
|
-
```
|
|
634
|
-
|
|
635
|
-
```
|
|
636
|
-
Agent(
|
|
637
|
-
prompt=revision_prompt,
|
|
638
|
-
subagent_type="gsd-planner",
|
|
639
|
-
model="{planner_model}",
|
|
640
|
-
description="Revise quick plan: ${DESCRIPTION}"
|
|
641
|
-
)
|
|
642
|
-
```
|
|
643
|
-
|
|
644
|
-
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
|
|
645
|
-
|
|
646
|
-
After planner returns → spawn checker again, increment iteration_count.
|
|
647
|
-
|
|
648
|
-
**If iteration_count >= 2:**
|
|
649
|
-
|
|
650
|
-
Display: `Max iterations reached. ${N} issues remain:` + issue list
|
|
651
|
-
|
|
652
|
-
Offer: 1) Force proceed, 2) Abort
|
|
360
|
+
<!-- gsd:section id="plan-checker-loop" when="flag:--validate" -->
|
|
361
|
+
If `section_manifest` is `null` or `"plan-checker-loop"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/plan-checker-loop.md`. Otherwise skip — do not read the file.
|
|
362
|
+
<!-- /gsd:section -->
|
|
653
363
|
|
|
654
364
|
---
|
|
655
365
|
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
Skip this step entirely if `USE_WORKTREES === "false"` (non-worktree mode: PLAN.md is committed in Step 8 as usual).
|
|
661
|
-
|
|
662
|
-
```bash
|
|
663
|
-
QUICK_PLAN_PARENT=""
|
|
664
|
-
QUICK_PLAN_COMMIT=""
|
|
665
|
-
if [ "${USE_WORKTREES}" != "false" ]; then
|
|
666
|
-
QUICK_PLAN_PARENT=$(git rev-parse HEAD)
|
|
667
|
-
COMMIT_DOCS=$(gsd_run query config-get commit_docs 2>/dev/null || echo "true")
|
|
668
|
-
if [ "$COMMIT_DOCS" != "false" ]; then
|
|
669
|
-
git add "${QUICK_DIR}/${quick_id}-PLAN.md"
|
|
670
|
-
# No-op skip if nothing actually staged (idempotent re-runs).
|
|
671
|
-
if git diff --cached --quiet -- "${QUICK_DIR}/${quick_id}-PLAN.md"; then
|
|
672
|
-
echo "ℹ Pre-dispatch PLAN.md commit skipped (no staged changes)"
|
|
673
|
-
else
|
|
674
|
-
# Run hooks normally (#2924). If a project opts out via
|
|
675
|
-
# workflow.worktree_skip_hooks=true, honor that opt-in only.
|
|
676
|
-
SKIP_HOOKS=$(gsd_run query config-get workflow.worktree_skip_hooks 2>/dev/null || echo "false")
|
|
677
|
-
if [ "$SKIP_HOOKS" = "true" ]; then
|
|
678
|
-
git commit --no-verify -m "docs(${quick_id}): pre-dispatch plan for ${DESCRIPTION}" -- "${QUICK_DIR}/${quick_id}-PLAN.md" \
|
|
679
|
-
|| { echo "ERROR: pre-dispatch PLAN.md commit failed (--no-verify path). Aborting before executor dispatch." >&2; exit 1; }
|
|
680
|
-
else
|
|
681
|
-
git commit -m "docs(${quick_id}): pre-dispatch plan for ${DESCRIPTION}" -- "${QUICK_DIR}/${quick_id}-PLAN.md" \
|
|
682
|
-
|| { echo "ERROR: pre-dispatch PLAN.md commit failed — likely a pre-commit hook failure. Fix the hook output above (or set workflow.worktree_skip_hooks=true to bypass) and re-run." >&2; exit 1; }
|
|
683
|
-
fi
|
|
684
|
-
QUICK_PLAN_COMMIT=$(git rev-parse HEAD)
|
|
685
|
-
fi
|
|
686
|
-
fi
|
|
687
|
-
if [ -z "$QUICK_PLAN_COMMIT" ]; then
|
|
688
|
-
QUICK_PLAN_COMMIT=$(git rev-parse HEAD)
|
|
689
|
-
fi
|
|
690
|
-
fi
|
|
691
|
-
```
|
|
366
|
+
<!-- gsd:section id="worktree-pre-dispatch-commit" when="state:worktrees-enabled" -->
|
|
367
|
+
If `section_manifest` is `null` or `"worktree-pre-dispatch-commit"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md`. Otherwise skip — do not read the file.
|
|
368
|
+
<!-- /gsd:section -->
|
|
692
369
|
|
|
693
370
|
---
|
|
694
371
|
|
|
@@ -703,21 +380,37 @@ halts with a base-mismatch fatal — potentially many commits behind, not just o
|
|
|
703
380
|
immediately before capturing `EXPECTED_BASE` so it reflects the most current local state.
|
|
704
381
|
|
|
705
382
|
```bash
|
|
706
|
-
if [ "$
|
|
383
|
+
if [ "$ISOLATION" = "harness-worktree" ] && [ "${USE_WORKTREES:-true}" != "false" ]; then
|
|
707
384
|
_QUICK_SHOULD_DEGRADE=$(gsd_run query worktree.base-check --pick shouldDegrade 2>/dev/null || true)
|
|
708
385
|
if [ "$_QUICK_SHOULD_DEGRADE" = "true" ]; then
|
|
709
386
|
_QUICK_DEGRADE_MSG=$(gsd_run query worktree.base-check --pick message 2>/dev/null || true)
|
|
710
387
|
[ -n "$_QUICK_DEGRADE_MSG" ] && printf '%s\n' "$_QUICK_DEGRADE_MSG" >&2
|
|
711
388
|
echo "⚠ [#1941] Worktree fork base diverged from orchestrator HEAD — auto-degrading to sequential mode for this quick task to avoid a base-mismatch halt." >&2
|
|
712
389
|
USE_WORKTREES=false
|
|
390
|
+
ISOLATION=none
|
|
713
391
|
fi
|
|
714
392
|
fi
|
|
393
|
+
|
|
394
|
+
# Re-resolve (and, as a side effect, re-persist) now that the base-check
|
|
395
|
+
# auto-degrade above may have changed $ISOLATION since the Step 2 gate's
|
|
396
|
+
# `dispatch-isolation` call (#3045). That first call recorded the NATURALLY
|
|
397
|
+
# resolved mode into the run-scoped sentinel the isolation guard hooks read
|
|
398
|
+
# (hooks/gsd-agent-isolation-guard.js, hooks/gsd-cursor-subagent-start.js via
|
|
399
|
+
# hooks/lib/isolation-sentinel.js). The degrade above is decided HERE, in
|
|
400
|
+
# shell — the resolver cannot see it — so without this the sentinel still
|
|
401
|
+
# asserts `harness-worktree` while the dispatch below correctly omits the
|
|
402
|
+
# harness flag, and the guard denies the dispatch with exit 2. `--force-isolation`
|
|
403
|
+
# pushes the FINAL, shell-computed value through that SAME single write path
|
|
404
|
+
# (`none` also clears the stored harnessFlag, since none applies to sequential
|
|
405
|
+
# dispatch). Best-effort: a write failure here must never fail the task — the
|
|
406
|
+
# guards' own sentinel-absent fallback is safe, just less precise.
|
|
407
|
+
gsd_run query dispatch-isolation --raw --force-isolation "$ISOLATION" >/dev/null 2>&1 || true
|
|
715
408
|
```
|
|
716
409
|
|
|
717
410
|
Capture current HEAD before spawning (used for worktree branch check):
|
|
718
411
|
```bash
|
|
719
412
|
EXPECTED_BASE=$(git rev-parse HEAD)
|
|
720
|
-
if [ "$
|
|
413
|
+
if [ "$ISOLATION" = "harness-worktree" ]; then # keyed on ISOLATION like every other dispatch-coupled branch (#2652)
|
|
721
414
|
# BSD/macOS mktemp only randomizes XXXXXX when it is the final path component, so make a
|
|
722
415
|
# suffixless temp then append the extension — portable across BSD + GNU (#1520).
|
|
723
416
|
QUICK_WORKTREE_MANIFEST=$(mktemp "${TMPDIR:-/tmp}/gsd-quick-worktree-XXXXXX") && mv "$QUICK_WORKTREE_MANIFEST" "${QUICK_WORKTREE_MANIFEST}.json" && QUICK_WORKTREE_MANIFEST="${QUICK_WORKTREE_MANIFEST}.json" || exit 1
|
|
@@ -733,7 +426,7 @@ Agent(
|
|
|
733
426
|
prompt="
|
|
734
427
|
Execute quick task ${quick_id}.
|
|
735
428
|
|
|
736
|
-
${
|
|
429
|
+
${ISOLATION === "harness-worktree" ? `
|
|
737
430
|
<worktree_branch_check>
|
|
738
431
|
ORCHESTRATOR build-time embed (NOT a sub-agent runtime step): before this dispatch, read \`gsd-core/references/worktree-branch-check.md\`, substitute \`{EXPECTED_BASE}\` with the base SHA captured above (${EXPECTED_BASE}), substitute \`{EXPECTED_BASE_ALTERNATE}\` with \`${QUICK_PLAN_PARENT}\` when it differs from \`${EXPECTED_BASE}\` (otherwise empty), and replace this note with that fragment's \`<worktree_branch_check>\` block so the dispatched prompt carries the runnable guard verbatim — do not pass this instruction through in its place.
|
|
739
432
|
</worktree_branch_check>
|
|
@@ -753,12 +446,12 @@ fi
|
|
|
753
446
|
\`\`\`
|
|
754
447
|
` : ''}
|
|
755
448
|
|
|
756
|
-
<
|
|
449
|
+
<required_reading>
|
|
757
450
|
- ${QUICK_DIR}/${quick_id}-PLAN.md (Plan)
|
|
758
451
|
- ${STATE_PATH} (Project state)
|
|
759
452
|
- ./CLAUDE.md or ./.claude/CLAUDE.md (Project instructions, if exists)
|
|
760
453
|
- .claude/skills/ or .agents/skills/ (Project skills, if either exists — list skills, read SKILL.md for each, follow relevant rules during implementation)
|
|
761
|
-
</
|
|
454
|
+
</required_reading>
|
|
762
455
|
|
|
763
456
|
${AGENT_SKILLS_EXECUTOR}
|
|
764
457
|
|
|
@@ -807,17 +500,17 @@ SUMMARY.md and stop — the user must rerun with worktrees disabled.
|
|
|
807
500
|
",
|
|
808
501
|
subagent_type="gsd-executor",
|
|
809
502
|
model="{executor_model}",
|
|
810
|
-
|
|
503
|
+
{harnessFlag}
|
|
811
504
|
description="Execute: ${DESCRIPTION}"
|
|
812
505
|
)
|
|
813
506
|
```
|
|
814
507
|
|
|
815
508
|
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
|
|
816
509
|
|
|
817
|
-
If the executor ran
|
|
510
|
+
If the executor ran isolated (`ISOLATION = "harness-worktree"` at dispatch), append its returned `{agent_id, worktree_path, branch, expected_base, allowed_bases}` metadata to `QUICK_WORKTREE_MANIFEST` before cleanup. Set `expected_base` to `${EXPECTED_BASE}` and `allowed_bases` to `["${EXPECTED_BASE}", "${QUICK_PLAN_PARENT}"]` with duplicates removed. If any required field is unavailable, stop and ask for recovery; do not discover global worktrees.
|
|
818
511
|
|
|
819
512
|
After executor returns:
|
|
820
|
-
1. **Worktree cleanup:** If the executor ran
|
|
513
|
+
1. **Worktree cleanup:** If the executor ran isolated (`ISOLATION = "harness-worktree"` at dispatch), merge the worktree branch back and clean up:
|
|
821
514
|
```bash
|
|
822
515
|
QUICK_WORKTREE_MANIFEST=${QUICK_WORKTREE_MANIFEST:-$WAVE_WORKTREE_MANIFEST}
|
|
823
516
|
[ -n "${QUICK_WORKTREE_MANIFEST:-}" ] && [ -f "$QUICK_WORKTREE_MANIFEST" ] || {
|
|
@@ -831,7 +524,7 @@ After executor returns:
|
|
|
831
524
|
# Fail closed: SDK refusal (safety guard #3174/#3384) must surface — do not swallow exit 1.
|
|
832
525
|
gsd_run query worktree.cleanup-wave --manifest "$QUICK_WORKTREE_MANIFEST" || exit 1
|
|
833
526
|
```
|
|
834
|
-
If `
|
|
527
|
+
If `ISOLATION` was not `"harness-worktree"` at dispatch (including a #1941 base-check degrade — that is *this* file's degrade; #2649 is the `diagnose-issues.md` / `execute-plan.md` one), skip this step.
|
|
835
528
|
|
|
836
529
|
> **ISOLATED-RUN RECOVERY — FAIL SAFE (#1292):** When an isolated (worktree) run is *rejected* — the user declines to merge it, the orchestrator surfaces recovery guidance for a blocked/halted plan, or the run over-reached the requested scope — the worktree-isolation contract MUST hold through recovery. Do **NOT** propose continuing on `main`/the primary checkout as the default or recommended recovery path. Default to a **safe halt** and offer: (a) re-attempt in a **fresh, narrowly-scoped worktree**, or (b) inspect or discard the rejected worktree without merging. Any path that edits the primary checkout requires an **explicit, clearly-labeled confirmation** from the user first — editing `main` directly is never the proposed or default option for a run the user configured to be isolated.
|
|
837
530
|
|
|
@@ -901,52 +594,9 @@ If review produces findings, display advisory message. **Error handling:** Failu
|
|
|
901
594
|
|
|
902
595
|
---
|
|
903
596
|
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
Display banner:
|
|
909
|
-
```
|
|
910
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
911
|
-
GSD ► VERIFYING RESULTS
|
|
912
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
913
|
-
|
|
914
|
-
◆ Spawning verifier... (runs in a subagent — no output until it returns, ~1–5 min; expected, not a freeze)
|
|
915
|
-
```
|
|
916
|
-
|
|
917
|
-
```
|
|
918
|
-
Agent(
|
|
919
|
-
prompt="Verify quick task goal achievement.
|
|
920
|
-
Task directory: ${QUICK_DIR}
|
|
921
|
-
Task goal: ${DESCRIPTION}
|
|
922
|
-
|
|
923
|
-
<files_to_read>
|
|
924
|
-
- ${QUICK_DIR}/${quick_id}-PLAN.md (Plan)
|
|
925
|
-
</files_to_read>
|
|
926
|
-
|
|
927
|
-
${AGENT_SKILLS_VERIFIER}
|
|
928
|
-
|
|
929
|
-
Check must_haves against actual codebase. Create VERIFICATION.md at ${QUICK_DIR}/${quick_id}-VERIFICATION.md.",
|
|
930
|
-
subagent_type="gsd-verifier",
|
|
931
|
-
model="{verifier_model}",
|
|
932
|
-
description="Verify: ${DESCRIPTION}"
|
|
933
|
-
)
|
|
934
|
-
```
|
|
935
|
-
|
|
936
|
-
> **ORCHESTRATOR RULE — CODEX RUNTIME**: After calling Agent() above, stop working on this task immediately. Do not read more files, edit code, or run tests related to this task while the subagent is active. Wait for the subagent to return its result. This prevents duplicate work, conflicting edits, and wasted context. Only resume when the subagent result is available.
|
|
937
|
-
|
|
938
|
-
Read verification status:
|
|
939
|
-
```bash
|
|
940
|
-
grep "^status:" "${QUICK_DIR}/${quick_id}-VERIFICATION.md" | cut -d: -f2 | tr -d ' '
|
|
941
|
-
```
|
|
942
|
-
|
|
943
|
-
Store as `$VERIFICATION_STATUS`.
|
|
944
|
-
|
|
945
|
-
| Status | Action |
|
|
946
|
-
|--------|--------|
|
|
947
|
-
| `passed` | Store `$VERIFICATION_STATUS = "Verified"`, continue to step 7 |
|
|
948
|
-
| `human_needed` | Display items needing manual check, store `$VERIFICATION_STATUS = "Needs Review"`, continue |
|
|
949
|
-
| `gaps_found` | Display gap summary, offer: 1) Re-run executor to fix gaps, 2) Accept as-is. Store `$VERIFICATION_STATUS = "Gaps"` |
|
|
597
|
+
<!-- gsd:section id="quick-verification" when="flag:--validate" -->
|
|
598
|
+
If `section_manifest` is `null` or `"quick-verification"` is in its `included` list: read and execute `gsd-core/workflows/quick/steps/quick-verification.md`. Otherwise skip — do not read the file.
|
|
599
|
+
<!-- /gsd:section -->
|
|
950
600
|
|
|
951
601
|
---
|
|
952
602
|
|
|
@@ -64,6 +64,9 @@ cat .planning/PROJECT.md
|
|
|
64
64
|
Look for incomplete work that needs attention:
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
|
+
# #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
|
|
68
|
+
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
69
|
+
|
|
67
70
|
# Check for structured handoff (preferred — machine-readable)
|
|
68
71
|
cat .planning/HANDOFF.json 2>/dev/null || true
|
|
69
72
|
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
**Reviewer instances (#1517, optional):** if `review.reviewer_instances` is configured,
|
|
2
|
+
instance names in `review.default_reviewers` run as independent identities. Resolution rules
|
|
3
|
+
are in `gsd-core/references/reviewer-instances.md` — load it lazily only when instances are
|
|
4
|
+
configured. Unconfigured → default path unchanged.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
**Reviewer instances (#1517, optional):** instances resolve *through* a lane and are not lanes
|
|
2
|
+
themselves (ADR-2782 D8). Each selected instance invokes its base `cli` with its own `model`/`agent`
|
|
3
|
+
as opaque argv. Exact invocation in `gsd-core/references/reviewer-instances.md`.
|