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,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* (
|
|
4
|
-
*
|
|
5
|
-
* A hotspot's severity says how bad the code measures. These three say how
|
|
6
|
-
* much that badness costs: how often the file changes (churn), how much of
|
|
7
|
-
* the repository depends on it (import in-degree), and how often agents have
|
|
8
|
-
* actually tripped over it (friction signals).
|
|
9
|
-
*
|
|
10
|
-
* All three are **optional inputs**. A shallow clone has no git history, a
|
|
11
|
-
* fresh checkout has no friction ledger, and a consumer whose sources live
|
|
12
|
-
* outside the scanned roots has no resolvable import graph. Each degrades to
|
|
13
|
-
* a neutral multiplier of exactly 1.0 — never 0 (which would erase the
|
|
14
|
-
* hotspot) and never a guess. The engine exits 0 in every degraded case.
|
|
2
|
+
* Hotspot ranking multipliers — churn, import in-degree, friction signals.
|
|
3
|
+
* Each input is optional and degrades to exactly 1.0: never 0 (which would
|
|
4
|
+
* erase the hotspot), never a guess.
|
|
15
5
|
*
|
|
16
6
|
* @module lib/audit-baselines/weights
|
|
17
7
|
*/
|
|
@@ -21,14 +11,11 @@ import path from 'node:path';
|
|
|
21
11
|
import { execFileCapture } from '../child-exec.js';
|
|
22
12
|
import { computeInDegree, resolveRepoGraph } from '../import-graph.js';
|
|
23
13
|
|
|
24
|
-
/** Neutral multiplier every degraded weight collapses to. */
|
|
25
14
|
const NEUTRAL_WEIGHT = 1.0;
|
|
26
15
|
|
|
27
16
|
/**
|
|
28
|
-
* Saturating count →
|
|
29
|
-
*
|
|
30
|
-
* same number — the degradation is indistinguishable from an honest zero,
|
|
31
|
-
* which is the point: neither should move the ranking.
|
|
17
|
+
* Saturating count → `[1, 2)`; zero equals the degraded weight, so neither
|
|
18
|
+
* moves the ranking.
|
|
32
19
|
*
|
|
33
20
|
* @param {number} count
|
|
34
21
|
* @param {number} half count at which the multiplier reaches 1.5
|
|
@@ -40,12 +27,10 @@ function saturate(count, half) {
|
|
|
40
27
|
}
|
|
41
28
|
|
|
42
29
|
/**
|
|
43
|
-
*
|
|
30
|
+
* Commits per file in the window; `degraded` when git cannot answer at all.
|
|
44
31
|
*
|
|
45
32
|
* @param {{ cwd: string, windowDays?: number, run?: Function }} args
|
|
46
33
|
* @returns {{ counts: Map<string, number>, degraded: boolean }}
|
|
47
|
-
* `degraded` is true when git could not answer at all — not a git work
|
|
48
|
-
* tree, no commits yet, or the binary is unavailable.
|
|
49
34
|
*/
|
|
50
35
|
export function readChurn({ cwd, windowDays = 180, run }) {
|
|
51
36
|
let stdout;
|
|
@@ -62,8 +47,7 @@ export function readChurn({ cwd, windowDays = 180, run }) {
|
|
|
62
47
|
{
|
|
63
48
|
run,
|
|
64
49
|
cwd,
|
|
65
|
-
//
|
|
66
|
-
// reported in the envelope, not shouted at the operator.
|
|
50
|
+
// Degradation is reported in the envelope, not on stderr.
|
|
67
51
|
stdio: ['ignore', 'pipe', 'ignore'],
|
|
68
52
|
},
|
|
69
53
|
);
|
|
@@ -80,8 +64,6 @@ export function readChurn({ cwd, windowDays = 180, run }) {
|
|
|
80
64
|
}
|
|
81
65
|
|
|
82
66
|
/**
|
|
83
|
-
* Import in-degree per module, keyed by repo-relative posix path.
|
|
84
|
-
*
|
|
85
67
|
* @param {{ cwd: string, graph?: Map<string, string[]> | null }} args
|
|
86
68
|
* @returns {{ degrees: Map<string, number>, degraded: boolean }}
|
|
87
69
|
*/
|
|
@@ -91,12 +73,9 @@ export function readCentrality({ cwd, graph }) {
|
|
|
91
73
|
return { degrees: computeInDegree(resolved), degraded: false };
|
|
92
74
|
}
|
|
93
75
|
|
|
94
|
-
/** Path tokens that look like repository files, harvested from signal text. */
|
|
95
76
|
const PATH_TOKEN_RE = /[\w@][\w./@-]*\.(?:js|mjs|cjs|ts|tsx|json|md)\b/g;
|
|
96
77
|
|
|
97
78
|
/**
|
|
98
|
-
* Collect every `signals.ndjson` under `tempRoot`. Absent tree → empty list.
|
|
99
|
-
*
|
|
100
79
|
* @param {string} tempRootAbs
|
|
101
80
|
* @returns {string[]} absolute paths
|
|
102
81
|
*/
|
|
@@ -121,12 +100,8 @@ function findSignalStreams(tempRootAbs) {
|
|
|
121
100
|
}
|
|
122
101
|
|
|
123
102
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* Signal records carry no dedicated path field — the blamed file surfaces
|
|
127
|
-
* inside free-form `details` / `emitter.command` text — so paths are
|
|
128
|
-
* harvested by token scan over each record's serialized form. A malformed
|
|
129
|
-
* line is skipped, never fatal.
|
|
103
|
+
* Friction signals per blamed file. Records have no path field, so paths are
|
|
104
|
+
* token-scanned from `details` / `emitter.command`; bad lines are skipped.
|
|
130
105
|
*
|
|
131
106
|
* @param {{ tempRootAbs: string, kinds?: Set<string> }} args
|
|
132
107
|
* @returns {{ counts: Map<string, number>, degraded: boolean, streams: number }}
|
|
@@ -167,9 +142,6 @@ export function readFriction({
|
|
|
167
142
|
}
|
|
168
143
|
|
|
169
144
|
/**
|
|
170
|
-
* Bundle the three weight lookups into one resolver the hotspot builder can
|
|
171
|
-
* call per cluster id, plus the degradation flags the envelope reports.
|
|
172
|
-
*
|
|
173
145
|
* @param {{
|
|
174
146
|
* churn: { counts: Map<string, number>, degraded: boolean },
|
|
175
147
|
* centrality: { degrees: Map<string, number>, degraded: boolean },
|
|
@@ -1,31 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The manifest is shipped framework configuration resolved from one fixed
|
|
6
|
-
* path per process, and the shape-derivation path reads it once per Story at
|
|
7
|
-
* resolve AND persist — an un-memoized read is pure repeated I/O (measured
|
|
8
|
-
* 221 µs/op raw vs 5.5 µs seamed on the run adhoc-4722-4723 audit). Only a
|
|
9
|
-
* successful parse is cached: a read failure stays a per-call throw so a
|
|
10
|
-
* caller can observe a manifest that becomes readable later. Tests never
|
|
11
|
-
* reach this read — they inject fixture rules through the callers'
|
|
12
|
-
* `injectedRules` seam.
|
|
2
|
+
* The one synchronous `audit-rules.json` reader, memoized per process. Only a
|
|
3
|
+
* successful parse is cached, so a failure stays a per-call throw and a
|
|
4
|
+
* manifest that later becomes readable is seen.
|
|
13
5
|
*/
|
|
14
6
|
|
|
15
7
|
import { readFileSync } from 'node:fs';
|
|
16
8
|
import path from 'node:path';
|
|
17
9
|
import { getPaths, PROJECT_ROOT, resolveConfig } from '../config-resolver.js';
|
|
18
10
|
|
|
19
|
-
/** Process-lifetime memo of the parsed manifest (successful parses only). */
|
|
20
11
|
let auditRulesCache = null;
|
|
21
12
|
|
|
22
13
|
/**
|
|
23
|
-
* Read and parse the `audit-rules.json` manifest synchronously from the
|
|
24
|
-
* project's configured `schemasRoot`. Shared by the synchronous, ticket-free
|
|
25
|
-
* readers (`resolveLensTier`, `selectLocalLenses`,
|
|
26
|
-
* `selectSensitivePathClasses`) so the path resolution and read-failure
|
|
27
|
-
* handling live in one place rather than being duplicated per reader.
|
|
28
|
-
*
|
|
29
14
|
* @returns {{ audits?: Record<string, object> }} Parsed manifest.
|
|
30
15
|
* @throws {Error} When the manifest cannot be read or parsed.
|
|
31
16
|
*/
|
|
@@ -1,39 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Given a Story's predicted footprint (its `changes[]` / `references[]` path
|
|
6
|
-
* list), select the distilled authoring checklists for the **footprint-matched
|
|
7
|
-
* LOCAL lenses only** and assemble them into one payload the dispatch/hydrator
|
|
8
|
-
* seam threads into the Story maker prompt. This moves each local-lens concern
|
|
9
|
-
* to the innermost, write-time tier so makers author against it on fresh
|
|
10
|
-
* context instead of paying an Epic-close remediation loop on stale context.
|
|
11
|
-
*
|
|
12
|
-
* Matching is the **light** path, deliberately NOT `selectAudits`:
|
|
13
|
-
* - tier gate — a lens is in scope only when `resolveLensTier(lens) ===
|
|
14
|
-
* 'local'` (the pure `scope`-field read; cumulative/global
|
|
15
|
-
* lenses are owned by the Epic-close tier, never threaded
|
|
16
|
-
* here).
|
|
17
|
-
* - file gate — the pure `matchesAnyFilePattern` matcher runs the lens's
|
|
18
|
-
* own `triggers.filePatterns` (from `audit-rules.json`)
|
|
19
|
-
* against the predicted footprint.
|
|
20
|
-
*
|
|
21
|
-
* `selectAudits` is the wrong tool here: it is gate-aware and provider-backed
|
|
22
|
-
* (it reads the ticket through an `ITicketingProvider` and diffs the working
|
|
23
|
-
* tree via `git`). The write-time path has a *predicted* footprint, not a git
|
|
24
|
-
* diff, and no ticket to fetch — so this module reaches for the two pure
|
|
25
|
-
* primitives directly and never touches a provider or `git`. That purity is
|
|
26
|
-
* load-bearing (asserted by the test): the threading path must be a pure
|
|
27
|
-
* function of the footprint and the on-disk manifest/checklists.
|
|
28
|
-
*
|
|
29
|
-
* A hard token budget caps the assembled payload. When the matched lenses'
|
|
30
|
-
* checklists together exceed the budget, the payload is truncated
|
|
31
|
-
* deterministically (a stable prefix in {@link AUDIT_LENSES} order is kept;
|
|
32
|
-
* the overflowing tail is dropped) and every dropped lens is logged so the
|
|
33
|
-
* elision is never silent.
|
|
34
|
-
*
|
|
35
|
-
* Pure (modulo the default disk reads for `audit-rules.json` and the checklist
|
|
36
|
-
* artifacts, both injectable seams). No git, no provider, no network.
|
|
2
|
+
* Write-time checklists for LOCAL lenses matching a predicted footprint,
|
|
3
|
+
* under a token budget. Not `selectAudits`: this must stay a pure function of
|
|
4
|
+
* footprint + on-disk files — no git, provider, or network (tested).
|
|
37
5
|
*/
|
|
38
6
|
|
|
39
7
|
import fs from 'node:fs';
|
|
@@ -48,11 +16,7 @@ import {
|
|
|
48
16
|
} from './selector.js';
|
|
49
17
|
|
|
50
18
|
/**
|
|
51
|
-
*
|
|
52
|
-
* deterministic — this budget is the one surviving ceiling that speaks in
|
|
53
|
-
* tokens (Story #5312 deleted the plan-time sizing ceilings that shared the
|
|
54
|
-
* estimator), so the approximation matters far less than the payload and
|
|
55
|
-
* the cap agreeing on one number.
|
|
19
|
+
* ~4 chars per token; what matters is that payload and cap agree on one number.
|
|
56
20
|
*
|
|
57
21
|
* @param {string} text
|
|
58
22
|
* @returns {number}
|
|
@@ -62,24 +26,14 @@ function estimateTokens(text) {
|
|
|
62
26
|
}
|
|
63
27
|
|
|
64
28
|
/**
|
|
65
|
-
*
|
|
66
|
-
* above ({@link estimateTokens}). Generous
|
|
67
|
-
* relative to the real checklist sizes (each distilled lens checklist is
|
|
68
|
-
* ~130–190 tokens, and at most the seven local lenses can match), so a normal
|
|
69
|
-
* Story is never truncated — the cap is a safety ceiling against a pathological
|
|
70
|
-
* footprint that matches every local lens, not a routine squeeze. Callers may
|
|
71
|
-
* override per-invocation via `tokenBudget`.
|
|
29
|
+
* Safety ceiling, not a routine squeeze: all seven local lenses together fit.
|
|
72
30
|
*/
|
|
73
31
|
export const DEFAULT_CHECKLIST_TOKEN_BUDGET = 4000;
|
|
74
32
|
|
|
75
|
-
/** Separator between concatenated per-lens checklist sections. */
|
|
76
33
|
const SECTION_SEPARATOR = '\n\n';
|
|
77
34
|
|
|
78
35
|
/**
|
|
79
|
-
*
|
|
80
|
-
* name. The taxonomy in {@link AUDIT_LENSES} carries bare names (`clean-code`);
|
|
81
|
-
* the manifest and the tier resolver key off the `audit-`-prefixed form
|
|
82
|
-
* (`audit-clean-code`).
|
|
36
|
+
* Manifest key for a bare taxonomy lens name (`clean-code` → `audit-clean-code`).
|
|
83
37
|
*
|
|
84
38
|
* @param {string} lens
|
|
85
39
|
* @returns {string}
|
|
@@ -89,13 +43,9 @@ function lensKeyFor(lens) {
|
|
|
89
43
|
}
|
|
90
44
|
|
|
91
45
|
/**
|
|
92
|
-
*
|
|
93
|
-
* SSOT the generator writes to (`generate-lens-checklists.js` →
|
|
94
|
-
* `<agentRoot>/audit-checklists/<lens>.md`), resolved through the same
|
|
95
|
-
* `agentRoot` the rest of the config surface uses so a consumer that relocates
|
|
96
|
-
* `.agents` reads its checklists from the relocated tree.
|
|
46
|
+
* `<agentRoot>/audit-checklists`, honouring a relocated agent root.
|
|
97
47
|
*
|
|
98
|
-
* @param {object} [config]
|
|
48
|
+
* @param {object} [config]
|
|
99
49
|
* @returns {string}
|
|
100
50
|
*/
|
|
101
51
|
function checklistsDir(config = resolveConfig()) {
|
|
@@ -107,12 +57,9 @@ function checklistsDir(config = resolveConfig()) {
|
|
|
107
57
|
}
|
|
108
58
|
|
|
109
59
|
/**
|
|
110
|
-
*
|
|
111
|
-
* and {@link resolveLensTier} consume), resolved through the configured
|
|
112
|
-
* `schemasRoot`. Synchronous — this is a pure-ish read with no git and no
|
|
113
|
-
* provider.
|
|
60
|
+
* Parse `audit-rules.json` from the configured `schemasRoot`.
|
|
114
61
|
*
|
|
115
|
-
* @param {object} [config]
|
|
62
|
+
* @param {object} [config]
|
|
116
63
|
* @returns {{ audits?: Record<string, { triggers?: { filePatterns?: string[] } }> }}
|
|
117
64
|
*/
|
|
118
65
|
export function readAuditRules(config = resolveConfig()) {
|
|
@@ -125,12 +72,6 @@ export function readAuditRules(config = resolveConfig()) {
|
|
|
125
72
|
}
|
|
126
73
|
|
|
127
74
|
/**
|
|
128
|
-
* The `triggers.filePatterns` a lens declares in the manifest, or `[]` when
|
|
129
|
-
* the lens declares none. (`audit-clean-code` carries the universal
|
|
130
|
-
* match-everything glob, so it footprint-matches every non-empty change
|
|
131
|
-
* set — the selector.js twin comment documents the same post-#4405
|
|
132
|
-
* follow-up fix.)
|
|
133
|
-
*
|
|
134
75
|
* @param {object} rules parsed `audit-rules.json`.
|
|
135
76
|
* @param {string} lens canonical lens name.
|
|
136
77
|
* @returns {string[]}
|
|
@@ -140,9 +81,6 @@ function filePatternsFor(rules, lens) {
|
|
|
140
81
|
}
|
|
141
82
|
|
|
142
83
|
/**
|
|
143
|
-
* The full `triggers` block a lens declares in the manifest (or `undefined`).
|
|
144
|
-
* Used to read non-glob trigger fields (e.g. `sourceWithoutSiblingTest`).
|
|
145
|
-
*
|
|
146
84
|
* @param {object} rules parsed `audit-rules.json`.
|
|
147
85
|
* @param {string} lens canonical lens name.
|
|
148
86
|
* @returns {object|undefined}
|
|
@@ -152,10 +90,6 @@ function triggerFor(rules, lens) {
|
|
|
152
90
|
}
|
|
153
91
|
|
|
154
92
|
/**
|
|
155
|
-
* Normalize a predicted footprint into a clean path list. Accepts a plain
|
|
156
|
-
* `string[]` (the shape the caller derives from a Story's `changes[]` /
|
|
157
|
-
* `references[]` entries); drops empty and non-string entries.
|
|
158
|
-
*
|
|
159
93
|
* @param {unknown} footprint
|
|
160
94
|
* @returns {string[]}
|
|
161
95
|
*/
|
|
@@ -168,21 +102,13 @@ function normalizeFootprint(footprint) {
|
|
|
168
102
|
}
|
|
169
103
|
|
|
170
104
|
/**
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* contract — `resolveLensTier(lens) === 'local'` for the tier gate plus the
|
|
174
|
-
* pure `matchesAnyFilePattern` matcher for the file gate — with no provider and
|
|
175
|
-
* no git diff.
|
|
176
|
-
*
|
|
177
|
-
* A lens whose tier cannot be resolved (not registered / malformed scope) is
|
|
178
|
-
* skipped rather than allowed to throw the whole selection; the generator and
|
|
179
|
-
* schema keep the manifest well-formed, so this only guards against drift.
|
|
105
|
+
* LOCAL lenses matching the footprint, in {@link AUDIT_LENSES} order. A lens
|
|
106
|
+
* whose tier cannot be resolved is skipped rather than failing the selection.
|
|
180
107
|
*
|
|
181
108
|
* @param {object} params
|
|
182
109
|
* @param {string[]} params.footprint predicted footprint path list.
|
|
183
|
-
* @param {object} [params.rules] parsed `audit-rules.json
|
|
184
|
-
* @param {(lens: string) => string} [params.resolveTier]
|
|
185
|
-
* (injectable seam; defaults to {@link resolveLensTier}).
|
|
110
|
+
* @param {object} [params.rules] parsed `audit-rules.json`.
|
|
111
|
+
* @param {(lens: string) => string} [params.resolveTier]
|
|
186
112
|
* @returns {string[]} matched local lens names, in taxonomy order.
|
|
187
113
|
*/
|
|
188
114
|
export function matchLocalLenses({
|
|
@@ -206,9 +132,8 @@ export function matchLocalLenses({
|
|
|
206
132
|
const patterns = filePatternsFor(rules, lens);
|
|
207
133
|
const fileMatch =
|
|
208
134
|
patterns.length > 0 && matchesAnyFilePattern(patterns, paths);
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
// that ships without a test is reminded of the quality lens up front.
|
|
135
|
+
// Same sibling-test predicate as the selector: a source change without a
|
|
136
|
+
// test gets the quality checklist up front.
|
|
212
137
|
const siblingMatch =
|
|
213
138
|
triggerFor(rules, lens)?.sourceWithoutSiblingTest === true &&
|
|
214
139
|
changeSetLacksSiblingTest(paths);
|
|
@@ -218,13 +143,9 @@ export function matchLocalLenses({
|
|
|
218
143
|
}
|
|
219
144
|
|
|
220
145
|
/**
|
|
221
|
-
* Default checklist reader: read `<agentRoot>/audit-checklists/<lens>.md`.
|
|
222
|
-
* Returns `null` when the artifact is absent (a matched lens with no committed
|
|
223
|
-
* checklist), so the caller skips it rather than crashing.
|
|
224
|
-
*
|
|
225
146
|
* @param {string} lens
|
|
226
147
|
* @param {object} [config]
|
|
227
|
-
* @returns {string|null}
|
|
148
|
+
* @returns {string|null} `null` when the checklist artifact is absent
|
|
228
149
|
*/
|
|
229
150
|
function readChecklistFile(lens, config = resolveConfig()) {
|
|
230
151
|
const file = path.join(checklistsDir(config), `${lens}.md`);
|
|
@@ -236,31 +157,16 @@ function readChecklistFile(lens, config = resolveConfig()) {
|
|
|
236
157
|
}
|
|
237
158
|
|
|
238
159
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* Returns the assembled payload string plus the accounting the caller (and the
|
|
242
|
-
* test) asserts against: which lenses were included, which were dropped by the
|
|
243
|
-
* budget, the full matched set, and the payload's estimated token count.
|
|
244
|
-
*
|
|
245
|
-
* Truncation is deterministic prefix truncation: lenses are considered in
|
|
246
|
-
* stable {@link AUDIT_LENSES} order and appended while the running payload
|
|
247
|
-
* estimate stays within `tokenBudget`; the first lens that would overflow — and
|
|
248
|
-
* every remaining matched lens — is dropped, and the drop is logged. The
|
|
249
|
-
* returned `payload` therefore always satisfies
|
|
250
|
-
* `estimateTokens(payload) <= tokenBudget`.
|
|
160
|
+
* Prefix truncation: the first overflowing lens and all later ones are
|
|
161
|
+
* dropped and logged.
|
|
251
162
|
*
|
|
252
163
|
* @param {object} params
|
|
253
|
-
* @param {string[]} params.footprint predicted footprint
|
|
254
|
-
*
|
|
255
|
-
* @param {
|
|
256
|
-
*
|
|
257
|
-
* @param {
|
|
258
|
-
* @param {(
|
|
259
|
-
* (injectable seam).
|
|
260
|
-
* @param {(lens: string) => (string|null)} [params.readChecklist] checklist
|
|
261
|
-
* reader (injectable seam; defaults to the on-disk reader).
|
|
262
|
-
* @param {{ warn?: (msg: string) => void }} [params.logger] logger for the drop
|
|
263
|
-
* record (defaults to {@link Logger}).
|
|
164
|
+
* @param {string[]} params.footprint predicted footprint path list.
|
|
165
|
+
* @param {number} [params.tokenBudget]
|
|
166
|
+
* @param {object} [params.rules] parsed `audit-rules.json`.
|
|
167
|
+
* @param {(lens: string) => string} [params.resolveTier]
|
|
168
|
+
* @param {(lens: string) => (string|null)} [params.readChecklist]
|
|
169
|
+
* @param {{ warn?: (msg: string) => void }} [params.logger]
|
|
264
170
|
* @returns {{
|
|
265
171
|
* payload: string,
|
|
266
172
|
* includedLenses: string[],
|
|
@@ -294,9 +200,7 @@ export function buildChecklistPayload({
|
|
|
294
200
|
const lens = matchedLenses[i];
|
|
295
201
|
const content = readChecklist(lens);
|
|
296
202
|
if (content == null) {
|
|
297
|
-
//
|
|
298
|
-
// budget drop). The generator keeps every lens's checklist in tree, so
|
|
299
|
-
// this only trips on drift, which we surface rather than swallow.
|
|
203
|
+
// Missing artifact is drift, not a budget drop: surface and skip.
|
|
300
204
|
logger?.warn?.(
|
|
301
205
|
`[checklist-threading] no checklist artifact for matched local lens '${lens}' — skipping`,
|
|
302
206
|
);
|
|
@@ -306,8 +210,6 @@ export function buildChecklistPayload({
|
|
|
306
210
|
const trimmed = content.trim();
|
|
307
211
|
const candidate = [...sections, trimmed].join(SECTION_SEPARATOR);
|
|
308
212
|
if (estimateTokens(candidate) > tokenBudget) {
|
|
309
|
-
// Deterministic prefix truncation: this lens and every remaining matched
|
|
310
|
-
// lens are dropped, keeping the payload within budget.
|
|
311
213
|
droppedLenses.push(...matchedLenses.slice(i));
|
|
312
214
|
break;
|
|
313
215
|
}
|
|
@@ -1,21 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `checklist-threading.js#buildChecklistPayload` was built and unit-tested but
|
|
7
|
-
* had **zero production call sites**: nothing derived a footprint, assembled
|
|
8
|
-
* the payload, or handed a `checklistPath` to the spawned Story worker. This
|
|
9
|
-
* module is that call site. Given a Story's predicted footprint (its
|
|
10
|
-
* `changes[]` / `references[]` path entries), it assembles the footprint-matched
|
|
11
|
-
* local-lens checklist payload, writes it to the run's temp dir, and returns
|
|
12
|
-
* the `checklistPath` the deliver-story spawn threads into the maker's prompt
|
|
13
|
-
* (the same way the docs digest reaches the worker as `docsDigestPath`).
|
|
14
|
-
*
|
|
15
|
-
* Pure modulo the single file write, which is an injectable seam
|
|
16
|
-
* (`writeFileFn`) so the builder is unit-testable without touching disk. No
|
|
17
|
-
* git, no provider, no network — the footprint is the planner's *prediction*,
|
|
18
|
-
* not a diff, so no repository read is involved.
|
|
2
|
+
* Deliver-dispatch call site for checklist threading: builds the payload from
|
|
3
|
+
* a Story's predicted `changes[]` + `references[]` footprint, writes it to
|
|
4
|
+
* the run temp dir, and returns the `checklistPath` the worker spawn threads.
|
|
5
|
+
* The footprint is a prediction, not a diff: no git, provider, or network.
|
|
19
6
|
*/
|
|
20
7
|
|
|
21
8
|
import fs from 'node:fs';
|
|
@@ -23,9 +10,7 @@ import path from 'node:path';
|
|
|
23
10
|
import { buildChecklistPayload } from './checklist-threading.js';
|
|
24
11
|
|
|
25
12
|
/**
|
|
26
|
-
*
|
|
27
|
-
* entries. Accepts both the parsed `{ path, assumption }` PathEntry shape and a
|
|
28
|
-
* bare `string`, dropping empty / non-string entries.
|
|
13
|
+
* Accepts `{ path }` entries or bare strings.
|
|
29
14
|
*
|
|
30
15
|
* @param {unknown} entries
|
|
31
16
|
* @returns {string[]}
|
|
@@ -39,13 +24,7 @@ function footprintFromEntries(entries) {
|
|
|
39
24
|
}
|
|
40
25
|
|
|
41
26
|
/**
|
|
42
|
-
*
|
|
43
|
-
* Story's `changes[]` and `references[]` path entries, in that order.
|
|
44
|
-
*
|
|
45
|
-
* Module-local: a detail of {@link buildDispatchChecklist}, exercised through
|
|
46
|
-
* that public entry point (assert the footprint the injected payload builder
|
|
47
|
-
* received) rather than imported directly, so it adds no test-only public
|
|
48
|
-
* export the dead-export ratchet would flag.
|
|
27
|
+
* Module-local so it adds no test-only export for the dead-export ratchet.
|
|
49
28
|
*
|
|
50
29
|
* @param {{ changes?: unknown, references?: unknown }} [args]
|
|
51
30
|
* @returns {string[]}
|
|
@@ -58,8 +37,6 @@ function deriveDispatchFootprint({ changes, references } = {}) {
|
|
|
58
37
|
}
|
|
59
38
|
|
|
60
39
|
/**
|
|
61
|
-
* Default file writer: ensure the parent dir exists, then write the payload.
|
|
62
|
-
*
|
|
63
40
|
* @param {string} filePath
|
|
64
41
|
* @param {string} content
|
|
65
42
|
* @returns {void}
|
|
@@ -70,24 +47,16 @@ function defaultWriteFile(filePath, content) {
|
|
|
70
47
|
}
|
|
71
48
|
|
|
72
49
|
/**
|
|
73
|
-
*
|
|
74
|
-
* temp dir, returning the `checklistPath` the deliver-story spawn threads.
|
|
75
|
-
*
|
|
76
|
-
* When the footprint matches no local lens (the common case for a
|
|
77
|
-
* docs-only or infra-only Story), nothing is written and `checklistPath` is
|
|
78
|
-
* `null` — the worker then runs with no write-time checklist, exactly as it
|
|
79
|
-
* does today, and lens-aware coverage still runs maker-blind at Story-scope
|
|
80
|
-
* close.
|
|
50
|
+
* No matched lens → nothing written, `checklistPath: null`.
|
|
81
51
|
*
|
|
82
52
|
* @param {object} args
|
|
83
|
-
* @param {number|string} args.storyId
|
|
84
|
-
* @param {unknown} [args.changes]
|
|
85
|
-
* @param {unknown} [args.references]
|
|
86
|
-
* @param {string} args.runTempDir
|
|
87
|
-
* @param {number} [args.tokenBudget]
|
|
88
|
-
* @param {typeof buildChecklistPayload} [args.buildPayloadFn]
|
|
89
|
-
* @param {(filePath: string, content: string) => void} [args.writeFileFn]
|
|
90
|
-
* injectable write seam (defaults to the on-disk writer).
|
|
53
|
+
* @param {number|string} args.storyId
|
|
54
|
+
* @param {unknown} [args.changes]
|
|
55
|
+
* @param {unknown} [args.references]
|
|
56
|
+
* @param {string} args.runTempDir
|
|
57
|
+
* @param {number} [args.tokenBudget]
|
|
58
|
+
* @param {typeof buildChecklistPayload} [args.buildPayloadFn]
|
|
59
|
+
* @param {(filePath: string, content: string) => void} [args.writeFileFn]
|
|
91
60
|
* @returns {{
|
|
92
61
|
* checklistPath: string|null,
|
|
93
62
|
* skipped: boolean,
|
|
@@ -1,26 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* block of the audit-suite envelope with a severity histogram.
|
|
6
|
-
*
|
|
7
|
-
* `aggregateBaselineDelta` (Task #1920, Epic #1786) reports per-component
|
|
8
|
-
* rollup deltas between two committed baseline envelopes loaded via
|
|
9
|
-
* `lib/baselines/reader.js`. It supersedes the prior row-by-row diff —
|
|
10
|
-
* row-level deltas surfaced noise from churn that did not move any
|
|
11
|
-
* component's rollup, drowning out the regressions that actually mattered.
|
|
12
|
-
*
|
|
13
|
-
* The delta function is **pure**: it takes the two `{ rollup, rows }`
|
|
14
|
-
* envelopes returned by the reader plus the resolved components map and
|
|
15
|
-
* returns a deterministic per-component delta. No filesystem I/O.
|
|
2
|
+
* Findings severity histogram and per-component baseline rollup deltas.
|
|
3
|
+
* Deltas are per rollup, not per row: row churn that moves no rollup is noise.
|
|
4
|
+
* Pure, no I/O.
|
|
16
5
|
*/
|
|
17
6
|
|
|
18
7
|
import { groupRows, resolveComponents } from '../baselines/components.js';
|
|
19
8
|
|
|
20
9
|
/**
|
|
21
|
-
*
|
|
22
|
-
* with severities outside that set are ignored, keeping the rendered summary
|
|
23
|
-
* truthful even if upstream callers append non-standard severities.
|
|
10
|
+
* Non-standard severities are ignored.
|
|
24
11
|
*
|
|
25
12
|
* @param {Array<{ severity?: string }>|null|undefined} findings
|
|
26
13
|
* @returns {{ critical: number, high: number, medium: number, low: number }}
|
|
@@ -36,20 +23,10 @@ export function aggregateSummary(findings) {
|
|
|
36
23
|
}
|
|
37
24
|
|
|
38
25
|
/**
|
|
39
|
-
* The single halting rule
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* integration gate (`evaluateAutoMergePredicate`) — routes its
|
|
44
|
-
* halt-on-critical decision through this one predicate so the rule has a
|
|
45
|
-
* single definition rather than a re-derived `critical > 0` expression at
|
|
46
|
-
* each site.
|
|
47
|
-
*
|
|
48
|
-
* Accepts either the severity **count object** produced by
|
|
49
|
-
* `countBySeverity` / {@link aggregateSummary} (`{ critical: n, ... }`) or a
|
|
50
|
-
* raw `Finding[]`. A non-numeric / absent `critical` count (e.g. the
|
|
51
|
-
* auto-merge gate's "unparseable body" sentinel `null`) is **not** a halt —
|
|
52
|
-
* the caller owns that fail-open path separately. Pure; never throws.
|
|
26
|
+
* The single halting rule: a surviving Critical finding halts delivery. Every
|
|
27
|
+
* consumer routes through this rather than re-deriving `critical > 0`.
|
|
28
|
+
* Accepts a severity count object or a `Finding[]`; a non-numeric `critical`
|
|
29
|
+
* (e.g. an unparseable-body `null`) is not a halt — the caller owns that path.
|
|
53
30
|
*
|
|
54
31
|
* @param {{ critical?: unknown }|Array<{ severity?: string }>|null|undefined} input
|
|
55
32
|
* @returns {boolean} `true` when at least one surviving Critical is present.
|
|
@@ -63,11 +40,7 @@ export function hasSurvivingCritical(input) {
|
|
|
63
40
|
}
|
|
64
41
|
|
|
65
42
|
/**
|
|
66
|
-
*
|
|
67
|
-
* already carries a `rollup` block (every writer-produced baseline does), we
|
|
68
|
-
* trust it as the source of truth. When `rollup` is absent (raw test
|
|
69
|
-
* fixtures, hand-written cases) we recompute from rows via the supplied
|
|
70
|
-
* `recompute` callback so the function stays useful in both shapes.
|
|
43
|
+
* The envelope's own `rollup` when present, else recomputed from rows.
|
|
71
44
|
*
|
|
72
45
|
* @param {{ rollup?: object, rows?: Array<object> }} envelope
|
|
73
46
|
* @param {Record<string, string[]>} components
|
|
@@ -89,13 +62,8 @@ function resolveRollup(envelope, components, keyField, recompute) {
|
|
|
89
62
|
}
|
|
90
63
|
|
|
91
64
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* The direction is informational only — the audit emitter does not enforce
|
|
96
|
-
* pass/fail policy; floor enforcement happens in `check-baselines.js`. We
|
|
97
|
-
* report `before`, `after`, and the signed delta so a reviewer can read the
|
|
98
|
-
* sign in context (lint count up = bad; coverage % down = bad).
|
|
65
|
+
* One entry per differing axis. Informational only — floors are enforced by
|
|
66
|
+
* `check-baselines.js`.
|
|
99
67
|
*
|
|
100
68
|
* @param {Record<string, number>|null|undefined} before
|
|
101
69
|
* @param {Record<string, number>|null|undefined} after
|
|
@@ -120,12 +88,6 @@ function diffAxes(before, after) {
|
|
|
120
88
|
}
|
|
121
89
|
|
|
122
90
|
/**
|
|
123
|
-
* Compute per-component rollup deltas between two baseline envelopes.
|
|
124
|
-
*
|
|
125
|
-
* Inputs are the shapes returned by `lib/baselines/reader.js#load(kind)`.
|
|
126
|
-
* The function is pure — disk reads happen in the caller so the audit
|
|
127
|
-
* emitter (and its tests) can drive synthetic before/after pairs.
|
|
128
|
-
*
|
|
129
91
|
* @param {{
|
|
130
92
|
* before: { rollup?: object, rows?: Array<object> },
|
|
131
93
|
* after: { rollup?: object, rows?: Array<object> },
|
|
@@ -137,9 +99,7 @@ function diffAxes(before, after) {
|
|
|
137
99
|
* component: string,
|
|
138
100
|
* axes: Array<{ axis: string, before: number|null, after: number|null, delta: number|null }>
|
|
139
101
|
* }>}
|
|
140
|
-
*
|
|
141
|
-
* the remainder is alpha. Components with no axis changes are omitted so
|
|
142
|
-
* an unchanged baseline yields `[]`.
|
|
102
|
+
* Changed components only, `*` first then alpha.
|
|
143
103
|
*/
|
|
144
104
|
export function aggregateBaselineDelta(params = {}) {
|
|
145
105
|
const before = params.before ?? { rollup: {}, rows: [] };
|