@opengsd/gsd-core 1.13.0 → 1.15.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/README.ja-JP.md +3 -3
- package/README.ko-KR.md +3 -3
- package/README.pt-BR.md +3 -3
- package/README.zh-CN.md +3 -3
- package/agents/gsd-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +459 -0
- package/agents/gsd-code-fixer.md +9 -8
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +360 -0
- package/agents/gsd-debug-session-manager.md +17 -2
- package/agents/gsd-debugger.md +2 -2
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +13 -8
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-phase-researcher.md +19 -11
- package/agents/gsd-plan-checker.md +8 -7
- package/agents/gsd-planner.md +12 -8
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-auditor.md +155 -17
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +10 -9
- package/bin/install.js +848 -163
- package/commands/gsd/autonomous.md +2 -2
- package/commands/gsd/capture.md +1 -1
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +8 -3
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +1 -0
- package/commands/gsd/plan-review-convergence.md +6 -6
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/progress.md +1 -1
- package/commands/gsd/quick-batch.md +1 -1
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/review.md +2 -3
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +672 -146
- package/gsd-core/bin/lib/adr-parser.cjs +4 -2
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +119 -34
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +96 -189
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-validator.cjs +14 -2
- package/gsd-core/bin/lib/check-command-router.cjs +213 -49
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/codex-agent-toml.cjs +21 -25
- package/gsd-core/bin/lib/commands.cjs +823 -112
- package/gsd-core/bin/lib/config-loader.cjs +66 -4
- package/gsd-core/bin/lib/config.cjs +186 -45
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +164 -45
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/frontmatter.cjs +13 -0
- package/gsd-core/bin/lib/graphify.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +12 -1
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
- package/gsd-core/bin/lib/init.cjs +614 -86
- package/gsd-core/bin/lib/install-engine.cjs +29 -3
- package/gsd-core/bin/lib/install-profiles.cjs +14 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +41 -5
- package/gsd-core/bin/lib/loop-resolver.cjs +50 -31
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +37 -13
- package/gsd-core/bin/lib/model-resolver.cjs +253 -53
- package/gsd-core/bin/lib/phase-command-router.cjs +16 -2
- package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
- package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
- package/gsd-core/bin/lib/phase-id.cjs +268 -27
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase-locator.cjs +29 -10
- package/gsd-core/bin/lib/phase.cjs +393 -88
- package/gsd-core/bin/lib/plan-document.cjs +49 -1
- package/gsd-core/bin/lib/planning-document.cjs +459 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +52 -19
- package/gsd-core/bin/lib/planning-snapshot.cjs +61 -12
- package/gsd-core/bin/lib/planning-workspace.cjs +57 -3
- package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/probe-core.cjs +7 -1
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- package/gsd-core/bin/lib/project-root.cjs +41 -2
- package/gsd-core/bin/lib/quick-batch.cjs +1 -1
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
- package/gsd-core/bin/lib/review-lane-invocation.cjs +23 -0
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +12 -4
- package/gsd-core/bin/lib/roadmap-parser.cjs +219 -18
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +1539 -13
- package/gsd-core/bin/lib/roadmap.cjs +356 -42
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +310 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +15 -4
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +13 -5
- package/gsd-core/bin/lib/runtime-homes.cjs +4 -0
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -37
- package/gsd-core/bin/lib/runtime-name-policy.cjs +111 -1
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +10 -6
- package/gsd-core/bin/lib/state-document.cjs +130 -28
- package/gsd-core/bin/lib/state-md-schema.cjs +21 -14
- package/gsd-core/bin/lib/state-transition.cjs +181 -30
- package/gsd-core/bin/lib/state.cjs +265 -27
- package/gsd-core/bin/lib/surface.cjs +77 -3
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +78 -5
- package/gsd-core/bin/lib/uat-predicate.cjs +47 -4
- package/gsd-core/bin/lib/uat.cjs +9 -1
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +100 -9
- package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
- package/gsd-core/bin/lib/update-context.cjs +30 -24
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification.cjs +315 -30
- package/gsd-core/bin/lib/verify-command-grounding.cjs +47 -3
- package/gsd-core/bin/lib/verify.cjs +320 -48
- package/gsd-core/bin/lib/workstream-inventory.cjs +1 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
- package/gsd-core/bin/lib/worktree-safety.cjs +797 -58
- package/gsd-core/bin/shared/config-defaults.manifest.json +4 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +6 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +439 -80
- package/gsd-core/references/checkpoints.md +5 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe.md +195 -21
- package/gsd-core/references/execute-phase-between-wave-reset.md +7 -6
- package/gsd-core/references/execute-phase-wave-guard.md +22 -11
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +13 -4
- package/gsd-core/references/phase-argument-parsing.md +9 -7
- package/gsd-core/references/phase-id-convention.md +28 -0
- package/gsd-core/references/planner-gap-closure.md +2 -0
- package/gsd-core/references/planner-load-graph-context.md +24 -13
- package/gsd-core/references/planner-verify-command-grounding.md +14 -0
- package/gsd-core/references/planning-config.md +14 -2
- package/gsd-core/references/tdd.md +30 -4
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/ui-consideration-probe.md +10 -5
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verify-command-path-resolvability.md +10 -2
- package/gsd-core/references/worktree-path-safety.md +433 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- package/gsd-core/templates/verification-report.md +1 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +1 -1
- package/gsd-core/workflows/add-tests.md +2 -2
- package/gsd-core/workflows/add-todo.md +6 -5
- package/gsd-core/workflows/ai-integration-phase.md +11 -3
- package/gsd-core/workflows/audit-fix.md +1 -1
- package/gsd-core/workflows/audit-milestone.md +1 -1
- package/gsd-core/workflows/audit-uat.md +1 -1
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
- package/gsd-core/workflows/autonomous.md +29 -16
- package/gsd-core/workflows/check-todos.md +6 -4
- package/gsd-core/workflows/cleanup.md +5 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +8 -1
- package/gsd-core/workflows/code-review-fix.md +108 -22
- package/gsd-core/workflows/code-review.md +216 -73
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +41 -264
- package/gsd-core/workflows/debug.md +3 -3
- package/gsd-core/workflows/diagnose-issues.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +2 -2
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +17 -158
- package/gsd-core/workflows/edit-phase.md +1 -1
- package/gsd-core/workflows/eval-review.md +10 -3
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1017 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +19 -4
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +43 -4
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- 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 +1 -1
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/stale-reverification.md +24 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
- package/gsd-core/workflows/execute-phase.md +83 -172
- package/gsd-core/workflows/execute-plan.md +24 -10
- package/gsd-core/workflows/explore.md +3 -3
- package/gsd-core/workflows/extract-learnings.md +2 -1
- package/gsd-core/workflows/fast.md +1 -1
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +2 -2
- package/gsd-core/workflows/help/modes/full.compact.md +398 -0
- package/gsd-core/workflows/help/modes/full.md +5 -5
- package/gsd-core/workflows/help/modes/topic.md +15 -5
- package/gsd-core/workflows/help.md +1 -1
- package/gsd-core/workflows/import.md +2 -2
- package/gsd-core/workflows/inbox.md +2 -2
- package/gsd-core/workflows/ingest-docs.md +3 -3
- package/gsd-core/workflows/insert-phase.md +1 -1
- package/gsd-core/workflows/list-seeds.md +1 -1
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +2 -2
- package/gsd-core/workflows/map-codebase.md +52 -5
- package/gsd-core/workflows/milestone-summary.md +1 -1
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +56 -14
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
- package/gsd-core/workflows/new-project.md +39 -209
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +1 -1
- package/gsd-core/workflows/note.md +1 -1
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +1 -1
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
- package/gsd-core/workflows/plan-phase.md +45 -187
- package/gsd-core/workflows/plan-review-convergence.md +21 -5
- package/gsd-core/workflows/plant-seed.md +62 -20
- package/gsd-core/workflows/pr-branch.md +132 -20
- package/gsd-core/workflows/profile-user.md +2 -2
- package/gsd-core/workflows/progress.md +1 -1
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +25 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +1 -1
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
- package/gsd-core/workflows/quick-batch.md +1 -1
- package/gsd-core/workflows/quick.md +29 -10
- package/gsd-core/workflows/reapply-patches.md +86 -6
- package/gsd-core/workflows/remove-phase.md +1 -1
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +1 -1
- package/gsd-core/workflows/review.md +31 -16
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -2
- package/gsd-core/workflows/settings-advanced.md +30 -10
- package/gsd-core/workflows/settings-integrations.md +2 -3
- package/gsd-core/workflows/settings.md +22 -9
- package/gsd-core/workflows/ship.md +3 -2
- package/gsd-core/workflows/sketch-wrap-up.md +1 -1
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +2 -2
- package/gsd-core/workflows/spec-phase.md +15 -5
- package/gsd-core/workflows/spike-wrap-up.md +1 -1
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +1 -1
- package/gsd-core/workflows/sync-skills.md +5 -5
- package/gsd-core/workflows/thread.md +1 -1
- package/gsd-core/workflows/transition.md +1 -1
- package/gsd-core/workflows/ui-phase.md +44 -8
- package/gsd-core/workflows/ui-review.md +18 -4
- package/gsd-core/workflows/ultraplan-phase.md +1 -1
- package/gsd-core/workflows/undo.md +339 -20
- package/gsd-core/workflows/update.md +14 -12
- package/gsd-core/workflows/validate-phase.md +3 -2
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +101 -196
- package/hooks/dist/gsd-agent-isolation-guard.js +66 -16
- package/hooks/dist/gsd-context-monitor.js +88 -15
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-secret-read-guard.js +71 -19
- package/hooks/dist/gsd-statusline.js +81 -20
- package/hooks/dist/gsd-validate-commit.sh +97 -8
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/gsd-agent-isolation-guard.js +66 -16
- package/hooks/gsd-context-monitor.js +88 -15
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-secret-read-guard.js +71 -19
- package/hooks/gsd-statusline.js +81 -20
- package/hooks/gsd-validate-commit.sh +97 -8
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/package.json +11 -6
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +15 -6
- package/scripts/check-contract-drift.cjs +131 -12
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +126 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/command-contract-helpers.cjs +3 -0
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +35 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +69 -0
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +224 -0
- package/scripts/lib/ndjson-reporter.cjs +3 -2
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +287 -0
- package/scripts/lib/suite-detection.cjs +32 -0
- package/scripts/lint-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +47 -3
- package/scripts/lint-phase-arg-assignment.cjs +257 -0
- package/scripts/lint-phase-id-drift.cjs +623 -13
- package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
- package/scripts/lint-response-language-coverage.cjs +9 -3
- package/scripts/lint-retired-runtime-name.cjs +619 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-state-write-path-drift.cjs +93 -0
- package/scripts/lint-test-file-count.allowlist.json +29 -9
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +100 -0
- package/scripts/prompt-injection-scan.sh +18 -0
- package/scripts/release-tarball-smoke.cjs +194 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-autonomous/SKILL.md +2 -2
- package/skills/gsd-capture/SKILL.md +1 -1
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +8 -3
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -0
- package/skills/gsd-plan-review-convergence/SKILL.md +5 -5
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-progress/SKILL.md +1 -1
- package/skills/gsd-quick-batch/SKILL.md +1 -1
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review/SKILL.md +2 -3
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -8,14 +8,14 @@ Plans execute autonomously. Checkpoints formalize interaction points where human
|
|
|
8
8
|
2. **Claude sets up the verification environment** - Start dev servers, seed databases, configure env vars
|
|
9
9
|
3. **User only does what requires human judgment** - Visual checks, UX evaluation, "does this feel right?"
|
|
10
10
|
4. **Secrets come from user, automation comes from Claude** - Ask for API keys, then Claude uses them via CLI
|
|
11
|
-
5. **Auto-mode bypasses verification
|
|
11
|
+
5. **Auto-mode bypasses verification checkpoints, and decision checkpoints with a declared `auto_select`** — When `workflow._auto_chain_active` or `workflow.auto_advance` is true in config: human-verify auto-approves; a `checkpoint:decision` carrying `auto_select="<option-id>"` auto-selects that named option; a `checkpoint:decision` with NO `auto_select` escalates to a human instead of guessing by position (#4095); human-action still stops (auth gates cannot be automated)
|
|
12
12
|
6. **`gate="blocking-human"` is never auto-approved** — a checkpoint carrying this gate stops for a human in *every* mode, including auto-mode, regardless of its type. Rule 5 does not apply to it. The executor's precondition-unmet checkpoint (a task's `<precondition>` evaluated false — unmet `user_setup` step, missing env var, absent prior-phase artifact) reports this gate (#3210).
|
|
13
13
|
|
|
14
14
|
**The `gate` attribute:**
|
|
15
15
|
|
|
16
16
|
| Value | Auto-mode behavior | Use for |
|
|
17
17
|
|-------|--------------------|---------|
|
|
18
|
-
| `gate="blocking"` | Bypassed per rule 5 (human-verify auto-approves
|
|
18
|
+
| `gate="blocking"` | Bypassed per rule 5 (human-verify auto-approves; decision auto-selects only when `auto_select` names an option, else escalates) | The default. Post-hoc verification and implementation choices that are safe to take the recommended path on when unattended. |
|
|
19
19
|
| `gate="blocking-human"` | **Never bypassed.** Stops for a human in auto-mode too. | Irreversible or trust-establishing steps a human must actually see: package-legitimacy verification before install, any decision whose default answer would be wrong to assume, and unmet `<precondition>` facts the executor cannot establish on its own (#3210). |
|
|
20
20
|
|
|
21
21
|
Reach for `gate="blocking-human"` whenever auto-approving the checkpoint would defeat its purpose. If the checkpoint exists because a human must *decide* something, `blocking` is the wrong gate — auto-mode will decide it for them.
|
|
@@ -147,7 +147,7 @@ HUMAN_VERIFY_MODE=$(gsd_run query config-get workflow.human_verify_mode --defaul
|
|
|
147
147
|
|
|
148
148
|
**Structure:**
|
|
149
149
|
```xml
|
|
150
|
-
<task type="checkpoint:decision" gate="blocking">
|
|
150
|
+
<task type="checkpoint:decision" gate="blocking" auto_select="option-a">
|
|
151
151
|
<decision>[What's being decided]</decision>
|
|
152
152
|
<context>[Why this decision matters]</context>
|
|
153
153
|
<options>
|
|
@@ -166,6 +166,8 @@ HUMAN_VERIFY_MODE=$(gsd_run query config-get workflow.human_verify_mode --defaul
|
|
|
166
166
|
</task>
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
+
`auto_select` is optional and names the `id` of the `<option>` auto-mode should pick when this checkpoint is reached unattended. Omit it and auto-mode escalates to a human instead of guessing from option order — the same treatment `gate="blocking-human"` already gets. An `auto_select` value that doesn't match any `<option id="…">` fails `verify plan-structure` at plan-parse time rather than silently falling back to the first option.
|
|
170
|
+
|
|
169
171
|
**Example: Auth Provider Selection**
|
|
170
172
|
```xml
|
|
171
173
|
<task type="checkpoint:decision" gate="blocking">
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Compact Content Gate
|
|
2
|
+
|
|
3
|
+
Shared by every workflow spine split under ADR-4139, and by every lazily-read fragment or
|
|
4
|
+
planning-artifact template given a compact variant under Phase 6 (#4406). States the config check
|
|
5
|
+
and both resolution rules once — a spine or fragment references this file; it never restates
|
|
6
|
+
either check inline.
|
|
7
|
+
|
|
8
|
+
## The check
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
COMPACT_CONTENT=$(gsd_run query config-get workflow.compact_content --raw 2>/dev/null || echo "false")
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Stream 1 — spine + detail (top-level, eagerly `@`-included workflows)
|
|
15
|
+
|
|
16
|
+
- **`COMPACT_CONTENT` is `"false"` (default):** Read every part under this workflow's own `detail/` directory (a sibling of this spine, e.g. `gsd-core/workflows/<name>/detail/*.md`) now, in full, before continuing past this point. Their content elaborates on the spine you are reading — treat everything they say as part of this document from here on.
|
|
17
|
+
- **`COMPACT_CONTENT` is `"true"`:** Do not read the detail file. Continue directly with the spine's own content — per ADR-4139 Decision 3, it is complete enough to run this workflow correctly on its own.
|
|
18
|
+
|
|
19
|
+
**The fail-safe this holds (ADR-4139 Decision 4):** A `Read` that does not fire for any reason (tool error, a skipped step, a misread condition) leaves you running on the spine alone. That is the same, correct, terser state an opted-in project runs in on purpose — never a state with no instructions. The spine's own completeness is what makes this safe; this gate is only ever additive.
|
|
20
|
+
|
|
21
|
+
## Streams 1b and 4 — variant resolution (lazily-read fragments and planning-artifact templates)
|
|
22
|
+
|
|
23
|
+
For a `workflows/<name>/{modes,steps,templates}/*.md` fragment or a `gsd-core/templates/**`
|
|
24
|
+
planning-artifact template that has a registered `.compact.md` sibling (same directory, same stem,
|
|
25
|
+
`.compact.md` suffix):
|
|
26
|
+
|
|
27
|
+
- **`COMPACT_CONTENT` is `"false"` (default), or the file has no registered `.compact.md` sibling:** Read the canonical path exactly as named — unchanged from today.
|
|
28
|
+
- **`COMPACT_CONTENT` is `"true"` and a `.compact.md` sibling is registered:** Read the `.compact.md` sibling instead of the canonical path.
|
|
29
|
+
|
|
30
|
+
Both files are complete, independently — Read exactly one, never both, and never read the compact
|
|
31
|
+
sibling's content as an addendum to the canonical file.
|
|
32
|
+
|
|
33
|
+
**The fail-safe this holds:** unlike stream 1, a call site this rule actually applies to is already
|
|
34
|
+
reached only by a runtime `Read` — a missed `Read` already means zero overlay content, with or
|
|
35
|
+
without `workflow.compact_content`. Selecting between two independently-complete files at that
|
|
36
|
+
call site does not introduce a new way to end up with nothing; the worst case is identical to
|
|
37
|
+
today's. This is why stream 1b/4 can use variant-swap (two independent files) where stream 1 could
|
|
38
|
+
not: the degradation-direction argument that ruled out converting stream 1's `@`-includes (ADR-4139
|
|
39
|
+
Decision 4) does not apply at a genuine runtime-`Read` call site, because there is no
|
|
40
|
+
host-guaranteed baseline being traded away there.
|
|
41
|
+
|
|
42
|
+
**This rule is scoped per call site, not per file.** A `gsd-core/templates/**` file can have both
|
|
43
|
+
kinds of reference in the corpus at once — some places name it inside an eager `@`-include or an
|
|
44
|
+
orchestrator build-time embed (the same mechanism as stream 1, just reaching a template path
|
|
45
|
+
instead of a workflow path), others name it in prose instructing a runtime `Read`. Only the latter
|
|
46
|
+
gets rewritten to point at this rule; an eager reference to the canonical file is left exactly as
|
|
47
|
+
it is, for the same reason stream 1's `@`-includes were left alone — converting it would trade a
|
|
48
|
+
host-guaranteed load for a conditional one. Before wiring any call site, confirm by inspection
|
|
49
|
+
which kind it is; do not assume every mention of a `gsd-core/templates/**` path is a runtime `Read`
|
|
50
|
+
just because the directory's typical case is.
|
|
51
|
+
|
|
52
|
+
## Stream 2 — agent-skill payloads (the `gsd_run query agent-skills` CLI seam)
|
|
53
|
+
|
|
54
|
+
`agents/<name>.compact.md`, same directory, same stem, `.compact.md` suffix — registered and
|
|
55
|
+
checked the same way as streams 1b/4. The selection is different: this seam already runs through
|
|
56
|
+
a real function call (`cmdAgentSkills`, `src/init.cts`), so the resolution happens **in code**,
|
|
57
|
+
not by a `gsd_run query config-get` prose instruction. There is nothing to state here for a
|
|
58
|
+
workflow author to follow, because no workflow author calls this seam directly — it fires only
|
|
59
|
+
inside the `#2454` persona fallback for non-Claude, AGENTS-native runtimes that cannot dispatch a
|
|
60
|
+
named subagent.
|
|
61
|
+
|
|
62
|
+
Same two rules as streams 1b/4, enforced in code instead of prose: `workflow.compact_content` off,
|
|
63
|
+
or no registered `.compact.md` sibling for that agent, serves the canonical persona unchanged; on,
|
|
64
|
+
with a sibling registered, serves the compact one. The one addition code gives that prose could
|
|
65
|
+
not: a missing sibling is disclosed in the served payload itself (a leading `<!-- gsd: no compact
|
|
66
|
+
payload registered ... -->` comment) rather than silently serving canonical with no signal at all.
|
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"items": [
|
|
3
|
-
{
|
|
4
|
-
|
|
3
|
+
{
|
|
4
|
+
"requirement_id": "R1",
|
|
5
|
+
"category": "boundary",
|
|
6
|
+
"status": "unresolved",
|
|
7
|
+
"verification": null,
|
|
8
|
+
"resolution": null,
|
|
9
|
+
"reason": null,
|
|
10
|
+
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"requirement_id": "R1",
|
|
14
|
+
"category": "precision",
|
|
15
|
+
"status": "unresolved",
|
|
16
|
+
"verification": null,
|
|
17
|
+
"resolution": null,
|
|
18
|
+
"reason": null,
|
|
19
|
+
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
|
20
|
+
}
|
|
5
21
|
],
|
|
6
|
-
"coverage": {
|
|
22
|
+
"coverage": {
|
|
23
|
+
"applicable": 2,
|
|
24
|
+
"resolved": 0,
|
|
25
|
+
"unresolved": 2,
|
|
26
|
+
"unclassified": 0,
|
|
27
|
+
"byVerification": {
|
|
28
|
+
"explicit": 0,
|
|
29
|
+
"backstop": 0
|
|
30
|
+
}
|
|
31
|
+
}
|
|
7
32
|
}
|
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"items": [
|
|
3
|
-
{
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
{
|
|
4
|
+
"requirement_id": "R1",
|
|
5
|
+
"category": "adjacency",
|
|
6
|
+
"status": "unresolved",
|
|
7
|
+
"verification": null,
|
|
8
|
+
"resolution": null,
|
|
9
|
+
"reason": null,
|
|
10
|
+
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"requirement_id": "R1",
|
|
14
|
+
"category": "empty",
|
|
15
|
+
"status": "unresolved",
|
|
16
|
+
"verification": null,
|
|
17
|
+
"resolution": null,
|
|
18
|
+
"reason": null,
|
|
19
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"requirement_id": "R1",
|
|
23
|
+
"category": "ordering",
|
|
24
|
+
"status": "unresolved",
|
|
25
|
+
"verification": null,
|
|
26
|
+
"resolution": null,
|
|
27
|
+
"reason": null,
|
|
28
|
+
"probe": "When elements compare equal, is output order specified and stable?"
|
|
29
|
+
}
|
|
6
30
|
],
|
|
7
|
-
"coverage": {
|
|
31
|
+
"coverage": {
|
|
32
|
+
"applicable": 3,
|
|
33
|
+
"resolved": 0,
|
|
34
|
+
"unresolved": 3,
|
|
35
|
+
"unclassified": 0,
|
|
36
|
+
"byVerification": {
|
|
37
|
+
"explicit": 0,
|
|
38
|
+
"backstop": 0
|
|
39
|
+
}
|
|
40
|
+
}
|
|
8
41
|
}
|
package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"items": [
|
|
3
|
-
{
|
|
4
|
-
|
|
3
|
+
{
|
|
4
|
+
"requirement_id": "R1",
|
|
5
|
+
"category": "empty",
|
|
6
|
+
"status": "unresolved",
|
|
7
|
+
"verification": null,
|
|
8
|
+
"resolution": null,
|
|
9
|
+
"reason": null,
|
|
10
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"requirement_id": "R1",
|
|
14
|
+
"category": "encoding",
|
|
15
|
+
"status": "unresolved",
|
|
16
|
+
"verification": null,
|
|
17
|
+
"resolution": null,
|
|
18
|
+
"reason": null,
|
|
19
|
+
"probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?"
|
|
20
|
+
}
|
|
5
21
|
],
|
|
6
|
-
"coverage": {
|
|
22
|
+
"coverage": {
|
|
23
|
+
"applicable": 2,
|
|
24
|
+
"resolved": 0,
|
|
25
|
+
"unresolved": 2,
|
|
26
|
+
"unclassified": 0,
|
|
27
|
+
"byVerification": {
|
|
28
|
+
"explicit": 0,
|
|
29
|
+
"backstop": 0
|
|
30
|
+
}
|
|
31
|
+
}
|
|
7
32
|
}
|
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"items": [
|
|
3
|
-
{
|
|
4
|
-
|
|
3
|
+
{
|
|
4
|
+
"requirement_id": "R1",
|
|
5
|
+
"category": "boundary",
|
|
6
|
+
"status": "unresolved",
|
|
7
|
+
"verification": null,
|
|
8
|
+
"resolution": null,
|
|
9
|
+
"reason": null,
|
|
10
|
+
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"requirement_id": "R1",
|
|
14
|
+
"category": "precision",
|
|
15
|
+
"status": "unresolved",
|
|
16
|
+
"verification": null,
|
|
17
|
+
"resolution": null,
|
|
18
|
+
"reason": null,
|
|
19
|
+
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
|
20
|
+
}
|
|
5
21
|
],
|
|
6
|
-
"coverage": {
|
|
22
|
+
"coverage": {
|
|
23
|
+
"applicable": 2,
|
|
24
|
+
"resolved": 0,
|
|
25
|
+
"unresolved": 2,
|
|
26
|
+
"unclassified": 0,
|
|
27
|
+
"byVerification": {
|
|
28
|
+
"explicit": 0,
|
|
29
|
+
"backstop": 0
|
|
30
|
+
}
|
|
31
|
+
}
|
|
7
32
|
}
|
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"items": [
|
|
3
|
-
{
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
{
|
|
4
|
+
"requirement_id": "R1",
|
|
5
|
+
"category": "adjacency",
|
|
6
|
+
"status": "unresolved",
|
|
7
|
+
"verification": null,
|
|
8
|
+
"resolution": null,
|
|
9
|
+
"reason": null,
|
|
10
|
+
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"requirement_id": "R1",
|
|
14
|
+
"category": "empty",
|
|
15
|
+
"status": "unresolved",
|
|
16
|
+
"verification": null,
|
|
17
|
+
"resolution": null,
|
|
18
|
+
"reason": null,
|
|
19
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"requirement_id": "R1",
|
|
23
|
+
"category": "ordering",
|
|
24
|
+
"status": "unresolved",
|
|
25
|
+
"verification": null,
|
|
26
|
+
"resolution": null,
|
|
27
|
+
"reason": null,
|
|
28
|
+
"probe": "When elements compare equal, is output order specified and stable?"
|
|
29
|
+
}
|
|
6
30
|
],
|
|
7
|
-
"coverage": {
|
|
31
|
+
"coverage": {
|
|
32
|
+
"applicable": 3,
|
|
33
|
+
"resolved": 0,
|
|
34
|
+
"unresolved": 3,
|
|
35
|
+
"unclassified": 0,
|
|
36
|
+
"byVerification": {
|
|
37
|
+
"explicit": 0,
|
|
38
|
+
"backstop": 0
|
|
39
|
+
}
|
|
40
|
+
}
|
|
8
41
|
}
|
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"items": [
|
|
3
|
-
{
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
{
|
|
4
|
+
"requirement_id": "R1",
|
|
5
|
+
"category": "adjacency",
|
|
6
|
+
"status": "resolved",
|
|
7
|
+
"verification": "explicit",
|
|
8
|
+
"resolution": "AC#6: touching intervals merge",
|
|
9
|
+
"reason": null,
|
|
10
|
+
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"requirement_id": "R1",
|
|
14
|
+
"category": "empty",
|
|
15
|
+
"status": "unresolved",
|
|
16
|
+
"verification": null,
|
|
17
|
+
"resolution": null,
|
|
18
|
+
"reason": null,
|
|
19
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"requirement_id": "R1",
|
|
23
|
+
"category": "ordering",
|
|
24
|
+
"status": "dismissed",
|
|
25
|
+
"verification": null,
|
|
26
|
+
"resolution": null,
|
|
27
|
+
"reason": "output is canonically sorted; no tie possible",
|
|
28
|
+
"probe": "When elements compare equal, is output order specified and stable?"
|
|
29
|
+
}
|
|
6
30
|
],
|
|
7
|
-
"coverage": {
|
|
31
|
+
"coverage": {
|
|
32
|
+
"applicable": 3,
|
|
33
|
+
"resolved": 2,
|
|
34
|
+
"unresolved": 1,
|
|
35
|
+
"unclassified": 0,
|
|
36
|
+
"byVerification": {
|
|
37
|
+
"explicit": 1,
|
|
38
|
+
"backstop": 0
|
|
39
|
+
}
|
|
40
|
+
}
|
|
8
41
|
}
|
|
@@ -169,11 +169,44 @@ resolutions supplied, every applicable edge is `unresolved`:
|
|
|
169
169
|
```json edge-probe:02-merge-intervals/expected-coverage.json
|
|
170
170
|
{
|
|
171
171
|
"items": [
|
|
172
|
-
{
|
|
173
|
-
|
|
174
|
-
|
|
172
|
+
{
|
|
173
|
+
"requirement_id": "R1",
|
|
174
|
+
"category": "adjacency",
|
|
175
|
+
"status": "unresolved",
|
|
176
|
+
"verification": null,
|
|
177
|
+
"resolution": null,
|
|
178
|
+
"reason": null,
|
|
179
|
+
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"requirement_id": "R1",
|
|
183
|
+
"category": "empty",
|
|
184
|
+
"status": "unresolved",
|
|
185
|
+
"verification": null,
|
|
186
|
+
"resolution": null,
|
|
187
|
+
"reason": null,
|
|
188
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"requirement_id": "R1",
|
|
192
|
+
"category": "ordering",
|
|
193
|
+
"status": "unresolved",
|
|
194
|
+
"verification": null,
|
|
195
|
+
"resolution": null,
|
|
196
|
+
"reason": null,
|
|
197
|
+
"probe": "When elements compare equal, is output order specified and stable?"
|
|
198
|
+
}
|
|
175
199
|
],
|
|
176
|
-
"coverage": {
|
|
200
|
+
"coverage": {
|
|
201
|
+
"applicable": 3,
|
|
202
|
+
"resolved": 0,
|
|
203
|
+
"unresolved": 3,
|
|
204
|
+
"unclassified": 0,
|
|
205
|
+
"byVerification": {
|
|
206
|
+
"explicit": 0,
|
|
207
|
+
"backstop": 0
|
|
208
|
+
}
|
|
209
|
+
}
|
|
177
210
|
}
|
|
178
211
|
```
|
|
179
212
|
|
|
@@ -192,10 +225,35 @@ rule, the requirement classifies as `numeric-range`, which raises `boundary` and
|
|
|
192
225
|
```json edge-probe:01-round-half-even/expected-coverage.json
|
|
193
226
|
{
|
|
194
227
|
"items": [
|
|
195
|
-
{
|
|
196
|
-
|
|
228
|
+
{
|
|
229
|
+
"requirement_id": "R1",
|
|
230
|
+
"category": "boundary",
|
|
231
|
+
"status": "unresolved",
|
|
232
|
+
"verification": null,
|
|
233
|
+
"resolution": null,
|
|
234
|
+
"reason": null,
|
|
235
|
+
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"requirement_id": "R1",
|
|
239
|
+
"category": "precision",
|
|
240
|
+
"status": "unresolved",
|
|
241
|
+
"verification": null,
|
|
242
|
+
"resolution": null,
|
|
243
|
+
"reason": null,
|
|
244
|
+
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
|
245
|
+
}
|
|
197
246
|
],
|
|
198
|
-
"coverage": {
|
|
247
|
+
"coverage": {
|
|
248
|
+
"applicable": 2,
|
|
249
|
+
"resolved": 0,
|
|
250
|
+
"unresolved": 2,
|
|
251
|
+
"unclassified": 0,
|
|
252
|
+
"byVerification": {
|
|
253
|
+
"explicit": 0,
|
|
254
|
+
"backstop": 0
|
|
255
|
+
}
|
|
256
|
+
}
|
|
199
257
|
}
|
|
200
258
|
```
|
|
201
259
|
|
|
@@ -211,10 +269,35 @@ the requirement classifies as `text`, which raises `empty` and `encoding`:
|
|
|
211
269
|
```json edge-probe:03-truncate-graphemes/expected-coverage.json
|
|
212
270
|
{
|
|
213
271
|
"items": [
|
|
214
|
-
{
|
|
215
|
-
|
|
272
|
+
{
|
|
273
|
+
"requirement_id": "R1",
|
|
274
|
+
"category": "empty",
|
|
275
|
+
"status": "unresolved",
|
|
276
|
+
"verification": null,
|
|
277
|
+
"resolution": null,
|
|
278
|
+
"reason": null,
|
|
279
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"requirement_id": "R1",
|
|
283
|
+
"category": "encoding",
|
|
284
|
+
"status": "unresolved",
|
|
285
|
+
"verification": null,
|
|
286
|
+
"resolution": null,
|
|
287
|
+
"reason": null,
|
|
288
|
+
"probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?"
|
|
289
|
+
}
|
|
216
290
|
],
|
|
217
|
-
"coverage": {
|
|
291
|
+
"coverage": {
|
|
292
|
+
"applicable": 2,
|
|
293
|
+
"resolved": 0,
|
|
294
|
+
"unresolved": 2,
|
|
295
|
+
"unclassified": 0,
|
|
296
|
+
"byVerification": {
|
|
297
|
+
"explicit": 0,
|
|
298
|
+
"backstop": 0
|
|
299
|
+
}
|
|
300
|
+
}
|
|
218
301
|
}
|
|
219
302
|
```
|
|
220
303
|
|
|
@@ -231,10 +314,35 @@ classifies as `numeric-range`, which raises `boundary` and `precision`:
|
|
|
231
314
|
```json edge-probe:04-money-rounding/expected-coverage.json
|
|
232
315
|
{
|
|
233
316
|
"items": [
|
|
234
|
-
{
|
|
235
|
-
|
|
317
|
+
{
|
|
318
|
+
"requirement_id": "R1",
|
|
319
|
+
"category": "boundary",
|
|
320
|
+
"status": "unresolved",
|
|
321
|
+
"verification": null,
|
|
322
|
+
"resolution": null,
|
|
323
|
+
"reason": null,
|
|
324
|
+
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"requirement_id": "R1",
|
|
328
|
+
"category": "precision",
|
|
329
|
+
"status": "unresolved",
|
|
330
|
+
"verification": null,
|
|
331
|
+
"resolution": null,
|
|
332
|
+
"reason": null,
|
|
333
|
+
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
|
334
|
+
}
|
|
236
335
|
],
|
|
237
|
-
"coverage": {
|
|
336
|
+
"coverage": {
|
|
337
|
+
"applicable": 2,
|
|
338
|
+
"resolved": 0,
|
|
339
|
+
"unresolved": 2,
|
|
340
|
+
"unclassified": 0,
|
|
341
|
+
"byVerification": {
|
|
342
|
+
"explicit": 0,
|
|
343
|
+
"backstop": 0
|
|
344
|
+
}
|
|
345
|
+
}
|
|
238
346
|
}
|
|
239
347
|
```
|
|
240
348
|
|
|
@@ -250,11 +358,44 @@ Given a requirement to deduplicate a list of items, the requirement classifies a
|
|
|
250
358
|
```json edge-probe:05-list-dedupe/expected-coverage.json
|
|
251
359
|
{
|
|
252
360
|
"items": [
|
|
253
|
-
{
|
|
254
|
-
|
|
255
|
-
|
|
361
|
+
{
|
|
362
|
+
"requirement_id": "R1",
|
|
363
|
+
"category": "adjacency",
|
|
364
|
+
"status": "unresolved",
|
|
365
|
+
"verification": null,
|
|
366
|
+
"resolution": null,
|
|
367
|
+
"reason": null,
|
|
368
|
+
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"requirement_id": "R1",
|
|
372
|
+
"category": "empty",
|
|
373
|
+
"status": "unresolved",
|
|
374
|
+
"verification": null,
|
|
375
|
+
"resolution": null,
|
|
376
|
+
"reason": null,
|
|
377
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
"requirement_id": "R1",
|
|
381
|
+
"category": "ordering",
|
|
382
|
+
"status": "unresolved",
|
|
383
|
+
"verification": null,
|
|
384
|
+
"resolution": null,
|
|
385
|
+
"reason": null,
|
|
386
|
+
"probe": "When elements compare equal, is output order specified and stable?"
|
|
387
|
+
}
|
|
256
388
|
],
|
|
257
|
-
"coverage": {
|
|
389
|
+
"coverage": {
|
|
390
|
+
"applicable": 3,
|
|
391
|
+
"resolved": 0,
|
|
392
|
+
"unresolved": 3,
|
|
393
|
+
"unclassified": 0,
|
|
394
|
+
"byVerification": {
|
|
395
|
+
"explicit": 0,
|
|
396
|
+
"backstop": 0
|
|
397
|
+
}
|
|
398
|
+
}
|
|
258
399
|
}
|
|
259
400
|
```
|
|
260
401
|
|
|
@@ -270,11 +411,44 @@ left unresolved:
|
|
|
270
411
|
```json edge-probe:06-resolved-mixed/expected-coverage.json
|
|
271
412
|
{
|
|
272
413
|
"items": [
|
|
273
|
-
{
|
|
274
|
-
|
|
275
|
-
|
|
414
|
+
{
|
|
415
|
+
"requirement_id": "R1",
|
|
416
|
+
"category": "adjacency",
|
|
417
|
+
"status": "resolved",
|
|
418
|
+
"verification": "explicit",
|
|
419
|
+
"resolution": "AC#6: touching intervals merge",
|
|
420
|
+
"reason": null,
|
|
421
|
+
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"requirement_id": "R1",
|
|
425
|
+
"category": "empty",
|
|
426
|
+
"status": "unresolved",
|
|
427
|
+
"verification": null,
|
|
428
|
+
"resolution": null,
|
|
429
|
+
"reason": null,
|
|
430
|
+
"probe": "What is the result for empty, single-element, or null input?"
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"requirement_id": "R1",
|
|
434
|
+
"category": "ordering",
|
|
435
|
+
"status": "dismissed",
|
|
436
|
+
"verification": null,
|
|
437
|
+
"resolution": null,
|
|
438
|
+
"reason": "output is canonically sorted; no tie possible",
|
|
439
|
+
"probe": "When elements compare equal, is output order specified and stable?"
|
|
440
|
+
}
|
|
276
441
|
],
|
|
277
|
-
"coverage": {
|
|
442
|
+
"coverage": {
|
|
443
|
+
"applicable": 3,
|
|
444
|
+
"resolved": 2,
|
|
445
|
+
"unresolved": 1,
|
|
446
|
+
"unclassified": 0,
|
|
447
|
+
"byVerification": {
|
|
448
|
+
"explicit": 1,
|
|
449
|
+
"backstop": 0
|
|
450
|
+
}
|
|
451
|
+
}
|
|
278
452
|
}
|
|
279
453
|
```
|
|
280
454
|
|
|
@@ -24,12 +24,13 @@
|
|
|
24
24
|
# Unset per-wave manifest so wave N+1 creates a fresh one (#3384, #1369).
|
|
25
25
|
unset WAVE_WORKTREE_MANIFEST
|
|
26
26
|
|
|
27
|
-
# Between-wave base re-check (#1369, #3659): after wave N merges and tracking
|
|
28
|
-
# HEAD has advanced. Re-asserting worktree.baseRef:"head" is
|
|
29
|
-
#
|
|
30
|
-
# harness
|
|
31
|
-
#
|
|
32
|
-
#
|
|
27
|
+
# Between-wave base re-check (#1369, #3659, #4588): after wave N merges and tracking
|
|
28
|
+
# commits, HEAD has advanced. Re-asserting worktree.baseRef:"head" is NOT done here — the
|
|
29
|
+
# setting is either already in place (honored by GSD-created worktrees and by the Claude
|
|
30
|
+
# Code harness, #4588) or
|
|
31
|
+
# deliberately absent; a re-write would not change the fork base. The safety re-check
|
|
32
|
+
# below compares HEAD against the fork base and degrades the remaining waves whenever
|
|
33
|
+
# they diverge, avoiding the base-mismatch FATAL in executor agents.
|
|
33
34
|
if [ "$ISOLATION" = "harness-worktree" ] && [ "$USE_WORKTREES" != "false" ]; then
|
|
34
35
|
_BETWEEN_DEGRADE=$(gsd_run query worktree.base-check --mode "$ISOLATION" --pick shouldDegrade 2>/dev/null || echo "false")
|
|
35
36
|
if [ "$_BETWEEN_DEGRADE" = "true" ]; then
|