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,52 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* - `warn`: recoverable issue the operator should notice.
|
|
7
|
-
* - `error`: non-fatal failure; caller continues. Use when `throw` would
|
|
8
|
-
* be too loud (e.g. best-effort cleanup paths).
|
|
9
|
-
* - `fatal`: unrecoverable; exits the process. Use only at CLI
|
|
10
|
-
* boundaries, never inside library code.
|
|
11
|
-
*
|
|
12
|
-
* Level is resolved **lazily on every emit** from `AGENT_LOG_LEVEL` (or a
|
|
13
|
-
* `setLevel` override). Resolving per emit — rather than once at module
|
|
14
|
-
* load — lets tests exercise every level branch in-process via `setLevel`
|
|
15
|
-
* or a live `AGENT_LOG_LEVEL` flip, without spawning a child process per
|
|
16
|
-
* level (Story #3329):
|
|
17
|
-
*
|
|
18
|
-
* - `silent` → only `fatal` emits.
|
|
19
|
-
* - `info` → default. Emits `info` and above; suppresses `debug`.
|
|
20
|
-
* - `verbose` → emits everything (including `debug`).
|
|
2
|
+
* `error` is non-fatal (the caller continues); `fatal` exits and belongs only
|
|
3
|
+
* at CLI boundaries. The level (`silent` = fatal only, `info` default,
|
|
4
|
+
* `verbose` adds debug) is resolved from `AGENT_LOG_LEVEL` on every emit, not
|
|
5
|
+
* at load, so tests can flip it in-process.
|
|
21
6
|
*/
|
|
22
7
|
/**
|
|
23
|
-
*
|
|
24
|
-
* resolves to `info`.
|
|
8
|
+
* Anything else resolves to `info`.
|
|
25
9
|
*
|
|
26
10
|
* @type {ReadonlySet<string>}
|
|
27
11
|
*/
|
|
28
12
|
const VALID_LEVELS = Object.freeze(new Set(['silent', 'info', 'verbose']));
|
|
29
13
|
|
|
30
14
|
/**
|
|
31
|
-
*
|
|
32
|
-
* `AGENT_LOG_LEVEL` from the environment on each resolve". `setLevel`
|
|
33
|
-
* pins this so tests (and embedders) can exercise every level branch
|
|
34
|
-
* in-process without spawning a child whose module-load reads a different
|
|
35
|
-
* env var. `setLevel(null)` clears the pin and restores env-driven
|
|
36
|
-
* resolution.
|
|
15
|
+
* `null` means read `AGENT_LOG_LEVEL` on each resolve.
|
|
37
16
|
*
|
|
38
17
|
* @type {string|null}
|
|
39
18
|
*/
|
|
40
19
|
let levelOverride = null;
|
|
41
20
|
|
|
42
21
|
/**
|
|
43
|
-
* Resolve the active log level lazily. Honors an explicit `setLevel`
|
|
44
|
-
* override first, otherwise reads `AGENT_LOG_LEVEL` from the environment
|
|
45
|
-
* on every call. Resolving per emit (rather than once at module load)
|
|
46
|
-
* means a test can flip `AGENT_LOG_LEVEL` — or call `setLevel` — and see
|
|
47
|
-
* the level branches react in-process, without a child process per level
|
|
48
|
-
* (Story #3329).
|
|
49
|
-
*
|
|
50
22
|
* @returns {'silent'|'info'|'verbose'}
|
|
51
23
|
*/
|
|
52
24
|
export function resolveLevel() {
|
|
@@ -59,11 +31,8 @@ export function resolveLevel() {
|
|
|
59
31
|
}
|
|
60
32
|
|
|
61
33
|
/**
|
|
62
|
-
* Pin the
|
|
63
|
-
*
|
|
64
|
-
* or `null` to clear the pin and restore env-driven resolution. An
|
|
65
|
-
* unrecognized non-null value throws so callers cannot silently pin a
|
|
66
|
-
* level that resolves to `info`.
|
|
34
|
+
* Pin the level (`null` clears it). An unrecognized value throws rather than
|
|
35
|
+
* silently pinning `info`.
|
|
67
36
|
*
|
|
68
37
|
* @param {('silent'|'info'|'verbose')|null} level
|
|
69
38
|
* @returns {void}
|
|
@@ -89,24 +58,12 @@ function infoEnabled() {
|
|
|
89
58
|
return resolveLevel() === 'info' || debugEnabled();
|
|
90
59
|
}
|
|
91
60
|
|
|
92
|
-
//
|
|
93
|
-
// stdout branch of `createProgress` (defaults to console.log). `warn` already
|
|
94
|
-
// uses console.warn which Node routes to stderr, but we expose a sink for it
|
|
95
|
-
// too so a single `routeAllOutputToStderr()` call gives a uniform guarantee
|
|
96
|
-
// to callers that "no Logger output lands on stdout" (Story #2278).
|
|
61
|
+
// Swappable so `routeAllOutputToStderr()` can guarantee nothing hits stdout.
|
|
97
62
|
let infoSink = (msg) => console.log(msg);
|
|
98
63
|
let warnSink = (msg) => console.warn(msg);
|
|
99
64
|
let progressStdoutSink = (msg) => console.log(msg);
|
|
100
65
|
|
|
101
|
-
/**
|
|
102
|
-
* Flip every Logger output that can land on stdout (`info`, `warn`, and the
|
|
103
|
-
* stdout branch of `createProgress`) to stderr for the lifetime of the
|
|
104
|
-
* process. Idempotent. Use when stdout is reserved for a structured payload
|
|
105
|
-
* — for example the JSON envelope emitted by
|
|
106
|
-
* `plan-context.js`, where any interleaved
|
|
107
|
-
* `[Orchestrator] ℹ️ …` log line corrupts the captured file
|
|
108
|
-
* (Story #2278).
|
|
109
|
-
*/
|
|
66
|
+
/** For processes whose stdout is a structured payload. Idempotent. */
|
|
110
67
|
export function routeAllOutputToStderr() {
|
|
111
68
|
infoSink = (msg) => console.error(msg);
|
|
112
69
|
warnSink = (msg) => console.error(msg);
|
|
@@ -114,11 +71,7 @@ export function routeAllOutputToStderr() {
|
|
|
114
71
|
}
|
|
115
72
|
|
|
116
73
|
export const Logger = {
|
|
117
|
-
/**
|
|
118
|
-
* The currently-resolved level. A getter (not a frozen snapshot) so it
|
|
119
|
-
* reflects `setLevel` overrides and live `AGENT_LOG_LEVEL` changes —
|
|
120
|
-
* reading `Logger.level` always returns what the next emit will use.
|
|
121
|
-
*/
|
|
74
|
+
/** A getter, so it always reports what the next emit will use. */
|
|
122
75
|
get level() {
|
|
123
76
|
return resolveLevel();
|
|
124
77
|
},
|
|
@@ -155,16 +108,8 @@ export const Logger = {
|
|
|
155
108
|
};
|
|
156
109
|
|
|
157
110
|
/**
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
* this as the default-argument value when a function accepts an optional
|
|
161
|
-
* logger; consumers that don't pass one get a uniform shape without each
|
|
162
|
-
* call site re-declaring its own inline literal.
|
|
163
|
-
*
|
|
164
|
-
* Deliberately omits `fatal` so that any code path tempted to call
|
|
165
|
-
* `logger.fatal(...)` against the no-op fails loudly rather than silently
|
|
166
|
-
* skipping a process-exit that would otherwise have surfaced an
|
|
167
|
-
* unrecoverable error.
|
|
111
|
+
* Default for an optional logger. Omits `fatal` deliberately: a silenced
|
|
112
|
+
* process-exit would hide an unrecoverable error, so calling it throws.
|
|
168
113
|
*/
|
|
169
114
|
export const NOOP_LOGGER = Object.freeze({
|
|
170
115
|
silent: true,
|
|
@@ -174,14 +119,7 @@ export const NOOP_LOGGER = Object.freeze({
|
|
|
174
119
|
error() {},
|
|
175
120
|
});
|
|
176
121
|
|
|
177
|
-
/**
|
|
178
|
-
* Frozen logger that routes every level to **stderr**. Use this when a
|
|
179
|
-
* caller's stdout is a structured payload (e.g. the authoring-context JSON
|
|
180
|
-
* envelope from `plan-context.js`) and any
|
|
181
|
-
* progress/telemetry log must not interleave with the payload. Mirrors the
|
|
182
|
-
* `{ info, warn, error, debug }` shape that the orchestration helpers
|
|
183
|
-
* accept via optional `logger` arguments.
|
|
184
|
-
*/
|
|
122
|
+
/** Every level to stderr, for callers whose stdout is a structured payload. */
|
|
185
123
|
export const STDERR_LOGGER = Object.freeze({
|
|
186
124
|
debug: (message) => console.error(message),
|
|
187
125
|
info: (message) => console.error(message),
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Strictly read-only and strictly offline: it reads committed baselines, the
|
|
6
|
-
* resolved config, git history, the static import graph, and any friction
|
|
7
|
-
* ledger it finds. It never writes under `baselines/`, never refreshes a
|
|
8
|
-
* baseline, and never runs a test, coverage, or mutation suite — the whole
|
|
9
|
-
* point is that a baseline review costs a file read, not a CI run.
|
|
10
|
-
*
|
|
11
|
-
* Findings are evidence, not a verdict: assembling the envelope is success,
|
|
12
|
-
* however alarming its contents, so the CLI exits 0 whenever it got this far.
|
|
13
|
-
* Judgment belongs to the lens that reads the envelope.
|
|
2
|
+
* Assembles the `/audit-baselines` evidence envelope. Read-only and offline:
|
|
3
|
+
* never writes baselines or runs a suite — a review costs a file read, not a
|
|
4
|
+
* CI run. Evidence, not a verdict: assembling it is success (exit 0).
|
|
14
5
|
*
|
|
15
6
|
* @module lib/audit-baselines/engine
|
|
16
7
|
*/
|
|
@@ -31,19 +22,16 @@ import {
|
|
|
31
22
|
readFriction,
|
|
32
23
|
} from './weights.js';
|
|
33
24
|
|
|
34
|
-
/**
|
|
25
|
+
/** Matches the shipped schema's const. */
|
|
35
26
|
const ENVELOPE_KIND = 'audit-baselines-envelope';
|
|
36
27
|
|
|
37
|
-
/**
|
|
28
|
+
/** Bump on any breaking shape change. */
|
|
38
29
|
const ENVELOPE_SCHEMA_VERSION = '1';
|
|
39
30
|
|
|
40
|
-
/** Cap on emitted hotspot clusters, independent of the per-gate `topN`. */
|
|
41
31
|
export const DEFAULT_HOTSPOT_LIMIT = 50;
|
|
42
32
|
|
|
43
33
|
/**
|
|
44
|
-
*
|
|
45
|
-
* abort the run — an unreadable config still leaves the baseline files
|
|
46
|
-
* themselves readable at their default paths.
|
|
34
|
+
* A broken `.agentrc.json` must not abort: default baseline paths still read.
|
|
47
35
|
*
|
|
48
36
|
* @param {string} cwd
|
|
49
37
|
* @returns {{ quality: object, configError: string | null }}
|
|
@@ -57,11 +45,8 @@ function resolveQualityBlock(cwd) {
|
|
|
57
45
|
}
|
|
58
46
|
|
|
59
47
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* anchors to whichever checkout the current process sits in, which is the
|
|
63
|
-
* right answer for a writer and the wrong one here: an engine pointed at
|
|
64
|
-
* another repo with `--cwd` must read that repo's ledger, not this one's.
|
|
48
|
+
* Anchored to the analysed repo (`--cwd`), not the process's checkout as
|
|
49
|
+
* `resolvedTempRoot()` would be.
|
|
65
50
|
*
|
|
66
51
|
* @param {string} cwd
|
|
67
52
|
* @returns {string}
|
|
@@ -71,17 +56,13 @@ function tempRootFor(cwd) {
|
|
|
71
56
|
try {
|
|
72
57
|
relative = tempRootFrom(resolveConfig({ cwd }));
|
|
73
58
|
} catch {
|
|
74
|
-
// Unreadable config
|
|
59
|
+
// Unreadable config: probe the default root.
|
|
75
60
|
}
|
|
76
61
|
if (path.isAbsolute(relative)) return relative;
|
|
77
62
|
return path.join(mainCheckoutRoot(cwd) ?? cwd, relative);
|
|
78
63
|
}
|
|
79
64
|
|
|
80
65
|
/**
|
|
81
|
-
* Run the engine and return the envelope object. Pure with respect to the
|
|
82
|
-
* filesystem apart from the reads named in the module docstring — writing
|
|
83
|
-
* the result is the caller's job.
|
|
84
|
-
*
|
|
85
66
|
* @param {{
|
|
86
67
|
* cwd: string,
|
|
87
68
|
* topN?: number,
|
|
@@ -138,11 +119,10 @@ export function runEngine({
|
|
|
138
119
|
}
|
|
139
120
|
|
|
140
121
|
/**
|
|
141
|
-
*
|
|
142
|
-
* read in a terminal, and never carrying a row set.
|
|
122
|
+
* Terminal-sized stdout summary; never carries a row set.
|
|
143
123
|
*
|
|
144
124
|
* @param {object} envelope
|
|
145
|
-
* @param {string} outPath
|
|
125
|
+
* @param {string} outPath
|
|
146
126
|
* @returns {object}
|
|
147
127
|
*/
|
|
148
128
|
export function summarize(envelope, outPath) {
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* The closed `delivery.quality.gates` kinds and the out-of-band ratchet
|
|
5
|
-
* baselines are one surface, and an engine that walks only the first silently
|
|
6
|
-
* drops the second. This module owns that walk and the file universe an
|
|
7
|
-
* `ignoreGlobs` entry is checked against; [`surface-entry.js`](surface-entry.js)
|
|
8
|
-
* turns each kind into its health report.
|
|
2
|
+
* Walks both halves of the baseline surface (gates and ratchets).
|
|
9
3
|
*
|
|
10
4
|
* @module lib/audit-baselines/gate-surface
|
|
11
5
|
*/
|
|
@@ -16,9 +10,7 @@ import { listFilesUnder, readJsonFile } from './read.js';
|
|
|
16
10
|
import { surfaceEntryFor } from './surface-entry.js';
|
|
17
11
|
|
|
18
12
|
/**
|
|
19
|
-
*
|
|
20
|
-
* file universe an `ignoreGlobs` entry is checked against — a glob that
|
|
21
|
-
* matches nothing inside the dirs its own gate scans is dead weight.
|
|
13
|
+
* The file universe `ignoreGlobs` are checked against.
|
|
22
14
|
*
|
|
23
15
|
* @param {object | null | undefined} quality
|
|
24
16
|
* @returns {string[]}
|
|
@@ -34,15 +26,9 @@ function declaredTargetDirs(quality) {
|
|
|
34
26
|
}
|
|
35
27
|
|
|
36
28
|
/**
|
|
37
|
-
* Walk both halves of the gate surface — the closed `delivery.quality.gates`
|
|
38
|
-
* kinds and the out-of-band ratchet baselines — and report each instrument's
|
|
39
|
-
* health.
|
|
40
|
-
*
|
|
41
29
|
* @param {{ cwd: string, quality: object, now?: Date, run?: Function }} args
|
|
42
|
-
* `run` overrides the git spawn; `staleness.js` owns the real default.
|
|
43
30
|
* @returns {{ entries: object[], baselines: Map<string, object|null> }}
|
|
44
|
-
* `baselines`
|
|
45
|
-
* and headroom sections never re-read a 650KB file off disk.
|
|
31
|
+
* `baselines` is carried forward so later sections never re-read from disk.
|
|
46
32
|
*/
|
|
47
33
|
export function buildGateSurface({ cwd, quality, now = new Date(), run }) {
|
|
48
34
|
const files = declaredTargetDirs(quality).flatMap((dir) =>
|
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* A floor set far from reality is a gate that cannot fail. Headroom is the
|
|
6
|
-
* distance the measurement could still drift before the gate notices, and it
|
|
7
|
-
* is the direct input to the only remediation this lens ever recommends:
|
|
8
|
-
* tighten the floor to what the repo already achieves.
|
|
9
|
-
*
|
|
10
|
-
* Both sides come from the repository, never from this module: the floor
|
|
11
|
-
* from `resolveQuality()` over `.agentrc.json` (so a consumer's own floors
|
|
12
|
-
* are the ones reported), and the measurement from the committed baseline's
|
|
13
|
-
* whole-repo rollup. Polarity comes from `axisDirection` in the gate's own
|
|
14
|
-
* floors phase, so "better" always means the same thing here as it does when
|
|
15
|
-
* `check-baselines.js` decides pass or fail.
|
|
2
|
+
* Slack between each configured floor and the measured rollup — a floor far
|
|
3
|
+
* from reality is a gate that cannot fail. Polarity comes from the gate's own
|
|
4
|
+
* `axisDirection`, so "better" means what `check-baselines.js` means.
|
|
16
5
|
*
|
|
17
6
|
* @module lib/audit-baselines/headroom
|
|
18
7
|
*/
|
|
@@ -21,8 +10,7 @@ import { axisDirection } from '../orchestration/check-baselines/phases/floors.js
|
|
|
21
10
|
import { rollupOf } from './kinds.js';
|
|
22
11
|
|
|
23
12
|
/**
|
|
24
|
-
*
|
|
25
|
-
* good side of it. Null when the baseline carries no value for the axis.
|
|
13
|
+
* Positive on the good side of the floor, negative when breached.
|
|
26
14
|
*
|
|
27
15
|
* @param {number | undefined} measured
|
|
28
16
|
* @param {number} floor
|
|
@@ -35,8 +23,6 @@ function headroomFor(measured, floor, direction) {
|
|
|
35
23
|
}
|
|
36
24
|
|
|
37
25
|
/**
|
|
38
|
-
* Build the `headroom[]` section across every configured gate kind.
|
|
39
|
-
*
|
|
40
26
|
* @param {{
|
|
41
27
|
* kinds: string[],
|
|
42
28
|
* quality: object,
|
|
@@ -60,8 +46,6 @@ export function buildHeadroom({ kinds, quality, baselines }) {
|
|
|
60
46
|
floor,
|
|
61
47
|
measured: typeof measured === 'number' ? measured : null,
|
|
62
48
|
direction,
|
|
63
|
-
// Positive headroom = the measurement is on the good side of the
|
|
64
|
-
// floor by this much; negative = the floor is already breached.
|
|
65
49
|
headroom: headroomFor(measured, floor, direction),
|
|
66
50
|
});
|
|
67
51
|
}
|
|
@@ -1,24 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* (
|
|
4
|
-
*
|
|
5
|
-
* The signal a baseline review is looking for is *convergence*: the file that
|
|
6
|
-
* is simultaneously a CRAP outlier, a maintainability outlier, and a
|
|
7
|
-
* duplication outlier is a different kind of problem from three unrelated
|
|
8
|
-
* files each bad at one thing. Reading the baselines one at a time cannot see
|
|
9
|
-
* it, because each gate's own top-20 is a different list.
|
|
10
|
-
*
|
|
11
|
-
* So severity **adds across gate memberships** and the three cost
|
|
12
|
-
* multipliers apply to the sum. Two gate memberships of severity s therefore
|
|
13
|
-
* outrank one membership of severity s at equal churn, centrality, and
|
|
14
|
-
* friction — which is the ranking property this section exists to provide.
|
|
2
|
+
* Per-file clusters of per-gate outliers. Severity adds across gate
|
|
3
|
+
* memberships before the cost multipliers apply, so convergence (one file bad
|
|
4
|
+
* on several gates) outranks a single membership.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/audit-baselines/hotspots
|
|
17
7
|
*/
|
|
18
8
|
|
|
19
9
|
/**
|
|
20
|
-
* Group per-gate outlier rows by cluster id and rank them.
|
|
21
|
-
*
|
|
22
10
|
* @param {{
|
|
23
11
|
* outliers: Array<object>,
|
|
24
12
|
* weightsFor: (id: string) => {
|
|
@@ -1,31 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Mandrel's baseline surface is not one list. `delivery.quality.gates` is a
|
|
6
|
-
* **closed** AJV schema of eight kinds, enforced by `check-baselines.js`.
|
|
7
|
-
* Alongside it sit out-of-band **ratchet** baselines — dead exports (two
|
|
8
|
-
* passes), import cycles, context budget — which no gate block declares and
|
|
9
|
-
* only the CI baselines job runs. An engine that walks one half and calls it
|
|
10
|
-
* "the baselines" silently drops the other; both halves are enumerated here.
|
|
11
|
-
*
|
|
12
|
-
* `GATE_KINDS` is derived from `GATES_SCHEMA` rather than re-typed, so a
|
|
13
|
-
* ninth gate kind landing in the schema reaches this engine automatically.
|
|
2
|
+
* Both halves of the baseline surface (gate kinds and out-of-band ratchets)
|
|
3
|
+
* and how to read rows from each.
|
|
14
4
|
*
|
|
15
5
|
* @module lib/audit-baselines/kinds
|
|
16
6
|
*/
|
|
17
7
|
|
|
18
8
|
import { GATES_SCHEMA } from '../config/gates/index.js';
|
|
19
9
|
|
|
20
|
-
/**
|
|
10
|
+
/** Derived from the schema so a new gate kind arrives automatically. */
|
|
21
11
|
export const GATE_KINDS = Object.freeze(
|
|
22
12
|
Object.keys(GATES_SCHEMA.properties).sort(),
|
|
23
13
|
);
|
|
24
14
|
|
|
25
|
-
/**
|
|
26
|
-
* Out-of-band ratchet baselines: committed under `baselines/` and enforced
|
|
27
|
-
* only by the CI baselines job, never by `check-baselines.js`.
|
|
28
|
-
*/
|
|
15
|
+
/** Enforced only by the CI baselines job, never by `check-baselines.js`. */
|
|
29
16
|
const RATCHET_KINDS = Object.freeze([
|
|
30
17
|
'arch-cycles',
|
|
31
18
|
'context-budget',
|
|
@@ -34,13 +21,10 @@ const RATCHET_KINDS = Object.freeze([
|
|
|
34
21
|
'dead-exports-production',
|
|
35
22
|
]);
|
|
36
23
|
|
|
37
|
-
/** Every kind the engine walks, gates first then ratchets. */
|
|
38
24
|
export const ALL_KINDS = Object.freeze([...GATE_KINDS, ...RATCHET_KINDS]);
|
|
39
25
|
|
|
40
26
|
/**
|
|
41
|
-
*
|
|
42
|
-
* default layout. Never hardcodes a consumer's location: a repo that moved
|
|
43
|
-
* `baselines/crap.json` via `gates.crap.baselinePath` is followed.
|
|
27
|
+
* Honours `gates.<kind>.baselinePath`, else `baselines/<kind>.json`.
|
|
44
28
|
*
|
|
45
29
|
* @param {string} kind
|
|
46
30
|
* @param {object | null | undefined} quality resolved `delivery.quality`
|
|
@@ -55,9 +39,8 @@ export function baselinePathFor(kind, quality) {
|
|
|
55
39
|
}
|
|
56
40
|
|
|
57
41
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* different keys, so they fold into one row set rather than three.
|
|
42
|
+
* All three `context-budget.json` sections measure bytes, so they fold into
|
|
43
|
+
* one row set.
|
|
61
44
|
*
|
|
62
45
|
* @param {object} baseline
|
|
63
46
|
* @returns {Array<{ id: string, value: number }>}
|
|
@@ -79,8 +62,7 @@ function contextBudgetRows(baseline) {
|
|
|
79
62
|
}
|
|
80
63
|
|
|
81
64
|
/**
|
|
82
|
-
*
|
|
83
|
-
* three cycles is a worse architectural hotspot than one in a single cycle.
|
|
65
|
+
* Allowlisted-cycle memberships per module.
|
|
84
66
|
*
|
|
85
67
|
* @param {object} baseline
|
|
86
68
|
* @returns {Array<{ id: string, value: number }>}
|
|
@@ -96,8 +78,7 @@ function archCycleRows(baseline) {
|
|
|
96
78
|
}
|
|
97
79
|
|
|
98
80
|
/**
|
|
99
|
-
*
|
|
100
|
-
* hotspot grain is the file.
|
|
81
|
+
* Dead exports per file (rows are per symbol).
|
|
101
82
|
*
|
|
102
83
|
* @param {object} baseline
|
|
103
84
|
* @returns {Array<{ id: string, value: number }>}
|
|
@@ -112,10 +93,8 @@ function deadExportRows(baseline) {
|
|
|
112
93
|
}
|
|
113
94
|
|
|
114
95
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* @param {string} idKey row property carrying the cluster identity
|
|
118
|
-
* @param {string} metric row property carrying the measured value
|
|
96
|
+
* @param {string} idKey
|
|
97
|
+
* @param {string} metric
|
|
119
98
|
* @returns {(baseline: object) => Array<{ id: string, value: number }>}
|
|
120
99
|
*/
|
|
121
100
|
function envelopeRows(idKey, metric) {
|
|
@@ -126,36 +105,21 @@ function envelopeRows(idKey, metric) {
|
|
|
126
105
|
}
|
|
127
106
|
|
|
128
107
|
/**
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* `TOTAL` is for **additive** metrics — dead-export symbols, context bytes,
|
|
132
|
-
* lint errors — where the sum is the quantity the instrument measures.
|
|
133
|
-
* `TALLY` is for **non-additive** ones — percentages, indices, scores — where
|
|
134
|
-
* summing per-file values would fabricate a statistic; the honest whole-repo
|
|
135
|
-
* number is how many rows are tracked, and the unit name says so.
|
|
108
|
+
* `TOTAL` sums additive metrics; `TALLY` counts rows for non-additive ones
|
|
109
|
+
* (percentages, indices), where a sum would fabricate a statistic.
|
|
136
110
|
*/
|
|
137
111
|
const TOTAL = (rows) => rows.reduce((sum, row) => sum + row.value, 0);
|
|
138
112
|
const TALLY = (rows) => rows.length;
|
|
139
113
|
|
|
140
114
|
/**
|
|
141
|
-
* `[unit, fold]` per kind
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* This is the fix for the roll-up that counted **files** for every kind
|
|
145
|
-
* (Story #4962). `dead-exports-production` moving 590 → 589 *symbols* across
|
|
146
|
-
* 187 files on both sides read as a delta of 0, and a 421-byte context-budget
|
|
147
|
-
* growth read as 0 too, because the fallback counted rows — a grain finer than
|
|
148
|
-
* the file for dead exports and coarser than the byte for context budget.
|
|
149
|
-
* Naming the unit is half the fix: an axis called `symbols` or `bytes` cannot
|
|
150
|
-
* be re-read as a file count the way a bare `rowCount` was.
|
|
115
|
+
* `[unit, fold]` per kind. The named unit keeps a whole-repo total from being
|
|
116
|
+
* misread as a file count.
|
|
151
117
|
*/
|
|
152
118
|
const TREND_UNITS = Object.freeze({
|
|
153
119
|
'bundle-size': ['rawKb', TOTAL],
|
|
154
120
|
coverage: ['filesTracked', TALLY],
|
|
155
121
|
crap: ['filesTracked', TALLY],
|
|
156
122
|
duplication: ['filesTracked', TALLY],
|
|
157
|
-
lighthouse: ['routesTracked', TALLY],
|
|
158
|
-
lint: ['errorCount', TOTAL],
|
|
159
123
|
maintainability: ['filesTracked', TALLY],
|
|
160
124
|
mutation: ['filesTracked', TALLY],
|
|
161
125
|
'arch-cycles': ['cycleMemberships', TOTAL],
|
|
@@ -166,16 +130,8 @@ const TREND_UNITS = Object.freeze({
|
|
|
166
130
|
});
|
|
167
131
|
|
|
168
132
|
/**
|
|
169
|
-
* Per-kind row spec
|
|
170
|
-
*
|
|
171
|
-
* - `metric` — the axis a hotspot is measured on.
|
|
172
|
-
* - `worse` — which end of that axis is the bad end.
|
|
173
|
-
* - `rows` — baseline → `{ id, value }` pairs, already aggregated where
|
|
174
|
-
* the on-disk grain is finer than the file (dead exports,
|
|
175
|
-
* cycles).
|
|
176
|
-
* - `idKind` — what the cluster key names. Every kind but `lighthouse`
|
|
177
|
-
* (routes) and `bundle-size` (bundle names) keys on a
|
|
178
|
-
* repository file path.
|
|
133
|
+
* Per-kind row spec: hotspot `metric`, which end is `worse`, `rows`
|
|
134
|
+
* extractor (aggregated to file grain), and what the `idKind` key names.
|
|
179
135
|
*/
|
|
180
136
|
export const KIND_SPECS = Object.freeze({
|
|
181
137
|
'bundle-size': {
|
|
@@ -202,18 +158,6 @@ export const KIND_SPECS = Object.freeze({
|
|
|
202
158
|
idKind: 'path',
|
|
203
159
|
rows: envelopeRows('path', 'percentage'),
|
|
204
160
|
},
|
|
205
|
-
lighthouse: {
|
|
206
|
-
metric: 'performance',
|
|
207
|
-
worse: 'lower',
|
|
208
|
-
idKind: 'route',
|
|
209
|
-
rows: envelopeRows('route', 'performance'),
|
|
210
|
-
},
|
|
211
|
-
lint: {
|
|
212
|
-
metric: 'errorCount',
|
|
213
|
-
worse: 'higher',
|
|
214
|
-
idKind: 'path',
|
|
215
|
-
rows: envelopeRows('path', 'errorCount'),
|
|
216
|
-
},
|
|
217
161
|
maintainability: {
|
|
218
162
|
metric: 'mi',
|
|
219
163
|
worse: 'lower',
|
|
@@ -259,10 +203,8 @@ export const KIND_SPECS = Object.freeze({
|
|
|
259
203
|
});
|
|
260
204
|
|
|
261
205
|
/**
|
|
262
|
-
* The
|
|
263
|
-
*
|
|
264
|
-
* for an all-zero rollup rather than merely empty rows: an `arch-cycles`
|
|
265
|
-
* baseline with zero cycles is a passing gate, not a dead instrument.
|
|
206
|
+
* The `*` rollup, or `null` (ratchets carry none — a zero-cycle `arch-cycles`
|
|
207
|
+
* is a passing gate, not a stub).
|
|
266
208
|
*
|
|
267
209
|
* @param {object | null} baseline
|
|
268
210
|
* @returns {object | null}
|
|
@@ -273,12 +215,8 @@ export function rollupOf(baseline) {
|
|
|
273
215
|
}
|
|
274
216
|
|
|
275
217
|
/**
|
|
276
|
-
*
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
* This sits beside `rowCount` in `gateSurface[]` precisely because the two
|
|
280
|
-
* disagree: `dead-exports-production` carries 589 rows across 187 files, so a
|
|
281
|
-
* lone `rowCount: 187` reads as a symbol count and is not one.
|
|
218
|
+
* Whole-repo quantity in its own unit; differs from `rowCount` whenever the
|
|
219
|
+
* row grain is not the unit.
|
|
282
220
|
*
|
|
283
221
|
* @param {string} kind
|
|
284
222
|
* @param {object | null} baseline
|
|
@@ -293,12 +231,8 @@ export function measuredTotalOf(kind, baseline) {
|
|
|
293
231
|
}
|
|
294
232
|
|
|
295
233
|
/**
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
* under its own unit — "dead exports went 590 → 589 **symbols**" is exactly
|
|
299
|
-
* the direction-of-travel question trend answers, and skipping the ratchet
|
|
300
|
-
* half here would leave it visible in `gateSurface[]` but invisible in
|
|
301
|
-
* `trend[]`.
|
|
234
|
+
* Trend comparison rollup: the declared one, else (ratchets) the measured
|
|
235
|
+
* total under its unit, so ratchets appear in `trend[]` too.
|
|
302
236
|
*
|
|
303
237
|
* @param {string} kind
|
|
304
238
|
* @param {object | null} baseline
|
|
@@ -1,31 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* at most `topN` rows here, before anything downstream sees them.
|
|
7
|
-
*
|
|
8
|
-
* Narrowing happens in two steps:
|
|
9
|
-
*
|
|
10
|
-
* 1. **Aggregate to the cluster grain.** Baseline rows are per-method
|
|
11
|
-
* (crap) or per-symbol (dead exports); hotspots are per-file. Each id
|
|
12
|
-
* keeps its single worst value, plus how many rows it contributed.
|
|
13
|
-
* 2. **Score, then cut.** `severityWeight` is the row's position in its
|
|
14
|
-
* own kind's distribution, from 0 (the best value present) to 1 (the
|
|
15
|
-
* worst). Scoring within the kind is what makes CRAP 29 and MI 74
|
|
16
|
-
* comparable at all — the two axes share no unit, and the whole point
|
|
17
|
-
* of a cluster is to add them up.
|
|
2
|
+
* Bounded top-N outliers per gate, so no whole baseline enters the envelope.
|
|
3
|
+
* Rows fold to the file grain (worst value kept), then `severityWeight` is
|
|
4
|
+
* the position in the kind's own distribution (0 best … 1 worst) — which is
|
|
5
|
+
* what makes unit-less axes like CRAP and MI summable in a cluster.
|
|
18
6
|
*
|
|
19
7
|
* @module lib/audit-baselines/outliers
|
|
20
8
|
*/
|
|
21
9
|
|
|
22
10
|
import { KIND_SPECS } from './kinds.js';
|
|
23
11
|
|
|
24
|
-
/** Default bound on rows extracted per gate. */
|
|
25
12
|
export const DEFAULT_TOP_N = 20;
|
|
26
13
|
|
|
27
14
|
/**
|
|
28
|
-
*
|
|
15
|
+
* One entry per id, worst value kept.
|
|
29
16
|
*
|
|
30
17
|
* @param {Array<{ id: string, value: number }>} rows
|
|
31
18
|
* @param {'higher' | 'lower'} worse
|
|
@@ -48,9 +35,7 @@ function aggregateById(rows, worse) {
|
|
|
48
35
|
}
|
|
49
36
|
|
|
50
37
|
/**
|
|
51
|
-
*
|
|
52
|
-
* end. A degenerate distribution (every value identical) scores 1 for every
|
|
53
|
-
* row: they are all equally the worst, and equally the best.
|
|
38
|
+
* 1 is always the worst end; a degenerate distribution scores all 1.
|
|
54
39
|
*
|
|
55
40
|
* @param {number} value
|
|
56
41
|
* @param {number} min
|
|
@@ -65,8 +50,6 @@ function normalizeSeverity(value, min, max, worse) {
|
|
|
65
50
|
}
|
|
66
51
|
|
|
67
52
|
/**
|
|
68
|
-
* Extract the bounded worst-N rows for one kind.
|
|
69
|
-
*
|
|
70
53
|
* @param {{ kind: string, baseline: object | null, topN?: number }} args
|
|
71
54
|
* @returns {Array<{
|
|
72
55
|
* kind: string, id: string, metric: string, value: number,
|