mandrel 2.59.0 → 2.61.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/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,45 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/complexity-gate.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* context envelope carries the paths a seed predicts, their repo state
|
|
9
|
-
* (existing paths predict refactors; missing ones predict creates) and
|
|
10
|
-
* the `audit-rules.json` sensitive-path classes the footprint intersects.
|
|
11
|
-
* They ground the authoring template's `changes[]` skeleton and the
|
|
12
|
-
* `/prototype` offer; they route nothing.
|
|
13
|
-
* 2. **Story shape ({@link deriveStoryShape}).** The light path
|
|
14
|
-
* (`deliver-light`) reads a predicted footprint's effort and risk —
|
|
15
|
-
* distinct change kinds, declared magnitude, uncertainty,
|
|
16
|
-
* deployable/migration span, sensitive-path classes — against
|
|
17
|
-
* {@link STORY_SHAPE_CEILINGS} to decide whether a prompt may skip the
|
|
18
|
-
* Story-authoring ceremony. Artifact cardinality is deliberately not an
|
|
19
|
-
* axis (Story #4764).
|
|
20
|
-
* 3. **Dispatch mode ({@link resolveStoryDispatchMode}).** `/mandrel-deliver`
|
|
21
|
-
* answers a different question from the route: may the engine run in the
|
|
22
|
-
* router's own session? Only a **single-Story run** may (Story #4736).
|
|
23
|
-
*
|
|
24
|
-
* Story #5312 deleted the plan-side half: the planner's authored lite claim
|
|
25
|
-
* (`--route-downgrade-reason`), the persist-time shape backstop that
|
|
26
|
-
* validated it, the `route::lite` hint label, and the
|
|
27
|
-
* `planning.complexityGate` knobs. Persist no longer routes; every Story
|
|
28
|
-
* lands through the same engine and the same close gates, and the shape
|
|
29
|
-
* ceilings below are read only where a shape is actually decided on.
|
|
30
|
-
*
|
|
31
|
-
* The shape taxonomy is deliberately the one `review-depth.js` already
|
|
32
|
-
* applies to the landed diff at close (`deriveChangeLevel` over the
|
|
33
|
-
* `audit-rules.json` sensitive-path classes): **predicted shape at dispatch,
|
|
34
|
-
* actual diff at close** — one taxonomy, two read points. Sensitivity always
|
|
35
|
-
* wins: a small change whose footprint intersects a sensitive-path class
|
|
36
|
-
* routes `full`, which keeps its fresh acceptance critic.
|
|
37
|
-
*
|
|
38
|
-
* {@link LITE_PATH_INVARIANTS} is the machine-readable contract that the
|
|
39
|
-
* light path still produces a Story ticket, still lands via a PR to `main`,
|
|
40
|
-
* still runs every repo quality gate, and still honours
|
|
41
|
-
* `rules/security-baseline.md`. Those gates run in `single-story-close.js`
|
|
42
|
-
* regardless of route; the router cannot and does not switch them off.
|
|
2
|
+
* lib/orchestration/complexity-gate.js — deliver-side Story routing: seed
|
|
3
|
+
* signals for `/mandrel-plan`, footprint risk for the light path, and
|
|
4
|
+
* inline-vs-subagent dispatch. Risk uses the same sensitive-path taxonomy
|
|
5
|
+
* `review-depth.js` applies to the landed diff at close (predicted footprint
|
|
6
|
+
* at dispatch, actual diff at close); sensitivity always wins. Close gates
|
|
7
|
+
* run regardless of route — the router cannot switch them off.
|
|
43
8
|
*
|
|
44
9
|
* @typedef {'lite'|'full'} ComplexityRoute
|
|
45
10
|
*/
|
|
@@ -49,152 +14,17 @@ import path from 'node:path';
|
|
|
49
14
|
import { extractChangePaths } from '../story-body/story-body.js';
|
|
50
15
|
import { deriveChangeLevel } from './review-depth.js';
|
|
51
16
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
* ceiling an operator can widen past what the inline path can safely absorb is
|
|
56
|
-
* a ceiling that fails silently.
|
|
57
|
-
*
|
|
58
|
-
* ## Effort and risk, never artifact cardinality (Story #4764)
|
|
59
|
-
*
|
|
60
|
-
* These ceilings used to count the declared footprint (`maxChanges: 2`,
|
|
61
|
-
* `maxAcceptance: 3`, `maxNonCreateChanges: 1`). Cardinality is the wrong axis
|
|
62
|
-
* in both directions: three identical one-line edits across three files is
|
|
63
|
-
* trivial work with a high count, while a 200-line rewrite of one module is a
|
|
64
|
-
* single change. And the count was read off a footprint the model **declares
|
|
65
|
-
* before doing the work** — a guess, and a gameable one — so counting it
|
|
66
|
-
* rejected genuinely small work (mandrel-bench's hello-world scenario is a
|
|
67
|
-
* server create plus a `package.json` edit plus a test create, structurally
|
|
68
|
-
* over the old ceilings) while admitting whatever an optimistic declaration
|
|
69
|
-
* under-counted.
|
|
70
|
-
*
|
|
71
|
-
* So the axes are effort, risk, and uncertainty, and the **prediction** gate
|
|
72
|
-
* they form is deliberately **coarse**: it rejects clearly-epic work only.
|
|
73
|
-
* Real enforcement belongs to the diff-derived backstop, which sees ground
|
|
74
|
-
* truth instead of a declaration
|
|
75
|
-
* ({@link module:lib/orchestration/light-suitability.checkLightDiffBackstop}).
|
|
76
|
-
*
|
|
77
|
-
* - `maxChangeKinds` — distinct change KINDS, not files. N instances of one
|
|
78
|
-
* mechanical edit is one kind at N sites; enumerating
|
|
79
|
-
* more kinds than this is a multi-capability scope.
|
|
80
|
-
* - `maxMagnitude` — coarse magnitude bucket, declared alongside the
|
|
81
|
-
* footprint: `trivial` < `moderate` < `substantial`.
|
|
82
|
-
* - `maxUncertainty` — is the shape determined by the request
|
|
83
|
-
* (`determined`), or does it still need the design
|
|
84
|
-
* decisions `/mandrel-plan` exists to resolve
|
|
85
|
-
* (`needs-design`)?
|
|
86
|
-
* - `maxDeployables` — named deployable roots (`apps/<x>`, `packages/<x>`, …)
|
|
87
|
-
* the footprint spans; more than one is epic by
|
|
88
|
-
* construction.
|
|
89
|
-
*
|
|
90
|
-
* Two rules ride beside the ceilings and are not tunable at all: a footprint
|
|
91
|
-
* pairing a migration with its consumers is epic scope, and a footprint
|
|
92
|
-
* intersecting a sensitive-path class routes `full` however small or mechanical
|
|
93
|
-
* it is — the hard gate, unchanged.
|
|
94
|
-
*
|
|
95
|
-
* Exposed as the `ceilings` field on every {@link deriveStoryShape} decision
|
|
96
|
-
* and exported directly (Story #4740) so the light path's suitability gate
|
|
97
|
-
* ({@link module:lib/orchestration/light-suitability}) judges a prompt's
|
|
98
|
-
* predicted footprint against the **same** axes the plan-time shape backstop
|
|
99
|
-
* applies — one source, so the light entry point and the plan path can never
|
|
100
|
-
* disagree about what work is trivial.
|
|
101
|
-
*/
|
|
102
|
-
export const STORY_SHAPE_CEILINGS = Object.freeze({
|
|
103
|
-
maxChangeKinds: 2,
|
|
104
|
-
maxMagnitude: 'moderate',
|
|
105
|
-
maxUncertainty: 'determined',
|
|
106
|
-
maxDeployables: 1,
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
/** Coarse effort buckets, ascending. Anything past `maxMagnitude` routes full. */
|
|
110
|
-
const MAGNITUDE_SCALE = Object.freeze(['trivial', 'moderate', 'substantial']);
|
|
111
|
-
|
|
112
|
-
/** Coarse uncertainty buckets, ascending. */
|
|
113
|
-
const UNCERTAINTY_SCALE = Object.freeze(['determined', 'needs-design']);
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Directory roots whose immediate child is a separately-deployable unit. A
|
|
117
|
-
* footprint spanning two of them is the "multiple deployables" epic signal.
|
|
118
|
-
*/
|
|
119
|
-
const DEPLOYABLE_ROOTS = Object.freeze([
|
|
120
|
-
'apps',
|
|
121
|
-
'packages',
|
|
122
|
-
'services',
|
|
123
|
-
'functions',
|
|
124
|
-
'workers',
|
|
125
|
-
]);
|
|
17
|
+
// No predicted-size ceilings: a size the caller declares about itself is not
|
|
18
|
+
// a measurement. Size is bounded only by the diff backstop
|
|
19
|
+
// (`light-suitability.checkLightDiffBackstop`); the rules here read paths.
|
|
126
20
|
|
|
127
21
|
/** Paths that are schema migrations rather than ordinary source. */
|
|
128
22
|
const MIGRATION_PATH_RE =
|
|
129
23
|
/(?:^|\/)(?:migrations?|migrate)(?:\/|$)|\.sql$|(?:^|\/)schema\.(?:prisma|rb)$/i;
|
|
130
24
|
|
|
131
25
|
/**
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* rejecting. **Present but unrecognized** is a malformed claim, which cannot be
|
|
135
|
-
* verified as small and therefore fails closed to the worst bucket on the
|
|
136
|
-
* scale.
|
|
137
|
-
*
|
|
138
|
-
* @param {unknown} value
|
|
139
|
-
* @param {readonly string[]} scale Ascending buckets.
|
|
140
|
-
* @param {string} whenAbsent Bucket to assume when nothing was declared.
|
|
141
|
-
* @returns {string}
|
|
142
|
-
*/
|
|
143
|
-
function normalizeBucket(value, scale, whenAbsent) {
|
|
144
|
-
if (value === undefined || value === null || value === '') return whenAbsent;
|
|
145
|
-
const key = typeof value === 'string' ? value.trim().toLowerCase() : '';
|
|
146
|
-
return scale.includes(key) ? key : scale[scale.length - 1];
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Resolve the distinct change KINDS in a footprint. An explicit `kinds[]`
|
|
151
|
-
* declaration wins; absent one, each entry's `assumption` is its kind — which
|
|
152
|
-
* is exactly the "N instances of one mechanical edit is one kind at N sites"
|
|
153
|
-
* reading, since N same-assumption entries collapse to one kind.
|
|
154
|
-
*
|
|
155
|
-
* @param {{ changes?: unknown, kinds?: unknown }} args
|
|
156
|
-
* @returns {string[]} Distinct kinds, in order of first appearance.
|
|
157
|
-
*/
|
|
158
|
-
function resolveChangeKinds({ changes, kinds }) {
|
|
159
|
-
const clean = (list) =>
|
|
160
|
-
list
|
|
161
|
-
.filter((k) => typeof k === 'string' && k.trim() !== '')
|
|
162
|
-
.map((k) => k.trim().toLowerCase());
|
|
163
|
-
const declared = clean(Array.isArray(kinds) ? kinds : []);
|
|
164
|
-
if (declared.length > 0) return [...new Set(declared)];
|
|
165
|
-
const derived = (Array.isArray(changes) ? changes : []).map((entry) =>
|
|
166
|
-
entry && typeof entry === 'object' && typeof entry.assumption === 'string'
|
|
167
|
-
? entry.assumption.trim().toLowerCase() || 'unspecified'
|
|
168
|
-
: 'unspecified',
|
|
169
|
-
);
|
|
170
|
-
return [...new Set(derived)];
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Named deployable roots a footprint spans (`apps/web`, `packages/core`, …).
|
|
175
|
-
* The repository root itself is deliberately **not** counted: a change to one
|
|
176
|
-
* app plus a root-level README is one deployable, not two.
|
|
177
|
-
*
|
|
178
|
-
* @param {string[]} paths
|
|
179
|
-
* @returns {string[]}
|
|
180
|
-
*/
|
|
181
|
-
function resolveDeployables(paths) {
|
|
182
|
-
const ids = new Set();
|
|
183
|
-
for (const p of paths) {
|
|
184
|
-
const segments = String(p)
|
|
185
|
-
.split('/')
|
|
186
|
-
.filter((s) => s !== '');
|
|
187
|
-
if (segments.length >= 3 && DEPLOYABLE_ROOTS.includes(segments[0])) {
|
|
188
|
-
ids.add(`${segments[0]}/${segments[1]}`);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return [...ids];
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Does the footprint pair a schema migration with its consumers? A migration
|
|
196
|
-
* plus the code that reads through it is epic scope: the two have to land
|
|
197
|
-
* together and the ordering is the design work.
|
|
26
|
+
* A migration plus the code that reads through it is epic scope: the
|
|
27
|
+
* ordering is the design work.
|
|
198
28
|
*
|
|
199
29
|
* @param {string[]} paths
|
|
200
30
|
* @returns {boolean}
|
|
@@ -205,83 +35,30 @@ function spansMigrationAndConsumers(paths) {
|
|
|
205
35
|
}
|
|
206
36
|
|
|
207
37
|
/**
|
|
208
|
-
* Stable
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
* is free to be re-worded; a caller that must **branch** on *which* rule
|
|
213
|
-
* objected reads this code instead. That distinction is load-bearing for the
|
|
214
|
-
* light path's operator override
|
|
215
|
-
* ({@link module:lib/orchestration/light-suitability.OVERRIDABLE_SHAPE_CODES}),
|
|
216
|
-
* which may waive a size *prediction* but never a risk rule: keying that
|
|
217
|
-
* decision off reason text would make a copy-edit a security change.
|
|
218
|
-
*
|
|
219
|
-
* Split three ways, and the grouping is the contract:
|
|
220
|
-
*
|
|
221
|
-
* - **Ceiling rules** — `change-kinds`, `magnitude`, `uncertainty`,
|
|
222
|
-
* `deployable-span`. Coarse predictions about size, enforced for real
|
|
223
|
-
* against ground truth by the diff backstop.
|
|
224
|
-
* - **Absolute rules** — `migration-span`, `sensitive-path`. Risk, not size.
|
|
225
|
-
* - **Unknown-footprint rejections** — `no-changes`, `unreadable-changes`,
|
|
226
|
-
* `glob-footprint`, `no-acceptance`, `classification-unavailable`.
|
|
227
|
-
* Nothing was judged, so there is nothing to waive.
|
|
228
|
-
*
|
|
229
|
-
* A `lite` route carries `code: null`.
|
|
38
|
+
* Stable codes for why a footprint routes `full`; callers branch on these,
|
|
39
|
+
* never on `reasons[]` prose. Absolute risk rules (`migration-span`,
|
|
40
|
+
* `sensitive-path`) no re-slicing satisfies; the rest are unknown-footprint
|
|
41
|
+
* rejections. `lite` carries `code: null`.
|
|
230
42
|
*/
|
|
231
43
|
export const SHAPE_CODES = Object.freeze({
|
|
232
|
-
CHANGE_KINDS: 'change-kinds',
|
|
233
|
-
MAGNITUDE: 'magnitude',
|
|
234
|
-
UNCERTAINTY: 'uncertainty',
|
|
235
|
-
DEPLOYABLE_SPAN: 'deployable-span',
|
|
236
44
|
MIGRATION_SPAN: 'migration-span',
|
|
237
45
|
SENSITIVE_PATH: 'sensitive-path',
|
|
238
46
|
NO_CHANGES: 'no-changes',
|
|
239
47
|
UNREADABLE_CHANGES: 'unreadable-changes',
|
|
240
48
|
GLOB_FOOTPRINT: 'glob-footprint',
|
|
241
|
-
NO_ACCEPTANCE: 'no-acceptance',
|
|
242
49
|
CLASSIFICATION_UNAVAILABLE: 'classification-unavailable',
|
|
243
50
|
});
|
|
244
51
|
|
|
245
52
|
/**
|
|
246
|
-
*
|
|
247
|
-
* reason for a `full` route. Every rule names an effort, risk, or uncertainty
|
|
248
|
-
* property of the work — none counts artifacts.
|
|
53
|
+
* Absolute risk rules, in order; the first hit is the `full` reason.
|
|
249
54
|
*
|
|
250
55
|
* @type {ReadonlyArray<{
|
|
251
56
|
* code: string,
|
|
252
|
-
* when: (shape: object
|
|
253
|
-
* reason: (shape: object
|
|
57
|
+
* when: (shape: object) => boolean,
|
|
58
|
+
* reason: (shape: object) => string,
|
|
254
59
|
* }>}
|
|
255
60
|
*/
|
|
256
|
-
const
|
|
257
|
-
{
|
|
258
|
-
code: SHAPE_CODES.CHANGE_KINDS,
|
|
259
|
-
when: (s, c) => s.kindCount > c.maxChangeKinds,
|
|
260
|
-
reason: (s, c) =>
|
|
261
|
-
`${s.kindCount} distinct change kinds (${s.changeKinds.join(', ')}) > maxChangeKinds ${c.maxChangeKinds} — an explicit multi-capability enumeration, not one capability; full route`,
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
code: SHAPE_CODES.MAGNITUDE,
|
|
265
|
-
when: (s, c) =>
|
|
266
|
-
MAGNITUDE_SCALE.indexOf(s.magnitude) >
|
|
267
|
-
MAGNITUDE_SCALE.indexOf(c.maxMagnitude),
|
|
268
|
-
reason: (s, c) =>
|
|
269
|
-
`declared magnitude "${s.magnitude}" > maxMagnitude "${c.maxMagnitude}" — a substantial rewrite is effort a single inline pass should not absorb, however few files it touches; full route`,
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
code: SHAPE_CODES.UNCERTAINTY,
|
|
273
|
-
when: (s, c) =>
|
|
274
|
-
UNCERTAINTY_SCALE.indexOf(s.uncertainty) >
|
|
275
|
-
UNCERTAINTY_SCALE.indexOf(c.maxUncertainty),
|
|
276
|
-
reason: (s) =>
|
|
277
|
-
`the shape is not determined by the request (uncertainty "${s.uncertainty}") — the design decisions /mandrel-plan exists to resolve are still open; full route`,
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
code: SHAPE_CODES.DEPLOYABLE_SPAN,
|
|
281
|
-
when: (s, c) => s.deployables.length > c.maxDeployables,
|
|
282
|
-
reason: (s, c) =>
|
|
283
|
-
`footprint spans ${s.deployables.length} deployables (${s.deployables.join(', ')}) > maxDeployables ${c.maxDeployables} — clearly-epic scope; full route`,
|
|
284
|
-
},
|
|
61
|
+
const RISK_RULES = Object.freeze([
|
|
285
62
|
{
|
|
286
63
|
code: SHAPE_CODES.MIGRATION_SPAN,
|
|
287
64
|
when: (s) => s.migrationSpan,
|
|
@@ -292,44 +69,25 @@ const EFFORT_RULES = Object.freeze([
|
|
|
292
69
|
code: SHAPE_CODES.SENSITIVE_PATH,
|
|
293
70
|
when: (s) => s.sensitiveClasses.length > 0,
|
|
294
71
|
reason: (s) =>
|
|
295
|
-
`footprint intersects sensitive-path class(es) ${s.sensitiveClasses.join(', ')} — sensitivity wins over a small
|
|
72
|
+
`footprint intersects sensitive-path class(es) ${s.sensitiveClasses.join(', ')} — sensitivity wins over a small footprint; full route (deep review retained)`,
|
|
296
73
|
},
|
|
297
74
|
]);
|
|
298
75
|
|
|
299
76
|
/**
|
|
300
|
-
* First effort/risk rule the shape violates as a `{ code, reason }` pair, or
|
|
301
|
-
* `null` when it clears them all.
|
|
302
|
-
*
|
|
303
77
|
* @param {object} shape
|
|
304
|
-
* @param {typeof STORY_SHAPE_CEILINGS} ceilings
|
|
305
78
|
* @returns {{ code: string, reason: string }|null}
|
|
306
79
|
*/
|
|
307
|
-
function
|
|
308
|
-
for (const rule of
|
|
309
|
-
if (rule.when(shape
|
|
310
|
-
return { code: rule.code, reason: rule.reason(shape
|
|
80
|
+
function firstRiskViolation(shape) {
|
|
81
|
+
for (const rule of RISK_RULES) {
|
|
82
|
+
if (rule.when(shape)) {
|
|
83
|
+
return { code: rule.code, reason: rule.reason(shape) };
|
|
311
84
|
}
|
|
312
85
|
}
|
|
313
86
|
return null;
|
|
314
87
|
}
|
|
315
88
|
|
|
316
89
|
/**
|
|
317
|
-
*
|
|
318
|
-
* collapsing ceremony never means dropping the Story ticket, the PR-to-`main`
|
|
319
|
-
* landing, the repo quality gates, or the security baseline. Attached
|
|
320
|
-
* verbatim to every route decision's `preserves` field so a downstream reader
|
|
321
|
-
* (or contract test) can assert the invariants held on either route.
|
|
322
|
-
*/
|
|
323
|
-
const LITE_PATH_INVARIANTS = Object.freeze({
|
|
324
|
-
storyTicket: true,
|
|
325
|
-
prToMain: true,
|
|
326
|
-
repoGates: true,
|
|
327
|
-
securityBaseline: true,
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* Count top-level enumerated items (`- `, `* `, `1. `) in a free-form seed —
|
|
332
|
-
* each enumerated line is one predicted artifact.
|
|
90
|
+
* Count enumerated lines (`- `, `* `, `1. `) in a seed.
|
|
333
91
|
*
|
|
334
92
|
* @param {string} text
|
|
335
93
|
* @returns {number}
|
|
@@ -345,9 +103,7 @@ function countSeedArtifacts(text) {
|
|
|
345
103
|
const MAX_PREDICTED_PATHS = 50;
|
|
346
104
|
|
|
347
105
|
/**
|
|
348
|
-
*
|
|
349
|
-
* free-form seed — the predicted footprint the sensitive-path and repo-state
|
|
350
|
-
* signals classify.
|
|
106
|
+
* Path-like tokens (a `/` plus a dotted extension) in a seed.
|
|
351
107
|
*
|
|
352
108
|
* @param {string} text
|
|
353
109
|
* @returns {string[]} Deduplicated, in order of first appearance.
|
|
@@ -365,25 +121,10 @@ function extractPredictedPaths(text) {
|
|
|
365
121
|
}
|
|
366
122
|
|
|
367
123
|
/**
|
|
368
|
-
*
|
|
369
|
-
*
|
|
370
|
-
*
|
|
371
|
-
*
|
|
372
|
-
* hits and the `planning.complexityGate` echo that used to ride alongside).
|
|
373
|
-
*
|
|
374
|
-
* - `artifactCount` — enumerated items in the seed, a rough width
|
|
375
|
-
* signal for the operator's eye only.
|
|
376
|
-
* - `predictedPaths` — path-like tokens the seed names, in order of
|
|
377
|
-
* first appearance (capped).
|
|
378
|
-
* - `repoState` — which predicted paths exist in the repo (existing
|
|
379
|
-
* paths predict refactors; missing predict
|
|
380
|
-
* creates).
|
|
381
|
-
* - `sensitivePathClasses` — `audit-rules.json` sensitive-path classes the
|
|
382
|
-
* predicted footprint intersects (the same
|
|
383
|
-
* taxonomy close applies to the landed diff).
|
|
384
|
-
*
|
|
385
|
-
* Total: never throws; a failed classification degrades to an empty class
|
|
386
|
-
* list (the honest "no signal", never a verdict).
|
|
124
|
+
* Advisory signals for a planning seed — they ground the authoring
|
|
125
|
+
* template's `changes[]` and the `/prototype` offer and route nothing.
|
|
126
|
+
* Existing paths predict refactors, missing ones creates. Never throws; a
|
|
127
|
+
* failed classification yields an empty class list.
|
|
387
128
|
*
|
|
388
129
|
* @param {{
|
|
389
130
|
* seedText?: string,
|
|
@@ -441,143 +182,112 @@ export function buildComplexitySignals({
|
|
|
441
182
|
}
|
|
442
183
|
|
|
443
184
|
/**
|
|
444
|
-
*
|
|
445
|
-
*
|
|
185
|
+
* @param {'lite'|'full'} route
|
|
186
|
+
* @param {string|null} code
|
|
187
|
+
* @param {string} reason
|
|
188
|
+
* @param {object|null} [shape]
|
|
189
|
+
* @returns {object}
|
|
190
|
+
*/
|
|
191
|
+
function decide(route, code, reason, shape = null) {
|
|
192
|
+
return { route, reasons: [reason], code, shape };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Read the footprint into path entries, or a shape-less rejection when it
|
|
197
|
+
* cannot be read.
|
|
446
198
|
*
|
|
199
|
+
* @param {unknown} changes
|
|
200
|
+
* @returns {{ entries: Array<{ path: string, isGlob?: boolean }>|null, rejection: object|null }}
|
|
201
|
+
*/
|
|
202
|
+
function readFootprintEntries(changes) {
|
|
203
|
+
if (!Array.isArray(changes) || changes.length === 0) {
|
|
204
|
+
return {
|
|
205
|
+
entries: null,
|
|
206
|
+
rejection: decide(
|
|
207
|
+
'full',
|
|
208
|
+
SHAPE_CODES.NO_CHANGES,
|
|
209
|
+
'no changes[] declared — the footprint is unknown, so the work cannot be judged trivial; conservative full route',
|
|
210
|
+
),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
return { entries: extractChangePaths(changes), rejection: null };
|
|
215
|
+
} catch (err) {
|
|
216
|
+
return {
|
|
217
|
+
entries: null,
|
|
218
|
+
rejection: decide(
|
|
219
|
+
'full',
|
|
220
|
+
SHAPE_CODES.UNREADABLE_CHANGES,
|
|
221
|
+
`changes[] could not be read (${err?.message ?? err}) — unknown footprint; conservative full route`,
|
|
222
|
+
),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* A glob footprint has unknowable width; `null` when judgeable.
|
|
229
|
+
*
|
|
230
|
+
* @param {Array<{ isGlob?: boolean }>} entries
|
|
231
|
+
* @param {object} shape
|
|
232
|
+
* @returns {object|null}
|
|
233
|
+
*/
|
|
234
|
+
function unjudgeableFootprintRejection(entries, shape) {
|
|
235
|
+
if (entries.some((e) => e.isGlob)) {
|
|
236
|
+
return decide(
|
|
237
|
+
'full',
|
|
238
|
+
SHAPE_CODES.GLOB_FOOTPRINT,
|
|
239
|
+
'changes[] contains a glob path — unknown footprint width; conservative full route',
|
|
240
|
+
shape,
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
447
247
|
* @param {{
|
|
448
|
-
* changes: unknown[],
|
|
449
248
|
* paths: string[],
|
|
450
|
-
* acceptance?: unknown,
|
|
451
|
-
* kinds?: unknown,
|
|
452
|
-
* magnitude?: unknown,
|
|
453
|
-
* uncertainty?: unknown,
|
|
454
249
|
* sensitiveClasses: string[],
|
|
455
250
|
* }} args
|
|
456
251
|
* @returns {{
|
|
457
252
|
* siteCount: number,
|
|
458
|
-
* changeKinds: string[],
|
|
459
|
-
* kindCount: number,
|
|
460
|
-
* magnitude: string,
|
|
461
|
-
* uncertainty: string,
|
|
462
|
-
* acceptanceCount: number,
|
|
463
|
-
* deployables: string[],
|
|
464
253
|
* migrationSpan: boolean,
|
|
465
254
|
* sensitiveClasses: string[],
|
|
466
255
|
* }}
|
|
467
256
|
*/
|
|
468
|
-
function
|
|
469
|
-
changes,
|
|
470
|
-
paths,
|
|
471
|
-
acceptance,
|
|
472
|
-
kinds,
|
|
473
|
-
magnitude,
|
|
474
|
-
uncertainty,
|
|
475
|
-
sensitiveClasses,
|
|
476
|
-
}) {
|
|
477
|
-
const changeKinds = resolveChangeKinds({ changes, kinds });
|
|
257
|
+
function buildRiskShape({ paths, sensitiveClasses }) {
|
|
478
258
|
return {
|
|
479
259
|
siteCount: paths.length,
|
|
480
|
-
changeKinds,
|
|
481
|
-
kindCount: changeKinds.length,
|
|
482
|
-
magnitude: normalizeBucket(magnitude, MAGNITUDE_SCALE, 'moderate'),
|
|
483
|
-
uncertainty: normalizeBucket(uncertainty, UNCERTAINTY_SCALE, 'determined'),
|
|
484
|
-
acceptanceCount: Array.isArray(acceptance) ? acceptance.length : 0,
|
|
485
|
-
deployables: resolveDeployables(paths),
|
|
486
260
|
migrationSpan: spansMigrationAndConsumers(paths),
|
|
487
261
|
sensitiveClasses,
|
|
488
262
|
};
|
|
489
263
|
}
|
|
490
264
|
|
|
491
265
|
/**
|
|
492
|
-
*
|
|
493
|
-
*
|
|
494
|
-
*
|
|
495
|
-
*
|
|
496
|
-
*
|
|
497
|
-
* `lite` requires **every** signal to agree, against
|
|
498
|
-
* {@link STORY_SHAPE_CEILINGS}:
|
|
499
|
-
*
|
|
500
|
-
* - a declared, parseable, glob-free `changes[]` footprint — width is not
|
|
501
|
-
* counted, but an unknown width cannot be judged;
|
|
502
|
-
* - at least one acceptance criterion (a Story with no contract cannot be
|
|
503
|
-
* judged trivial). The criteria are **not** capped: criterion count is
|
|
504
|
-
* contract detail, not effort;
|
|
505
|
-
* - at most `maxChangeKinds` distinct change kinds, magnitude no worse than
|
|
506
|
-
* `maxMagnitude`, uncertainty no worse than `maxUncertainty`, and at most
|
|
507
|
-
* `maxDeployables` deployable roots — plus no migration-with-consumers
|
|
508
|
-
* span. These are the clearly-epic rejections, and nothing finer: the
|
|
509
|
-
* declared footprint is a guess, so the diff-derived backstop does the real
|
|
510
|
-
* enforcement (see {@link STORY_SHAPE_CEILINGS});
|
|
511
|
-
* - a footprint intersecting **no** sensitive-path class
|
|
512
|
-
* (`deriveChangeLevel`, the taxonomy close applies to the landed diff).
|
|
513
|
-
* Sensitivity always wins (AC-6): a sensitive footprint routes `full`
|
|
514
|
-
* however small or mechanical, which keeps the fresh acceptance critic via
|
|
515
|
-
* `ceremony-routing.js`.
|
|
516
|
-
*
|
|
517
|
-
* Everything else — an unknown/undeclared footprint, a malformed magnitude or
|
|
518
|
-
* uncertainty claim, or an unreadable sensitive-path manifest — fails toward
|
|
519
|
-
* `full`. Total: never throws.
|
|
266
|
+
* Route a footprint by risk. `lite` requires a declared, parseable,
|
|
267
|
+
* glob-free `changes[]`, no migration-with-consumers span, and no
|
|
268
|
+
* sensitive-path class (a sensitive footprint keeps deep code review however
|
|
269
|
+
* small). Anything unknown or unclassifiable fails toward `full`. Never
|
|
270
|
+
* throws.
|
|
520
271
|
*
|
|
521
272
|
* @param {{
|
|
522
273
|
* changes?: unknown,
|
|
523
|
-
* acceptance?: unknown,
|
|
524
|
-
* kinds?: unknown,
|
|
525
|
-
* magnitude?: unknown,
|
|
526
|
-
* uncertainty?: unknown,
|
|
527
274
|
* injectedRules?: object,
|
|
528
275
|
* selectSensitivePathClassesFn?: Function,
|
|
529
|
-
* }} [args]
|
|
530
|
-
* entry's `assumption` is its kind); `magnitude` and `uncertainty` are the
|
|
531
|
-
* declared coarse buckets.
|
|
276
|
+
* }} [args]
|
|
532
277
|
* @returns {{
|
|
533
278
|
* route: ComplexityRoute,
|
|
534
279
|
* reasons: string[],
|
|
535
280
|
* code: string|null,
|
|
536
|
-
* shape: ReturnType<typeof
|
|
537
|
-
*
|
|
538
|
-
* preserves: typeof LITE_PATH_INVARIANTS,
|
|
539
|
-
* }} `code` is the stable {@link SHAPE_CODES} identifier for the rule that
|
|
540
|
-
* rejected the shape (`null` on `lite`) — the field a caller branches on,
|
|
541
|
-
* since `reasons[]` is human prose and free to be re-worded.
|
|
281
|
+
* shape: ReturnType<typeof buildRiskShape>|null,
|
|
282
|
+
* }}
|
|
542
283
|
*/
|
|
543
284
|
export function deriveStoryShape({
|
|
544
285
|
changes,
|
|
545
|
-
acceptance,
|
|
546
|
-
kinds,
|
|
547
|
-
magnitude,
|
|
548
|
-
uncertainty,
|
|
549
286
|
injectedRules,
|
|
550
287
|
selectSensitivePathClassesFn,
|
|
551
288
|
} = {}) {
|
|
552
|
-
const
|
|
553
|
-
|
|
554
|
-
const decide = (route, code, reason, shape = null) => ({
|
|
555
|
-
route,
|
|
556
|
-
reasons: [reason],
|
|
557
|
-
code,
|
|
558
|
-
shape,
|
|
559
|
-
ceilings,
|
|
560
|
-
preserves,
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
if (!Array.isArray(changes) || changes.length === 0) {
|
|
564
|
-
return decide(
|
|
565
|
-
'full',
|
|
566
|
-
SHAPE_CODES.NO_CHANGES,
|
|
567
|
-
'no changes[] declared — the footprint is unknown, so the work cannot be judged trivial; conservative full route',
|
|
568
|
-
);
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
let entries;
|
|
572
|
-
try {
|
|
573
|
-
entries = extractChangePaths(changes);
|
|
574
|
-
} catch (err) {
|
|
575
|
-
return decide(
|
|
576
|
-
'full',
|
|
577
|
-
SHAPE_CODES.UNREADABLE_CHANGES,
|
|
578
|
-
`changes[] could not be read (${err?.message ?? err}) — unknown footprint; conservative full route`,
|
|
579
|
-
);
|
|
580
|
-
}
|
|
289
|
+
const { entries, rejection } = readFootprintEntries(changes);
|
|
290
|
+
if (rejection !== null) return rejection;
|
|
581
291
|
|
|
582
292
|
const paths = entries.map((e) => e.path);
|
|
583
293
|
const { level, classes } = deriveChangeLevel({
|
|
@@ -585,42 +295,18 @@ export function deriveStoryShape({
|
|
|
585
295
|
injectedRules,
|
|
586
296
|
selectSensitivePathClassesFn,
|
|
587
297
|
});
|
|
588
|
-
const shape =
|
|
589
|
-
changes,
|
|
590
|
-
paths,
|
|
591
|
-
acceptance,
|
|
592
|
-
kinds,
|
|
593
|
-
magnitude,
|
|
594
|
-
uncertainty,
|
|
595
|
-
sensitiveClasses: classes,
|
|
596
|
-
});
|
|
298
|
+
const shape = buildRiskShape({ paths, sensitiveClasses: classes });
|
|
597
299
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
'full',
|
|
601
|
-
SHAPE_CODES.GLOB_FOOTPRINT,
|
|
602
|
-
'changes[] contains a glob path — unknown footprint width; conservative full route',
|
|
603
|
-
shape,
|
|
604
|
-
);
|
|
605
|
-
}
|
|
606
|
-
if (shape.acceptanceCount === 0) {
|
|
607
|
-
return decide(
|
|
608
|
-
'full',
|
|
609
|
-
SHAPE_CODES.NO_ACCEPTANCE,
|
|
610
|
-
'no acceptance criteria — the contract cannot be judged trivial; conservative full route',
|
|
611
|
-
shape,
|
|
612
|
-
);
|
|
613
|
-
}
|
|
300
|
+
const unjudgeable = unjudgeableFootprintRejection(entries, shape);
|
|
301
|
+
if (unjudgeable !== null) return unjudgeable;
|
|
614
302
|
|
|
615
|
-
const violation =
|
|
303
|
+
const violation = firstRiskViolation(shape);
|
|
616
304
|
if (violation !== null) {
|
|
617
305
|
return decide('full', violation.code, violation.reason, shape);
|
|
618
306
|
}
|
|
619
307
|
|
|
620
308
|
if (level !== 'low') {
|
|
621
|
-
//
|
|
622
|
-
// manifest / failed selector): there is no evidence the footprint is
|
|
623
|
-
// non-sensitive, and a classification failure must never buy lite.
|
|
309
|
+
// Classification failed; that must never buy lite.
|
|
624
310
|
return decide(
|
|
625
311
|
'full',
|
|
626
312
|
SHAPE_CODES.CLASSIFICATION_UNAVAILABLE,
|
|
@@ -632,55 +318,25 @@ export function deriveStoryShape({
|
|
|
632
318
|
return decide(
|
|
633
319
|
'lite',
|
|
634
320
|
null,
|
|
635
|
-
`
|
|
321
|
+
`no absolute risk rule fires across ${shape.siteCount} predicted path(s): no migration-with-consumers span, no sensitive-path class — inline-eligible; size is bounded by the diff backstop`,
|
|
636
322
|
shape,
|
|
637
323
|
);
|
|
638
324
|
}
|
|
639
325
|
|
|
640
326
|
/**
|
|
641
|
-
* Decide
|
|
642
|
-
*
|
|
643
|
-
*
|
|
644
|
-
*
|
|
645
|
-
*
|
|
646
|
-
*
|
|
647
|
-
*
|
|
648
|
-
*
|
|
649
|
-
*
|
|
650
|
-
*
|
|
651
|
-
* bench work) for nothing.
|
|
652
|
-
*
|
|
653
|
-
* **Shape cannot grant it (Story #4829).** The shape read used to return
|
|
654
|
-
* `inline` for any lite-shaped body in a multi-Story run, inheriting no
|
|
655
|
-
* topology guard. Measured twice on 2026-07-29: a two-Story and a three-Story
|
|
656
|
-
* run came back `inline` for *every* Story while `stories-wave-tick.js`
|
|
657
|
-
* reported the whole set ready under a concurrency cap of five — a router
|
|
658
|
-
* following both signals literally runs several engines over one session and
|
|
659
|
-
* one checkout, the precise hazard the sub-agent path exists to prevent.
|
|
660
|
-
*
|
|
661
|
-
* **So this function reads only `storyCount` (Story #5006).** #4829 left the
|
|
662
|
-
* body parse, the shape derivation, the `route::lite` hint note and the
|
|
663
|
-
* `planning.complexityGate.enabled` branch in place to populate a `route`
|
|
664
|
-
* field for reporting — but the sole consumer, `resolve-stories.js`, reads
|
|
665
|
-
* `.mode` and discards the rest, so every one of those inputs was a parse
|
|
666
|
-
* whose result nothing could act on. A caller that wants the shape calls
|
|
667
|
-
* {@link deriveStoryShape} directly, as the light path and plan-persist do.
|
|
668
|
-
*
|
|
669
|
-
* Inline execution removes model-side fan-out only — it changes **where** the
|
|
670
|
-
* engine runs, never **what** runs. Every deterministic
|
|
671
|
-
* `single-story-close.js` gate, the PR to `main`, and the
|
|
672
|
-
* `story-deliver-terminal` envelope are identical in both modes; see the
|
|
673
|
-
* module header's non-negotiables.
|
|
674
|
-
*
|
|
675
|
-
* @param {{ storyCount?: unknown }} [args] `storyCount` is the number of
|
|
676
|
-
* Stories the invoking `/mandrel-deliver` run resolved. Omitted (or not exactly 1)
|
|
677
|
-
* means the run cannot be shown sibling-free and therefore dispatches as a
|
|
678
|
-
* sub-agent — never an assumed 1.
|
|
327
|
+
* Decide where `/mandrel-deliver` runs a Story, from run topology only.
|
|
328
|
+
* `inline` claims the router's own session, which only one Story can own:
|
|
329
|
+
* sub-agent isolation matters only for concurrent dispatch (siblings race
|
|
330
|
+
* worktrees and branch refs), so a single-Story run goes inline to skip the
|
|
331
|
+
* spawn's cache-write premium. Shape must never grant inline — a multi-Story
|
|
332
|
+
* run would put several engines on one session and checkout. Only *where*
|
|
333
|
+
* changes; close gates, PR and terminal envelope are identical.
|
|
334
|
+
*
|
|
335
|
+
* @param {{ storyCount?: unknown }} [args] Anything but exactly 1 dispatches
|
|
336
|
+
* as a sub-agent.
|
|
679
337
|
* @returns {{ mode: 'inline'|'subagent', reasons: string[] }}
|
|
680
338
|
*/
|
|
681
339
|
export function resolveStoryDispatchMode({ storyCount } = {}) {
|
|
682
|
-
// The ONLY `inline` exit in this function, and the guard is the whole
|
|
683
|
-
// contract: an inline verdict must mean the engine can actually run inline.
|
|
684
340
|
if (storyCount === 1) {
|
|
685
341
|
return {
|
|
686
342
|
mode: 'inline',
|