@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
|
@@ -24,6 +24,7 @@ command -v opencode >/dev/null 2>&1 && echo "opencode:available" || echo "openco
|
|
|
24
24
|
command -v qwen >/dev/null 2>&1 && echo "qwen:available" || echo "qwen:missing"
|
|
25
25
|
command -v cursor-agent >/dev/null 2>&1 && echo "cursor:available" || echo "cursor:missing"
|
|
26
26
|
command -v agy >/dev/null 2>&1 && echo "antigravity:available" || echo "antigravity:missing"
|
|
27
|
+
command -v kimi >/dev/null 2>&1 && echo "kimi-code:available" || echo "kimi-code:missing"
|
|
27
28
|
|
|
28
29
|
# Check local model servers (OpenAI-compatible HTTP API — no CLI binary required)
|
|
29
30
|
OLLAMA_HOST=$(gsd_run query config-get review.ollama_host --raw 2>/dev/null || echo "")
|
|
@@ -75,6 +76,7 @@ Parse flags from `$ARGUMENTS`:
|
|
|
75
76
|
- `--qwen` → include Qwen Code
|
|
76
77
|
- `--cursor` → include Cursor
|
|
77
78
|
- `--agy` or `--antigravity` → include Antigravity CLI
|
|
79
|
+
- `--kimi-code` → include Kimi CLI
|
|
78
80
|
- `--ollama` → include Ollama (local server, OpenAI-compatible)
|
|
79
81
|
- `--lm-studio` → include LM Studio (local server, OpenAI-compatible)
|
|
80
82
|
- `--llama-cpp` → include llama.cpp (local server, OpenAI-compatible)
|
|
@@ -105,10 +107,9 @@ user who wants a preferred set has `review.default_reviewers`. Both stay lenient
|
|
|
105
107
|
preference evaluated across many hosts, so a subset being present is expected, not an error
|
|
106
108
|
- If all configured reviewers are unavailable, fail with an actionable message
|
|
107
109
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
configured. Unconfigured → default path unchanged.
|
|
110
|
+
<!-- gsd:section id="reviewer-instances-note-1" when="state:reviewer-instances-configured" -->
|
|
111
|
+
If `section_manifest` is `null` or `"reviewer-instances-note-1"` is in its `included` list: read and execute `gsd-core/workflows/review/steps/reviewer-instances-note-1.md`. Otherwise skip — do not read the file.
|
|
112
|
+
<!-- /gsd:section -->
|
|
112
113
|
|
|
113
114
|
If no CLIs are available:
|
|
114
115
|
```
|
|
@@ -156,7 +157,7 @@ Rules:
|
|
|
156
157
|
Collect phase artifacts for the review prompt:
|
|
157
158
|
|
|
158
159
|
```bash
|
|
159
|
-
INIT=$(gsd_run query init.
|
|
160
|
+
INIT=$(gsd_run query init.review "${PHASE_ARG}")
|
|
160
161
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
161
162
|
|
|
162
163
|
# #2358: ONE run-scoped temp dir (portable via ${TMPDIR:-/tmp}) so overlapping
|
|
@@ -243,6 +244,9 @@ Write to a temp file: `{run_dir}/gsd-review-prompt.md`
|
|
|
243
244
|
Also write individual section files so the budget tool can re-trim per reviewer:
|
|
244
245
|
|
|
245
246
|
```bash
|
|
247
|
+
# #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
|
|
248
|
+
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
249
|
+
|
|
246
250
|
RUN_DIR="{run_dir}" # from gather_context
|
|
247
251
|
|
|
248
252
|
# Write individual section files for per-reviewer budget trimming
|
|
@@ -262,11 +266,13 @@ done
|
|
|
262
266
|
if [ -f ".planning/PROJECT.md" ]; then
|
|
263
267
|
cp .planning/PROJECT.md "${RUN_DIR}/gsd-review-project.md"
|
|
264
268
|
fi
|
|
265
|
-
|
|
266
|
-
|
|
269
|
+
_CTX=( "${PHASE_DIR}"/*-CONTEXT.md )
|
|
270
|
+
if [ ${#_CTX[@]} -gt 0 ]; then
|
|
271
|
+
cat "${_CTX[@]}" > "${RUN_DIR}/gsd-review-context.md"
|
|
267
272
|
fi
|
|
268
|
-
|
|
269
|
-
|
|
273
|
+
_RESEARCH=( "${PHASE_DIR}"/*-RESEARCH.md )
|
|
274
|
+
if [ ${#_RESEARCH[@]} -gt 0 ]; then
|
|
275
|
+
cat "${_RESEARCH[@]}" > "${RUN_DIR}/gsd-review-research.md"
|
|
270
276
|
fi
|
|
271
277
|
if [ -f ".planning/REQUIREMENTS.md" ]; then
|
|
272
278
|
cp .planning/REQUIREMENTS.md "${RUN_DIR}/gsd-review-requirements.md"
|
|
@@ -306,13 +312,16 @@ An environment that genuinely hits an untrusted-hook prompt surfaces through the
|
|
|
306
312
|
the empty-output stub as a dropped lane with diagnosable stderr, not silent attrition. Do not
|
|
307
313
|
reintroduce the flag (even spelled out in prose — a regression test bans the literal file-wide).
|
|
308
314
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
315
|
+
<!-- gsd:section id="reviewer-instances-note-2" when="state:reviewer-instances-configured" -->
|
|
316
|
+
If `section_manifest` is `null` or `"reviewer-instances-note-2"` is in its `included` list: read and execute `gsd-core/workflows/review/steps/reviewer-instances-note-2.md`. Otherwise skip — do not read the file.
|
|
317
|
+
<!-- /gsd:section -->
|
|
312
318
|
|
|
313
319
|
Lanes run **sequentially, not in parallel** — concurrent invocation trips provider rate limits.
|
|
314
320
|
|
|
315
321
|
```bash
|
|
322
|
+
# #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
|
|
323
|
+
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
324
|
+
|
|
316
325
|
RUN_DIR="{run_dir}"
|
|
317
326
|
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
|
|
318
327
|
# SELECTED_REVIEWERS is the comma-separated result of reviewer selection (ADR-0011 precedence:
|
|
@@ -414,12 +423,31 @@ names, each gets its own `## <Adapter> Review (<instance>)` section, and ≥2 sa
|
|
|
414
423
|
instances print a one-line shared-adapter caveat. Format in
|
|
415
424
|
`gsd-core/references/reviewer-instances.md`.
|
|
416
425
|
|
|
426
|
+
**Resolved model (#2295):** each lane's `review-lane invoke --json` line in
|
|
427
|
+
`{run_dir}/gsd-review-lane-results.jsonl` carries a `model` object; render `models:` from
|
|
428
|
+
its `value` and `model_sources:` from its `source`. Both maps carry exactly one entry per
|
|
429
|
+
reviewer that appears in `reviewers:` — the two key sets always match. Write the literal
|
|
430
|
+
`unknown` rather than omitting a key: an omitted key is indistinguishable from the feature
|
|
431
|
+
not having run, and a reader must be able to tell *no model recorded* from *nothing to
|
|
432
|
+
look at*. Emit every `models:`/`model_sources:` value as a DOUBLE-QUOTED YAML scalar — a
|
|
433
|
+
legitimate model id can contain `:` (`llama3:70b`, `qwen2.5:7b`), which is unquotable as a
|
|
434
|
+
bare scalar; a control character is already refused at the recording seam, so quoting is
|
|
435
|
+
what closes the remaining `:`/`#`/leading-`-` cases. When GSD applied a reasoning effort to
|
|
436
|
+
a lane, its `value` already carries a `(reasoning=<level>)` suffix (e.g.
|
|
437
|
+
`gpt-5.6-sol (reasoning=high)`) — render it as-is, without re-deriving or re-formatting it.
|
|
438
|
+
|
|
417
439
|
```markdown
|
|
418
440
|
---
|
|
419
441
|
phase: {N}
|
|
420
442
|
reviewers: [gemini, claude, codex, coderabbit, opencode, qwen, cursor, antigravity, ollama, lm_studio, llama_cpp] # populate at runtime with only the reviewers actually invoked
|
|
421
443
|
reviewed_at: {ISO timestamp}
|
|
422
444
|
plans_reviewed: [{list of PLAN.md files}]
|
|
445
|
+
models: # resolved model per reviewer; `unknown` when not recoverable
|
|
446
|
+
codex: "gpt-5.6-sol (reasoning=low)"
|
|
447
|
+
antigravity: "unknown"
|
|
448
|
+
model_sources: # how each value above was determined
|
|
449
|
+
codex: "banner"
|
|
450
|
+
antigravity: "unknown"
|
|
423
451
|
trimmed_reviewers: # only present if at least one reviewer was trimmed
|
|
424
452
|
ollama:
|
|
425
453
|
budget: 6000
|
|
@@ -457,7 +485,7 @@ trimmed_reviewers: # only present if at least one reviewer was trimmed
|
|
|
457
485
|
|
|
458
486
|
## Consensus Summary
|
|
459
487
|
|
|
460
|
-
{synthesize common concerns across all reviewers. CodeRabbit is a diff-only reviewer (it never received the source-grounding prompt), so do not weight its verdict as a grounded plan review — fold in its diff findings, but base plan-level consensus on the prompt-fed reviewers. A reviewer output carrying the `[reviewed-without-repo-access]` marker (or beginning with `REVIEWED-WITHOUT-REPO-ACCESS`) ran without repo access (#2176) — treat it the same way: note its concerns, but do not count its verdict at full consensus weight.}
|
|
488
|
+
{synthesize common concerns across all reviewers. CodeRabbit is a diff-only reviewer (it never received the source-grounding prompt), so do not weight its verdict as a grounded plan review — fold in its diff findings, but base plan-level consensus on the prompt-fed reviewers. A reviewer output carrying the `[reviewed-without-repo-access]` marker (or beginning with `REVIEWED-WITHOUT-REPO-ACCESS`) ran without repo access (#2176) — treat it the same way: note its concerns, but do not count its verdict at full consensus weight. A reviewer output carrying the `[reviewed-without-source-citations]` marker (#3194) declared source-grounded evidence but cited no `file:line` evidence, so it reviewed the plan text only — treat it the same way: note its concerns, but do not count its verdict at full consensus weight.}
|
|
461
489
|
|
|
462
490
|
### Agreed Strengths
|
|
463
491
|
{strengths mentioned by 2+ reviewers}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
{
|
|
2
|
+
"workflows": {
|
|
3
|
+
"autonomous": [
|
|
4
|
+
{
|
|
5
|
+
"id": "converge-fail-fast",
|
|
6
|
+
"when": "state:plan-strategy-converge",
|
|
7
|
+
"read": "gsd-core/workflows/autonomous/steps/converge-fail-fast.md"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "converge-banner",
|
|
11
|
+
"when": "state:plan-strategy-converge",
|
|
12
|
+
"read": "gsd-core/workflows/autonomous/steps/converge-banner.md"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "converge-dispatch-bg",
|
|
16
|
+
"when": "state:plan-strategy-converge",
|
|
17
|
+
"read": "gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "converge-dispatch-inline",
|
|
21
|
+
"when": "state:plan-strategy-converge",
|
|
22
|
+
"read": "gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "converge-loop",
|
|
26
|
+
"when": "state:plan-strategy-converge",
|
|
27
|
+
"read": "gsd-core/workflows/autonomous/steps/converge-loop.md"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"code-review": [
|
|
31
|
+
{
|
|
32
|
+
"id": "structural-pre-pass",
|
|
33
|
+
"when": "state:fallow-enabled",
|
|
34
|
+
"read": "gsd-core/workflows/code-review/steps/structural-pre-pass.md"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "dispatch-fix",
|
|
38
|
+
"when": "flag:--fix",
|
|
39
|
+
"read": "gsd-core/workflows/code-review/steps/dispatch-fix.md"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"complete-milestone": [
|
|
43
|
+
{
|
|
44
|
+
"id": "git-tag",
|
|
45
|
+
"when": "state:git-create-tag",
|
|
46
|
+
"read": "gsd-core/workflows/complete-milestone/steps/git-tag.md"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"discuss-phase-assumptions": [
|
|
50
|
+
{
|
|
51
|
+
"id": "auto-advance-dispatch",
|
|
52
|
+
"when": "state:auto-advance-active",
|
|
53
|
+
"read": "gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"docs-update": [
|
|
57
|
+
{
|
|
58
|
+
"id": "dispatch-monorepo-packages",
|
|
59
|
+
"when": "state:is-monorepo",
|
|
60
|
+
"read": "gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md"
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"execute-phase": [
|
|
64
|
+
{
|
|
65
|
+
"id": "partial-wave",
|
|
66
|
+
"when": "flag:--wave",
|
|
67
|
+
"read": "gsd-core/workflows/execute-phase/steps/partial-wave.md"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "gap-closure-artifacts",
|
|
71
|
+
"when": "state:gap-closure-phase",
|
|
72
|
+
"read": "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "regression-gate",
|
|
76
|
+
"when": "state:has-prior-phases",
|
|
77
|
+
"read": "gsd-core/workflows/execute-phase/steps/regression-gate.md"
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"new-milestone": [
|
|
81
|
+
{
|
|
82
|
+
"id": "project-md-milestone-write",
|
|
83
|
+
"when": "state:flat-mode",
|
|
84
|
+
"read": "gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "reset-phase-safety",
|
|
88
|
+
"when": "flag:--reset-phase-numbers",
|
|
89
|
+
"read": "gsd-core/workflows/new-milestone/steps/reset-phase-safety.md"
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"new-project": [
|
|
93
|
+
{
|
|
94
|
+
"id": "auto-mode-detection",
|
|
95
|
+
"when": "flag:--auto",
|
|
96
|
+
"read": "gsd-core/workflows/new-project/steps/auto-mode-detection.md"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "codebase-map-offer",
|
|
100
|
+
"when": "state:needs-codebase-map",
|
|
101
|
+
"read": "gsd-core/workflows/new-project/steps/codebase-map-offer.md"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "auto-mode-config",
|
|
105
|
+
"when": "flag:--auto",
|
|
106
|
+
"read": "gsd-core/workflows/new-project/steps/auto-mode-config.md"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"plan-phase": [
|
|
110
|
+
{
|
|
111
|
+
"id": "reviews-prerequisite",
|
|
112
|
+
"when": "flag:--reviews",
|
|
113
|
+
"read": "gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "prd-express-gate",
|
|
117
|
+
"when": "flag:--prd",
|
|
118
|
+
"read": "gsd-core/workflows/plan-phase/steps/prd-express-gate.md"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "adr-ingest-express-path",
|
|
122
|
+
"when": "flag:--ingest",
|
|
123
|
+
"read": "gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"id": "research-only-modifiers",
|
|
127
|
+
"when": "flag:--research-phase",
|
|
128
|
+
"read": "gsd-core/workflows/plan-phase/steps/research-only-modifiers.md"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "research-only-early-exit",
|
|
132
|
+
"when": "flag:--research-phase",
|
|
133
|
+
"read": "gsd-core/workflows/plan-phase/steps/research-only-early-exit.md"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "chunked-planning-mode",
|
|
137
|
+
"when": "state:chunked-mode",
|
|
138
|
+
"read": "gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md"
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"progress": [
|
|
142
|
+
{
|
|
143
|
+
"id": "mvp-display",
|
|
144
|
+
"when": "state:phase-mvp-mode",
|
|
145
|
+
"read": "gsd-core/workflows/progress/steps/mvp-display.md"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "forensic-audit",
|
|
149
|
+
"when": "flag:--forensic",
|
|
150
|
+
"read": "gsd-core/workflows/progress/steps/forensic-audit.md"
|
|
151
|
+
}
|
|
152
|
+
],
|
|
153
|
+
"quick": [
|
|
154
|
+
{
|
|
155
|
+
"id": "discussion-phase",
|
|
156
|
+
"when": "flag:--discuss",
|
|
157
|
+
"read": "gsd-core/workflows/quick/steps/discussion-phase.md"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"id": "research-phase",
|
|
161
|
+
"when": "flag:--research",
|
|
162
|
+
"read": "gsd-core/workflows/quick/steps/research-phase.md"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "plan-checker-loop",
|
|
166
|
+
"when": "flag:--validate",
|
|
167
|
+
"read": "gsd-core/workflows/quick/steps/plan-checker-loop.md"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"id": "worktree-pre-dispatch-commit",
|
|
171
|
+
"when": "state:worktrees-enabled",
|
|
172
|
+
"read": "gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"id": "quick-verification",
|
|
176
|
+
"when": "flag:--validate",
|
|
177
|
+
"read": "gsd-core/workflows/quick/steps/quick-verification.md"
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
"review": [
|
|
181
|
+
{
|
|
182
|
+
"id": "reviewer-instances-note-1",
|
|
183
|
+
"when": "state:reviewer-instances-configured",
|
|
184
|
+
"read": "gsd-core/workflows/review/steps/reviewer-instances-note-1.md"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "reviewer-instances-note-2",
|
|
188
|
+
"when": "state:reviewer-instances-configured",
|
|
189
|
+
"read": "gsd-core/workflows/review/steps/reviewer-instances-note-2.md"
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
"transition": [
|
|
193
|
+
{
|
|
194
|
+
"id": "workstream-collision-check",
|
|
195
|
+
"when": "state:workstream-active",
|
|
196
|
+
"read": "gsd-core/workflows/transition/steps/workstream-collision-check.md"
|
|
197
|
+
}
|
|
198
|
+
],
|
|
199
|
+
"update": [
|
|
200
|
+
{
|
|
201
|
+
"id": "channel-banner",
|
|
202
|
+
"when": "state:next-channel",
|
|
203
|
+
"read": "gsd-core/workflows/update/steps/channel-banner.md"
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
"verify-work": [
|
|
207
|
+
{
|
|
208
|
+
"id": "automated-ui-verification",
|
|
209
|
+
"when": "state:ui-phase-active",
|
|
210
|
+
"read": "gsd-core/workflows/verify-work/steps/automated-ui-verification.md"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"id": "mvp-uat-framing",
|
|
214
|
+
"when": "state:phase-mvp-mode",
|
|
215
|
+
"read": "gsd-core/workflows/verify-work/steps/mvp-uat-framing.md"
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -115,7 +115,7 @@ Print: `◆ Spawning security auditor... (runs in a subagent — no output until
|
|
|
115
115
|
```
|
|
116
116
|
Agent(
|
|
117
117
|
prompt="Read ~/.claude/agents/gsd-security-auditor.md for instructions.\n\n" +
|
|
118
|
-
"<
|
|
118
|
+
"<required_reading>{PLAN, SUMMARY, impl files, SECURITY.md}</required_reading>" +
|
|
119
119
|
"<threat_register>{threat register}</threat_register>" +
|
|
120
120
|
"<config>asvs_level: {SECURITY_ASVS}, block_on: {SECURITY_BLOCK_ON}</config>" +
|
|
121
121
|
"<constraints>Never modify implementation files. Verify mitigations exist — do not scan for new threats. Escalate implementation gaps. Return a structured verdict only — do NOT write SECURITY.md (the orchestrator owns the file write).</constraints>" +
|
|
@@ -34,7 +34,8 @@ Read `.planning/ROADMAP.md` to get milestone name and goals.
|
|
|
34
34
|
|
|
35
35
|
Check for existing reports:
|
|
36
36
|
```bash
|
|
37
|
-
|
|
37
|
+
_REPORTS=( .planning/reports/SESSION_REPORT*.md )
|
|
38
|
+
if [ -e "${_REPORTS[0]}" ]; then ls -la "${_REPORTS[@]}"; else echo "No previous reports"; fi
|
|
38
39
|
```
|
|
39
40
|
</step>
|
|
40
41
|
|
|
@@ -59,7 +59,7 @@ Parse current values (default to `true` if not present):
|
|
|
59
59
|
- `graphify.auto_update` — opt-in: auto-rebuild graph after main HEAD advances (#3347) (default: `false`)
|
|
60
60
|
- `model_profile` — which model each agent uses (default: `balanced`)
|
|
61
61
|
- `git.branching_strategy` — branching approach (default: `"none"`)
|
|
62
|
-
- `workflow.use_worktrees` — whether parallel executor agents run in worktree isolation (default
|
|
62
|
+
- `workflow.use_worktrees` — whether parallel executor agents run in worktree isolation (honored when the runtime declares a `dispatch.isolation` primitive — `harness-worktree` or `orchestrator-worktree`; runtimes declaring `none` default it to `false` and fail closed on an explicit `true` — #1521, #2486, #2584)
|
|
63
63
|
- `model_policy.provider` — provider slug for model policy (default: `null`; known values: anthropic, openai, google, qwen; set via /gsd:config --advanced)
|
|
64
64
|
- `model_policy.budget` — budget level for model policy (default: `null`; known values: high, medium, low; set via /gsd:config --advanced)
|
|
65
65
|
- `model_policy.high` — model ID for high-cost tier (default: `null`; set via /gsd:config --advanced)
|
|
@@ -87,6 +87,30 @@ configure `model_overrides` manually in .planning/config.json to target specific
|
|
|
87
87
|
models per agent.
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
+
**Isolation resolution for the Worktrees question (#2486):** resolve the runtime's declared executor-isolation primitive and the current worktrees value before presenting the questions. Use `inspect-dispatch-isolation`, the **sentinel-free** inspection verb — never `dispatch-isolation`, whose #3045 contract records the resolved decision to the executor-dispatch sentinel as an unconditional side effect; a settings menu must not be able to stamp a sentinel the isolation guards then enforce against real dispatches. Sentinel-free is the exact claim: the shared CLI bootstrap still runs, but nothing it does can block a dispatch. The worktrees read deliberately carries no `--default`/fallback: an absent key must stay distinguishable from an explicit `false` (empty output = key absent), which the pre-selection rule below depends on.
|
|
91
|
+
|
|
92
|
+
A failed query is not a capability verdict, so track the two apart: settings still fails closed, but
|
|
93
|
+
says so instead of claiming the runtime declares no primitive. The verb fail-closes an unknown runtime — or an
|
|
94
|
+
internal resolution error — to `none` and exits 0, so `INSPECTED_RESOLVED=false` means only "the query did not answer"
|
|
95
|
+
(#2486 review):
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
_INSPECTED_RAW=$(gsd_run query inspect-dispatch-isolation --raw 2>/dev/null)
|
|
99
|
+
_ISOLATION_RC=$?
|
|
100
|
+
if [ $_ISOLATION_RC -ne 0 ] || [ -z "$_INSPECTED_RAW" ]; then
|
|
101
|
+
INSPECTED_ISOLATION=none
|
|
102
|
+
INSPECTED_RESOLVED=false # no verdict learned — not the same as "declares none"
|
|
103
|
+
else
|
|
104
|
+
INSPECTED_ISOLATION="$_INSPECTED_RAW"
|
|
105
|
+
INSPECTED_RESOLVED=true
|
|
106
|
+
fi
|
|
107
|
+
case "$INSPECTED_ISOLATION" in
|
|
108
|
+
harness-worktree|orchestrator-worktree|none) ;;
|
|
109
|
+
*) INSPECTED_ISOLATION=none; INSPECTED_RESOLVED=false ;; # out of vocabulary is not a verdict either
|
|
110
|
+
esac
|
|
111
|
+
USE_WORKTREES_CURRENT=$(gsd_run query config-get workflow.use_worktrees --raw 2>/dev/null)
|
|
112
|
+
```
|
|
113
|
+
|
|
90
114
|
Use AskUserQuestion with current values pre-selected. Questions are grouped into six visual sections; the first question in each section carries the section-denoting `header` field (AskUserQuestion renders abbreviated section tags for grouping, max 12 chars).
|
|
91
115
|
|
|
92
116
|
Section layout:
|
|
@@ -113,6 +137,46 @@ Context Warnings, Research Qs
|
|
|
113
137
|
|
|
114
138
|
**Conditional visibility — graphify.auto_update:** This question is shown only when the user's chosen `graphify.enabled` value is on. If `graphify.enabled` is off, omit the `graphify.auto_update` question and preserve the existing `graphify.auto_update` value in config (do not overwrite). Implementation: ask Graphify first; only ask Graph auto-update when Graphify is enabled.
|
|
115
139
|
|
|
140
|
+
**Conditional options — Worktrees (#2486):** whether a runtime can honor `workflow.use_worktrees: true` depends on its **declared `dispatch.isolation` capability, not its name** (#2584): `harness-worktree` (the host isolates each executor) and `orchestrator-worktree` (GSD drives the worktrees) both run parallel; `none` fails closed on an explicit `true`. Branch on the same negotiation the execution gate resolves, via the sentinel-free `inspect-dispatch-isolation` verb, which fail-closes unknown/undeclared/`undocumented` to `none`. The rule is one-directional: **never persist a value the isolation gate would fail closed on.** **Do not add a runtime-name test here.** Branch on `$INSPECTED_ISOLATION`:
|
|
141
|
+
|
|
142
|
+
- **If `INSPECTED_ISOLATION` ≠ `none`** (`harness-worktree` or `orchestrator-worktree`): present the Worktrees question exactly as written below — unchanged behavior. The `none` branch is the entirety of the #2486 change.
|
|
143
|
+
- **If `INSPECTED_ISOLATION` = `none`:** replace the question's options with the two below — do NOT offer an enabling option, and NEVER write `workflow.use_worktrees: true` from this workflow when the runtime declares no isolation primitive, regardless of the user's answer:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
{
|
|
147
|
+
question: "Use git worktrees for parallel agent isolation?",
|
|
148
|
+
header: "Worktrees",
|
|
149
|
+
multiSelect: false,
|
|
150
|
+
options: [
|
|
151
|
+
{ label: "No (Recommended)", description: "Write use_worktrees: false. {FINDING}, so parallel plans run sequentially and {CONSEQUENCE}." },
|
|
152
|
+
{ label: "Leave unchanged", description: "Do not write the key. {ABSENCE}; an existing explicit value is kept intact (e.g. for a worktree-capable install sharing this config)." }
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**The three placeholders** carry the only difference between a capability GSD resolved and one it could not, so no text in this branch ever asserts a verdict that was not reached. Substitute them everywhere they appear — the two `description`s above, the pre-selection rationale, and the notice — from whichever column applies:
|
|
158
|
+
|
|
159
|
+
| | `INSPECTED_RESOLVED=true` | `INSPECTED_RESOLVED=false` |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| `{FINDING}` | this runtime has no usable executor-isolation primitive | GSD could not resolve this runtime's executor-isolation capability |
|
|
162
|
+
| `{CONSEQUENCE}` | execution fails closed on an explicit true | GSD cannot tell whether execution will accept an explicit true |
|
|
163
|
+
| `{ABSENCE}` | absent, it resolves to false wherever this emit stamped that default | absent, it is the safe state until the capability resolves |
|
|
164
|
+
|
|
165
|
+
Failing closed is right in both columns — never write `workflow.use_worktrees: true` from this branch either way. Only the explanation changes.
|
|
166
|
+
|
|
167
|
+
Persistence: "No (Recommended)" → write `workflow.use_worktrees: false`; "Leave unchanged" → do not write `workflow.use_worktrees` at all (preserve the existing value or absence).
|
|
168
|
+
|
|
169
|
+
Pre-selection: the generic "current values pre-selected" rule does not apply when `INSPECTED_ISOLATION` is `none` — an explicit `true` has no matching option by design. Pre-select "No (Recommended)" in every case, including an absent key (`$USE_WORKTREES_CURRENT` empty, the no-`--default` read's absent signal): absence resolves to `false` only where this emit stamped that default and to `true` otherwise, so leaving it absent can preserve the very state this branch prevents, while an explicit `false` is correct under either emit (#2486 review). The same applies when it is an explicit non-false value — the broken-inheritance case the notice below covers. "Leave unchanged" remains available for the deliberate shared-config case, but is never the default here. The default must be the repair the "(Recommended)" label points to, so accepting it never keeps a value this branch could not justify. In TEXT_MODE, mark that option as the default in the numbered list.
|
|
170
|
+
|
|
171
|
+
Additionally, if `$USE_WORKTREES_CURRENT` is non-empty and not `false` (the config carries an explicit `true` — e.g. inherited from a worktree-capable install sharing the repo; empty means the key is absent, which needs no notice), prepend this notice before the question:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
Note: the project config currently sets workflow.use_worktrees: true.
|
|
175
|
+
{FINDING}, so {CONSEQUENCE}. Choose "No" to repair it for this runtime, or
|
|
176
|
+
"Leave unchanged" to keep it for a worktree-capable install that shares this
|
|
177
|
+
config.
|
|
178
|
+
```
|
|
179
|
+
|
|
116
180
|
```
|
|
117
181
|
// Model profile is selected via a two-question split because AskUserQuestion enforces a
|
|
118
182
|
// hard 4-option cap and there are 5 valid profiles (quality, balanced, budget, adaptive,
|
|
@@ -411,7 +475,7 @@ Merge new settings into existing config.json:
|
|
|
411
475
|
"research_before_questions": true/false,
|
|
412
476
|
"discuss_mode": "discuss" | "assumptions",
|
|
413
477
|
"skip_discuss": true/false,
|
|
414
|
-
"use_worktrees": true/false
|
|
478
|
+
"use_worktrees": true/false // never written as true when the runtime's dispatch.isolation is none; omitted entirely when the user chose "Leave unchanged" (#2486)
|
|
415
479
|
},
|
|
416
480
|
"plan_review": {
|
|
417
481
|
"source_grounding": true/false
|