mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,48 +1,16 @@
|
|
|
1
1
|
// .agents/scripts/lib/orchestration/ci-rerun-guard.js
|
|
2
2
|
/**
|
|
3
|
-
* ci-rerun-guard.js —
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* head-SHA discriminator, the auto-merge disarm, and the blocked-delivery
|
|
7
|
-
* escalation. `pr-watch-with-update.js` is the enforcement point; this
|
|
8
|
-
* module is the mechanism it drives.
|
|
3
|
+
* ci-rerun-guard.js — mechanism behind the no-rerun MUST in
|
|
4
|
+
* `rules/ci-remediation.md` § Verifier, driven by `pr-watch-with-update.js`:
|
|
5
|
+
* the CI failure digest, the head-SHA discriminator, and the block.
|
|
9
6
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* watcher disarms on red and records the PR head SHA; the head SHA is then
|
|
18
|
-
* read at **re-arm** time, not at merge time.
|
|
19
|
-
*
|
|
20
|
-
* **Head SHA is the discriminator.** A green on a *different* head SHA is a
|
|
21
|
-
* fix at source — legal, and it retires the digest. A green on the *same*
|
|
22
|
-
* head SHA is a re-run of a failed job, which the rule forbids: the
|
|
23
|
-
* delivery hard-stops at `agent::blocked` and a CI-gap intake filing
|
|
24
|
-
* (`file-ci-gap.js`, carrying the run link and failure signature the digest
|
|
25
|
-
* already holds) is required before it can proceed.
|
|
26
|
-
*
|
|
27
|
-
* **One rerun after a recorded verdict (Story #5343).** The single exception,
|
|
28
|
-
* and it is evidence-gated rather than discretionary: once `file-ci-gap.js`
|
|
29
|
-
* has filed a `capacity` or `unreproducible-tier` verdict **for the current
|
|
30
|
-
* head SHA**, it stamps a `rerunAllowance` on the digest, and exactly one
|
|
31
|
-
* same-SHA green is then admitted — the digest is retired and the delivery
|
|
32
|
-
* proceeds. This closes the one shape where the rule stranded a correct
|
|
33
|
-
* delivery: a runner that ran out of something has no fix at source to make,
|
|
34
|
-
* so the branch could never move its head SHA and the block needed a human to
|
|
35
|
-
* clear. Every other same-SHA green is still a violation, the allowance is
|
|
36
|
-
* spent the moment it is honoured (it dies with the digest), and a second red
|
|
37
|
-
* after the rerun is real: it writes a fresh digest with no allowance, so it
|
|
38
|
-
* routes to Option 1 like any other red.
|
|
39
|
-
*
|
|
40
|
-
* **Fail closed on an unverifiable green.** A digest whose head SHA is
|
|
41
|
-
* missing, or a current head SHA that `gh` could not resolve, leaves no
|
|
42
|
-
* evidence that the red was fixed at source. An unresolved red plus no
|
|
43
|
-
* evidence of a new commit is treated as a violation rather than waved
|
|
44
|
-
* through — the same unknown-is-blocking posture the arming probe takes on
|
|
45
|
-
* an unrecognized check state.
|
|
7
|
+
* Enforcement happens at the first red, not the rerun-green: native
|
|
8
|
+
* auto-merge fires server-side and races the watcher, so only the red is a
|
|
9
|
+
* race-free observation point. The watcher disarms on red and records the
|
|
10
|
+
* head SHA. A later green on a different SHA is a fix at source; on the
|
|
11
|
+
* same SHA it is a forbidden rerun, unless `file-ci-gap.js` recorded a
|
|
12
|
+
* `capacity`/`unreproducible-tier` allowance for that SHA (one rerun; it
|
|
13
|
+
* dies with the digest). A missing SHA on either side fails closed.
|
|
46
14
|
*/
|
|
47
15
|
|
|
48
16
|
import {
|
|
@@ -57,6 +25,7 @@ import { spawnChild } from '../child-exec.js';
|
|
|
57
25
|
import { resolveConfig } from '../config-resolver.js';
|
|
58
26
|
import { Logger } from '../Logger.js';
|
|
59
27
|
import { createProvider } from '../provider-factory.js';
|
|
28
|
+
import { isRerunPermitted } from './check-state.js';
|
|
60
29
|
import {
|
|
61
30
|
STATE_LABELS,
|
|
62
31
|
transitionTicketState,
|
|
@@ -67,11 +36,8 @@ import {
|
|
|
67
36
|
const MAX_PRIOR_REDS = 10;
|
|
68
37
|
|
|
69
38
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* branch can move the head SHA to clear it. `pre-existing` is deliberately
|
|
73
|
-
* excluded: it reproduces on `main`, which is a real defect someone owns and
|
|
74
|
-
* a rerun cannot make go away.
|
|
39
|
+
* Verdicts earning the one same-SHA rerun: proven environment faults no
|
|
40
|
+
* commit can fix. `pre-existing` is excluded — a real defect on `main`.
|
|
75
41
|
*
|
|
76
42
|
* @type {readonly ['capacity', 'unreproducible-tier']}
|
|
77
43
|
*/
|
|
@@ -81,13 +47,6 @@ export const RERUN_ALLOWANCE_VERDICTS = Object.freeze([
|
|
|
81
47
|
]);
|
|
82
48
|
|
|
83
49
|
/**
|
|
84
|
-
* Resolve which ticket the digest is keyed to. Story #4539: the digest used
|
|
85
|
-
* to be Epic-scoped by filename and returned `null` without an epic id — so
|
|
86
|
-
* on the v2 Story path (which has no Epic and invokes the watch with `--pr`
|
|
87
|
-
* alone) a red check wrote no digest at all, despite the module header
|
|
88
|
-
* advertising one. v2.0.0 removed the Epic tier; Story scope is the only
|
|
89
|
-
* scope.
|
|
90
|
-
*
|
|
91
50
|
* @param {{ storyId?: number|string|null }} opts
|
|
92
51
|
* @returns {{ kind: 'story', id: number } | null}
|
|
93
52
|
*/
|
|
@@ -100,9 +59,8 @@ export function resolveDigestScope({ storyId = null } = {}) {
|
|
|
100
59
|
}
|
|
101
60
|
|
|
102
61
|
/**
|
|
103
|
-
* Coarse
|
|
104
|
-
*
|
|
105
|
-
* next move (which `/loop` unit to reach for), not a root-cause verdict.
|
|
62
|
+
* Coarse classification from a check name; steers the next move, not a
|
|
63
|
+
* root-cause verdict.
|
|
106
64
|
*
|
|
107
65
|
* @param {string} name failing required-check name.
|
|
108
66
|
* @returns {'test'|'lint'|'baseline'|'build'|'unknown'}
|
|
@@ -117,13 +75,7 @@ export function classifyFailure(name) {
|
|
|
117
75
|
}
|
|
118
76
|
|
|
119
77
|
/**
|
|
120
|
-
*
|
|
121
|
-
* no scope can be keyed (the digest is scoped by filename and has nothing
|
|
122
|
-
* to key on).
|
|
123
|
-
*
|
|
124
|
-
* Module-private: `writeCiDigest` / `readCiDigest` / `retireCiDigest` are the
|
|
125
|
-
* only callers and are the surface worth pinning, so the keying is asserted
|
|
126
|
-
* through them rather than through an export nothing in production reaches.
|
|
78
|
+
* Digest paths for a scope; `null` without a Story id to key on.
|
|
127
79
|
*
|
|
128
80
|
* @param {{ storyId?: number|string|null, tempRoot: string, cwd: string }} opts
|
|
129
81
|
* @returns {{ scope: { kind: 'story', id: number }, jsonPath: string, mdPath: string } | null}
|
|
@@ -141,10 +93,7 @@ function ciDigestPaths({ storyId = null, tempRoot, cwd }) {
|
|
|
141
93
|
}
|
|
142
94
|
|
|
143
95
|
/**
|
|
144
|
-
*
|
|
145
|
-
* job log so the digest carries an actionable excerpt. Best-effort:
|
|
146
|
-
* returns an empty tail when the run id is unknown or `gh` errors.
|
|
147
|
-
* Injected into `writeCiDigest` so tests never shell out.
|
|
96
|
+
* Tail of the failed job log; best-effort, empty on any failure.
|
|
148
97
|
*/
|
|
149
98
|
function ghRunLogTail({ runId, cwd, spawnFn, maxLines = 40 }) {
|
|
150
99
|
if (!runId) return '';
|
|
@@ -160,11 +109,8 @@ function ghRunLogTail({ runId, cwd, spawnFn, maxLines = 40 }) {
|
|
|
160
109
|
}
|
|
161
110
|
|
|
162
111
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* field carries the run URL whose trailing path segment is the run id. The
|
|
166
|
-
* URL matters as much as the id, because the intake issue a
|
|
167
|
-
* rerun violation demands must carry a run **link**.
|
|
112
|
+
* The failing check's run id and URL (the intake filing needs the link).
|
|
113
|
+
* Best-effort.
|
|
168
114
|
*
|
|
169
115
|
* @returns {{ runId: string|null, url: string|null }}
|
|
170
116
|
*/
|
|
@@ -188,10 +134,8 @@ function resolveFailingCheckRun({ prRef, checkName, cwd, spawnFn }) {
|
|
|
188
134
|
}
|
|
189
135
|
|
|
190
136
|
/**
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
* `null` when `gh` fails or the payload is unparseable; callers treat an
|
|
194
|
-
* unresolvable head as unverifiable, never as "changed".
|
|
137
|
+
* The PR's head SHA; `null` on failure, which callers treat as
|
|
138
|
+
* unverifiable, never as "changed".
|
|
195
139
|
*
|
|
196
140
|
* @param {{ prRef: string, cwd: string, spawnFn?: Function }} opts
|
|
197
141
|
* @returns {string|null}
|
|
@@ -216,60 +160,8 @@ export function resolvePrHeadSha({ prRef, cwd, spawnFn }) {
|
|
|
216
160
|
}
|
|
217
161
|
|
|
218
162
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
* the guard wants. Distinguishing this from a genuine disarm failure is
|
|
222
|
-
* load-bearing: an armed PR that could not be disarmed is a blocker, while
|
|
223
|
-
* a never-armed PR is the desired end state.
|
|
224
|
-
*/
|
|
225
|
-
const NOT_ARMED = /not enabled|isn't enabled|is not set|no auto-?merge/i;
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Disarm GitHub native auto-merge for the PR — the race-free response to the
|
|
229
|
-
* first red. Never throws.
|
|
230
|
-
*
|
|
231
|
-
* @param {{ prRef: string, cwd: string, spawnFn?: Function }} opts
|
|
232
|
-
* @returns {{ disarmed: boolean, alreadyUnarmed: boolean, detail: string }}
|
|
233
|
-
* `disarmed` is true when the PR is (now) un-armed; `alreadyUnarmed`
|
|
234
|
-
* distinguishes "there was nothing armed" from an executed disarm.
|
|
235
|
-
*/
|
|
236
|
-
export function disarmAutoMerge({ prRef, cwd, spawnFn }) {
|
|
237
|
-
let result;
|
|
238
|
-
try {
|
|
239
|
-
result = spawnChild('gh', ['pr', 'merge', prRef, '--disable-auto'], {
|
|
240
|
-
run: spawnFn,
|
|
241
|
-
cwd,
|
|
242
|
-
});
|
|
243
|
-
} catch (err) {
|
|
244
|
-
return {
|
|
245
|
-
disarmed: false,
|
|
246
|
-
alreadyUnarmed: false,
|
|
247
|
-
detail: `gh-spawn-error: ${err?.message ?? err}`,
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
const status = result?.status ?? 1;
|
|
251
|
-
const stderr = String(result?.stderr ?? '').trim();
|
|
252
|
-
if (status === 0) {
|
|
253
|
-
return { disarmed: true, alreadyUnarmed: false, detail: 'disarmed' };
|
|
254
|
-
}
|
|
255
|
-
if (NOT_ARMED.test(stderr)) {
|
|
256
|
-
return {
|
|
257
|
-
disarmed: true,
|
|
258
|
-
alreadyUnarmed: true,
|
|
259
|
-
detail: `auto-merge was not armed: ${stderr.slice(0, 160)}`,
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
return {
|
|
263
|
-
disarmed: false,
|
|
264
|
-
alreadyUnarmed: false,
|
|
265
|
-
detail: `gh-exit-${status}: ${stderr.slice(0, 200)}`,
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Read the CI failure digest for a scope, or `null` when none exists (or it
|
|
271
|
-
* is unreadable / malformed — an unparseable digest carries no enforceable
|
|
272
|
-
* evidence, so it is treated as absent).
|
|
163
|
+
* The digest, or `null`; a malformed one carries no evidence and counts as
|
|
164
|
+
* absent.
|
|
273
165
|
*
|
|
274
166
|
* @param {{ storyId?: number|string|null, tempRoot: string, cwd: string }} opts
|
|
275
167
|
* @returns {object|null}
|
|
@@ -286,8 +178,7 @@ export function readCiDigest({ storyId = null, tempRoot, cwd }) {
|
|
|
286
178
|
}
|
|
287
179
|
|
|
288
180
|
/**
|
|
289
|
-
* Retire the digest
|
|
290
|
-
* source. Best-effort; returns the paths removed (or `null`).
|
|
181
|
+
* Retire the digest once its red is resolved.
|
|
291
182
|
*
|
|
292
183
|
* @param {{ storyId?: number|string|null, tempRoot: string, cwd: string }} opts
|
|
293
184
|
* @returns {{ jsonPath: string, mdPath: string } | null}
|
|
@@ -301,9 +192,7 @@ export function retireCiDigest({ storyId = null, tempRoot, cwd }) {
|
|
|
301
192
|
}
|
|
302
193
|
|
|
303
194
|
/**
|
|
304
|
-
*
|
|
305
|
-
* `priorReds`, so a second red on a new head never silently erases the
|
|
306
|
-
* evidence of an unresolved earlier one.
|
|
195
|
+
* Summary kept in `priorReds` so a new red never erases an unresolved one.
|
|
307
196
|
*/
|
|
308
197
|
function summarizeRed(digest) {
|
|
309
198
|
return {
|
|
@@ -316,9 +205,7 @@ function summarizeRed(digest) {
|
|
|
316
205
|
}
|
|
317
206
|
|
|
318
207
|
/**
|
|
319
|
-
*
|
|
320
|
-
* re-red on the SAME head is the same unresolved red observed again, so it
|
|
321
|
-
* is not duplicated into the history.
|
|
208
|
+
* A re-red on the same head is not duplicated into history.
|
|
322
209
|
*/
|
|
323
210
|
function carryPriorReds(previous, headSha) {
|
|
324
211
|
if (!previous) return [];
|
|
@@ -330,10 +217,6 @@ function carryPriorReds(previous, headSha) {
|
|
|
330
217
|
return history.slice(-MAX_PRIOR_REDS);
|
|
331
218
|
}
|
|
332
219
|
|
|
333
|
-
/**
|
|
334
|
-
* Render the human-readable digest. Names the head SHA, because that is the
|
|
335
|
-
* field the green path adjudicates on.
|
|
336
|
-
*/
|
|
337
220
|
function renderDigestMarkdown(digest, failures) {
|
|
338
221
|
return [
|
|
339
222
|
`# CI failure digest — Story #${digest.storyId} (PR #${digest.prNumber})`,
|
|
@@ -373,9 +256,7 @@ function renderDigestMarkdown(digest, failures) {
|
|
|
373
256
|
}
|
|
374
257
|
|
|
375
258
|
/**
|
|
376
|
-
* Write the
|
|
377
|
-
* the two paths written, or `null` when no story id was supplied (the
|
|
378
|
-
* digest is scoped by filename and has nothing to key on).
|
|
259
|
+
* Write the digest (`.json` + `.md`); `null` without a Story id.
|
|
379
260
|
*
|
|
380
261
|
* @param {object} opts
|
|
381
262
|
* @param {number|string|null} [opts.storyId] The v2 delivery scope.
|
|
@@ -387,9 +268,7 @@ function renderDigestMarkdown(digest, failures) {
|
|
|
387
268
|
* @param {string} opts.prRef
|
|
388
269
|
* @param {Function} [opts.checkRunFn]
|
|
389
270
|
* @param {Function} [opts.logTailFn]
|
|
390
|
-
* @param {Function} [opts.spawnFn] Child runner
|
|
391
|
-
* `gh` probes, so their real bodies can be exercised without shelling out.
|
|
392
|
-
* Ignored when `checkRunFn` / `logTailFn` are replaced outright.
|
|
271
|
+
* @param {Function} [opts.spawnFn] Child runner for the default `gh` probes.
|
|
393
272
|
* @returns {{ jsonPath: string, mdPath: string } | null}
|
|
394
273
|
*/
|
|
395
274
|
export function writeCiDigest({
|
|
@@ -438,18 +317,9 @@ export function writeCiDigest({
|
|
|
438
317
|
}
|
|
439
318
|
|
|
440
319
|
/**
|
|
441
|
-
* Stamp the one-rerun allowance
|
|
442
|
-
*
|
|
443
|
-
*
|
|
444
|
-
* allowance exists only where the evidence the filing carries does. It is
|
|
445
|
-
* keyed on the digest's own head SHA — the head the red was recorded
|
|
446
|
-
* against — so an allowance can never be honoured on a later head it was not
|
|
447
|
-
* earned for.
|
|
448
|
-
*
|
|
449
|
-
* Best-effort and non-throwing: a digest that cannot be re-read or re-written
|
|
450
|
-
* simply records no allowance, and the guard keeps blocking. Returns the
|
|
451
|
-
* recorded allowance, or `null` when none was written (no digest, an
|
|
452
|
-
* ineligible verdict, or an unresolved head SHA).
|
|
320
|
+
* Stamp the one-rerun allowance, called by `file-ci-gap.js` after filing.
|
|
321
|
+
* Keyed on the digest's own head SHA so it cannot apply to a later head.
|
|
322
|
+
* Non-throwing; `null` when nothing was written (the guard keeps blocking).
|
|
453
323
|
*
|
|
454
324
|
* @param {{
|
|
455
325
|
* storyId?: number|string|null,
|
|
@@ -488,10 +358,6 @@ export function recordRerunAllowance({
|
|
|
488
358
|
}
|
|
489
359
|
|
|
490
360
|
/**
|
|
491
|
-
* The allowance a digest carries for `headSha`, or `null`. An allowance
|
|
492
|
-
* recorded against a different head is not one: the red it was filed for is
|
|
493
|
-
* not the red being adjudicated.
|
|
494
|
-
*
|
|
495
361
|
* @param {object|null} digest
|
|
496
362
|
* @param {string|null} headSha
|
|
497
363
|
* @returns {{ verdict: string, headSha: string } | null}
|
|
@@ -508,18 +374,10 @@ function allowanceFor(digest, headSha) {
|
|
|
508
374
|
}
|
|
509
375
|
|
|
510
376
|
/**
|
|
511
|
-
* Adjudicate an all-green watch against
|
|
377
|
+
* Adjudicate an all-green watch against the scope's digest (see header).
|
|
512
378
|
*
|
|
513
379
|
* @param {{ digest: object|null, headSha: string|null }} opts
|
|
514
380
|
* @returns {{ verdict: 'clean'|'fix-at-source'|'rerun-permitted'|'rerun'|'unverifiable', reason: string }}
|
|
515
|
-
* - `clean` — no digest: this delivery never went red.
|
|
516
|
-
* - `fix-at-source` — the head SHA moved since the red; legal.
|
|
517
|
-
* - `rerun-permitted` — same head SHA, but `file-ci-gap.js` recorded a
|
|
518
|
-
* `capacity` / `unreproducible-tier` verdict for it;
|
|
519
|
-
* the one sanctioned rerun (Story #5343).
|
|
520
|
-
* - `rerun` — green on the SAME head SHA; forbidden.
|
|
521
|
-
* - `unverifiable` — an unresolved red with no head-SHA evidence either
|
|
522
|
-
* side; fail closed and treat it as a rerun.
|
|
523
381
|
*/
|
|
524
382
|
export function classifyGreenVerdict({ digest, headSha }) {
|
|
525
383
|
if (!digest) return { verdict: 'clean', reason: 'no digest for this scope' };
|
|
@@ -531,8 +389,12 @@ export function classifyGreenVerdict({ digest, headSha }) {
|
|
|
531
389
|
};
|
|
532
390
|
}
|
|
533
391
|
if (recorded === headSha) {
|
|
392
|
+
// Digests only record required checks.
|
|
534
393
|
const allowance = allowanceFor(digest, headSha);
|
|
535
|
-
return
|
|
394
|
+
return isRerunPermitted({
|
|
395
|
+
required: true,
|
|
396
|
+
allowanceRecorded: allowance !== null,
|
|
397
|
+
})
|
|
536
398
|
? {
|
|
537
399
|
verdict: 'rerun-permitted',
|
|
538
400
|
reason: `one rerun admitted: \`${allowance.verdict}\` verdict recorded for this head SHA (${headSha})`,
|
|
@@ -548,11 +410,7 @@ export function classifyGreenVerdict({ digest, headSha }) {
|
|
|
548
410
|
};
|
|
549
411
|
}
|
|
550
412
|
|
|
551
|
-
/**
|
|
552
|
-
* The failure signature an intake filing must carry (see `file-ci-gap.js`):
|
|
553
|
-
* the first
|
|
554
|
-
* distinctive line of the captured failed-job log.
|
|
555
|
-
*/
|
|
413
|
+
/** First non-blank failed-log line: the signature an intake filing carries. */
|
|
556
414
|
function failureSignature(digest) {
|
|
557
415
|
const tail = String(digest?.logTail ?? '');
|
|
558
416
|
const line = tail
|
|
@@ -563,8 +421,7 @@ function failureSignature(digest) {
|
|
|
563
421
|
}
|
|
564
422
|
|
|
565
423
|
/**
|
|
566
|
-
*
|
|
567
|
-
* body and, line by line, as the watcher's stderr report.
|
|
424
|
+
* The friction comment body, also the watcher's stderr report.
|
|
568
425
|
*
|
|
569
426
|
* @param {{ digest: object, headSha: string|null, prNumber: number, reason: string }} opts
|
|
570
427
|
* @returns {string}
|
|
@@ -603,13 +460,9 @@ export function formatRerunViolation({ digest, headSha, prNumber, reason }) {
|
|
|
603
460
|
}
|
|
604
461
|
|
|
605
462
|
/**
|
|
606
|
-
*
|
|
607
|
-
* `
|
|
608
|
-
*
|
|
609
|
-
* what actually stops the delivery.
|
|
610
|
-
*
|
|
611
|
-
* Routed through `transitionTicketState` rather than a bare label write so
|
|
612
|
-
* the Projects v2 column sync runs (Story #2548 / #4539).
|
|
463
|
+
* Post the `friction` comment and flip to `agent::blocked` (via
|
|
464
|
+
* `transitionTicketState` so the board column syncs). Best-effort: the
|
|
465
|
+
* watcher's non-zero exit is what actually stops delivery.
|
|
613
466
|
*
|
|
614
467
|
* @param {{
|
|
615
468
|
* storyId: number|string,
|
|
@@ -1,42 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/code-review.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
* `/mandrel-deliver` runner can run Phase D without spawning a child
|
|
7
|
-
* process or routing through an LLM-driven helper.
|
|
8
|
-
*
|
|
9
|
-
* Story #2831 (Epic #2815, Pluggable Code Review) — refactored to load
|
|
10
|
-
* the review provider through `review-provider-factory`, call the
|
|
11
|
-
* adapter's `runReview()` to collect a `Finding[]`, render the
|
|
12
|
-
* structured-comment body via `findings-renderer`, and post the
|
|
13
|
-
* comment through the GitHub provider here (the adapter is post-free
|
|
14
|
-
* by design).
|
|
15
|
-
*
|
|
16
|
-
* v2.0.0 removed the Epic tier. The Epic-scope envelope and the
|
|
17
|
-
* Epic-scoped `code-review.start` / `.end` lifecycle emits (whose schema
|
|
18
|
-
* requires `epicId`) went with it; Story scope is the only scope. Story #5024
|
|
19
|
-
* deleted those schemas along with the bus that was their only publish path.
|
|
20
|
-
*
|
|
21
|
-
* Public API:
|
|
22
|
-
* - `runCodeReview({ ticketId, headRef, provider, logger, ... })` →
|
|
23
|
-
* `{ status, severity, posted, report, halted, blockerReason }`.
|
|
24
|
-
*
|
|
25
|
-
* Behaviour:
|
|
26
|
-
* - Loads the configured review adapter via the factory; defaults to
|
|
27
|
-
* a single `native` chain entry when `delivery.codeReview.providers`
|
|
28
|
-
* is unset or empty.
|
|
29
|
-
* - Always posts the unified `verification-results` structured comment on
|
|
30
|
-
* the target issue/PR (the adapter never posts; the orchestrator owns
|
|
31
|
-
* persistence). Story #4411 (Epic #4405) unified the former
|
|
32
|
-
* `code-review` and `audit-results` findings contracts into this one
|
|
33
|
-
* `verification-results` marker.
|
|
34
|
-
* - Treats severity.critical > 0 as a halting blocker — the merged
|
|
35
|
-
* `/mandrel-deliver` runner consults `halted` and refuses to advance
|
|
36
|
-
* to Phase E (retro) when set.
|
|
37
|
-
*
|
|
38
|
-
* Halting on critical findings is the in-process replacement for the
|
|
39
|
-
* helper's "operator must remediate before /mandrel-deliver" gate.
|
|
2
|
+
* lib/orchestration/code-review.js — in-process Story-scope code review:
|
|
3
|
+
* load the configured review adapter (default `native`), collect its
|
|
4
|
+
* `Finding[]`, render and post the `verification-results` comment (adapters
|
|
5
|
+
* never post), and report `halted` on any surviving critical finding.
|
|
40
6
|
*/
|
|
41
7
|
|
|
42
8
|
import { hasSurvivingCritical } from '../audit-suite/findings.js';
|
|
@@ -56,26 +22,16 @@ import { createReviewProvider } from './review-providers/review-provider-factory
|
|
|
56
22
|
import { upsertStructuredComment } from './ticketing.js';
|
|
57
23
|
|
|
58
24
|
/**
|
|
59
|
-
* Review depth
|
|
60
|
-
*
|
|
61
|
-
* the
|
|
62
|
-
* sensitive path ({@link deriveChangeLevel}) and their mechanical count — then
|
|
63
|
-
* threaded into the review provider's `runReview` input so a sensitive *or*
|
|
64
|
-
* wide-footprint change gets a deeper pass than a small, unremarkable one.
|
|
65
|
-
* Depth is an **input** signal only — it never changes the
|
|
66
|
-
* `{ status, severity, posted, report, halted, blockerReason }` output
|
|
67
|
-
* envelope nor the `verification-results` structured-comment body (Story #3876,
|
|
68
|
-
* extended by Story #3938; re-based off the diff by Story #4542).
|
|
25
|
+
* Review depth (light → standard → deep), from the diff's sensitivity and
|
|
26
|
+
* width. An input to `runReview` only; never changes the output envelope or
|
|
27
|
+
* the posted comment.
|
|
69
28
|
*
|
|
70
29
|
* @typedef {import('./review-depth.js').ReviewDepth} ReviewDepth
|
|
71
30
|
*/
|
|
72
31
|
|
|
73
32
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* silently inherit the local ref's drift (Story #5325). An unfetched remote
|
|
77
|
-
* then yields an unenumerable diff, which every downstream consumer already
|
|
78
|
-
* fails safe on, instead of a confidently-wrong wide one.
|
|
33
|
+
* Default base is remote-qualified so it cannot inherit local-ref drift; an
|
|
34
|
+
* unfetched remote yields an unenumerable diff, which consumers fail safe on.
|
|
79
35
|
*/
|
|
80
36
|
function resolveConfigBase(config) {
|
|
81
37
|
return remoteBaseRef(config?.project?.baseBranch ?? 'main');
|
|
@@ -89,9 +45,6 @@ function resolveCommentTargetId(commentTargetId, fallback) {
|
|
|
89
45
|
}
|
|
90
46
|
|
|
91
47
|
/**
|
|
92
|
-
* Resolve the Story-scope envelope from the parameterized
|
|
93
|
-
* `{ scope: 'story', ticketId, baseRef, headRef, commentTargetId }` shape.
|
|
94
|
-
*
|
|
95
48
|
* @returns {{
|
|
96
49
|
* scope: 'story',
|
|
97
50
|
* ticketId: number,
|
|
@@ -123,40 +76,15 @@ function resolveStoryScope(opts, config) {
|
|
|
123
76
|
};
|
|
124
77
|
}
|
|
125
78
|
|
|
126
|
-
/**
|
|
127
|
-
* Resolve the scope envelope
|
|
128
|
-
* (`{ scope, ticketId, baseRef, headRef, commentTargetId }`). v2.0.0
|
|
129
|
-
* removed the Epic tier, so `'story'` is the only scope.
|
|
130
|
-
*/
|
|
79
|
+
/** `'story'` is the only scope. */
|
|
131
80
|
function resolveScopeEnvelope(opts, config) {
|
|
132
81
|
return resolveStoryScope(opts, config);
|
|
133
82
|
}
|
|
134
83
|
|
|
135
84
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* Story #2252 — emits `code-review.start` immediately on entry and
|
|
140
|
-
* `code-review.end` immediately before returning the envelope (success
|
|
141
|
-
* or halt). On runner throw, emits `code-review.end` with the canonical
|
|
142
|
-
* structure (`status: 'invalid'`) before re-throwing so the ledger
|
|
143
|
-
* always carries the closing boundary.
|
|
144
|
-
*
|
|
145
|
-
* Story #2831 — the runner loads its adapter through the factory; the
|
|
146
|
-
* `reviewProvider` opt overrides the factory for tests. Severity is
|
|
147
|
-
* derived from the `Finding[]` returned by the adapter (no separate
|
|
148
|
-
* severity field on the runner result).
|
|
149
|
-
*
|
|
150
|
-
* Story #2839 (Epic #2815) — the Story closer requests a Story-scope
|
|
151
|
-
* review against `main`, posts the structured findings comment to the PR
|
|
152
|
-
* (via `commentTargetId`), and surfaces critical findings to the caller
|
|
153
|
-
* as `halted: true`.
|
|
154
|
-
*
|
|
155
|
-
* Argument shape:
|
|
156
|
-
* `{ ticketId, baseRef, headRef, [commentTargetId], provider }`
|
|
157
|
-
* `baseRef` defaults to the project base branch; `headRef` is required.
|
|
158
|
-
* `commentTargetId` overrides the post target (e.g. PR number) while
|
|
159
|
-
* `ticketId` continues to label the rendered header ("Story #N").
|
|
85
|
+
* Run a Story-scope review. `headRef` is required; `baseRef` defaults to
|
|
86
|
+
* the remote base branch; `commentTargetId` (e.g. a PR number) overrides
|
|
87
|
+
* the post target while `ticketId` still labels the header.
|
|
160
88
|
*
|
|
161
89
|
* @param {{
|
|
162
90
|
* scope?: 'story',
|
|
@@ -188,12 +116,7 @@ function resolveScopeEnvelope(opts, config) {
|
|
|
188
116
|
* blockerReason: string|null,
|
|
189
117
|
* }>}
|
|
190
118
|
*/
|
|
191
|
-
/**
|
|
192
|
-
* Resolve the human-facing provider name from the resolved code-review
|
|
193
|
-
* config. Multi-entry chains render as `chain[a,b,...]`; a single-entry
|
|
194
|
-
* chain (including the unset/empty default) renders that entry's name;
|
|
195
|
-
* everything else falls back to `'native'`.
|
|
196
|
-
*/
|
|
119
|
+
/** Display name: the single entry's name, `chain[a,b]`, or `'native'`. */
|
|
197
120
|
function resolveProviderName(codeReviewConfig) {
|
|
198
121
|
const providers =
|
|
199
122
|
codeReviewConfig && Array.isArray(codeReviewConfig.providers)
|
|
@@ -209,17 +132,10 @@ function resolveProviderName(codeReviewConfig) {
|
|
|
209
132
|
}
|
|
210
133
|
|
|
211
134
|
/**
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
* and
|
|
216
|
-
* verbatim; an explicit **null** is a caller (`runStoryReviewCore`) reporting
|
|
217
|
-
* that it already tried and the diff is unenumerable — re-running git here would
|
|
218
|
-
* only fail again, so it degrades straight to the fail-safe tier; **absent**
|
|
219
|
-
* means no caller enumerated at all, so the shared {@link computeChangeSet}
|
|
220
|
-
* enumerator runs as the fallback (standalone CLI use). On the close path the
|
|
221
|
-
* spine always injects, so the diff is enumerated exactly once per delivery and
|
|
222
|
-
* this pillar can never disagree with the lens pass about what changed.
|
|
135
|
+
* `opts.changedFiles` has three states: an array is used verbatim; `null`
|
|
136
|
+
* means the caller already found the diff unenumerable (fail-safe tier, no
|
|
137
|
+
* retry); absent means enumerate here. The close path always injects, so
|
|
138
|
+
* review and lens pass agree on what changed.
|
|
223
139
|
*/
|
|
224
140
|
function resolveInjectedChangedFiles({ opts, baseRef, headRef }) {
|
|
225
141
|
if (opts.changedFiles === undefined) {
|
|
@@ -230,12 +146,8 @@ function resolveInjectedChangedFiles({ opts, baseRef, headRef }) {
|
|
|
230
146
|
}
|
|
231
147
|
|
|
232
148
|
/**
|
|
233
|
-
* Build the
|
|
234
|
-
*
|
|
235
|
-
* touched or not — Story #4542) and their count supplies the width. The depth
|
|
236
|
-
* is an input-only signal (light → standard → deep) and never touches the
|
|
237
|
-
* output envelope or the posted comment. An unenumerable diff → `standard`.
|
|
238
|
-
* Story #4075 — extracted from `runCodeReview`.
|
|
149
|
+
* Build the `runReview` input with its depth; an unenumerable diff yields
|
|
150
|
+
* `standard`.
|
|
239
151
|
*/
|
|
240
152
|
function buildReviewInput({ opts, scope, ticketId, baseRef, headRef }) {
|
|
241
153
|
const changedFiles = resolveInjectedChangedFiles({ opts, baseRef, headRef });
|
|
@@ -243,9 +155,7 @@ function buildReviewInput({ opts, scope, ticketId, baseRef, headRef }) {
|
|
|
243
155
|
typeof opts.changedFileCount === 'number'
|
|
244
156
|
? opts.changedFileCount
|
|
245
157
|
: (changedFiles?.length ?? null);
|
|
246
|
-
//
|
|
247
|
-
// of the diff under review). It is deliberately decoupled from the
|
|
248
|
-
// planning model-capacity advisory (`DEFAULT_MODEL_CAPACITY`).
|
|
158
|
+
// Width is the diff's file count, decoupled from planning model capacity.
|
|
249
159
|
const { level } = deriveChangeLevel({ changedFiles });
|
|
250
160
|
const depth = resolveDepth({
|
|
251
161
|
derivedLevel: level,
|
|
@@ -262,10 +172,7 @@ function buildReviewInput({ opts, scope, ticketId, baseRef, headRef }) {
|
|
|
262
172
|
}
|
|
263
173
|
|
|
264
174
|
/**
|
|
265
|
-
*
|
|
266
|
-
* single-adapter providers don't carry `getPromptMessages`, so the
|
|
267
|
-
* empty-array fallback keeps the old snapshot byte-stable; a throw is
|
|
268
|
-
* logged and degraded to empty.
|
|
175
|
+
* Optional `getPromptMessages`; absent or throwing yields `[]`.
|
|
269
176
|
*/
|
|
270
177
|
async function resolvePromptMessages(reviewProvider, reviewInput, logger) {
|
|
271
178
|
if (typeof reviewProvider.getPromptMessages !== 'function') return [];
|
|
@@ -283,9 +190,7 @@ async function resolvePromptMessages(reviewProvider, reviewInput, logger) {
|
|
|
283
190
|
}
|
|
284
191
|
|
|
285
192
|
/**
|
|
286
|
-
*
|
|
287
|
-
* non-fatal: it is logged and surfaced via `posted: false`. Story #4075 —
|
|
288
|
-
* extracted from `runCodeReview`.
|
|
193
|
+
* Posting failure is non-fatal and surfaces as `posted: false`.
|
|
289
194
|
*/
|
|
290
195
|
async function postReviewComment({
|
|
291
196
|
upsertCommentFn,
|
|
@@ -319,12 +224,6 @@ async function postReviewComment({
|
|
|
319
224
|
}
|
|
320
225
|
}
|
|
321
226
|
|
|
322
|
-
/**
|
|
323
|
-
* Run the review pipeline (resolve provider → runReview → prompt messages →
|
|
324
|
-
* render → post comment) and shape the `status: 'ok'` result. Pure of the
|
|
325
|
-
* lifecycle-boundary concern — `runCodeReview` owns the start/end emit pair.
|
|
326
|
-
* Story #4075 — extracted to keep both bodies below the CC must-fix band.
|
|
327
|
-
*/
|
|
328
227
|
async function executeReviewPipeline({ opts, config, envelope }) {
|
|
329
228
|
const {
|
|
330
229
|
provider,
|
|
@@ -366,7 +265,7 @@ async function executeReviewPipeline({ opts, config, envelope }) {
|
|
|
366
265
|
logger,
|
|
367
266
|
);
|
|
368
267
|
|
|
369
|
-
//
|
|
268
|
+
// Degraded gates ride beside the findings, never inside them.
|
|
370
269
|
const degradations = await collectProviderDegradations(
|
|
371
270
|
reviewProvider,
|
|
372
271
|
logger,
|
|
@@ -413,8 +312,5 @@ export async function runCodeReview(opts = {}) {
|
|
|
413
312
|
const config = resolveConfigFn();
|
|
414
313
|
const envelope = resolveScopeEnvelope(opts, config);
|
|
415
314
|
|
|
416
|
-
// No lifecycle-bus emit: the `code-review.start` / `.end` ledger pair was
|
|
417
|
-
// Epic-scoped (its schema requires `epicId`), and v2.0.0 removed the Epic
|
|
418
|
-
// tier. Story-scope review sits outside the lifecycle ledger entirely.
|
|
419
315
|
return executeReviewPipeline({ opts, config, envelope });
|
|
420
316
|
}
|