@opengsd/gsd-core 1.11.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +78 -42
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +0 -1
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +3 -1
- package/agents/gsd-plan-checker.md +91 -112
- package/agents/gsd-planner.md +20 -4
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +82 -7
- package/agents/gsd-ui-researcher.md +70 -3
- package/agents/gsd-verifier.md +24 -2
- package/bin/install.js +847 -200
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/phase.md +1 -1
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/quick.md +8 -4
- package/commands/gsd/surface.md +18 -8
- package/gsd-core/bin/gsd-tools.cjs +761 -100
- package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
- package/gsd-core/bin/lib/api-coverage.cjs +30 -9
- package/gsd-core/bin/lib/artifacts.cjs +2 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
- package/gsd-core/bin/lib/audit.cjs +163 -41
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +785 -144
- package/gsd-core/bin/lib/capability-state.cjs +25 -4
- package/gsd-core/bin/lib/capability-validator.cjs +321 -18
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +229 -6
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +877 -54
- package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
- package/gsd-core/bin/lib/config-loader.cjs +121 -29
- package/gsd-core/bin/lib/config.cjs +92 -2
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +118 -14
- package/gsd-core/bin/lib/decisions.cjs +213 -1
- package/gsd-core/bin/lib/edge-probe.cjs +23 -2
- package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
- package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +975 -326
- package/gsd-core/bin/lib/gap-checker.cjs +41 -8
- package/gsd-core/bin/lib/git-base-branch.cjs +182 -39
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +60 -14
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
- package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
- package/gsd-core/bin/lib/host-integration.cjs +96 -11
- package/gsd-core/bin/lib/init-command-router.cjs +132 -21
- package/gsd-core/bin/lib/init.cjs +252 -56
- package/gsd-core/bin/lib/install-engine.cjs +252 -15
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +78 -1
- package/gsd-core/bin/lib/install-profiles.cjs +100 -18
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +195 -15
- package/gsd-core/bin/lib/learnings.cjs +85 -14
- package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
- package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
- package/gsd-core/bin/lib/markdown-table.cjs +175 -4
- package/gsd-core/bin/lib/milestone.cjs +112 -7
- package/gsd-core/bin/lib/model-catalog.cjs +177 -19
- package/gsd-core/bin/lib/model-resolver.cjs +10 -28
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
- package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
- package/gsd-core/bin/lib/phase-id.cjs +321 -13
- package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
- package/gsd-core/bin/lib/phase-locator.cjs +138 -17
- package/gsd-core/bin/lib/phase.cjs +1175 -115
- package/gsd-core/bin/lib/plan-document.cjs +273 -0
- package/gsd-core/bin/lib/plan-scan.cjs +13 -2
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +165 -34
- package/gsd-core/bin/lib/planning-workspace.cjs +159 -28
- package/gsd-core/bin/lib/probe-core.cjs +4 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +62 -14
- package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
- package/gsd-core/bin/lib/roadmap-parser.cjs +577 -41
- package/gsd-core/bin/lib/roadmap.cjs +248 -64
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +329 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +320 -109
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +487 -83
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
- package/gsd-core/bin/lib/shell-command-projection.cjs +75 -8
- package/gsd-core/bin/lib/smart-entry.cjs +19 -31
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +47 -18
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +216 -5
- package/gsd-core/bin/lib/state-md-schema.cjs +231 -0
- package/gsd-core/bin/lib/state-transition.cjs +850 -145
- package/gsd-core/bin/lib/state.cjs +1629 -287
- package/gsd-core/bin/lib/surface.cjs +33 -10
- package/gsd-core/bin/lib/task-command-router.cjs +111 -1
- package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
- package/gsd-core/bin/lib/uat.cjs +2542 -387
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
- package/gsd-core/bin/lib/unusable-input.cjs +13 -0
- package/gsd-core/bin/lib/update-context.cjs +6 -2
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/README.md +43 -5
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -13
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +441 -56
- package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +185 -21
- package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
- package/gsd-core/references/agent-contracts.md +6 -5
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +37 -19
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/edge-probe.md +17 -5
- package/gsd-core/references/execute-mvp-tdd.md +18 -18
- package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/execute-phase-wave-guard.md +11 -9
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +3 -3
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +22 -0
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/nyquist-compliance.md +74 -0
- package/gsd-core/references/offer-next.md +3 -5
- package/gsd-core/references/phase-argument-parsing.md +3 -3
- package/gsd-core/references/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +76 -3
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +39 -9
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/tdd.md +15 -12
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +2 -2
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +11 -11
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/phase-prompt.md +7 -0
- package/gsd-core/templates/state.md +7 -0
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +3 -1
- package/gsd-core/workflows/add-phase.md +5 -3
- package/gsd-core/workflows/add-tests.md +4 -9
- package/gsd-core/workflows/add-todo.md +2 -2
- package/gsd-core/workflows/ai-integration-phase.md +5 -10
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +14 -3
- package/gsd-core/workflows/audit-milestone.md +11 -9
- package/gsd-core/workflows/audit-uat.md +19 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +12 -26
- package/gsd-core/workflows/check-todos.md +2 -2
- package/gsd-core/workflows/cleanup.md +3 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +16 -14
- package/gsd-core/workflows/code-review-fix.md +3 -1
- package/gsd-core/workflows/code-review.md +192 -69
- package/gsd-core/workflows/complete-milestone.md +28 -14
- package/gsd-core/workflows/debug.md +6 -4
- package/gsd-core/workflows/diagnose-issues.md +17 -7
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +3 -1
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -7
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +3 -1
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +3 -3
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +2 -2
- package/gsd-core/workflows/do.md +46 -19
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +3 -1
- package/gsd-core/workflows/eval-review.md +5 -10
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +129 -11
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +29 -5
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +4 -2
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +68 -66
- package/gsd-core/workflows/execute-plan.md +25 -20
- package/gsd-core/workflows/explore.md +3 -1
- package/gsd-core/workflows/extract-learnings.md +3 -1
- package/gsd-core/workflows/fast.md +8 -2
- package/gsd-core/workflows/forensics.md +3 -1
- package/gsd-core/workflows/graduation.md +6 -6
- package/gsd-core/workflows/health.md +4 -7
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +2 -0
- package/gsd-core/workflows/import.md +17 -14
- package/gsd-core/workflows/inbox.md +5 -6
- package/gsd-core/workflows/ingest-docs.md +45 -12
- package/gsd-core/workflows/insert-phase.md +7 -5
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +7 -3
- package/gsd-core/workflows/list-workspaces.md +3 -1
- package/gsd-core/workflows/manager.md +15 -26
- package/gsd-core/workflows/map-codebase.md +3 -1
- package/gsd-core/workflows/milestone-summary.md +3 -1
- package/gsd-core/workflows/mvp-phase.md +3 -3
- package/gsd-core/workflows/new-milestone.md +10 -22
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +17 -29
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +4 -2
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +20 -5
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +4 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +12 -3
- package/gsd-core/workflows/plan-phase.md +251 -54
- package/gsd-core/workflows/plan-review-convergence.md +148 -19
- package/gsd-core/workflows/plant-seed.md +3 -3
- package/gsd-core/workflows/pr-branch.md +195 -51
- package/gsd-core/workflows/profile-user.md +17 -15
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +52 -15
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +38 -5
- package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
- package/gsd-core/workflows/quick/steps/research-phase.md +5 -7
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +33 -32
- package/gsd-core/workflows/reapply-patches.md +2 -0
- package/gsd-core/workflows/remove-phase.md +6 -4
- package/gsd-core/workflows/remove-workspace.md +3 -3
- package/gsd-core/workflows/resume-project.md +14 -14
- package/gsd-core/workflows/review.md +404 -21
- package/gsd-core/workflows/scan.md +3 -1
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +9 -9
- package/gsd-core/workflows/settings-integrations.md +66 -32
- package/gsd-core/workflows/settings.md +4 -6
- package/gsd-core/workflows/ship.md +22 -16
- package/gsd-core/workflows/sketch-wrap-up.md +13 -17
- package/gsd-core/workflows/sketch.md +13 -19
- package/gsd-core/workflows/smart-entry.md +4 -6
- package/gsd-core/workflows/spec-phase.md +31 -4
- package/gsd-core/workflows/spike-wrap-up.md +9 -11
- package/gsd-core/workflows/spike.md +21 -32
- package/gsd-core/workflows/stats.md +4 -2
- package/gsd-core/workflows/sync-skills.md +13 -5
- package/gsd-core/workflows/thread.md +13 -7
- package/gsd-core/workflows/transition.md +7 -5
- package/gsd-core/workflows/ui-phase.md +36 -21
- package/gsd-core/workflows/ui-review.md +7 -11
- package/gsd-core/workflows/ultraplan-phase.md +7 -13
- package/gsd-core/workflows/undo.md +9 -17
- package/gsd-core/workflows/update.md +47 -48
- package/gsd-core/workflows/validate-phase.md +3 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +106 -21
- package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +302 -22
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +77 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +46 -12
- package/hooks/dist/gsd-read-guard.js +18 -7
- package/hooks/dist/gsd-read-injection-scanner.js +22 -13
- package/hooks/dist/gsd-secret-read-guard.js +1079 -0
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +222 -29
- package/hooks/dist/gsd-validate-commit.sh +523 -12
- package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
- package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
- package/hooks/dist/gsd-workflow-guard.js +36 -17
- package/hooks/dist/gsd-worktree-path-guard.js +36 -21
- package/hooks/dist/gsd-write-guard.js +35 -25
- package/hooks/dist/lib/cli-exit.js +560 -0
- package/hooks/dist/lib/exit-code-registry.js +98 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/managed-hooks-registry.cjs +4 -0
- package/hooks/gsd-agent-isolation-guard.js +77 -38
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +302 -22
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +3 -1
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +28 -23
- package/hooks/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +77 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +46 -12
- package/hooks/gsd-read-guard.js +18 -7
- package/hooks/gsd-read-injection-scanner.js +22 -13
- package/hooks/gsd-secret-read-guard.js +1079 -0
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +222 -29
- package/hooks/gsd-validate-commit.sh +523 -12
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +36 -17
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/hooks.json +6 -0
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/managed-hooks-registry.cjs +4 -0
- package/package.json +14 -9
- package/scripts/base64-scan.sh +74 -12
- package/scripts/build-hooks.js +12 -0
- package/scripts/check-glossary-refs.cjs +77 -15
- package/scripts/check-mutation-score-ratchet.cjs +156 -0
- package/scripts/ci-check-job-near-cap.cjs +49 -0
- package/scripts/ci-pr-mergeability.cjs +262 -0
- package/scripts/ci-test-scope.cjs +52 -12
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/docs-guard-registry.cjs +406 -0
- package/scripts/gen-capability-registry.cjs +8 -6
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-loop-host-contract.cjs +189 -4
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +32 -2
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +198 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +45 -14
- package/scripts/lint-phase-id-drift.cjs +133 -8
- package/scripts/lint-planning-prompt-drift.cjs +38 -1
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-removed-but-needed.cjs +184 -16
- package/scripts/lint-response-language-coverage.cjs +524 -0
- package/scripts/lint-seam-enforcement.cjs +182 -0
- package/scripts/lint-slug-derivation-drift.cjs +921 -0
- package/scripts/lint-source-test-name-collision.cjs +241 -0
- package/scripts/lint-state-write-path-drift.cjs +337 -432
- package/scripts/lint-test-file-count.allowlist.json +124 -4
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +51 -64
- package/scripts/lint-vendored-deps.cjs +208 -35
- package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +83 -14
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +22 -3
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -1
- package/skills/gsd-quick/SKILL.md +8 -4
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -109
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/state-write-path-drift-baseline.json +0 -19
|
@@ -134,9 +134,7 @@ FRAMEWORK_RECOMMENDATION:
|
|
|
134
134
|
Display to user:
|
|
135
135
|
|
|
136
136
|
```
|
|
137
|
-
|
|
138
|
-
FRAMEWORK RECOMMENDATION
|
|
139
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
137
|
+
### FRAMEWORK RECOMMENDATION
|
|
140
138
|
|
|
141
139
|
◆ Primary Pick: {framework}
|
|
142
140
|
{rationale}
|
|
@@ -212,7 +212,7 @@ Glob for project structure indicators:
|
|
|
212
212
|
|
|
213
213
|
Read package.json, configs, and build files. Write `stack.json`. Then patch its timestamp:
|
|
214
214
|
```bash
|
|
215
|
-
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$
|
|
215
|
+
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; _gsd_at() { for _p; do if [ -f "$_p" ]; then GSD_TOOLS="$_p"; return 0; fi; done; return 1; }; if _gsd_at "${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif unset -f gsd_run; _G="$(command -v gsd_run)"; then GSD_TOOLS="$_G"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif _gsd_at "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd_run is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; GSD_IDENTITY_STATUS=unverified; case "$(gsd_run runtime-identity --raw 2>/dev/null || true)" in '{"packageName":"@opengsd/gsd-core"'*'}') GSD_IDENTITY_STATUS=ok;; esac; export GSD_IDENTITY_STATUS; [ "$GSD_IDENTITY_STATUS" = ok ] || echo "WARNING: \"$GSD_TOOLS\" did not prove it is @opengsd/gsd-core - it is either a different package or an @opengsd/gsd-core older than the runtime-identity verb. See docs/how-to/diagnose-a-foreign-gsd-tools.md" >&2; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
216
216
|
gsd_run intel patch-meta .planning/intel/stack.json
|
|
217
217
|
```
|
|
218
218
|
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
name: gsd-mempalace-curator
|
|
3
3
|
description: Ship-time MemPalace curation — writes the session diary, proposes/creates cross-project tunnels, mirrors extract-learnings into the temporal KG, and runs wing-scoped drawer pruning. Spawned at ship:post by the mempalace capability.
|
|
4
4
|
tools: Read, Bash, Grep, Glob
|
|
5
|
-
model: sonnet
|
|
6
5
|
color: cyan
|
|
7
6
|
---
|
|
8
7
|
|
|
@@ -116,6 +116,17 @@ Grep("router\.(get|post|put|delete)", type: "ts")
|
|
|
116
116
|
3. Different role, same data flow — partial match
|
|
117
117
|
4. Most recently modified — prefer current patterns over legacy
|
|
118
118
|
|
|
119
|
+
**Tracked-source gate (#3645):** every analog path you name must be git-TRACKED
|
|
120
|
+
source, never a gitignored install/runtime mirror (e.g. `<root>/.gsd/capabilities/
|
|
121
|
+
<id>/...` synced from a plugin's tracked tree). Before naming an analog whose
|
|
122
|
+
file exists on disk, verify `git ls-files -- <path>` prints it (non-empty =
|
|
123
|
+
tracked); if the closest analog is a gitignored mirror, substitute its tracked
|
|
124
|
+
origin (e.g. `plugins/*/.gsd/capabilities/<id>/...`, or root
|
|
125
|
+
`capabilities/<id>/...`). PATTERNS.md must never emit mirror paths — the
|
|
126
|
+
planner builds later phases on your output, so one mirror path self-propagates
|
|
127
|
+
across phases and the executor's edits die on the next capability sync. For
|
|
128
|
+
files inside a nested submodule, run the check from within the submodule.
|
|
129
|
+
|
|
119
130
|
## Step 4: Extract Patterns from Analogs
|
|
120
131
|
|
|
121
132
|
**Never re-read the same range.** For small files (≤ 2,000 lines), one `Read` call is enough — extract everything in that pass. For large files, multiple non-overlapping targeted reads are fine; what is forbidden is re-reading a range already in context.
|
|
@@ -34,6 +34,8 @@ Spawned by `/gsd:plan-phase` (integrated) or `/gsd:plan-phase --research-phase <
|
|
|
34
34
|
|
|
35
35
|
**In-repo value provenance rule:** A claim about an in-repo *discrete value* — an enum, a schema or type union, an error code, a status constant, or a filesystem path — may be tagged `[VERIFIED: …]` only if you opened the source-of-truth file with `Read` **this session**. A codebase `grep` is not sufficient on its own: it confirms a string occurs, not that you read the definition. Cite the path **and line range** (`[VERIFIED: src/types/order.ts:14-22]`), and quote the values **verbatim** in RESEARCH.md beside the claim — paraphrase is forbidden. The quote is what makes the tag checkable — a citation with no quote beside it does not earn `[VERIFIED]`, however precise the line range looks. Every value appearing in a code example or skeleton must also appear in that verbatim quote; a value that does not is `[ASSUMED]`. For a filesystem path, cite the line in the script that creates it, not the location you expect it to occupy. Training memory and a web search are not substitutes for reading the file — a discrete value that merely looks right fails at the executor's `parse()`/typecheck, the most expensive place to discover it.
|
|
36
36
|
|
|
37
|
+
**Absent-evidence provenance rule:** A compatibility claim resting on **missing** metadata — no `python_requires`, no `engines` field, no per-version classifier, no changelog entry, no matching row in a support matrix — does not earn `[VERIFIED: …]`, however authoritative the source you consulted. Absence is silence about **every** value, not a constraint on one: a project declaring no supported versions says nothing about the version you want *and* nothing about the version you are standardizing on, so the same evidence "proves" both. The rule keys on the **evidence, not the wording** — "does not support 3.14" rephrased as "supports only up to 3.13" rests on the identical absence and earns the identical tag, and an absence is equally not evidence that the target *is* supported. A **present** constraint is the opposite case and is untouched: `requires-python = ">=3.9,<3.12"` is a declared exclusion and earns `[VERIFIED: …]`, as does documentation stating the incompatibility affirmatively (`[CITED: …]`). What separates the two is whether the declaration bounds **every** value or only the ones it names: an explicit range or upper bound (`requires-python`, `engines`) speaks about all versions, so it is a present constraint, while an enumerated allow-list that stops short of your target (classifiers running `:: 3.9` through `:: 3.13` with no `:: 3.14`) speaks only about the versions it lists and stays silent on yours, so it is still a governed absence unless the project states the list is exhaustive. Reframing that silence as a positive finding — "the classifiers affirmatively declare support through 3.13" — is the same absence in different clothes and earns the same tag. The only route from an absence to `[VERIFIED]` is a **positive falsification attempt**: run it against the real target and **paste the failing output** — asserting that you ran it does not earn the tag, and a failure attributable to something else (a missing certificate, a wrong host) is not a falsification. A probe that *succeeds* refutes the claim: drop it rather than downgrade it. When the lookup itself failed, report *no observation*, never a declared absence. Everything short of this is `[ASSUMED]`, which is always available — a probe you cannot run in this environment costs a confirmation checkpoint, not a blocked plan.
|
|
38
|
+
|
|
37
39
|
Claims tagged `[ASSUMED]` signal to the planner and discuss-phase that the information needs user confirmation before becoming a locked decision. Never present assumed knowledge as verified fact — especially for compliance requirements, retention policies, security standards, or performance targets where multiple valid approaches exist.
|
|
38
40
|
</role>
|
|
39
41
|
|
|
@@ -116,7 +118,7 @@ Construct a JSON file at a temp path (e.g. `/tmp/research-plan-input.json`):
|
|
|
116
118
|
### Step B — Obtain the fetch plan
|
|
117
119
|
|
|
118
120
|
```bash
|
|
119
|
-
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$
|
|
121
|
+
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; _gsd_at() { for _p; do if [ -f "$_p" ]; then GSD_TOOLS="$_p"; return 0; fi; done; return 1; }; if _gsd_at "${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif unset -f gsd_run; _G="$(command -v gsd_run)"; then GSD_TOOLS="$_G"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif _gsd_at "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd_run is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; GSD_IDENTITY_STATUS=unverified; case "$(gsd_run runtime-identity --raw 2>/dev/null || true)" in '{"packageName":"@opengsd/gsd-core"'*'}') GSD_IDENTITY_STATUS=ok;; esac; export GSD_IDENTITY_STATUS; [ "$GSD_IDENTITY_STATUS" = ok ] || echo "WARNING: \"$GSD_TOOLS\" did not prove it is @opengsd/gsd-core - it is either a different package or an @opengsd/gsd-core older than the runtime-identity verb. See docs/how-to/diagnose-a-foreign-gsd-tools.md" >&2; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
120
122
|
gsd_run query research-plan --input /tmp/research-plan-input.json
|
|
121
123
|
```
|
|
122
124
|
|
|
@@ -39,7 +39,11 @@ You are NOT the executor or verifier — you verify plans WILL work before execu
|
|
|
39
39
|
**Required finding classification:** Every issue must carry an explicit severity:
|
|
40
40
|
- **BLOCKER** — the phase goal will not be achieved if this is not fixed before execution
|
|
41
41
|
- **WARNING** — quality or maintainability is degraded; fix recommended but execution can proceed
|
|
42
|
-
|
|
42
|
+
- **INFO** — advisory; every consuming gate counts only BLOCKER + WARNING, so INFO alone never forces a revision or blocks acceptance (#3724)
|
|
43
|
+
Issues without a severity classification are not valid output. Neither are issues without a
|
|
44
|
+
`required_property` (the invariant that failed) and evidence for the failure — see
|
|
45
|
+
`<issue_structure>`. Your authority is to state what must be true; `fix_hint` is an example
|
|
46
|
+
of one route there, never a prescription.
|
|
43
47
|
</adversarial_stance>
|
|
44
48
|
|
|
45
49
|
<required_reading>
|
|
@@ -85,7 +89,7 @@ REVIEWS.md is audit trail and feedback input, not a hidden execution contract. /
|
|
|
85
89
|
|
|
86
90
|
- Extract current actionable findings from the human-readable per-reviewer and consensus content in REVIEWS.md. Do NOT look for a `CYCLE_SUMMARY: current_high=<N> current_actionable=<M>` line or `## Current HIGH Concerns` / `## Current Actionable Non-HIGH Concerns` section headers — those machine-readable fields exist only in the convergence orchestrator's return message, never in REVIEWS.md (which contains only human-readable review content).
|
|
87
91
|
- Do not re-open historical findings that are already incorporated, explicitly deferred/rejected in PLAN.md, or marked fully resolved.
|
|
88
|
-
- Verify each current actionable review finding appears in executable PLAN.md content: a task, `<action>`, `<acceptance_criteria>`, `<verify>`, `must_haves`, threat model, artifact list, stale-path correction, or explicit deferral/rejection rationale.
|
|
92
|
+
- Verify each current actionable review finding appears in executable PLAN.md content: a task, `<action>`, `<acceptance_criteria>`, `<verify>`, `must_haves`, threat model, artifact list, stale-path correction, or explicit deferral/rejection rationale using the Review Dispositions Ledger in `gsd-core/references/planner-reviews.md`.
|
|
89
93
|
- If a current actionable finding remains only in REVIEWS.md and would be invisible to /gsd:execute-phase, return `## ISSUES FOUND`. Use WARNING by default; use BLOCKER when the missing incorporation can prevent the phase goal, create unsafe execution, or invalidate verification.
|
|
90
94
|
</upstream_input>
|
|
91
95
|
|
|
@@ -142,6 +146,7 @@ For calibration on scoring and issue identification, reference these examples:
|
|
|
142
146
|
issue:
|
|
143
147
|
dimension: requirement_coverage
|
|
144
148
|
severity: blocker
|
|
149
|
+
required_property: "Every phase requirement is claimed by at least one task"
|
|
145
150
|
description: "AUTH-02 (logout) has no covering task"
|
|
146
151
|
plan: "16-01"
|
|
147
152
|
fix_hint: "Add task for logout endpoint in plan 01 or new plan"
|
|
@@ -174,6 +179,7 @@ issue:
|
|
|
174
179
|
issue:
|
|
175
180
|
dimension: task_completeness
|
|
176
181
|
severity: blocker
|
|
182
|
+
required_property: "Every `auto` task has a `<verify>` separating pass from fail"
|
|
177
183
|
description: "Task 2 missing <verify> element"
|
|
178
184
|
plan: "16-01"
|
|
179
185
|
task: 2
|
|
@@ -205,6 +211,7 @@ issue:
|
|
|
205
211
|
issue:
|
|
206
212
|
dimension: dependency_correctness
|
|
207
213
|
severity: blocker
|
|
214
|
+
required_property: "The cross-plan `depends_on` graph is acyclic"
|
|
208
215
|
description: "Circular dependency between plans 02 and 03"
|
|
209
216
|
plans: ["02", "03"]
|
|
210
217
|
fix_hint: "Plan 02 depends on 03, but 03 depends on 02"
|
|
@@ -214,7 +221,7 @@ issue:
|
|
|
214
221
|
|
|
215
222
|
**Question:** Do two same-wave plans depend on each other through shared mutable state or
|
|
216
223
|
execution order without declaring it? Dimension 3 checks *declared* edges and the wave guard
|
|
217
|
-
checks `files_modified` overlap; neither sees an undeclared edge, which under parallel
|
|
224
|
+
checks `files_modified`/`files_deleted` overlap (#3003); neither sees an undeclared edge, which under parallel
|
|
218
225
|
execution becomes an intermittent failure nobody can attribute.
|
|
219
226
|
|
|
220
227
|
**Scope: PLAN pairs, not tasks.** Tasks inside one plan run sequentially and cannot race.
|
|
@@ -229,21 +236,27 @@ Execution; strong-but-local coupling inside one plan is fine):
|
|
|
229
236
|
produces.
|
|
230
237
|
|
|
231
238
|
**Do NOT flag:** both sides only READ it, or it is immutable; the pair already overlaps in
|
|
232
|
-
`files_modified` (report that once, on the file axis); the plans sit in a different wave, which
|
|
239
|
+
`files_modified` or `files_deleted` (report that once, on the file axis); the plans sit in a different wave, which
|
|
233
240
|
already orders them; two tasks inside one plan; a vague same-subsystem claim naming no
|
|
234
|
-
resource; incompatible *transformations* of one entity — that is Dimension 9
|
|
241
|
+
resource; incompatible *transformations* of one entity — that is Dimension 9; the pair is
|
|
242
|
+
declared `coupling_justified` in either plan's frontmatter by an entry naming the other
|
|
243
|
+
plan (an entry naming only third plans exempts nothing here).
|
|
235
244
|
|
|
236
|
-
**Severity: ALWAYS
|
|
237
|
-
lets the planner declare the edge, move a plan to a later wave, or
|
|
245
|
+
**Severity: ALWAYS INFO, never a blocker.** Coupling is sometimes intentional; the finding
|
|
246
|
+
lets the planner declare the edge, move a plan to a later wave, or mark the pair
|
|
247
|
+
`coupling_justified`. When a `coupling_justified` entry exempts a pair, note the applied
|
|
248
|
+
exemption as its own `info` advisory naming both plans and the declaring plan — the
|
|
249
|
+
declaration stays observable instead of silently suppressing the check.
|
|
238
250
|
|
|
239
251
|
```yaml
|
|
240
252
|
issue:
|
|
241
253
|
dimension: dependency_correctness
|
|
242
|
-
severity:
|
|
254
|
+
severity: info
|
|
255
|
+
required_property: "Ordering between same-wave plans is declared, not implied"
|
|
243
256
|
description: "Plans 02 and 03 are both Wave 1 with no depends_on, but 02 writes config key
|
|
244
257
|
auth.session_ttl and 03 reads it"
|
|
245
258
|
plans: ["02", "03"]
|
|
246
|
-
fix_hint: "Declare depends_on, move 03 to a later wave, or
|
|
259
|
+
fix_hint: "Declare depends_on, move 03 to a later wave, or set coupling_justified"
|
|
247
260
|
```
|
|
248
261
|
|
|
249
262
|
## Dimension 4: Key Links Planned
|
|
@@ -274,6 +287,7 @@ State -> Render: Does action mention displaying state?
|
|
|
274
287
|
issue:
|
|
275
288
|
dimension: key_links_planned
|
|
276
289
|
severity: warning
|
|
290
|
+
required_property: "Dependent artifacts are wired by a task, not merely created"
|
|
277
291
|
description: "Chat.tsx created but no task wires it to /api/chat"
|
|
278
292
|
plan: "01"
|
|
279
293
|
artifacts: ["src/components/Chat.tsx", "src/app/api/chat/route.ts"]
|
|
@@ -320,11 +334,12 @@ issue:
|
|
|
320
334
|
issue:
|
|
321
335
|
dimension: scope_sanity
|
|
322
336
|
severity: warning
|
|
323
|
-
|
|
337
|
+
required_property: "Each plan stays within the per-plan context budget"
|
|
338
|
+
description: "Plan 01 has 4 tasks - borderline, split recommended"
|
|
324
339
|
plan: "01"
|
|
325
340
|
metrics:
|
|
326
|
-
tasks:
|
|
327
|
-
files:
|
|
341
|
+
tasks: 4
|
|
342
|
+
files: 8
|
|
328
343
|
fix_hint: "Split into 2 plans: foundation (01) and integration (02)"
|
|
329
344
|
```
|
|
330
345
|
|
|
@@ -349,6 +364,7 @@ issue:
|
|
|
349
364
|
issue:
|
|
350
365
|
dimension: verification_derivation
|
|
351
366
|
severity: warning
|
|
367
|
+
required_property: "Every `must_haves.truths` entry is user-observable"
|
|
352
368
|
description: "Plan 02 must_haves.truths are implementation-focused"
|
|
353
369
|
plan: "02"
|
|
354
370
|
problematic_truths:
|
|
@@ -382,6 +398,7 @@ issue:
|
|
|
382
398
|
issue:
|
|
383
399
|
dimension: context_compliance
|
|
384
400
|
severity: blocker
|
|
401
|
+
required_property: "No task contradicts a locked decision in CONTEXT.md"
|
|
385
402
|
description: "Plan contradicts locked decision: user specified 'card layout' but Task 2 implements 'table layout'"
|
|
386
403
|
plan: "01"
|
|
387
404
|
task: 2
|
|
@@ -395,6 +412,7 @@ issue:
|
|
|
395
412
|
issue:
|
|
396
413
|
dimension: context_compliance
|
|
397
414
|
severity: blocker
|
|
415
|
+
required_property: "No task implements an idea CONTEXT.md deferred"
|
|
398
416
|
description: "Plan includes deferred idea: 'search functionality' was explicitly deferred"
|
|
399
417
|
plan: "02"
|
|
400
418
|
task: 1
|
|
@@ -432,6 +450,7 @@ issue:
|
|
|
432
450
|
issue:
|
|
433
451
|
dimension: scope_reduction
|
|
434
452
|
severity: blocker
|
|
453
|
+
required_property: "Locked decisions are delivered at full recorded scope"
|
|
435
454
|
description: "Plan reduces D-26 from 'calculated costs in impulses' to 'static hardcoded labels'"
|
|
436
455
|
plan: "03"
|
|
437
456
|
task: 1
|
|
@@ -472,6 +491,7 @@ Plans reduce {N} user decisions. Options:
|
|
|
472
491
|
issue:
|
|
473
492
|
dimension: architectural_tier_compliance
|
|
474
493
|
severity: blocker
|
|
494
|
+
required_property: "Each capability sits in its Responsibility Map tier"
|
|
475
495
|
description: "Task places auth token validation in browser tier, but Architectural Responsibility Map assigns auth to API tier"
|
|
476
496
|
plan: "01"
|
|
477
497
|
task: 2
|
|
@@ -486,6 +506,7 @@ issue:
|
|
|
486
506
|
issue:
|
|
487
507
|
dimension: architectural_tier_compliance
|
|
488
508
|
severity: warning
|
|
509
|
+
required_property: "Each capability sits in its Responsibility Map tier"
|
|
489
510
|
description: "Task places data formatting in API tier, but Architectural Responsibility Map assigns it to Frontend Server"
|
|
490
511
|
plan: "02"
|
|
491
512
|
task: 1
|
|
@@ -497,61 +518,16 @@ issue:
|
|
|
497
518
|
|
|
498
519
|
## Dimension 8: Nyquist Compliance
|
|
499
520
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
### Check 8e — VALIDATION.md Existence (Gate)
|
|
503
|
-
|
|
504
|
-
Before running checks 8a-8d, verify VALIDATION.md exists:
|
|
505
|
-
|
|
506
|
-
```bash
|
|
507
|
-
ls "${PHASE_DIR}"/*-VALIDATION.md 2>/dev/null
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
**If missing:** **BLOCKING FAIL** — "VALIDATION.md not found for phase {N}. Re-run `/gsd:plan-phase {N} --research` to regenerate."
|
|
511
|
-
Skip checks 8a-8d entirely. Report Dimension 8 as FAIL with this single issue.
|
|
512
|
-
|
|
513
|
-
**If exists:** Proceed to checks 8a-8d.
|
|
514
|
-
|
|
515
|
-
### Check 8a — Automated Verify Presence
|
|
516
|
-
|
|
517
|
-
For each `<task>` in each plan:
|
|
518
|
-
- `<verify>` must contain `<automated>` command, OR a Wave 0 dependency that creates the test first
|
|
519
|
-
- If `<automated>` is absent with no Wave 0 dependency → **BLOCKING FAIL**
|
|
520
|
-
- If `<automated>` says "MISSING", a Wave 0 task must reference the same test file path → **BLOCKING FAIL** if link broken
|
|
521
|
-
|
|
522
|
-
### Check 8b — Feedback Latency Assessment
|
|
521
|
+
**Question:** Is every task's completion decided by an automated check that can actually fail?
|
|
523
522
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
- Watch mode flags (`--watchAll`) → **BLOCKING FAIL**
|
|
527
|
-
- Delays > 30 seconds → **WARNING**
|
|
523
|
+
Checks 8a-8e (presence, latency, sampling continuity, Wave 0 completeness, VALIDATION.md gate),
|
|
524
|
+
their skip condition and the Dimension 8 output table: @gsd-core/references/nyquist-compliance.md
|
|
528
525
|
|
|
529
|
-
### Check
|
|
530
|
-
|
|
531
|
-
Map tasks to waves. Per wave, any consecutive window of 3 implementation tasks must have ≥2 with `<automated>` verify. 3 consecutive without → **BLOCKING FAIL**.
|
|
532
|
-
|
|
533
|
-
### Check 8d — Wave 0 Completeness
|
|
534
|
-
|
|
535
|
-
For each `<automated>MISSING</automated>` reference:
|
|
536
|
-
- Wave 0 task must exist with matching `<files>` path
|
|
537
|
-
- Wave 0 plan must execute before dependent task
|
|
538
|
-
- Missing match → **BLOCKING FAIL**
|
|
539
|
-
|
|
540
|
-
### Dimension 8 Output
|
|
541
|
-
|
|
542
|
-
```
|
|
543
|
-
## Dimension 8: Nyquist Compliance
|
|
544
|
-
|
|
545
|
-
| Task | Plan | Wave | Automated Command | Status |
|
|
546
|
-
|------|------|------|-------------------|--------|
|
|
547
|
-
| {task} | {plan} | {wave} | `{command}` | ✅ / ❌ |
|
|
548
|
-
|
|
549
|
-
Sampling: Wave {N}: {X}/{Y} verified → ✅ / ❌
|
|
550
|
-
Wave 0: {test file} → ✅ present / ❌ MISSING
|
|
551
|
-
Overall: ✅ PASS / ❌ FAIL
|
|
552
|
-
```
|
|
526
|
+
### Check 8f - Stated Failing Direction (#3172)
|
|
553
527
|
|
|
554
|
-
|
|
528
|
+
Each runnable `<automated>` command needs a `<fails_when>` sibling naming what output constitutes
|
|
529
|
+
failure. Consume the supplied `{FAILING_DIRECTIONS}` probe, never re-derive it:
|
|
530
|
+
@gsd-core/references/failing-direction.md
|
|
555
531
|
|
|
556
532
|
## Dimension 9: Cross-Plan Data Contracts
|
|
557
533
|
|
|
@@ -597,6 +573,7 @@ If FAIL: return to planner with specific fixes. Same revision loop as other dime
|
|
|
597
573
|
issue:
|
|
598
574
|
dimension: claude_md_compliance
|
|
599
575
|
severity: blocker
|
|
576
|
+
required_property: "Plans use the toolchain CLAUDE.md mandates"
|
|
600
577
|
description: "Plan uses Jest for testing but CLAUDE.md requires Vitest"
|
|
601
578
|
plan: "01"
|
|
602
579
|
task: 1
|
|
@@ -610,6 +587,7 @@ issue:
|
|
|
610
587
|
issue:
|
|
611
588
|
dimension: claude_md_compliance
|
|
612
589
|
severity: warning
|
|
590
|
+
required_property: "Every `<verify>` runs the checks CLAUDE.md requires"
|
|
613
591
|
description: "Plan does not include lint step required by CLAUDE.md"
|
|
614
592
|
plan: "02"
|
|
615
593
|
claude_md_rule: "All tasks must run eslint before committing"
|
|
@@ -639,6 +617,7 @@ issue:
|
|
|
639
617
|
issue:
|
|
640
618
|
dimension: research_resolution
|
|
641
619
|
severity: blocker
|
|
620
|
+
required_property: "RESEARCH.md carries no unresolved open question"
|
|
642
621
|
description: "RESEARCH.md has unresolved open questions"
|
|
643
622
|
file: "01-RESEARCH.md"
|
|
644
623
|
unresolved_questions:
|
|
@@ -681,6 +660,7 @@ issue:
|
|
|
681
660
|
issue:
|
|
682
661
|
dimension: pattern_compliance
|
|
683
662
|
severity: warning
|
|
663
|
+
required_property: "Every new file names its closest PATTERNS.md analog, or cites RESEARCH.md if none exists"
|
|
684
664
|
description: "Plan 01-03 creates src/controllers/auth.ts but does not reference analog src/controllers/users.ts from PATTERNS.md"
|
|
685
665
|
file: "01-03-PLAN.md"
|
|
686
666
|
expected_analog: "src/controllers/users.ts"
|
|
@@ -692,6 +672,7 @@ issue:
|
|
|
692
672
|
issue:
|
|
693
673
|
dimension: pattern_compliance
|
|
694
674
|
severity: warning
|
|
675
|
+
required_property: "Plans reusing a PATTERNS.md shared pattern reference it"
|
|
695
676
|
description: "Plan 01-02 creates a controller but does not include the shared auth middleware pattern from PATTERNS.md"
|
|
696
677
|
file: "01-02-PLAN.md"
|
|
697
678
|
shared_pattern: "Authentication"
|
|
@@ -715,6 +696,11 @@ issue:
|
|
|
715
696
|
2. For each `<automated>` block containing `2>/dev/null || echo` where the result feeds a `[ "$VAR" = ... ]` comparison: BLOCKER.
|
|
716
697
|
3. For each `<automated>` block asserting a specific numeric count not cited as measured in this plan: WARNING.
|
|
717
698
|
|
|
699
|
+
## Dimension: Verify Command Path Resolvability (#2401)
|
|
700
|
+
|
|
701
|
+
**Question:** Does each `<automated>` command's target resolve? Consume the supplied
|
|
702
|
+
`{VERIFY_PATHS}` probe, never re-run/hand-reason it: @gsd-core/references/verify-command-path-resolvability.md
|
|
703
|
+
|
|
718
704
|
## Dimension: Numeric/Factual Claim Authority (#1480)
|
|
719
705
|
|
|
720
706
|
**Rule:** RESEARCH.md is produced at research time and may be stale. Numeric claims (test counts, file counts, version numbers) and factual state claims ("feature X is implemented") in RESEARCH.md may not reflect the current codebase. The plan may be more current. RESEARCH.md is authoritative for architectural decisions and constraints — not for measurements.
|
|
@@ -740,7 +726,7 @@ issue:
|
|
|
740
726
|
|
|
741
727
|
Load phase operation context:
|
|
742
728
|
```bash
|
|
743
|
-
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$
|
|
729
|
+
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; _gsd_at() { for _p; do if [ -f "$_p" ]; then GSD_TOOLS="$_p"; return 0; fi; done; return 1; }; if _gsd_at "${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif unset -f gsd_run; _G="$(command -v gsd_run)"; then GSD_TOOLS="$_G"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif _gsd_at "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd_run is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; GSD_IDENTITY_STATUS=unverified; case "$(gsd_run runtime-identity --raw 2>/dev/null || true)" in '{"packageName":"@opengsd/gsd-core"'*'}') GSD_IDENTITY_STATUS=ok;; esac; export GSD_IDENTITY_STATUS; [ "$GSD_IDENTITY_STATUS" = ok ] || echo "WARNING: \"$GSD_TOOLS\" did not prove it is @opengsd/gsd-core - it is either a different package or an @opengsd/gsd-core older than the runtime-identity verb. See docs/how-to/diagnose-a-foreign-gsd-tools.md" >&2; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
744
730
|
INIT=$(gsd_run query init.phase-op "${PHASE_ARG}")
|
|
745
731
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
746
732
|
```
|
|
@@ -901,9 +887,9 @@ Thresholds: 2-3 tasks/plan good, 4 warning, 5+ blocker (split required).
|
|
|
901
887
|
|
|
902
888
|
## Step 10: Determine Overall Status
|
|
903
889
|
|
|
904
|
-
**passed:** All requirements covered, all tasks complete, dependency graph valid, key links planned, scope within budget, must_haves properly derived.
|
|
890
|
+
**passed:** All requirements covered, all tasks complete, dependency graph valid, key links planned, scope within budget, must_haves properly derived — and zero issues of any severity. An INFO-only result is NOT `passed`.
|
|
905
891
|
|
|
906
|
-
**issues_found:** One or more
|
|
892
|
+
**issues_found:** One or more issues of ANY severity, including INFO-only. Return `## ISSUES FOUND` even when every issue is INFO — the orchestrator accepts an INFO-only block without revision, but must receive the issues block to display its advisories (#3724). Plans need revision only when blockers or warnings are present.
|
|
907
893
|
|
|
908
894
|
Severities: `blocker` (must fix), `warning` (should fix), `info` (suggestions).
|
|
909
895
|
|
|
@@ -911,40 +897,7 @@ Severities: `blocker` (must fix), `warning` (should fix), `info` (suggestions).
|
|
|
911
897
|
|
|
912
898
|
<examples>
|
|
913
899
|
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
**Plan 01 analysis:**
|
|
917
|
-
```
|
|
918
|
-
Tasks: 5
|
|
919
|
-
Files modified: 12
|
|
920
|
-
- prisma/schema.prisma
|
|
921
|
-
- src/app/api/auth/login/route.ts
|
|
922
|
-
- src/app/api/auth/logout/route.ts
|
|
923
|
-
- src/app/api/auth/refresh/route.ts
|
|
924
|
-
- src/middleware.ts
|
|
925
|
-
- src/lib/auth.ts
|
|
926
|
-
- src/lib/jwt.ts
|
|
927
|
-
- src/components/LoginForm.tsx
|
|
928
|
-
- src/components/LogoutButton.tsx
|
|
929
|
-
- src/app/login/page.tsx
|
|
930
|
-
- src/app/dashboard/page.tsx
|
|
931
|
-
- src/types/auth.ts
|
|
932
|
-
```
|
|
933
|
-
|
|
934
|
-
5 tasks exceeds 2-3 target, 12 files is high, auth is complex domain → quality degradation risk.
|
|
935
|
-
|
|
936
|
-
```yaml
|
|
937
|
-
issue:
|
|
938
|
-
dimension: scope_sanity
|
|
939
|
-
severity: blocker
|
|
940
|
-
description: "Plan 01 has 5 tasks with 12 files - exceeds context budget"
|
|
941
|
-
plan: "01"
|
|
942
|
-
metrics:
|
|
943
|
-
tasks: 5
|
|
944
|
-
files: 12
|
|
945
|
-
estimated_context: "~80%"
|
|
946
|
-
fix_hint: "Split into: 01 (schema + API), 02 (middleware + lib), 03 (UI components)"
|
|
947
|
-
```
|
|
900
|
+
@~/.claude/gsd-core/references/plan-checker-examples.md
|
|
948
901
|
|
|
949
902
|
</examples>
|
|
950
903
|
|
|
@@ -957,14 +910,29 @@ issue:
|
|
|
957
910
|
plan: "16-01" # Which plan (null if phase-level)
|
|
958
911
|
dimension: "task_completeness" # Which dimension failed
|
|
959
912
|
severity: "blocker" # blocker | warning | info
|
|
960
|
-
|
|
913
|
+
required_property: "..." # BINDING — the invariant that must hold
|
|
914
|
+
description: "..." # BINDING — evidence: what you observed proving it does not
|
|
961
915
|
task: 2 # Task number if applicable
|
|
962
|
-
fix_hint: "..."
|
|
916
|
+
fix_hint: "..." # NON-BINDING — ONE example route to the property
|
|
963
917
|
```
|
|
964
918
|
|
|
919
|
+
## Binding Payload vs Advisory Remediation
|
|
920
|
+
|
|
921
|
+
`required_property` + `description` + `severity` are the binding payload: what must be true,
|
|
922
|
+
the evidence it is not, and how hard that blocks. `fix_hint` is **one example** of a route to
|
|
923
|
+
that property — never the only admissible route, never an instruction. A planner that reaches
|
|
924
|
+
`required_property` by a smaller or different mechanism has addressed the issue in full.
|
|
925
|
+
|
|
926
|
+
State it as the invariant, not the edit — "every `auto` task has a `<verify>` separating pass
|
|
927
|
+
from fail", not "add a verify block". A finding you cannot state without naming your preferred
|
|
928
|
+
edit is a preference, not a defect: drop it or file `info`. Never author a `fix_hint` you can
|
|
929
|
+
see contradicts a locked decision, a CLAUDE.md convention, or an active capability constraint. If
|
|
930
|
+
every route you can name would, name NONE of them: say only that the property conflicts with that
|
|
931
|
+
constraint. A hint carrying a forbidden route is applied by anyone who trusts hints.
|
|
932
|
+
|
|
965
933
|
## Severity Levels
|
|
966
934
|
|
|
967
|
-
**blocker** -
|
|
935
|
+
**blocker** - The `required_property` must hold before execution (the property, never the hint)
|
|
968
936
|
- Missing requirement coverage
|
|
969
937
|
- Missing required task fields
|
|
970
938
|
- Circular dependencies
|
|
@@ -1020,18 +988,27 @@ Plans verified. Run `/gsd:execute-phase {phase}` to proceed.
|
|
|
1020
988
|
**Plans checked:** {N}
|
|
1021
989
|
**Issues:** {X} blocker(s), {Y} warning(s), {Z} info
|
|
1022
990
|
|
|
1023
|
-
### Blockers (must fix)
|
|
991
|
+
### Blockers — these properties must hold ("must fix" is the property, never the example)
|
|
1024
992
|
|
|
1025
|
-
**1. [{dimension}] {
|
|
993
|
+
**1. [{dimension}] {required_property}**
|
|
1026
994
|
- Plan: {plan}
|
|
1027
995
|
- Task: {task if applicable}
|
|
1028
|
-
-
|
|
996
|
+
- Evidence: {description}
|
|
997
|
+
- Example fix (non-binding — any mechanism reaching the property counts): {fix_hint}
|
|
998
|
+
|
|
999
|
+
### Warnings — these properties should hold
|
|
1000
|
+
|
|
1001
|
+
**1. [{dimension}] {required_property}**
|
|
1002
|
+
- Plan: {plan}
|
|
1003
|
+
- Evidence: {description}
|
|
1004
|
+
- Example fix (non-binding): {fix_hint}
|
|
1029
1005
|
|
|
1030
|
-
###
|
|
1006
|
+
### Advisories (info)
|
|
1031
1007
|
|
|
1032
|
-
**1. [{dimension}] {
|
|
1008
|
+
**1. [{dimension}] {required_property}**
|
|
1033
1009
|
- Plan: {plan}
|
|
1034
|
-
-
|
|
1010
|
+
- Evidence: {description}
|
|
1011
|
+
- Example fix (non-binding): {fix_hint}
|
|
1035
1012
|
|
|
1036
1013
|
### Structured Issues
|
|
1037
1014
|
|
|
@@ -1039,7 +1016,8 @@ Plans verified. Run `/gsd:execute-phase {phase}` to proceed.
|
|
|
1039
1016
|
|
|
1040
1017
|
### Recommendation
|
|
1041
1018
|
|
|
1042
|
-
{N} blocker(s) require revision. Returning to planner with feedback.
|
|
1019
|
+
{N} blocker(s), {M} warning(s) require revision. Returning to planner with feedback.
|
|
1020
|
+
(When blockers and warnings are both 0, write instead: Advisory only — no revision required.)
|
|
1043
1021
|
```
|
|
1044
1022
|
|
|
1045
1023
|
</structured_returns>
|
|
@@ -1084,7 +1062,8 @@ Plan verification complete when:
|
|
|
1084
1062
|
- [ ] Architectural tier compliance checked (tasks match responsibility map tiers)
|
|
1085
1063
|
- [ ] Cross-plan data contracts checked (no conflicting transforms on shared data)
|
|
1086
1064
|
- [ ] CLAUDE.md compliance checked (plans respect project conventions)
|
|
1087
|
-
- [ ] Structured issues returned (if any found)
|
|
1065
|
+
- [ ] Structured issues returned (if any found), each carrying a binding `required_property` +
|
|
1066
|
+
evidence + severity, with `fix_hint` rendered as a non-binding example
|
|
1088
1067
|
- [ ] Result returned to orchestrator
|
|
1089
1068
|
|
|
1090
1069
|
</success_criteria>
|