mandrel 2.60.0 → 2.62.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- 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 +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- 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 +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- 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 +10 -50
- 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 +5 -21
- 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 +31 -143
- 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 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- 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 +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- 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 +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- 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 -126
- 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 +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- 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 +31 -259
- 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 +21 -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 +5 -75
- 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 +42 -189
- 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 +42 -214
- 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 +26 -231
- 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/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- 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 +14 -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 +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- 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 -94
- 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 +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- 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 +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- 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 +183 -485
- 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 +9 -50
- 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 +110 -290
- 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 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- 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 -126
- 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 +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- 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 +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- 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 +53 -221
- 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 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- 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 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- 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/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/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- 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 +32 -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 +105 -661
- 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 +15 -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 +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- 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/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 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- 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/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 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,37 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ColumnSync —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* (`Todo` / `In Progress` / `Done`) — granular lifecycle state lives in the
|
|
7
|
-
* `agent::*` labels themselves. This mapping collapses each lifecycle label
|
|
8
|
-
* onto one of those three buckets:
|
|
9
|
-
*
|
|
10
|
-
* agent::review-spec → Todo
|
|
11
|
-
* agent::ready → Todo
|
|
12
|
-
* agent::executing → In Progress
|
|
13
|
-
* agent::closing → In Progress
|
|
14
|
-
* agent::blocked → In Progress (the `agent::blocked` label is the
|
|
15
|
-
* granular signal; the board column just shows the
|
|
16
|
-
* work is still in flight)
|
|
17
|
-
* agent::done → Done
|
|
18
|
-
*
|
|
19
|
-
* No-op (soft fail) when:
|
|
20
|
-
* - `projectNumber` is not configured
|
|
21
|
-
* - The Status field or the required option is not present on the project
|
|
22
|
-
* - The issue is not a project item (e.g. orchestrator running on a fork)
|
|
23
|
-
*
|
|
24
|
-
* The sync is implemented as pure functions plus a thin class wrapper so
|
|
25
|
-
* tests can pump a fake provider's `graphql` calls without touching live
|
|
26
|
-
* GitHub.
|
|
27
|
-
*
|
|
28
|
-
* Located at `lib/orchestration/column-sync.js` (Story #2548) so the
|
|
29
|
-
* canonical state mutator `transitionTicketState`
|
|
30
|
-
* (`lib/orchestration/ticketing/state.js`) can invoke it without an
|
|
31
|
-
* upward dependency into the deleted `epic-runner/` tree. Prior to #2548 this module
|
|
32
|
-
* lived under `epic-runner/` and was only wired against the Epic
|
|
33
|
-
* ticket — Stories and Tasks never updated their Projects v2 Status
|
|
34
|
-
* column on label flips.
|
|
2
|
+
* ColumnSync — collapse an issue's `agent::*` labels onto the stock Projects
|
|
3
|
+
* v2 Status options (`Todo` / `In Progress` / `Done`) and push it via
|
|
4
|
+
* GraphQL. Soft no-op when no project is configured, the Status field or
|
|
5
|
+
* option is missing, or the issue is not on the board.
|
|
35
6
|
*/
|
|
36
7
|
|
|
37
8
|
import { AGENT_LABELS } from '../label-constants.js';
|
|
@@ -52,11 +23,8 @@ export const LABEL_TO_COLUMN = Object.freeze({
|
|
|
52
23
|
});
|
|
53
24
|
|
|
54
25
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* blocked) collapses to `In Progress`, and parking labels (review-spec /
|
|
58
|
-
* ready) collapse to `Todo`. Returns null when no `agent::*` label is
|
|
59
|
-
* present so the caller can skip the sync.
|
|
26
|
+
* `done` wins, then any in-flight label, then parking labels; `null` when no
|
|
27
|
+
* `agent::*` label is present.
|
|
60
28
|
*/
|
|
61
29
|
export function columnForLabels(labels) {
|
|
62
30
|
const set = new Set(labels);
|
|
@@ -95,23 +63,14 @@ export class ColumnSync {
|
|
|
95
63
|
null;
|
|
96
64
|
this.projectOwner = opts.projectOwner ?? provider.projectOwner ?? null;
|
|
97
65
|
this.logger = opts.logger ?? ctx?.logger ?? console;
|
|
98
|
-
//
|
|
99
|
-
// Optional — when omitted, the cache resolves the framework-default
|
|
100
|
-
// `temp` root (Story #4252).
|
|
66
|
+
// Locates the meta cache's tempRoot; absent means the default `temp`.
|
|
101
67
|
this.config = opts.config ?? ctx?.config ?? undefined;
|
|
102
68
|
this._meta = null; // lazy-cached { projectId, fieldId, options: Map<name, id> }
|
|
103
|
-
//
|
|
104
|
-
// cache, so a GraphQL error against possibly-stale cached metadata can
|
|
105
|
-
// invalidate the disk entry and force a fresh resolve on the next flip
|
|
106
|
-
// (Story #4252).
|
|
69
|
+
// Disk-hydrated meta may be stale; a failed mutation then invalidates it.
|
|
107
70
|
this._metaFromDiskCache = false;
|
|
108
71
|
}
|
|
109
72
|
|
|
110
73
|
/**
|
|
111
|
-
* Sync a single issue to the column its `agent::*` labels imply. Returns a
|
|
112
|
-
* result descriptor (`synced | skipped | failed`) so callers can log
|
|
113
|
-
* without parsing errors.
|
|
114
|
-
*
|
|
115
74
|
* @param {number} issueId
|
|
116
75
|
* @param {string[]} labels
|
|
117
76
|
*/
|
|
@@ -122,19 +81,8 @@ export class ColumnSync {
|
|
|
122
81
|
}
|
|
123
82
|
|
|
124
83
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* Split out for the one caller whose target column cannot come from labels:
|
|
129
|
-
* a container Epic carries no `agent::*` label by construction, so
|
|
130
|
-
* {@link columnForLabels} returns `null` for it and `sync` can never move
|
|
131
|
-
* it. The Epic's column is derived from its children instead
|
|
132
|
-
* (`epic-rollup.js`) and handed here — which keeps that derivation from
|
|
133
|
-
* having to fabricate a label on the container just to reach the board, the
|
|
134
|
-
* one thing the container invariant forbids.
|
|
135
|
-
*
|
|
136
|
-
* Every skip path, the metadata cache and the stale-cache self-heal are
|
|
137
|
-
* shared with `sync` because they live here rather than in it.
|
|
84
|
+
* Set a column directly, without label derivation — for container Epics,
|
|
85
|
+
* which carry no `agent::*` label by invariant.
|
|
138
86
|
*
|
|
139
87
|
* @param {number} issueId
|
|
140
88
|
* @param {string} column Board column name (`Todo` | `In Progress` | `Done`).
|
|
@@ -177,12 +125,8 @@ export class ColumnSync {
|
|
|
177
125
|
},
|
|
178
126
|
);
|
|
179
127
|
} catch (err) {
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
// written (a stale projectId / fieldId / optionId). Invalidate the
|
|
183
|
-
// disk entry so the next flip re-resolves against the live board and
|
|
184
|
-
// self-heals (Story #4252). Re-throw so the caller's existing error
|
|
185
|
-
// handling (e.g. `syncProjectStatusColumn`'s warn) is preserved.
|
|
128
|
+
// Likely a reconfigured board: drop cached meta so the next flip
|
|
129
|
+
// self-heals, and re-throw for the caller's handling.
|
|
186
130
|
this.#invalidateMetaCache();
|
|
187
131
|
throw err;
|
|
188
132
|
}
|
|
@@ -190,9 +134,7 @@ export class ColumnSync {
|
|
|
190
134
|
}
|
|
191
135
|
|
|
192
136
|
/**
|
|
193
|
-
*
|
|
194
|
-
* the owner that `#loadMeta` resolves the board against so a cache hit and
|
|
195
|
-
* a live resolve agree on the same board identity.
|
|
137
|
+
* Cache key; same owner `#loadMeta` resolves against.
|
|
196
138
|
*
|
|
197
139
|
* @returns {{ owner: string|null, projectNumber: number|null }}
|
|
198
140
|
*/
|
|
@@ -204,11 +146,8 @@ export class ColumnSync {
|
|
|
204
146
|
}
|
|
205
147
|
|
|
206
148
|
/**
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
* board. Only fires when the current `_meta` came from the disk cache —
|
|
210
|
-
* a freshly-resolved entry that fails the mutation is a transient/live
|
|
211
|
-
* problem, not a stale-cache problem.
|
|
149
|
+
* Only disk-hydrated meta is invalidated; a fresh resolve that fails is a
|
|
150
|
+
* live problem, not a stale cache.
|
|
212
151
|
*/
|
|
213
152
|
#invalidateMetaCache() {
|
|
214
153
|
if (!this._metaFromDiskCache) return;
|
|
@@ -220,9 +159,8 @@ export class ColumnSync {
|
|
|
220
159
|
|
|
221
160
|
async #loadMeta() {
|
|
222
161
|
if (this._meta !== null) return this._meta || null;
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
// the cold CLI processes of a single-story delivery (Story #4252).
|
|
162
|
+
// Board meta is repo-invariant; the disk cache spares each cold CLI
|
|
163
|
+
// process the resolve round-trips.
|
|
226
164
|
const cachedBoard = this.#cacheBoard;
|
|
227
165
|
const cached = readProjectMetaCache({
|
|
228
166
|
owner: cachedBoard.owner,
|
|
@@ -235,18 +173,9 @@ export class ColumnSync {
|
|
|
235
173
|
return this._meta;
|
|
236
174
|
}
|
|
237
175
|
try {
|
|
238
|
-
//
|
|
239
|
-
// (organization → user → viewer) via the shared resolver so the
|
|
240
|
-
// org-owned path can't drift from `workflow-audit.js`. The Status
|
|
241
|
-
// single-select field is projected alongside the board id in one
|
|
242
|
-
// round-trip. (Story #4237; org-owner support extends the
|
|
243
|
-
// user/viewer ladder added in #3560.)
|
|
176
|
+
// Shared org → user → viewer resolver; Status field in one round-trip.
|
|
244
177
|
const project = await resolveProjectMeta({
|
|
245
178
|
provider: this.provider,
|
|
246
|
-
// Prefer the explicit `github.projectOwner`; fall back to the repo
|
|
247
|
-
// owner so an org-owned board still gets a login to scope
|
|
248
|
-
// `organization(login:)` / `user(login:)` by even when no separate
|
|
249
|
-
// projectOwner is configured. `viewer` is always the final rung.
|
|
250
179
|
owner: this.projectOwner ?? this.provider.owner ?? null,
|
|
251
180
|
projectNumber: this.projectNumber,
|
|
252
181
|
projectFields: `
|
|
@@ -269,9 +198,7 @@ export class ColumnSync {
|
|
|
269
198
|
fieldId: field.id,
|
|
270
199
|
options,
|
|
271
200
|
};
|
|
272
|
-
//
|
|
273
|
-
// cold flip reads it from disk instead of re-paying the resolve
|
|
274
|
-
// (Story #4252). Best-effort: a write failure never blocks the sync.
|
|
201
|
+
// Best-effort; a write failure never blocks the sync.
|
|
275
202
|
writeProjectMetaCache({
|
|
276
203
|
owner: cachedBoard.owner,
|
|
277
204
|
projectNumber: cachedBoard.projectNumber,
|
|
@@ -290,17 +217,8 @@ export class ColumnSync {
|
|
|
290
217
|
}
|
|
291
218
|
|
|
292
219
|
/**
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
* or `null` when the issue is not on the configured project, the
|
|
296
|
-
* Status field has no current value, or the metadata cannot be
|
|
297
|
-
* resolved.
|
|
298
|
-
*
|
|
299
|
-
* Story #2876 — used by `reassertStatusColumn` to detect drift
|
|
300
|
-
* between the orchestrator's intended column and the bot-rewritten
|
|
301
|
-
* column. The labels alone don't move when the bot overwrites
|
|
302
|
-
* Status — that's the bug class we defend against — so the
|
|
303
|
-
* drift-check MUST read the live Status, not the issue labels.
|
|
220
|
+
* Live Status column, or `null`. Drift checks must read this, not labels:
|
|
221
|
+
* the Projects bot rewrites Status without touching labels.
|
|
304
222
|
*
|
|
305
223
|
* @param {number} issueId
|
|
306
224
|
* @returns {Promise<string|null>}
|
|
@@ -336,14 +254,8 @@ export class ColumnSync {
|
|
|
336
254
|
}
|
|
337
255
|
|
|
338
256
|
async #getProjectItemId(issueId, projectId) {
|
|
339
|
-
// Walk
|
|
340
|
-
//
|
|
341
|
-
// paginated `node(projectId).items(first: 100)` and scanned for the
|
|
342
|
-
// issue number, which silently returned null on any board with >100
|
|
343
|
-
// items — the Mandrel board crossed that cliff at ~2,300 items, so
|
|
344
|
-
// every recent ticket's Status flip became a no-op. The by-issue path
|
|
345
|
-
// is O(1) per sync and has no pagination cliff (an issue is
|
|
346
|
-
// realistically never on more than a handful of boards at once).
|
|
257
|
+
// Walk issue → projectItems, not board → items: scanning board items
|
|
258
|
+
// hits a pagination cliff on large boards; an issue is on few boards.
|
|
347
259
|
const owner = this.provider.owner;
|
|
348
260
|
const repo = this.provider.repo;
|
|
349
261
|
if (!owner || !repo) return null;
|
|
@@ -1,49 +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 risk ({@link deriveStoryShape}).** The light path
|
|
14
|
-
* (`deliver-light`) reads a predicted footprint's **risk** — a migration
|
|
15
|
-
* paired with its consumers, and the `audit-rules.json` sensitive-path
|
|
16
|
-
* classes the footprint intersects — to decide whether a prompt may skip
|
|
17
|
-
* the Story-authoring ceremony. Effort is no longer an axis: Story #4764
|
|
18
|
-
* removed the artifact counts, and Story #5344 removed the declared
|
|
19
|
-
* effort ceilings that replaced them, because a prediction is a
|
|
20
|
-
* declaration and size is enforced against ground truth by the light
|
|
21
|
-
* path's diff backstop.
|
|
22
|
-
* 3. **Dispatch mode ({@link resolveStoryDispatchMode}).** `/mandrel-deliver`
|
|
23
|
-
* answers a different question from the route: may the engine run in the
|
|
24
|
-
* router's own session? Only a **single-Story run** may (Story #4736).
|
|
25
|
-
*
|
|
26
|
-
* Story #5312 deleted the plan-side half: the planner's authored lite claim
|
|
27
|
-
* (`--route-downgrade-reason`), the persist-time shape backstop that
|
|
28
|
-
* validated it, the `route::lite` hint label, and the
|
|
29
|
-
* `planning.complexityGate` knobs. Persist no longer routes; every Story
|
|
30
|
-
* lands through the same engine and the same close gates.
|
|
31
|
-
*
|
|
32
|
-
* The risk taxonomy is deliberately the one `review-depth.js` already
|
|
33
|
-
* applies to the landed diff at close (`deriveChangeLevel` over the
|
|
34
|
-
* `audit-rules.json` sensitive-path classes): **predicted footprint at
|
|
35
|
-
* dispatch, actual diff at close** — one taxonomy, two read points.
|
|
36
|
-
* Sensitivity always wins: a small change whose footprint intersects a
|
|
37
|
-
* sensitive-path class routes `full`, which keeps its deep code review
|
|
38
|
-
* (`review-depth.js`).
|
|
39
|
-
*
|
|
40
|
-
* The light path still produces a Story ticket, still lands via a PR to
|
|
41
|
-
* `main`, still runs every repo quality gate, and still honours
|
|
42
|
-
* `rules/security-baseline.md`. That is a property of
|
|
43
|
-
* `single-story-close.js`, which runs those gates regardless of route — the
|
|
44
|
-
* router cannot and does not switch them off. Story #5366 deleted the frozen
|
|
45
|
-
* `preserves` payload that used to restate it on every decision: nothing read
|
|
46
|
-
* it, and a claim attached to a decision is not the thing that enforces it.
|
|
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.
|
|
47
8
|
*
|
|
48
9
|
* @typedef {'lite'|'full'} ComplexityRoute
|
|
49
10
|
*/
|
|
@@ -53,37 +14,17 @@ import path from 'node:path';
|
|
|
53
14
|
import { extractChangePaths } from '../story-body/story-body.js';
|
|
54
15
|
import { deriveChangeLevel } from './review-depth.js';
|
|
55
16
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
* This module used to export a frozen shape-ceilings constant — declared kinds,
|
|
60
|
-
* a magnitude bucket, an uncertainty bucket, and a deployable span — which the
|
|
61
|
-
* light path judged a prompt's predicted footprint against. Two rounds of
|
|
62
|
-
* evidence retired them. Story #4764 had already removed the artifact counts
|
|
63
|
-
* (`maxChanges`, `maxAcceptance`) because cardinality is the wrong axis in both
|
|
64
|
-
* directions. Story #5313 then demoted the remaining four axes from a gate to a
|
|
65
|
-
* `warnings[]` entry, at which point they decided nothing at all: every one was
|
|
66
|
-
* SELF-DECLARED by the same agent asking to proceed, and an axis a caller sets
|
|
67
|
-
* and no one verifies is not a measurement. Story #5344 deleted them.
|
|
68
|
-
*
|
|
69
|
-
* What survives is what reads something other than the caller's own claim: the
|
|
70
|
-
* two absolute risk rules below (a migration paired with its consumers, and a
|
|
71
|
-
* footprint intersecting a registered sensitive-path class), derived from the
|
|
72
|
-
* predicted PATHS, and the diff-derived backstop that measures the actual
|
|
73
|
-
* change set
|
|
74
|
-
* ({@link module:lib/orchestration/light-suitability.checkLightDiffBackstop}).
|
|
75
|
-
* The backstop's `LIGHT_DIFF_CEILINGS` are now the only size block on the
|
|
76
|
-
* light path, and they are the only ceilings measured against ground truth.
|
|
77
|
-
*/
|
|
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.
|
|
78
20
|
|
|
79
21
|
/** Paths that are schema migrations rather than ordinary source. */
|
|
80
22
|
const MIGRATION_PATH_RE =
|
|
81
23
|
/(?:^|\/)(?:migrations?|migrate)(?:\/|$)|\.sql$|(?:^|\/)schema\.(?:prisma|rb)$/i;
|
|
82
24
|
|
|
83
25
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* 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.
|
|
87
28
|
*
|
|
88
29
|
* @param {string[]} paths
|
|
89
30
|
* @returns {boolean}
|
|
@@ -94,29 +35,10 @@ function spansMigrationAndConsumers(paths) {
|
|
|
94
35
|
}
|
|
95
36
|
|
|
96
37
|
/**
|
|
97
|
-
* Stable
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* The prose in `reasons[]` is written for a human reading a gate envelope and
|
|
102
|
-
* is free to be re-worded; a caller that must **branch** on *which* rule
|
|
103
|
-
* objected reads this code instead — keying that decision off reason text
|
|
104
|
-
* would make a copy-edit a routing change.
|
|
105
|
-
*
|
|
106
|
-
* Split two ways since Story #5344 deleted the ceiling rules
|
|
107
|
-
* (`change-kinds`, `magnitude`, `uncertainty`, `deployable-span`), and the
|
|
108
|
-
* grouping is the contract:
|
|
109
|
-
*
|
|
110
|
-
* - **Absolute rules** — `migration-span`, `sensitive-path`. Risk, not size,
|
|
111
|
-
* and derived from the predicted PATHS rather than a self-declared bucket.
|
|
112
|
-
* No re-slicing satisfies one.
|
|
113
|
-
* - **Unknown-footprint rejections** — `no-changes`, `unreadable-changes`,
|
|
114
|
-
* `glob-footprint`, `classification-unavailable`. Nothing was judged, so
|
|
115
|
-
* there is nothing to appeal. Story #5366 deleted `no-acceptance` with
|
|
116
|
-
* the `--acceptance` flag that was its only source: the flag clamped to a
|
|
117
|
-
* floor of one, so the zero-check behind this code could never fire.
|
|
118
|
-
*
|
|
119
|
-
* 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`.
|
|
120
42
|
*/
|
|
121
43
|
export const SHAPE_CODES = Object.freeze({
|
|
122
44
|
MIGRATION_SPAN: 'migration-span',
|
|
@@ -128,10 +50,7 @@ export const SHAPE_CODES = Object.freeze({
|
|
|
128
50
|
});
|
|
129
51
|
|
|
130
52
|
/**
|
|
131
|
-
*
|
|
132
|
-
* recorded reason for a `full` route. Neither reads a bucket the caller
|
|
133
|
-
* declared about itself — both are derived from the predicted paths, which is
|
|
134
|
-
* exactly why they survived the Story #5344 deletion of the effort ceilings.
|
|
53
|
+
* Absolute risk rules, in order; the first hit is the `full` reason.
|
|
135
54
|
*
|
|
136
55
|
* @type {ReadonlyArray<{
|
|
137
56
|
* code: string,
|
|
@@ -155,9 +74,6 @@ const RISK_RULES = Object.freeze([
|
|
|
155
74
|
]);
|
|
156
75
|
|
|
157
76
|
/**
|
|
158
|
-
* First absolute risk rule the footprint violates as a `{ code, reason }`
|
|
159
|
-
* pair, or `null` when it clears them all.
|
|
160
|
-
*
|
|
161
77
|
* @param {object} shape
|
|
162
78
|
* @returns {{ code: string, reason: string }|null}
|
|
163
79
|
*/
|
|
@@ -171,8 +87,7 @@ function firstRiskViolation(shape) {
|
|
|
171
87
|
}
|
|
172
88
|
|
|
173
89
|
/**
|
|
174
|
-
* Count
|
|
175
|
-
* each enumerated line is one predicted artifact.
|
|
90
|
+
* Count enumerated lines (`- `, `* `, `1. `) in a seed.
|
|
176
91
|
*
|
|
177
92
|
* @param {string} text
|
|
178
93
|
* @returns {number}
|
|
@@ -188,9 +103,7 @@ function countSeedArtifacts(text) {
|
|
|
188
103
|
const MAX_PREDICTED_PATHS = 50;
|
|
189
104
|
|
|
190
105
|
/**
|
|
191
|
-
*
|
|
192
|
-
* free-form seed — the predicted footprint the sensitive-path and repo-state
|
|
193
|
-
* signals classify.
|
|
106
|
+
* Path-like tokens (a `/` plus a dotted extension) in a seed.
|
|
194
107
|
*
|
|
195
108
|
* @param {string} text
|
|
196
109
|
* @returns {string[]} Deduplicated, in order of first appearance.
|
|
@@ -208,25 +121,10 @@ function extractPredictedPaths(text) {
|
|
|
208
121
|
}
|
|
209
122
|
|
|
210
123
|
/**
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
* hits and the `planning.complexityGate` echo that used to ride alongside).
|
|
216
|
-
*
|
|
217
|
-
* - `artifactCount` — enumerated items in the seed, a rough width
|
|
218
|
-
* signal for the operator's eye only.
|
|
219
|
-
* - `predictedPaths` — path-like tokens the seed names, in order of
|
|
220
|
-
* first appearance (capped).
|
|
221
|
-
* - `repoState` — which predicted paths exist in the repo (existing
|
|
222
|
-
* paths predict refactors; missing predict
|
|
223
|
-
* creates).
|
|
224
|
-
* - `sensitivePathClasses` — `audit-rules.json` sensitive-path classes the
|
|
225
|
-
* predicted footprint intersects (the same
|
|
226
|
-
* taxonomy close applies to the landed diff).
|
|
227
|
-
*
|
|
228
|
-
* Total: never throws; a failed classification degrades to an empty class
|
|
229
|
-
* 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.
|
|
230
128
|
*
|
|
231
129
|
* @param {{
|
|
232
130
|
* seedText?: string,
|
|
@@ -284,10 +182,6 @@ export function buildComplexitySignals({
|
|
|
284
182
|
}
|
|
285
183
|
|
|
286
184
|
/**
|
|
287
|
-
* Assemble one decision object. Module-level rather than a closure inside
|
|
288
|
-
* {@link deriveStoryShape}, so each rejection family below can build its own
|
|
289
|
-
* verdict through one shape.
|
|
290
|
-
*
|
|
291
185
|
* @param {'lite'|'full'} route
|
|
292
186
|
* @param {string|null} code
|
|
293
187
|
* @param {string} reason
|
|
@@ -299,10 +193,8 @@ function decide(route, code, reason, shape = null) {
|
|
|
299
193
|
}
|
|
300
194
|
|
|
301
195
|
/**
|
|
302
|
-
* Read the
|
|
303
|
-
*
|
|
304
|
-
* families {@link SHAPE_CODES} groups. Nothing has been judged at this point,
|
|
305
|
-
* so neither rejection carries a shape.
|
|
196
|
+
* Read the footprint into path entries, or a shape-less rejection when it
|
|
197
|
+
* cannot be read.
|
|
306
198
|
*
|
|
307
199
|
* @param {unknown} changes
|
|
308
200
|
* @returns {{ entries: Array<{ path: string, isGlob?: boolean }>|null, rejection: object|null }}
|
|
@@ -333,14 +225,7 @@ function readFootprintEntries(changes) {
|
|
|
333
225
|
}
|
|
334
226
|
|
|
335
227
|
/**
|
|
336
|
-
*
|
|
337
|
-
* rule is reached: an unknowable width (a glob). Returns `null` when the
|
|
338
|
-
* footprint is judgeable.
|
|
339
|
-
*
|
|
340
|
-
* It used to have a sibling — a zero-length acceptance list — which Story
|
|
341
|
-
* #5366 removed along with the `--acceptance` flag that fed it. The flag
|
|
342
|
-
* clamped its own value to a floor of one, so the branch was unreachable from
|
|
343
|
-
* the only caller in the tree.
|
|
228
|
+
* A glob footprint has unknowable width; `null` when judgeable.
|
|
344
229
|
*
|
|
345
230
|
* @param {Array<{ isGlob?: boolean }>} entries
|
|
346
231
|
* @param {object} shape
|
|
@@ -359,9 +244,6 @@ function unjudgeableFootprintRejection(entries, shape) {
|
|
|
359
244
|
}
|
|
360
245
|
|
|
361
246
|
/**
|
|
362
|
-
* Assemble the risk shape of a footprint — the evidence
|
|
363
|
-
* {@link deriveStoryShape} decides on and carries on its result.
|
|
364
|
-
*
|
|
365
247
|
* @param {{
|
|
366
248
|
* paths: string[],
|
|
367
249
|
* sensitiveClasses: string[],
|
|
@@ -381,31 +263,11 @@ function buildRiskShape({ paths, sensitiveClasses }) {
|
|
|
381
263
|
}
|
|
382
264
|
|
|
383
265
|
/**
|
|
384
|
-
*
|
|
385
|
-
*
|
|
386
|
-
*
|
|
387
|
-
*
|
|
388
|
-
*
|
|
389
|
-
*
|
|
390
|
-
* `lite` requires:
|
|
391
|
-
*
|
|
392
|
-
* - a declared, parseable, glob-free `changes[]` footprint — width is not
|
|
393
|
-
* counted, but an unknown footprint cannot be classified for risk;
|
|
394
|
-
* - no migration-with-consumers span;
|
|
395
|
-
* - a footprint intersecting **no** sensitive-path class
|
|
396
|
-
* (`deriveChangeLevel`, the taxonomy close applies to the landed diff).
|
|
397
|
-
* Sensitivity always wins (AC-6): a sensitive footprint routes `full`
|
|
398
|
-
* however small or mechanical, which keeps the deep code review via
|
|
399
|
-
* `review-depth.js#resolveDepth`. Since Story #5343 it does NOT also buy a
|
|
400
|
-
* fresh acceptance critic — that owner follows the ceremony profile.
|
|
401
|
-
*
|
|
402
|
-
* **Size is not a rule here.** It was, and Story #5344 removed it: every size
|
|
403
|
-
* axis was a bucket the caller declared about its own request, and the light
|
|
404
|
-
* path's diff backstop measures the real change set afterwards. What is left
|
|
405
|
-
* reads the predicted paths, which is evidence.
|
|
406
|
-
*
|
|
407
|
-
* Everything else — an unknown/undeclared footprint or an unreadable
|
|
408
|
-
* sensitive-path manifest — fails toward `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.
|
|
409
271
|
*
|
|
410
272
|
* @param {{
|
|
411
273
|
* changes?: unknown,
|
|
@@ -417,9 +279,7 @@ function buildRiskShape({ paths, sensitiveClasses }) {
|
|
|
417
279
|
* reasons: string[],
|
|
418
280
|
* code: string|null,
|
|
419
281
|
* shape: ReturnType<typeof buildRiskShape>|null,
|
|
420
|
-
* }}
|
|
421
|
-
* rejected the footprint (`null` on `lite`) — the field a caller branches
|
|
422
|
-
* on, since `reasons[]` is human prose and free to be re-worded.
|
|
282
|
+
* }}
|
|
423
283
|
*/
|
|
424
284
|
export function deriveStoryShape({
|
|
425
285
|
changes,
|
|
@@ -446,9 +306,7 @@ export function deriveStoryShape({
|
|
|
446
306
|
}
|
|
447
307
|
|
|
448
308
|
if (level !== 'low') {
|
|
449
|
-
//
|
|
450
|
-
// manifest / failed selector): there is no evidence the footprint is
|
|
451
|
-
// non-sensitive, and a classification failure must never buy lite.
|
|
309
|
+
// Classification failed; that must never buy lite.
|
|
452
310
|
return decide(
|
|
453
311
|
'full',
|
|
454
312
|
SHAPE_CODES.CLASSIFICATION_UNAVAILABLE,
|
|
@@ -466,49 +324,19 @@ export function deriveStoryShape({
|
|
|
466
324
|
}
|
|
467
325
|
|
|
468
326
|
/**
|
|
469
|
-
* Decide
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
*
|
|
474
|
-
*
|
|
475
|
-
*
|
|
476
|
-
*
|
|
477
|
-
*
|
|
478
|
-
*
|
|
479
|
-
* bench work) for nothing.
|
|
480
|
-
*
|
|
481
|
-
* **Shape cannot grant it (Story #4829).** The shape read used to return
|
|
482
|
-
* `inline` for any lite-shaped body in a multi-Story run, inheriting no
|
|
483
|
-
* topology guard. Measured twice on 2026-07-29: a two-Story and a three-Story
|
|
484
|
-
* run came back `inline` for *every* Story while `stories-wave-tick.js`
|
|
485
|
-
* reported the whole set ready under a concurrency cap of five — a router
|
|
486
|
-
* following both signals literally runs several engines over one session and
|
|
487
|
-
* one checkout, the precise hazard the sub-agent path exists to prevent.
|
|
488
|
-
*
|
|
489
|
-
* **So this function reads only `storyCount` (Story #5006).** #4829 left the
|
|
490
|
-
* body parse, the shape derivation, the `route::lite` hint note and the
|
|
491
|
-
* `planning.complexityGate.enabled` branch in place to populate a `route`
|
|
492
|
-
* field for reporting — but the sole consumer, `resolve-stories.js`, reads
|
|
493
|
-
* `.mode` and discards the rest, so every one of those inputs was a parse
|
|
494
|
-
* whose result nothing could act on. A caller that wants the shape calls
|
|
495
|
-
* {@link deriveStoryShape} directly, as the light path and plan-persist do.
|
|
496
|
-
*
|
|
497
|
-
* Inline execution removes model-side fan-out only — it changes **where** the
|
|
498
|
-
* engine runs, never **what** runs. Every deterministic
|
|
499
|
-
* `single-story-close.js` gate, the PR to `main`, and the
|
|
500
|
-
* `story-deliver-terminal` envelope are identical in both modes; see the
|
|
501
|
-
* module header's non-negotiables.
|
|
502
|
-
*
|
|
503
|
-
* @param {{ storyCount?: unknown }} [args] `storyCount` is the number of
|
|
504
|
-
* Stories the invoking `/mandrel-deliver` run resolved. Omitted (or not exactly 1)
|
|
505
|
-
* means the run cannot be shown sibling-free and therefore dispatches as a
|
|
506
|
-
* 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.
|
|
507
337
|
* @returns {{ mode: 'inline'|'subagent', reasons: string[] }}
|
|
508
338
|
*/
|
|
509
339
|
export function resolveStoryDispatchMode({ storyCount } = {}) {
|
|
510
|
-
// The ONLY `inline` exit in this function, and the guard is the whole
|
|
511
|
-
// contract: an inline verdict must mean the engine can actually run inline.
|
|
512
340
|
if (storyCount === 1) {
|
|
513
341
|
return {
|
|
514
342
|
mode: 'inline',
|