mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,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,
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The engine's job is to *report on* the baseline surface, including the
|
|
6
|
-
* parts of it that are missing or malformed. So no read here throws: a
|
|
7
|
-
* missing file, an unreadable directory, or a JSON parse error is evidence
|
|
8
|
-
* the envelope carries, not a crash. Nothing in this module opens a file for
|
|
9
|
-
* writing — the read-only invariant over `baselines/` starts here.
|
|
2
|
+
* Tolerant, strictly read-only fs access: a missing or malformed file is
|
|
3
|
+
* evidence for the envelope, never a throw.
|
|
10
4
|
*
|
|
11
5
|
* @module lib/audit-baselines/read
|
|
12
6
|
*/
|
|
@@ -15,8 +9,6 @@ import fs from 'node:fs';
|
|
|
15
9
|
import path from 'node:path';
|
|
16
10
|
|
|
17
11
|
/**
|
|
18
|
-
* Read and parse a JSON file without throwing.
|
|
19
|
-
*
|
|
20
12
|
* @param {string} absolutePath
|
|
21
13
|
* @returns {{ exists: boolean, parsed: object | null, parseError: string | null }}
|
|
22
14
|
*/
|
|
@@ -39,10 +31,6 @@ export function readJsonFile(absolutePath) {
|
|
|
39
31
|
}
|
|
40
32
|
|
|
41
33
|
/**
|
|
42
|
-
* List every file under `rootDir` as a posix repo-relative path, skipping
|
|
43
|
-
* `node_modules`, `.git`, and `.worktrees`. Returns `[]` for an absent or
|
|
44
|
-
* unreadable root rather than throwing.
|
|
45
|
-
*
|
|
46
34
|
* @param {string} repoRoot
|
|
47
35
|
* @param {string} rootDir repo-relative directory to walk
|
|
48
36
|
* @returns {string[]} sorted repo-relative posix paths
|
|
@@ -72,8 +60,7 @@ export function listFilesUnder(repoRoot, rootDir) {
|
|
|
72
60
|
}
|
|
73
61
|
|
|
74
62
|
/**
|
|
75
|
-
*
|
|
76
|
-
* absent or unparseable — the engine reports "unknown", never a fabricated 0.
|
|
63
|
+
* Whole days; `null` (unknown) rather than a fabricated 0.
|
|
77
64
|
*
|
|
78
65
|
* @param {unknown} generatedAt
|
|
79
66
|
* @param {Date} now
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* staleness
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `coverage.json` and `maintainability.json` both read `staleDays: 0` while
|
|
6
|
-
* already predating merges that had rescored files they still carry rows for:
|
|
7
|
-
* refreshed an hour ago, and behind already. The second clock is the one that
|
|
8
|
-
* matters — how many commits have touched the **measured surface** since the
|
|
9
|
-
* baseline was last committed. A baseline older than the surface it scores is
|
|
10
|
-
* stale at zero wall-clock days.
|
|
11
|
-
*
|
|
12
|
-
* Read-only and degrading, like the rest of this engine: a shallow clone, an
|
|
13
|
-
* untracked baseline, or a surface that is not path-keyed all report `null`.
|
|
14
|
-
* Unknown is never rounded down to a reassuring 0.
|
|
2
|
+
* Baseline staleness on two clocks: wall-clock age, and commits touching the
|
|
3
|
+
* measured surface since the baseline was committed — a baseline behind its
|
|
4
|
+
* surface is stale at zero days. Unknown reports `null`, never a reassuring 0.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/audit-baselines/staleness
|
|
17
7
|
*/
|
|
@@ -21,9 +11,7 @@ import { KIND_SPECS } from './kinds.js';
|
|
|
21
11
|
import { ageInDays } from './read.js';
|
|
22
12
|
|
|
23
13
|
/**
|
|
24
|
-
*
|
|
25
|
-
* failure or empty result. Buffer and shell policy come from the shared
|
|
26
|
-
* child-process surface ([`child-exec.js`](../child-exec.js)).
|
|
14
|
+
* Trimmed stdout, or `null` on failure or empty output.
|
|
27
15
|
*
|
|
28
16
|
* @param {string[]} args
|
|
29
17
|
* @param {{ cwd: string, run?: Function }} io
|
|
@@ -45,11 +33,8 @@ function git(args, { cwd, run }) {
|
|
|
45
33
|
}
|
|
46
34
|
|
|
47
35
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* ids — which are file paths for every kind but `lighthouse` (routes) and
|
|
51
|
-
* `bundle-size` (bundle names). Those two get an empty surface rather than a
|
|
52
|
-
* route name handed to git as a pathspec.
|
|
36
|
+
* `targetDirs`, else path-keyed row ids; non-path kinds get an empty surface
|
|
37
|
+
* rather than a bundle name as a git pathspec.
|
|
53
38
|
*
|
|
54
39
|
* @param {{ kind: string, gateBlock: object | null, rows: Array<{id: string}> }} args
|
|
55
40
|
* @returns {string[]}
|
|
@@ -64,9 +49,7 @@ function measuredSurfaceOf({ kind, gateBlock, rows }) {
|
|
|
64
49
|
}
|
|
65
50
|
|
|
66
51
|
/**
|
|
67
|
-
*
|
|
68
|
-
* empty surface yields `null` too: nothing was checked, so nothing can be
|
|
69
|
-
* claimed.
|
|
52
|
+
* Empty surface → `null`: nothing checked, nothing claimed.
|
|
70
53
|
*
|
|
71
54
|
* @param {{ relPath: string, surfacePaths: string[], io: object }} args
|
|
72
55
|
* @returns {number | null}
|
|
@@ -84,8 +67,6 @@ function commitsSinceBaseline({ relPath, surfacePaths, io }) {
|
|
|
84
67
|
}
|
|
85
68
|
|
|
86
69
|
/**
|
|
87
|
-
* The four staleness fields of one `gateSurface[]` entry, on both clocks.
|
|
88
|
-
*
|
|
89
70
|
* @param {{
|
|
90
71
|
* kind: string, gateBlock: object | null, rows: Array<{id: string}>,
|
|
91
72
|
* relPath: string, baseline: object | null, now: Date,
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* A baseline review that only reads the numbers cannot see the failure mode
|
|
6
|
-
* that matters most: an instrument that is not measuring anything. A gate can
|
|
7
|
-
* be unconfigured, its baseline file can be missing, it can be a **stub**
|
|
8
|
-
* (committed with no rows and an all-zero rollup, so it passes every run
|
|
9
|
-
* vacuously), it can be stale on either clock, and its `ignoreGlobs` can name
|
|
10
|
-
* paths that no longer exist — each of which reads as "green" from the gate's
|
|
11
|
-
* exit code. This module turns all of that into declarative fields for one
|
|
12
|
-
* kind; [`gate-surface.js`](gate-surface.js) walks the kinds and
|
|
13
|
-
* [`staleness.js`](staleness.js) owns the two clocks.
|
|
2
|
+
* Health of one measuring instrument: unconfigured, missing, stub, stale, or
|
|
3
|
+
* dead `ignoreGlobs` — each of which reads green from the gate's exit code.
|
|
14
4
|
*
|
|
15
5
|
* @module lib/audit-baselines/surface-entry
|
|
16
6
|
*/
|
|
@@ -20,9 +10,7 @@ import { GATE_KINDS, KIND_SPECS, measuredTotalOf, rollupOf } from './kinds.js';
|
|
|
20
10
|
import { stalenessOf } from './staleness.js';
|
|
21
11
|
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
24
|
-
* numeric leaves at all is not all-zero — it carries no measurement to call
|
|
25
|
-
* zero, and treating it as such would flag shapes this engine cannot read.
|
|
13
|
+
* A rollup with no numeric leaves is not all-zero.
|
|
26
14
|
*
|
|
27
15
|
* @param {object | null} rollup
|
|
28
16
|
* @returns {boolean}
|
|
@@ -34,10 +22,8 @@ function isAllZeroRollup(rollup) {
|
|
|
34
22
|
}
|
|
35
23
|
|
|
36
24
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* allowlist — genuinely zero cycles, the success state — is never mistaken
|
|
40
|
-
* for a dead instrument.
|
|
25
|
+
* Zero rows AND an all-zero rollup, so a clean ratchet (no rollup) is never
|
|
26
|
+
* called a stub.
|
|
41
27
|
*
|
|
42
28
|
* @param {{ rowCount: number, rollup: object | null }} args
|
|
43
29
|
* @returns {boolean}
|
|
@@ -47,11 +33,9 @@ function isStubInstrument({ rowCount, rollup }) {
|
|
|
47
33
|
}
|
|
48
34
|
|
|
49
35
|
/**
|
|
50
|
-
* Which of a gate's configured `ignoreGlobs` match zero files on disk.
|
|
51
|
-
*
|
|
52
36
|
* @param {string[]} ignoreGlobs
|
|
53
37
|
* @param {string[]} files repo-relative posix paths
|
|
54
|
-
* @returns {string[]}
|
|
38
|
+
* @returns {string[]} globs matching zero files
|
|
55
39
|
*/
|
|
56
40
|
function findDeadIgnoreGlobs(ignoreGlobs, files) {
|
|
57
41
|
const dead = [];
|
|
@@ -64,12 +48,7 @@ function findDeadIgnoreGlobs(ignoreGlobs, files) {
|
|
|
64
48
|
}
|
|
65
49
|
|
|
66
50
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* `rowCount` and `measured` both appear because they legitimately disagree:
|
|
70
|
-
* rows are counted after the kind's per-file aggregation, while `measured` is
|
|
71
|
-
* the quantity the instrument reports in its own unit — 589 dead-export
|
|
72
|
-
* symbols sit in 187 files.
|
|
51
|
+
* `rowCount` (per-file) and `measured` (own unit) legitimately differ.
|
|
73
52
|
*
|
|
74
53
|
* @param {{
|
|
75
54
|
* kind: string, quality: object, read: object, relPath: string,
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* history
|
|
4
|
-
*
|
|
5
|
-
* A ratchet only tells you whether today is worse than yesterday. The
|
|
6
|
-
* question a baseline review asks is the other one: which direction has this
|
|
7
|
-
* number been moving, and is the ratchet actually ratcheting? That answer is
|
|
8
|
-
* already committed — every baseline refresh is a commit against the same
|
|
9
|
-
* path — so it is read with `git log` + `git show`, never recomputed by
|
|
10
|
-
* re-running an instrument.
|
|
11
|
-
*
|
|
12
|
-
* Degradation: any git failure (shallow clone, no history for the path, not
|
|
13
|
-
* a work tree) yields an empty `trend[]` and exit 0. A missing history is
|
|
14
|
-
* missing evidence, not an error.
|
|
2
|
+
* Per-kind rollup direction of travel, read from each baseline's own git
|
|
3
|
+
* history — never recomputed. Any git failure yields no trend entry: missing
|
|
4
|
+
* history is missing evidence, not an error.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/audit-baselines/trend
|
|
17
7
|
*/
|
|
@@ -20,7 +10,7 @@ import { execFileCapture } from '../child-exec.js';
|
|
|
20
10
|
import { trendRollupOf } from './kinds.js';
|
|
21
11
|
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
13
|
+
* Newest first.
|
|
24
14
|
*
|
|
25
15
|
* @param {{ cwd: string, relPath: string, limit: number, run?: Function }} args
|
|
26
16
|
* @returns {Array<{ sha: string, committedAt: string }>}
|
|
@@ -47,8 +37,6 @@ function listCommits({ cwd, relPath, limit, run }) {
|
|
|
47
37
|
}
|
|
48
38
|
|
|
49
39
|
/**
|
|
50
|
-
* Read the comparable rollup of a baseline as it existed at `sha`.
|
|
51
|
-
*
|
|
52
40
|
* @param {{ cwd: string, kind: string, sha: string, relPath: string, run?: Function }} args
|
|
53
41
|
* @returns {object | null}
|
|
54
42
|
*/
|
|
@@ -71,9 +59,8 @@ function rollupAt({ cwd, kind, sha, relPath, run }) {
|
|
|
71
59
|
}
|
|
72
60
|
|
|
73
61
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* delta on it, and inventing one would read as a regression.
|
|
62
|
+
* `to - from` per axis; an axis missing on either side is omitted, since an
|
|
63
|
+
* invented delta would read as a regression.
|
|
77
64
|
*
|
|
78
65
|
* @param {object} from
|
|
79
66
|
* @param {object} to
|
|
@@ -91,7 +78,7 @@ function rollupDelta(from, to) {
|
|
|
91
78
|
}
|
|
92
79
|
|
|
93
80
|
/**
|
|
94
|
-
*
|
|
81
|
+
* Newest-vs-previous rollup deltas per kind.
|
|
95
82
|
*
|
|
96
83
|
* @param {{
|
|
97
84
|
* cwd: string, kinds: string[], pathFor: (kind: string) => string,
|