mandrel 2.60.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +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 +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,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,53 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/ceremony-routing.js —
|
|
3
|
-
* ceremony
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* ceremony profile into a per-Story ceremony decision for the acceptance
|
|
7
|
-
* verdict — **fresh-context spawn** vs the contract-identical **inline**
|
|
8
|
-
* self-eval. It does NOT invent a risk score, and it no longer routes off
|
|
9
|
-
* anything the diff says.
|
|
10
|
-
*
|
|
11
|
-
* ## The profile is the whole decision (Story #5343)
|
|
12
|
-
*
|
|
13
|
-
* - `minimal` — `inline`.
|
|
14
|
-
* - `standard` — `inline` (the **default**).
|
|
15
|
-
* - `strict` — `fresh`.
|
|
16
|
-
*
|
|
17
|
-
* A frontier-model worker scoring its own `acceptance[]` items against the
|
|
18
|
-
* `verify[]` output it just produced is the default the delivery diet settled
|
|
19
|
-
* on: the fresh critic's isolation bought a second full-context boot per
|
|
20
|
-
* Story and, measured across the run, changed no verdict the inline pass did
|
|
21
|
-
* not already reach. `strict` keeps the fresh-context critic for
|
|
22
|
-
* high-assurance surfaces, and is the one profile that spawns one.
|
|
23
|
-
*
|
|
24
|
-
* **The derived change level is not an input here (Story #5366).** It is
|
|
25
|
-
* still derived and still printed by `ceremony-derive.js`, because **review
|
|
26
|
-
* depth** reads it — `review-depth.js#resolveDepth` continues to resolve
|
|
27
|
-
* `deep` for any sensitive class, and that is untouched. What changed with
|
|
28
|
-
* #5343 is which of the two decisions the level feeds: review depth, not the
|
|
29
|
-
* verdict owner. Story #5366 finished the job by removing it (and the
|
|
30
|
-
* per-cluster index beside it) from this function's signature: a decision
|
|
31
|
-
* function that accepts what it ignores reads, to every caller and every
|
|
32
|
-
* reviewer, as though the input still mattered. An unenumerable diff is
|
|
33
|
-
* therefore not a fail-safe escalation here at all; it escalates review
|
|
34
|
-
* depth instead, where the evidence it withholds actually matters.
|
|
35
|
-
*
|
|
36
|
-
* ## One verdict-owner per Story (Story #4723, narrowed by #5343)
|
|
37
|
-
*
|
|
38
|
-
* The resolved decision names the Story's **single verdict owner** via
|
|
39
|
-
* `verdictOwner`: `'fresh-critic'` when the mode is `fresh`,
|
|
40
|
-
* `'inline-self-eval'` when the mode is `inline`. Exactly one pass authors
|
|
41
|
-
* the Story's verdict — the fresh maker-blind critic OR the
|
|
42
|
-
* contract-identical inline self-eval, never both, and never an additional
|
|
43
|
-
* pre-pass self-assessment before the owner runs. `acceptance-eval.js` is
|
|
44
|
-
* the deterministic SCORER of that one authored verdict (schema validation,
|
|
45
|
-
* round cap, proceed/redraft/block) — it is not a third pass over the
|
|
46
|
-
* criteria. The verdict is **one file per Story**, scored in one gate call;
|
|
47
|
-
* the cluster protocol that used to split it was retired with #5343.
|
|
48
|
-
*
|
|
49
|
-
* Pure and total: inputs in, decision out. No I/O, no throws. `null` /
|
|
50
|
-
* `undefined` / malformed inputs degrade to the default profile.
|
|
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.
|
|
51
6
|
*
|
|
52
7
|
* @typedef {'fresh'|'inline'} CeremonyMode
|
|
53
8
|
* @typedef {'fresh-critic'|'inline-self-eval'} VerdictOwner
|
|
@@ -55,10 +10,6 @@
|
|
|
55
10
|
*/
|
|
56
11
|
|
|
57
12
|
/**
|
|
58
|
-
* Map a resolved ceremony mode to the Story's single verdict owner
|
|
59
|
-
* (Story #4723). Total: any non-`fresh` value maps to the inline
|
|
60
|
-
* self-eval owner, mirroring how the mode itself degrades.
|
|
61
|
-
*
|
|
62
13
|
* @param {CeremonyMode} mode
|
|
63
14
|
* @returns {VerdictOwner}
|
|
64
15
|
*/
|
|
@@ -66,23 +17,12 @@ export function verdictOwnerForMode(mode) {
|
|
|
66
17
|
return mode === 'fresh' ? 'fresh-critic' : 'inline-self-eval';
|
|
67
18
|
}
|
|
68
19
|
|
|
69
|
-
/**
|
|
70
|
-
* The ceremony-profile vocabulary — the **single** place the three profile
|
|
71
|
-
* names are written. `normalizeCeremonyProfile` is its reader and the
|
|
72
|
-
* `CeremonyProfile` typedef is derived from it, so adding a profile is a
|
|
73
|
-
* one-line change here (Story #4926).
|
|
74
|
-
*
|
|
75
|
-
* @type {readonly ['minimal', 'standard', 'strict']}
|
|
76
|
-
*/
|
|
20
|
+
/** @type {readonly ['minimal', 'standard', 'strict']} */
|
|
77
21
|
const CEREMONY_PROFILES = Object.freeze(['minimal', 'standard', 'strict']);
|
|
78
22
|
|
|
79
|
-
/** The profile an absent or unrecognized value degrades to. */
|
|
80
23
|
const DEFAULT_CEREMONY_PROFILE = 'standard';
|
|
81
24
|
|
|
82
25
|
/**
|
|
83
|
-
* The one routing table: profile → mode + the reason the decision carries.
|
|
84
|
-
* `strict` is the only profile that spawns a fresh critic.
|
|
85
|
-
*
|
|
86
26
|
* @type {Readonly<Record<CeremonyProfile, { mode: CeremonyMode, reason: string }>>}
|
|
87
27
|
*/
|
|
88
28
|
const PROFILE_DECISIONS = Object.freeze({
|
|
@@ -102,9 +42,6 @@ const PROFILE_DECISIONS = Object.freeze({
|
|
|
102
42
|
});
|
|
103
43
|
|
|
104
44
|
/**
|
|
105
|
-
* Normalize an operator/config ceremony profile. Unknown values degrade to
|
|
106
|
-
* `standard` (fail toward the documented default, not toward less ceremony).
|
|
107
|
-
*
|
|
108
45
|
* @param {unknown} value
|
|
109
46
|
* @returns {CeremonyProfile}
|
|
110
47
|
*/
|
|
@@ -115,10 +52,6 @@ function normalizeCeremonyProfile(value) {
|
|
|
115
52
|
}
|
|
116
53
|
|
|
117
54
|
/**
|
|
118
|
-
* Resolve the acceptance ceremony for one Story from the ceremony profile —
|
|
119
|
-
* its one and only input. See the module header for the profile table and why
|
|
120
|
-
* the derived change level is not among them.
|
|
121
|
-
*
|
|
122
55
|
* @param {{
|
|
123
56
|
* ceremonyProfile?: (CeremonyProfile|string|null|undefined),
|
|
124
57
|
* }} [input]
|
|
@@ -130,9 +63,6 @@ function normalizeCeremonyProfile(value) {
|
|
|
130
63
|
* }}
|
|
131
64
|
*/
|
|
132
65
|
export function resolveCeremonyForRisk(input = {}) {
|
|
133
|
-
// Optional chaining rather than a typeof guard: `normalizeCeremonyProfile`
|
|
134
|
-
// is already total over anything that is not one of the three names, so a
|
|
135
|
-
// non-object input degrades to `standard` through the same door.
|
|
136
66
|
const profile = normalizeCeremonyProfile(input?.ceremonyProfile);
|
|
137
67
|
const { mode, reason } = PROFILE_DECISIONS[profile];
|
|
138
68
|
return { mode, reason, profile, verdictOwner: verdictOwnerForMode(mode) };
|
|
@@ -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
|
*/
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Owns CLI flag parsing and the canned `--help` text. Migrated in Story
|
|
5
|
-
* #2989 to delegate the bulk of argv walking to
|
|
6
|
-
* `parseStandardCliArgs`; the wrapper preserves the legacy parsed shape
|
|
7
|
-
* (storyId / epicId are now numbers, the rest of the keys are unchanged).
|
|
8
|
-
*
|
|
9
|
-
* `parseArgs(argv)` is re-exported from `check-baselines.js` and exercised
|
|
10
|
-
* directly by the unit tests, so the function name and signature are
|
|
11
|
-
* load-bearing.
|
|
2
|
+
* check-baselines CLI flag parsing and `--help` text.
|
|
12
3
|
*
|
|
13
4
|
* @module lib/orchestration/check-baselines/phases/parse-args
|
|
14
5
|
*/
|
|
@@ -16,23 +7,19 @@
|
|
|
16
7
|
import { parseStandardCliArgs } from '../../../cli/standard-args.js';
|
|
17
8
|
|
|
18
9
|
export const KNOWN_KINDS = Object.freeze([
|
|
19
|
-
'lint',
|
|
20
10
|
'coverage',
|
|
21
11
|
'crap',
|
|
22
12
|
'maintainability',
|
|
23
13
|
'mutation',
|
|
24
|
-
'lighthouse',
|
|
25
14
|
'bundle-size',
|
|
26
15
|
'duplication',
|
|
27
16
|
]);
|
|
28
17
|
|
|
29
18
|
export const DEFAULT_BASELINE_PATHS = Object.freeze({
|
|
30
|
-
lint: 'baselines/lint.json',
|
|
31
19
|
coverage: 'baselines/coverage.json',
|
|
32
20
|
crap: 'baselines/crap.json',
|
|
33
21
|
maintainability: 'baselines/maintainability.json',
|
|
34
22
|
mutation: 'baselines/mutation.json',
|
|
35
|
-
lighthouse: 'baselines/lighthouse.json',
|
|
36
23
|
'bundle-size': 'baselines/bundle-size.json',
|
|
37
24
|
duplication: 'baselines/duplication.json',
|
|
38
25
|
});
|
|
@@ -55,8 +42,8 @@ Env vars:
|
|
|
55
42
|
re-enforces the ratchet at full strength.
|
|
56
43
|
|
|
57
44
|
Equivalent commit-tagged trigger: a commit in the
|
|
58
|
-
compared range whose subject contains
|
|
59
|
-
'
|
|
45
|
+
compared range whose subject contains
|
|
46
|
+
'baseline-refresh:' AND whose
|
|
60
47
|
diff touches that kind's baseline file. One-shot by
|
|
61
48
|
construction — once merged the refreshed baseline is
|
|
62
49
|
the new base and the tag leaves the range.
|
|
@@ -81,13 +68,7 @@ export function helpReport() {
|
|
|
81
68
|
};
|
|
82
69
|
}
|
|
83
70
|
|
|
84
|
-
/**
|
|
85
|
-
* Comma-split + repeat-aggregate the raw `--gate` tokens collected by
|
|
86
|
-
* the shared parser. The original walker accepted both
|
|
87
|
-
* `--gate coverage,lint` and `--gate coverage --gate lint` and
|
|
88
|
-
* concatenated the values; we replicate that here in a single pass over
|
|
89
|
-
* the `string-multi` array the shared parser produces.
|
|
90
|
-
*/
|
|
71
|
+
/** Accept both `--gate a,b` and repeated `--gate a --gate b`. */
|
|
91
72
|
function flattenGateTokens(raw) {
|
|
92
73
|
if (!Array.isArray(raw) || raw.length === 0) return null;
|
|
93
74
|
const parts = [];
|
|
@@ -102,15 +83,6 @@ function flattenGateTokens(raw) {
|
|
|
102
83
|
}
|
|
103
84
|
|
|
104
85
|
/**
|
|
105
|
-
* Parse the CLI flags. Pure — exported for tests.
|
|
106
|
-
*
|
|
107
|
-
* Note: the migration to `parseStandardCliArgs` (Story #2989) changes
|
|
108
|
-
* `storyId` / `epicId` from string to number — both `parseTicketId`
|
|
109
|
-
* (positive integer, leading `#` stripped, `null` on invalid). The
|
|
110
|
-
* downstream `emitFrictionSignal` short-circuits on falsy, and
|
|
111
|
-
* `signals-writer` documents `storyId` / `epicId` as `number`, so the
|
|
112
|
-
* type alignment fixes a latent string-vs-number mismatch.
|
|
113
|
-
*
|
|
114
86
|
* @param {string[]} argv process.argv.slice(2)
|
|
115
87
|
* @returns {{
|
|
116
88
|
* configPath: string | null,
|
|
@@ -123,12 +95,8 @@ function flattenGateTokens(raw) {
|
|
|
123
95
|
* }}
|
|
124
96
|
*/
|
|
125
97
|
export function parseArgs(argv) {
|
|
126
|
-
//
|
|
127
|
-
// surface a help flag; pre-scan and short-circuit before delegating.
|
|
98
|
+
// The shared parser has no help flag and accepts any `--format` string.
|
|
128
99
|
const helpRequested = argv.some((t) => t === '--help' || t === '-h');
|
|
129
|
-
// Pre-validate `--format` so the legacy "expects json/text" message
|
|
130
|
-
// shape survives. The shared parser would accept any string for an
|
|
131
|
-
// extras `string` flag.
|
|
132
100
|
for (let i = 0; i < argv.length; i += 1) {
|
|
133
101
|
if (argv[i] !== '--format') continue;
|
|
134
102
|
const v = argv[i + 1];
|
|
@@ -151,7 +119,6 @@ export function parseArgs(argv) {
|
|
|
151
119
|
});
|
|
152
120
|
} catch (err) {
|
|
153
121
|
if (err && err.code === 'UNKNOWN_FLAG') {
|
|
154
|
-
// Preserve the legacy `unknown flag "--foo"` phrasing.
|
|
155
122
|
throw new Error(`unknown flag "--${err.flag}"`);
|
|
156
123
|
}
|
|
157
124
|
throw err;
|