mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,45 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* behind-recovery.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Two loops watch an open PR and both must fast-forward it when GitHub
|
|
6
|
-
* reports `mergeStateStatus: BEHIND`:
|
|
7
|
-
*
|
|
8
|
-
* - the CI-watch loop (`pr-watch.js#watchPrToTerminal`),
|
|
9
|
-
* which probes with a synchronous `gh pr view` spawn and re-enters its
|
|
10
|
-
* poll loop after each update; and
|
|
11
|
-
* - the merge wait (`single-story-close/phases/confirm-merge.js`), which
|
|
12
|
-
* probes with an async `gh` facade and simply re-reads on the next tick.
|
|
13
|
-
*
|
|
14
|
-
* They had two copies of the same three-way decision — *is it BEHIND, is
|
|
15
|
-
* there update budget left, did the update land* — differing only in
|
|
16
|
-
* incidental ordering, which is exactly the shape that drifts. This module
|
|
17
|
-
* owns the decision; the callers keep their own probe source, their own
|
|
18
|
-
* timing model, and their own operator-facing wording (supplied as the
|
|
19
|
-
* `on*` callbacks).
|
|
20
|
-
*
|
|
21
|
-
* Deliberately NOT owned here: probing `mergeStateStatus`, counting the
|
|
22
|
-
* budget across iterations, and deciding what a caller does next with the
|
|
23
|
-
* verdict. The helper is a single bounded step, not a loop.
|
|
2
|
+
* behind-recovery.js — one bounded `BEHIND` → `gh pr update-branch` step,
|
|
3
|
+
* shared by both merge loops; callers own probing, budget and wording.
|
|
24
4
|
*/
|
|
25
5
|
|
|
26
|
-
/**
|
|
27
|
-
* The `gh pr view --json mergeStateStatus` value that licenses a recovery.
|
|
28
|
-
* Module-private: both call sites reach it through {@link applyBehindUpdate},
|
|
29
|
-
* so exporting it would only add a symbol the reachability ratchet scores
|
|
30
|
-
* dead.
|
|
31
|
-
*/
|
|
32
6
|
const BEHIND_MERGE_STATE = 'BEHIND';
|
|
33
7
|
|
|
34
8
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* Both callers' invokers signal failure differently — the merge wait's `gh`
|
|
38
|
-
* facade **throws**, the watcher's `spawnSync` port **resolves** a non-zero
|
|
39
|
-
* status — so both shapes are accepted: a throw is a failure, and so is a
|
|
40
|
-
* resolved object carrying `ok === false`. Anything else resolved (including
|
|
41
|
-
* `undefined`) is a success, which is what a facade that only throws on
|
|
42
|
-
* failure returns.
|
|
9
|
+
* Failure is a throw or a resolved `{ ok: false }`; anything else succeeds.
|
|
43
10
|
*
|
|
44
11
|
* @param {() => Promise<unknown>} updateBranch
|
|
45
12
|
* @returns {Promise<{ ok: boolean, detail: string }>}
|
|
@@ -57,22 +24,14 @@ async function settleUpdate(updateBranch) {
|
|
|
57
24
|
}
|
|
58
25
|
|
|
59
26
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* The order of the two guards is load-bearing: **not-BEHIND is checked
|
|
64
|
-
* first**, so the budget-spent callback fires only for a PR that actually
|
|
65
|
-
* wanted an update. Reversing them would announce an exhausted budget on
|
|
66
|
-
* every poll of a perfectly up-to-date PR.
|
|
27
|
+
* Not-BEHIND is checked before the budget so an up-to-date PR never reports
|
|
28
|
+
* an exhausted budget; an unreadable probe never licenses a write.
|
|
67
29
|
*
|
|
68
30
|
* @param {object} args
|
|
69
|
-
* @param {string|undefined|null} args.mergeStateStatus
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* @param {
|
|
73
|
-
* @param {number} [args.maxUpdates=0] Hard cap on updates per wait.
|
|
74
|
-
* @param {() => Promise<unknown>} args.updateBranch Invoker that issues the
|
|
75
|
-
* fast-forward. See {@link settleUpdate} for the accepted settlements.
|
|
31
|
+
* @param {string|undefined|null} args.mergeStateStatus
|
|
32
|
+
* @param {number} [args.updatesUsed=0]
|
|
33
|
+
* @param {number} [args.maxUpdates=0]
|
|
34
|
+
* @param {() => Promise<unknown>} args.updateBranch
|
|
76
35
|
* @param {(args: { maxUpdates: number }) => void} [args.onBudgetSpent]
|
|
77
36
|
* @param {(args: { updatesUsed: number, maxUpdates: number }) => void} [args.onUpdated]
|
|
78
37
|
* @param {(detail: string) => void} [args.onUpdateFailed]
|
|
@@ -81,11 +40,7 @@ async function settleUpdate(updateBranch) {
|
|
|
81
40
|
* updated: boolean,
|
|
82
41
|
* outcome: 'not-behind'|'budget-spent'|'updated'|'update-failed',
|
|
83
42
|
* }>}
|
|
84
|
-
* `
|
|
85
|
-
* counts as an attempt (the merge wait treats it as a consumed tick and
|
|
86
|
-
* re-reads the real state next poll). `updated` is true only when the
|
|
87
|
-
* fast-forward actually landed, which is the signal a caller needs before
|
|
88
|
-
* invalidating a terminal check outcome and re-polling.
|
|
43
|
+
* `updated` means terminal check outcomes must be re-polled.
|
|
89
44
|
*/
|
|
90
45
|
export async function applyBehindUpdate({
|
|
91
46
|
mergeStateStatus,
|
|
@@ -1,87 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/ceremony-routing.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* profile and the **derived** change level into a per-cluster ceremony decision
|
|
7
|
-
* for the single-delivery acceptance critic — **fresh-context spawn** vs the
|
|
8
|
-
* contract-identical **inline** critic. It does NOT invent a new risk score and
|
|
9
|
-
* it does NOT own clustering.
|
|
10
|
-
*
|
|
11
|
-
* ## One derived source, two decisions (Story #4542)
|
|
12
|
-
*
|
|
13
|
-
* `derivedLevel` comes from `review-depth.js#deriveChangeLevel` — the same call
|
|
14
|
-
* that feeds review depth — so both ceremony decisions read one observable
|
|
15
|
-
* signal: does the change set touch a sensitive path registered in
|
|
16
|
-
* `audit-rules.json`? Previously this consumed the planner's own risk verdict,
|
|
17
|
-
* which meant a confident all-low self-assertion bought *less* independent
|
|
18
|
-
* checking than authoring nothing at all. A derived level cannot be talked down.
|
|
19
|
-
*
|
|
20
|
-
* ## Ceremony profiles (`delivery.routing.ceremonyProfile`)
|
|
21
|
-
*
|
|
22
|
-
* - `minimal` — always `inline` (no fresh critic spawn).
|
|
23
|
-
* Use for tiny N=1 Stories the operator trusts.
|
|
24
|
-
* - `standard` — level-routed (default). Low → inline; high or
|
|
25
|
-
* underivable → fresh.
|
|
26
|
-
* - `strict` — always `fresh` regardless of the derived level.
|
|
27
|
-
*
|
|
28
|
-
* ## The load-bearing invariant (M4-B acceptance floor — DO NOT VIOLATE)
|
|
29
|
-
*
|
|
30
|
-
* Risk-routing chooses fresh-vs-inline **PER CLUSTER**. It NEVER changes the
|
|
31
|
-
* cluster COUNT — the caller owns clustering and hands this module a cluster
|
|
32
|
-
* index. A low-risk Story still gets one verdict per cluster — just possibly
|
|
33
|
-
* authored inline instead of by a fresh sub-agent. This module takes the
|
|
34
|
-
* cluster index as an INPUT and returns a decision for that one cluster; it
|
|
35
|
-
* has no way to add or remove clusters.
|
|
36
|
-
*
|
|
37
|
-
* ## One verdict-owner per cluster (Story #4723)
|
|
38
|
-
*
|
|
39
|
-
* The resolved decision names the cluster's **single verdict owner** via
|
|
40
|
-
* `verdictOwner`: `'fresh-critic'` when the mode is `fresh`,
|
|
41
|
-
* `'inline-self-eval'` when the mode is `inline`. Exactly one pass authors
|
|
42
|
-
* the cluster's verdict — the fresh maker-blind critic OR the
|
|
43
|
-
* contract-identical inline self-eval, never both, and never an additional
|
|
44
|
-
* pre-pass self-assessment before the owner runs. `acceptance-eval.js` is
|
|
45
|
-
* the deterministic SCORER of that one authored verdict (schema validation,
|
|
46
|
-
* round cap, proceed/redraft/block) — it is not a third pass over the
|
|
47
|
-
* criteria. This removes a redundant pass only; it never removes a
|
|
48
|
-
* cluster's verdict (the M4-B floor above holds).
|
|
49
|
-
*
|
|
50
|
-
* ## Tier rules (per cluster, `standard` profile)
|
|
51
|
-
*
|
|
52
|
-
* - `high` level → `fresh` (a sensitive path was touched — a
|
|
53
|
-
* fresh-context maker-blind spawn).
|
|
54
|
-
* - `low` level → `inline` (the contract-identical inline critic).
|
|
55
|
-
* - missing / unknown → `fresh` (fail-safe: the diff could not be
|
|
56
|
-
* enumerated, so there is no evidence the
|
|
57
|
-
* change is unremarkable; treat it as
|
|
58
|
-
* needing the full fresh-context ceremony,
|
|
59
|
-
* exactly as `resolveDepth` degrades to
|
|
60
|
-
* `standard` on the same signal).
|
|
61
|
-
*
|
|
62
|
-
* ## No sampling floor (Story #5313)
|
|
63
|
-
*
|
|
64
|
-
* The maker-checker sampling floor (`delivery.routing.freshCriticSampleRate`,
|
|
65
|
-
* `sampledFresh`) bounded independent checking by a cluster-index stride —
|
|
66
|
-
* a count, not a risk signal — and was retired with the delivery diet. The
|
|
67
|
-
* standard profile now routes purely off the derived level, so the decision
|
|
68
|
-
* carries no `sampled` field and `clusterIndex` is accepted only for call-site
|
|
69
|
-
* compatibility (it never changes the outcome).
|
|
70
|
-
*
|
|
71
|
-
* Pure and total: inputs in, decision out. No I/O, no throws. `null` /
|
|
72
|
-
* `undefined` / malformed inputs degrade to `fresh` + `full` ceremony.
|
|
2
|
+
* lib/orchestration/ceremony-routing.js — the acceptance verdict owner from
|
|
3
|
+
* the ceremony profile alone: `strict` → fresh critic, else inline self-eval.
|
|
4
|
+
* The change level is deliberately not an input (it feeds review depth).
|
|
5
|
+
* Exactly one pass authors the verdict. Pure and total.
|
|
73
6
|
*
|
|
74
7
|
* @typedef {'fresh'|'inline'} CeremonyMode
|
|
75
8
|
* @typedef {'fresh-critic'|'inline-self-eval'} VerdictOwner
|
|
76
|
-
* @typedef {import('./review-depth.js').ChangeLevel} ChangeLevel
|
|
77
9
|
* @typedef {(typeof CEREMONY_PROFILES)[number]} CeremonyProfile
|
|
78
10
|
*/
|
|
79
11
|
|
|
80
12
|
/**
|
|
81
|
-
* Map a resolved ceremony mode to the cluster's single verdict owner
|
|
82
|
-
* (Story #4723). Total: any non-`fresh` value maps to the inline
|
|
83
|
-
* self-eval owner, mirroring how the mode itself degrades.
|
|
84
|
-
*
|
|
85
13
|
* @param {CeremonyMode} mode
|
|
86
14
|
* @returns {VerdictOwner}
|
|
87
15
|
*/
|
|
@@ -89,23 +17,31 @@ export function verdictOwnerForMode(mode) {
|
|
|
89
17
|
return mode === 'fresh' ? 'fresh-critic' : 'inline-self-eval';
|
|
90
18
|
}
|
|
91
19
|
|
|
92
|
-
/**
|
|
93
|
-
* The ceremony-profile vocabulary — the **single** place the three profile
|
|
94
|
-
* names are written. `normalizeCeremonyProfile` is its reader and the
|
|
95
|
-
* `CeremonyProfile` typedef is derived from it, so adding a profile is a
|
|
96
|
-
* one-line change here (Story #4926).
|
|
97
|
-
*
|
|
98
|
-
* @type {readonly ['minimal', 'standard', 'strict']}
|
|
99
|
-
*/
|
|
20
|
+
/** @type {readonly ['minimal', 'standard', 'strict']} */
|
|
100
21
|
const CEREMONY_PROFILES = Object.freeze(['minimal', 'standard', 'strict']);
|
|
101
22
|
|
|
102
|
-
/** The profile an absent or unrecognized value degrades to. */
|
|
103
23
|
const DEFAULT_CEREMONY_PROFILE = 'standard';
|
|
104
24
|
|
|
105
25
|
/**
|
|
106
|
-
*
|
|
107
|
-
|
|
108
|
-
|
|
26
|
+
* @type {Readonly<Record<CeremonyProfile, { mode: CeremonyMode, reason: string }>>}
|
|
27
|
+
*/
|
|
28
|
+
const PROFILE_DECISIONS = Object.freeze({
|
|
29
|
+
minimal: {
|
|
30
|
+
mode: 'inline',
|
|
31
|
+
reason: 'ceremonyProfile=minimal: inline self-eval (no fresh spawn)',
|
|
32
|
+
},
|
|
33
|
+
standard: {
|
|
34
|
+
mode: 'inline',
|
|
35
|
+
reason:
|
|
36
|
+
'ceremonyProfile=standard: inline self-eval authors the Story verdict',
|
|
37
|
+
},
|
|
38
|
+
strict: {
|
|
39
|
+
mode: 'fresh',
|
|
40
|
+
reason: 'ceremonyProfile=strict: fresh-context critic',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/**
|
|
109
45
|
* @param {unknown} value
|
|
110
46
|
* @returns {CeremonyProfile}
|
|
111
47
|
*/
|
|
@@ -116,16 +52,9 @@ function normalizeCeremonyProfile(value) {
|
|
|
116
52
|
}
|
|
117
53
|
|
|
118
54
|
/**
|
|
119
|
-
* Resolve the acceptance ceremony for one cluster from the ceremony profile
|
|
120
|
-
* and the derived change level. See the module header for the tier rules and
|
|
121
|
-
* the untouchable cluster-count invariant.
|
|
122
|
-
*
|
|
123
55
|
* @param {{
|
|
124
|
-
* derivedLevel?: (ChangeLevel|string|null|undefined),
|
|
125
|
-
* clusterIndex?: (number|null|undefined),
|
|
126
56
|
* ceremonyProfile?: (CeremonyProfile|string|null|undefined),
|
|
127
|
-
* }} [input]
|
|
128
|
-
* (Story #5313 retired the sampling floor that read it).
|
|
57
|
+
* }} [input]
|
|
129
58
|
* @returns {{
|
|
130
59
|
* mode: CeremonyMode,
|
|
131
60
|
* reason: string,
|
|
@@ -134,64 +63,7 @@ function normalizeCeremonyProfile(value) {
|
|
|
134
63
|
* }}
|
|
135
64
|
*/
|
|
136
65
|
export function resolveCeremonyForRisk(input = {}) {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Internal mode/reason resolution — the tier rules. `resolveCeremonyForRisk`
|
|
143
|
-
* decorates the result with the single `verdictOwner` derived from the mode
|
|
144
|
-
* (Story #4723).
|
|
145
|
-
*
|
|
146
|
-
* @param {Parameters<typeof resolveCeremonyForRisk>[0]} [input]
|
|
147
|
-
* @returns {{
|
|
148
|
-
* mode: CeremonyMode,
|
|
149
|
-
* reason: string,
|
|
150
|
-
* profile: CeremonyProfile,
|
|
151
|
-
* }}
|
|
152
|
-
*/
|
|
153
|
-
function resolveCeremonyDecision(input = {}) {
|
|
154
|
-
const derivedLevel =
|
|
155
|
-
input && typeof input === 'object' ? input.derivedLevel : undefined;
|
|
156
|
-
const profile = normalizeCeremonyProfile(
|
|
157
|
-
input && typeof input === 'object' ? input.ceremonyProfile : undefined,
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
if (profile === 'minimal') {
|
|
161
|
-
return {
|
|
162
|
-
mode: 'inline',
|
|
163
|
-
reason: 'ceremonyProfile=minimal: inline critic (no fresh spawn)',
|
|
164
|
-
profile,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
if (profile === 'strict') {
|
|
168
|
-
return {
|
|
169
|
-
mode: 'fresh',
|
|
170
|
-
reason: 'ceremonyProfile=strict: fresh-context critic',
|
|
171
|
-
profile,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (derivedLevel === 'high') {
|
|
176
|
-
return {
|
|
177
|
-
mode: 'fresh',
|
|
178
|
-
reason: 'sensitive path touched: fresh-context critic',
|
|
179
|
-
profile,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
if (derivedLevel === 'low') {
|
|
183
|
-
return {
|
|
184
|
-
mode: 'inline',
|
|
185
|
-
reason: 'no sensitive path touched: contract-identical inline critic',
|
|
186
|
-
profile,
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
// Missing / unknown / malformed level → fail-safe fresh + full ceremony,
|
|
190
|
-
// matching how resolveDepth degrades to `standard` on the same signal.
|
|
191
|
-
return {
|
|
192
|
-
mode: 'fresh',
|
|
193
|
-
reason:
|
|
194
|
-
'change level underivable: fail-safe fresh-context critic + full ceremony',
|
|
195
|
-
profile,
|
|
196
|
-
};
|
|
66
|
+
const profile = normalizeCeremonyProfile(input?.ceremonyProfile);
|
|
67
|
+
const { mode, reason } = PROFILE_DECISIONS[profile];
|
|
68
|
+
return { mode, reason, profile, verdictOwner: verdictOwnerForMode(mode) };
|
|
197
69
|
}
|
|
@@ -1,33 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/change-set.js — the
|
|
3
|
-
*
|
|
2
|
+
* lib/orchestration/change-set.js — the one Story change-set enumerator.
|
|
3
|
+
* Computed once and injected so ceremony, review depth and lens roster all
|
|
4
|
+
* route off the same file list.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* derivation in `helpers/deliver-story`, once inside `runCodeReview` (to derive
|
|
10
|
-
* the review depth), once for the Story-scope local-lens roster, and once more
|
|
11
|
-
* per fresh acceptance critic. Every one of those consumers must agree about
|
|
12
|
-
* *what changed* — ceremony level and review depth both flow from
|
|
13
|
-
* `deriveChangeLevel`, so two enumerations straddling a commit could route the
|
|
14
|
-
* same Story two different ways. Computing the set once and injecting it closes
|
|
15
|
-
* that window and drops the redundant git calls.
|
|
16
|
-
*
|
|
17
|
-
* ## Contract
|
|
18
|
-
*
|
|
19
|
-
* {@link computeChangeSet} is **total**: it never throws. A diff it cannot
|
|
20
|
-
* enumerate (git failure, missing ref, spawn error) yields
|
|
21
|
-
* `{ files: null, enumerated: false }` — the neutral "diff unknown" signal that
|
|
22
|
-
* `deriveChangeLevel` / `resolveDepth` already fail safe on (`standard` depth, a
|
|
23
|
-
* `fresh` critic). `null` is deliberately distinct from `[]`: an empty array is
|
|
24
|
-
* the *fact* that nothing changed, whereas `null` is the *absence* of evidence,
|
|
25
|
-
* and only the latter must never buy a change less checking.
|
|
26
|
-
*
|
|
27
|
-
* The returned `files` are trimmed, de-duplicated, and sorted, so two consumers
|
|
28
|
-
* comparing the same change set compare byte-identical lists. The refs the set
|
|
29
|
-
* was computed against ride along on the envelope so a downstream consumer can
|
|
30
|
-
* report (or assert) its provenance rather than re-deriving it.
|
|
6
|
+
* Total: an unenumerable diff yields `{ files: null, enumerated: false }`.
|
|
7
|
+
* `null` (no evidence) is distinct from `[]` (nothing changed) — only the
|
|
8
|
+
* former must never buy less checking. `files` is trimmed, de-duplicated and
|
|
9
|
+
* sorted.
|
|
31
10
|
*
|
|
32
11
|
* @typedef {{
|
|
33
12
|
* baseRef: string,
|
|
@@ -42,9 +21,6 @@
|
|
|
42
21
|
import { gitSpawn } from '../git-utils.js';
|
|
43
22
|
|
|
44
23
|
/**
|
|
45
|
-
* Trim, drop empties, de-duplicate, and sort raw `git diff --name-only` output.
|
|
46
|
-
* Pure.
|
|
47
|
-
*
|
|
48
24
|
* @param {string} stdout
|
|
49
25
|
* @returns {string[]}
|
|
50
26
|
*/
|
|
@@ -58,11 +34,6 @@ function normalizeFileList(stdout) {
|
|
|
58
34
|
}
|
|
59
35
|
|
|
60
36
|
/**
|
|
61
|
-
* Compute the change set for the `baseRef...headRef` diff **once**, for every
|
|
62
|
-
* consumer that needs to know what a Story touched.
|
|
63
|
-
*
|
|
64
|
-
* Total — never throws; see the module header for the `null` vs `[]` contract.
|
|
65
|
-
*
|
|
66
37
|
* @param {{
|
|
67
38
|
* baseRef: string,
|
|
68
39
|
* headRef: string,
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* compare
|
|
3
|
-
*
|
|
4
|
-
* Owns the head-vs-base compare stage: scope resolution, base-baseline
|
|
5
|
-
* read, per-kind classifier dispatch, and tolerance application.
|
|
6
|
-
*
|
|
7
|
-
* Extracted from `check-baselines.js` without behavior change.
|
|
2
|
+
* Head-vs-base compare stage of check-baselines: scope, base read, per-kind
|
|
3
|
+
* classifier, tolerance.
|
|
8
4
|
*
|
|
9
5
|
* @module lib/orchestration/check-baselines/phases/compare
|
|
10
6
|
*/
|
|
@@ -25,12 +21,9 @@ function baselineRelativePath(kind, gateBlock) {
|
|
|
25
21
|
return configured ?? DEFAULT_BASELINE_PATHS[kind];
|
|
26
22
|
}
|
|
27
23
|
|
|
28
|
-
export function resolveDispatchScope({ kind,
|
|
29
|
-
const cfg = quality?.gateScoping ?? {};
|
|
24
|
+
export function resolveDispatchScope({ kind, env }) {
|
|
30
25
|
return resolveScope({
|
|
31
26
|
kind,
|
|
32
|
-
configScope: cfg.scope,
|
|
33
|
-
configRef: cfg.diffRef,
|
|
34
27
|
envScope: env?.BASELINE_SCOPE,
|
|
35
28
|
envRef: env?.BASELINE_REF,
|
|
36
29
|
});
|
|
@@ -41,19 +34,8 @@ function emptyCompareResult(baseRef) {
|
|
|
41
34
|
}
|
|
42
35
|
|
|
43
36
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* `readBaseFromGit` already draws that line itself: it returns `null` only
|
|
47
|
-
* for git exit 128 ("path does not exist in this revision") and throws on
|
|
48
|
-
* everything else. Swallowing the throw conflated the two, so a broken read
|
|
49
|
-
* silently emptied the whole head-vs-base arm — regressions AND additions —
|
|
50
|
-
* while the floors arm kept the run at exit 0. A gate that fails open is
|
|
51
|
-
* worse than no gate, because it is trusted.
|
|
52
|
-
*
|
|
53
|
-
* So the read failure fails CLOSED as `EXIT_CONFIG` (3) — "the gate could
|
|
54
|
-
* not even start", the same code `assertFloorAxesExist` uses for a
|
|
55
|
-
* misconfigured floor axis. `check-baselines.js#main` maps any throw out of
|
|
56
|
-
* the pipeline onto that code.
|
|
37
|
+
* A failed base read is not an absent base: it fails closed as `EXIT_CONFIG`
|
|
38
|
+
* rather than silently emptying the compare arm to a trusted exit 0.
|
|
57
39
|
*/
|
|
58
40
|
function buildBaseReadError({ kind, ref, file, cause }) {
|
|
59
41
|
const detail = cause?.message ?? String(cause);
|
|
@@ -83,14 +65,7 @@ function readBaseBaselinePayload(scope, kind, gateBlock, cwd) {
|
|
|
83
65
|
try {
|
|
84
66
|
return JSON.parse(raw);
|
|
85
67
|
} catch (cause) {
|
|
86
|
-
//
|
|
87
|
-
// second way a base read fails. `null` here means "no baseline at the base
|
|
88
|
-
// ref", which empties the head-vs-base arm on purpose; an UNPARSEABLE base
|
|
89
|
-
// blob is a read that failed, and reporting it as "no base" made a
|
|
90
|
-
// corrupted or half-merged `baselines/*.json` on the base branch report
|
|
91
|
-
// zero regressions at exit 0. Text-merged baselines are exactly how such a
|
|
92
|
-
// blob gets onto the base branch, which is the failure this Story removes
|
|
93
|
-
// upstream — this arm is what stops it being silent when it happens anyway.
|
|
68
|
+
// An unparseable (e.g. text-merged) base blob is a failed read too.
|
|
94
69
|
throw buildBaseReadError({ kind, ref: scope.ref, file: rel, cause });
|
|
95
70
|
}
|
|
96
71
|
}
|
|
@@ -107,21 +82,9 @@ export async function evaluateCompare({ kind, gateBlock, scope, cwd }) {
|
|
|
107
82
|
}
|
|
108
83
|
|
|
109
84
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* without moving `kernelVersion`. Across that boundary the same row can carry
|
|
114
|
-
* a different score for reasons that have nothing to do with the branch's
|
|
115
|
-
* changes, so a head-vs-base diff manufactures phantom regressions (and can
|
|
116
|
-
* hide real ones behind them).
|
|
117
|
-
*
|
|
118
|
-
* The head-side stamp is already a fail-closed gate: a stale HEAD baseline
|
|
119
|
-
* never reaches this point. What reaches here is the opposite and legitimate
|
|
120
|
-
* case — a branch that DOES carry a re-derived baseline, compared against a
|
|
121
|
-
* base that predates the change. The only honest verdict is "no comparison";
|
|
122
|
-
* floors still run, so a genuine ceiling breach is still caught, and once the
|
|
123
|
-
* refreshed baseline is the base the ratchet returns to full strength on the
|
|
124
|
-
* very next run without anything to remember to reset.
|
|
85
|
+
* Rows scored under different `scoringSemantics` are incomparable (phantom
|
|
86
|
+
* regressions), so a branch carrying a re-derived baseline skips compare
|
|
87
|
+
* against an older base; floors still run.
|
|
125
88
|
*/
|
|
126
89
|
function baseIsComparable(headBaseline, basePayload) {
|
|
127
90
|
const head = headBaseline?.scoringSemantics ?? null;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Runs the per-kind pipeline: load → floor → compare → tolerance → report.
|
|
5
|
-
* Extracted from `check-baselines.js` without behavior change.
|
|
2
|
+
* Per-kind check-baselines pipeline: load → floor → compare → tolerance →
|
|
3
|
+
* acknowledgment → report.
|
|
6
4
|
*
|
|
7
5
|
* @module lib/orchestration/check-baselines/phases/evaluate
|
|
8
6
|
*/
|
|
@@ -19,33 +17,13 @@ import { applyFloors, flattenBreaches } from './floors.js';
|
|
|
19
17
|
import { applyRefreshAcknowledgment } from './refresh-ack.js';
|
|
20
18
|
|
|
21
19
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* `rollup["*"]` never includes an ignored file. But the floor check trusts the
|
|
27
|
-
* *stored* `rollup["*"]`: if a baseline is poisoned by some other route — a
|
|
28
|
-
* stale branch's older tooling, a hand-edit, a future generation bug — an
|
|
29
|
-
* ignored file's metric can still drag the global floor axis (e.g.
|
|
30
|
-
* maintainability `min`) below its floor and block every downstream close.
|
|
31
|
-
*
|
|
32
|
-
* This recomputes the global `*` aggregate over the baseline rows that are NOT
|
|
33
|
-
* matched by the gate's `ignoreGlobs`, using the kind's own canonical
|
|
34
|
-
* `rollup()` aggregator, so the floor axis reflects only the files the gate is
|
|
35
|
-
* meant to police. It is a **no-op for a correctly-generated baseline** (no
|
|
36
|
-
* ignored file is present in `rows`, so the filtered set is identical and the
|
|
37
|
-
* stored `rollup["*"]` is returned unchanged) and only affects the `*`
|
|
38
|
-
* component the incident poisons; named-component rollups are left as stored.
|
|
39
|
-
* The compare/regression stage is untouched — this only reshapes the floor
|
|
40
|
-
* input. All three `ignoreGlobs`-configured gates (maintainability, crap,
|
|
41
|
-
* duplication) are `path`-keyed, so the shared path matcher applies uniformly.
|
|
42
|
-
*
|
|
43
|
-
* Kept module-local (not exported): the poison-exclusion behaviour is covered
|
|
44
|
-
* end-to-end through `evaluateKind` by the `check-baselines.min-floor` suite,
|
|
45
|
-
* so there is no external consumer to justify widening the surface.
|
|
20
|
+
* Recompute the `*` floor rollup without `ignoreGlobs` rows, in case a
|
|
21
|
+
* baseline was poisoned by some route other than generation (which already
|
|
22
|
+
* drops them); an ignored file could otherwise breach a global floor. A no-op
|
|
23
|
+
* for a correct baseline; compare is untouched.
|
|
46
24
|
*
|
|
47
25
|
* @param {{ kind: string, baseline: { rollup?: object, rows?: object[] }, ignoreGlobs?: string[], cwd?: string }} args
|
|
48
|
-
* @returns {object}
|
|
26
|
+
* @returns {object}
|
|
49
27
|
*/
|
|
50
28
|
function rollupExcludingIgnored({ kind, baseline, ignoreGlobs, cwd }) {
|
|
51
29
|
const rollup = baseline?.rollup;
|
|
@@ -64,8 +42,6 @@ function rollupExcludingIgnored({ kind, baseline, ignoreGlobs, cwd }) {
|
|
|
64
42
|
const p = row?.path;
|
|
65
43
|
return typeof p !== 'string' || !isIgnoredByGlobs(p, ignoreGlobs, cwd);
|
|
66
44
|
});
|
|
67
|
-
// Nothing ignored is present → the stored rollup already excludes ignored
|
|
68
|
-
// files (the correct-baseline fast path); return it untouched.
|
|
69
45
|
if (kept.length === rows.length) return rollup;
|
|
70
46
|
const recomputed = mod.rollup(kept);
|
|
71
47
|
return { ...rollup, '*': recomputed?.['*'] ?? rollup?.['*'] };
|
|
@@ -109,17 +85,11 @@ function buildGateReport({
|
|
|
109
85
|
additions: compareOutput.additions ?? [],
|
|
110
86
|
regressionCount: compareOutput.regressions.length,
|
|
111
87
|
baseRef: cmp.baseRef ?? null,
|
|
112
|
-
//
|
|
113
|
-
// which is why a dead compare arm looked byte-identical to a clean run.
|
|
114
|
-
// Surfacing it makes "the head-vs-base arm did not run" diagnosable from
|
|
115
|
-
// the JSON report alone.
|
|
88
|
+
// Without this a compare arm that never ran looks identical to a clean run.
|
|
116
89
|
baseRead: cmp.baseRead === true,
|
|
117
90
|
generatedAt: baseline.generatedAt,
|
|
118
91
|
acknowledged: ack.acknowledged,
|
|
119
|
-
//
|
|
120
|
-
// clears only the rows it actually refreshed, so a run can acknowledge some
|
|
121
|
-
// regressions and still fail on others. Naming the acknowledged keys makes
|
|
122
|
-
// which-half-was-which readable from the JSON report without re-walking git.
|
|
92
|
+
// Acknowledgment can be partial; name which regressions it cleared.
|
|
123
93
|
acknowledgedKeys: ack.acknowledgedKeys,
|
|
124
94
|
};
|
|
125
95
|
}
|
|
@@ -135,11 +105,8 @@ export async function evaluateKind({
|
|
|
135
105
|
const headLoad = loadHeadBaseline(kind, cwd, configPath);
|
|
136
106
|
if (headLoad.schemaError) return { kind, schemaError: headLoad.schemaError };
|
|
137
107
|
const baseline = headLoad.baseline;
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
// incomparable, so schema validation alone would wave it through. Fail
|
|
141
|
-
// closed on the `semantics` tag rather than compare across the boundary;
|
|
142
|
-
// the message names the exact re-baseline command.
|
|
108
|
+
// Rows from superseded scoring semantics pass schema but are incomparable;
|
|
109
|
+
// fail closed.
|
|
143
110
|
const semanticsError = checkBaselineSemantics(kind, baseline);
|
|
144
111
|
if (semanticsError) {
|
|
145
112
|
return {
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Pure floor-comparison helpers. Extracted verbatim from `check-baselines.js`
|
|
5
|
-
* so `compareToFloor`, `assertFloorAxesExist`, and `applyFloors` keep their
|
|
6
|
-
* named-export contracts for the existing unit tests.
|
|
2
|
+
* Pure floor-comparison helpers for check-baselines.
|
|
7
3
|
*
|
|
8
4
|
* @module lib/orchestration/check-baselines/phases/floors
|
|
9
5
|
*/
|
|
@@ -11,11 +7,7 @@
|
|
|
11
7
|
import { EXIT_CONFIG } from '../../../baselines/exit-codes.js';
|
|
12
8
|
|
|
13
9
|
/**
|
|
14
|
-
*
|
|
15
|
-
* at or above the floor, `lte` at or below it. Exported (Story #4902) so the
|
|
16
|
-
* baseline hotspot engine reports floor headroom with the same polarity the
|
|
17
|
-
* gate enforces — a second copy of this table would let the two disagree
|
|
18
|
-
* about which direction is "better" for a given axis.
|
|
10
|
+
* Floor polarity per axis; the single table every consumer must share.
|
|
19
11
|
*
|
|
20
12
|
* @param {string} kind
|
|
21
13
|
* @param {string} axis
|
|
@@ -33,10 +25,7 @@ export function axisDirection(kind, axis) {
|
|
|
33
25
|
return 'gte';
|
|
34
26
|
}
|
|
35
27
|
|
|
36
|
-
/**
|
|
37
|
-
* Compare a single rollup component against a single floor object. Returns
|
|
38
|
-
* the array of axis violations (empty when every axis meets its floor).
|
|
39
|
-
*/
|
|
28
|
+
/** Axis violations of one rollup component against its floor. */
|
|
40
29
|
export function compareToFloor(kind, aggregate, floor) {
|
|
41
30
|
const out = [];
|
|
42
31
|
if (!floor || typeof floor !== 'object') return out;
|
|
@@ -52,10 +41,6 @@ export function compareToFloor(kind, aggregate, floor) {
|
|
|
52
41
|
return out;
|
|
53
42
|
}
|
|
54
43
|
|
|
55
|
-
/**
|
|
56
|
-
* Tiny helper to suggest the closest available axis when an operator
|
|
57
|
-
* misnamed a floor axis. Substring containment is enough.
|
|
58
|
-
*/
|
|
59
44
|
function suggestAxis(unknownAxis, availableKeys) {
|
|
60
45
|
if (availableKeys.length === 0) return null;
|
|
61
46
|
const target = unknownAxis.toLowerCase();
|
|
@@ -85,9 +70,8 @@ function buildAxisMismatchError({ kind, component, axis, availableKeys }) {
|
|
|
85
70
|
}
|
|
86
71
|
|
|
87
72
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* rationale (typo in `.agentrc.json` → exit code 3 instead of silent pass).
|
|
73
|
+
* Fail closed (exit 3) on a floor axis absent from the rollup, so a config
|
|
74
|
+
* typo never silently passes.
|
|
91
75
|
*/
|
|
92
76
|
export function assertFloorAxesExist(kind, component, aggregate, floor) {
|
|
93
77
|
if (!floor || typeof floor !== 'object') return;
|
|
@@ -119,9 +103,6 @@ function evaluateComponentFloor(kind, component, rollup, floors) {
|
|
|
119
103
|
return { component, violations };
|
|
120
104
|
}
|
|
121
105
|
|
|
122
|
-
/**
|
|
123
|
-
* Apply the floor policy across every component in a rollup. Pure.
|
|
124
|
-
*/
|
|
125
106
|
export function applyFloors(kind, rollup, floors) {
|
|
126
107
|
const out = [];
|
|
127
108
|
for (const component of collectComponentNames(rollup, floors)) {
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* site: per (kind, severity) tuple, exactly one friction event with the
|
|
6
|
-
* canonical payload `{tool:'check-baselines', kind, severity, file?,
|
|
7
|
-
* method?, delta?, baseRef}`.
|
|
8
|
-
*
|
|
9
|
-
* Severities:
|
|
10
|
-
* - `floor` — at least one floor breach.
|
|
11
|
-
* - `regression` — at least one head-vs-base regression.
|
|
12
|
-
* - `schema` — head baseline failed schema validation / read.
|
|
13
|
-
* - `kernel-mismatch` — baseline kernelVersion ≠ running kernel.
|
|
2
|
+
* The single check-baselines friction emission site: exactly one event per
|
|
3
|
+
* (kind, severity), severity one of `floor | regression | schema |
|
|
4
|
+
* kernel-mismatch`.
|
|
14
5
|
*
|
|
15
6
|
* @module lib/orchestration/check-baselines/phases/friction
|
|
16
7
|
*/
|