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,33 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/pre-gate-steps.js —
|
|
3
|
-
* the
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* ahead of the gates so its commit is part of what the gates score and part of
|
|
8
|
-
* the branch's own PR, and **neither may ever fail the close**. Downstream
|
|
9
|
-
* there is always an authoritative gate — `biome ci` for formatting,
|
|
10
|
-
* `check-baselines` for the ratchet — so a failure here is a missed
|
|
11
|
-
* opportunity to self-heal, never a verdict.
|
|
12
|
-
*
|
|
13
|
-
* 1. **Scoped format-autofix** (Story #4250) — run the formatter over the
|
|
14
|
-
* `baseBranch...storyBranch` diff and fold any rewrite into a
|
|
15
|
-
* `fix(story-close):` commit, so benign JSON/YAML drift that lint-staged
|
|
16
|
-
* does not glob never reaches the check-only format gate.
|
|
17
|
-
* 2. **Upward baseline write-back** (Story #5224) — persist the
|
|
18
|
-
* maintainability rows this branch improved on files it touched, as a
|
|
19
|
-
* `baseline-refresh:` commit, so the committed baseline stops falling
|
|
20
|
-
* behind the tree in the upward direction.
|
|
21
|
-
* 3. **Context-budget write-back** (Story #5313) — persist the lower
|
|
22
|
-
* documentation-tier totals this branch measured, so a trimmed tier's
|
|
23
|
-
* gain locks in without `check-context-budget.js` ever going red on it.
|
|
24
|
-
*
|
|
25
|
-
* Extracted from `close-validation.js` when the second step landed. The phase
|
|
26
|
-
* module's job is the gate chain, the evidence keyspace and the gate-log sink;
|
|
27
|
-
* carrying two multi-branch best-effort wrappers inline alongside that was the
|
|
28
|
-
* mass that made it the file it was. Both collaborators stay injectable — the
|
|
29
|
-
* parent CLI's cache-busted bindings must win in tests that mock the upstream
|
|
30
|
-
* module URLs — and are threaded through from the phase unchanged.
|
|
2
|
+
* phases/pre-gate-steps.js — self-heal steps run on the Story branch before
|
|
3
|
+
* the gates: scoped format-autofix, the upward maintainability baseline
|
|
4
|
+
* write-back, and the context-budget write-back. Each may commit on
|
|
5
|
+
* `story-<id>` (so the gates score it) and none may ever fail the close — an
|
|
6
|
+
* authoritative gate for each runs right after.
|
|
31
7
|
*/
|
|
32
8
|
|
|
33
9
|
import { Logger } from '../../../Logger.js';
|
|
@@ -36,8 +12,6 @@ import { runContextBudgetWriteback as defaultRunContextBudgetWriteback } from '.
|
|
|
36
12
|
import { runScopedFormatAutofix as defaultRunScopedFormatAutofix } from '../../story-close/format-autofix.js';
|
|
37
13
|
|
|
38
14
|
/**
|
|
39
|
-
* Run the scoped formatter self-heal.
|
|
40
|
-
*
|
|
41
15
|
* @param {object} ctx the shared step context (see {@link runPreGateSteps})
|
|
42
16
|
* @returns {void}
|
|
43
17
|
*/
|
|
@@ -73,12 +47,7 @@ function formatAutofixStep({
|
|
|
73
47
|
}
|
|
74
48
|
|
|
75
49
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* Both steps (Story #5224's maintainability rows, Story #5313's context-budget
|
|
79
|
-
* totals) take the same context and answer in the same shape — `committed`
|
|
80
|
-
* with a `sha`, or a named `reason` — so one wrapper serves both; `describe`
|
|
81
|
-
* renders the committed outcome in the step's own words.
|
|
50
|
+
* Serves both write-backs, which share an input and result shape.
|
|
82
51
|
*
|
|
83
52
|
* @param {object} ctx the shared step context (see {@link runPreGateSteps})
|
|
84
53
|
* @param {{ tag: string, run: Function, describe: (w: object) => string, noun: string }} step
|
|
@@ -106,13 +75,7 @@ async function writebackStep(
|
|
|
106
75
|
}
|
|
107
76
|
|
|
108
77
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* The absorption is the point, not laziness about error handling: every step
|
|
112
|
-
* here is the *refresh* half of a loop whose *enforcement* half runs
|
|
113
|
-
* immediately afterwards. A step that could abort the close would convert a
|
|
114
|
-
* self-heal opportunity into an outage, and would do it on the path with the
|
|
115
|
-
* least operator attention.
|
|
78
|
+
* Absorbs any throw: these are refresh halves; enforcement runs right after.
|
|
116
79
|
*
|
|
117
80
|
* @param {{ tag: string, label: string, progress: Function, run: () => Promise<void>|void }} opts
|
|
118
81
|
* @returns {Promise<void>}
|
|
@@ -129,12 +92,7 @@ async function bestEffort({ tag, label, progress, run }) {
|
|
|
129
92
|
}
|
|
130
93
|
|
|
131
94
|
/**
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* Both steps commit to `story-<id>`, so both are skipped — with a log line, not
|
|
135
|
-
* a throw — when the caller has no `storyBranch`. That is the resume/legacy
|
|
136
|
-
* path, which has no branch to commit onto and must not trip an exception for
|
|
137
|
-
* saying so.
|
|
95
|
+
* Without a `storyBranch` there is nothing to commit onto: skip with a log line.
|
|
138
96
|
*
|
|
139
97
|
* @param {{
|
|
140
98
|
* cwd: string,
|
|
@@ -1,44 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/pull-request.js — open, reuse, or decline to open the PR
|
|
3
|
-
* standalone Story.
|
|
2
|
+
* phases/pull-request.js — open, reuse, or decline to open the Story's PR.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* with `gh pr list --head <branch>` and fall back to `gh pr create`.
|
|
10
|
-
*
|
|
11
|
-
* Story #2990 routed the underlying `gh pr list` / `gh pr create` calls
|
|
12
|
-
* through the `lib/gh-exec.js` facade (the same shim the
|
|
13
|
-
* `providers/github/` gateways use) so this phase inherits the typed
|
|
14
|
-
* error classification, timeout handling, and JSON parsing surface
|
|
15
|
-
* instead of carrying its own `execFileSync('gh', …)` plumbing.
|
|
16
|
-
*
|
|
17
|
-
* ## An already-merged PR is not an absent PR (Story #4873)
|
|
18
|
-
*
|
|
19
|
-
* The probe used to ask for `--state open` only. On the recovery path that is
|
|
20
|
-
* a false negative with teeth: a resumed close pushes the branch, the push
|
|
21
|
-
* turns the checks green, armed auto-merge lands the ORIGINAL PR server-side,
|
|
22
|
-
* and the resumed close then sees no OPEN PR on the head — so it opened a
|
|
23
|
-
* SECOND PR against a branch that is now byte-identical to base and
|
|
24
|
-
* squash-merged a zero-file commit onto `main`. Both halves of that are now
|
|
25
|
-
* closed:
|
|
26
|
-
*
|
|
27
|
-
* 1. The probe reads `--state all` and reports a MERGED PR on this head as
|
|
28
|
-
* the outcome (`alreadyMerged: true`), so the caller lands on the merge
|
|
29
|
-
* that already happened instead of manufacturing a new one. An OPEN PR
|
|
30
|
-
* still wins over a merged one — a re-opened head is a live PR.
|
|
31
|
-
* 2. Creation is REFUSED outright when the head-versus-base diff contains no
|
|
32
|
-
* files. An empty diff means there is nothing to merge, so a PR opened on
|
|
33
|
-
* it can only ever produce an empty commit.
|
|
34
|
-
*
|
|
35
|
-
* The empty-diff guard fails **open**, not closed: `computeChangeSet` returns
|
|
36
|
-
* `files: null` when it cannot enumerate the diff at all, and absence of
|
|
37
|
-
* evidence must never block a legitimate PR — only a positively-observed empty
|
|
38
|
-
* file list refuses.
|
|
39
|
-
*
|
|
40
|
-
* The function still accepts an injected `gh` facade so tests can wire
|
|
41
|
-
* a fake without spawning real children.
|
|
4
|
+
* A MERGED PR on the head is reported as the outcome, not treated as absent:
|
|
5
|
+
* a resumed close whose original PR auto-merged would otherwise open a second
|
|
6
|
+
* PR and squash an empty commit onto `main`. Creation is also refused on a
|
|
7
|
+
* positively empty diff; an unenumerable diff fails open.
|
|
42
8
|
*/
|
|
43
9
|
|
|
44
10
|
import { gh as defaultGh } from '../../../gh-exec.js';
|
|
@@ -47,21 +13,9 @@ import { computeChangeSet as defaultComputeChangeSet } from '../../change-set.js
|
|
|
47
13
|
import { buildPullRequestFields } from './normalize-pr-title.js';
|
|
48
14
|
|
|
49
15
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* merging resolves to nothing — there is a new PR to open.
|
|
54
|
-
*
|
|
55
|
-
* A row carrying a url but no recognizable `state` reads as live, not as
|
|
56
|
-
* nothing: the projection this phase asks for always includes `state`, so an
|
|
57
|
-
* absent one means an older/other `gh`, and the old `--state open` probe
|
|
58
|
-
* treated every returned row as a reusable open PR. Guessing "no PR" there is
|
|
59
|
-
* the failure mode with teeth — it opens a duplicate.
|
|
60
|
-
*
|
|
61
|
-
* Pure, and module-private on purpose: `ensurePullRequestWith` is the only
|
|
62
|
-
* caller and the only surface worth pinning, so the precedence is asserted
|
|
63
|
-
* through it rather than through a test-only export the production
|
|
64
|
-
* dead-export ratchet would then flag.
|
|
16
|
+
* OPEN wins, then the first MERGED; CLOSED-only resolves to null. A row with
|
|
17
|
+
* no recognizable `state` reads as live, since guessing "no PR" opens a
|
|
18
|
+
* duplicate. Module-private: a test-only export would trip dead-exports.
|
|
65
19
|
*
|
|
66
20
|
* @param {Array<{url?: string, state?: string, mergedAt?: string}>} rows
|
|
67
21
|
* @returns {{ url: string, state: 'OPEN'|'MERGED' }|null}
|
|
@@ -84,14 +38,8 @@ function pickHeadPullRequest(rows) {
|
|
|
84
38
|
}
|
|
85
39
|
|
|
86
40
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* The diff is taken against `origin/<baseBranch>` when that ref resolves,
|
|
91
|
-
* because the local base ref can trail the remote by exactly the merge that
|
|
92
|
-
* makes this diff empty — the very state the guard exists to catch. It falls
|
|
93
|
-
* back to the local ref, and finally to "unknown", when the remote ref cannot
|
|
94
|
-
* be enumerated.
|
|
41
|
+
* Prefers `origin/<base>`: the local ref can trail by exactly the merge that
|
|
42
|
+
* makes the diff empty. Unenumerable is NOT empty.
|
|
95
43
|
*
|
|
96
44
|
* @returns {{ empty: boolean, baseRef: string|null }}
|
|
97
45
|
*/
|
|
@@ -105,9 +53,6 @@ function probeEmptyDiff({ cwd, baseBranch, storyBranch, computeChangeSet }) {
|
|
|
105
53
|
}
|
|
106
54
|
|
|
107
55
|
/**
|
|
108
|
-
* Probe for an existing PR with `head = storyBranch`; create one if none
|
|
109
|
-
* exists. Exported for testing.
|
|
110
|
-
*
|
|
111
56
|
* @param {{
|
|
112
57
|
* cwd: string,
|
|
113
58
|
* storyId: number,
|
|
@@ -132,16 +77,9 @@ export async function ensurePullRequestWith({
|
|
|
132
77
|
computeChangeSetFn = defaultComputeChangeSet,
|
|
133
78
|
progress = () => {},
|
|
134
79
|
}) {
|
|
135
|
-
// `
|
|
136
|
-
// with the SUT's thin wrapper, but `gh-exec` spawns `gh` against the
|
|
137
|
-
// current process cwd. `single-story-close.js` chdirs into the worktree
|
|
138
|
-
// before invoking the phase, so the effective cwd matches the legacy
|
|
139
|
-
// `execFileSync('gh', …, { cwd })` shape.
|
|
80
|
+
// `gh-exec` spawns `gh` in the process cwd, not `_cwd`.
|
|
140
81
|
try {
|
|
141
|
-
//
|
|
142
|
-
// returns a JSON array of rows; an empty array means this head has never
|
|
143
|
-
// had a PR. `--state all` (not `open`) is load-bearing — see the module
|
|
144
|
-
// header's duplicate-empty-PR note.
|
|
82
|
+
// `--state all`, not `open`: a merged PR must be seen.
|
|
145
83
|
const rows = await gh.pr.list(
|
|
146
84
|
['--head', storyBranch, '--state', 'all'],
|
|
147
85
|
['url', 'state', 'mergedAt'],
|
|
@@ -160,16 +98,11 @@ export async function ensurePullRequestWith({
|
|
|
160
98
|
return { url: existing.url, alreadyMerged: true, created: false };
|
|
161
99
|
}
|
|
162
100
|
} catch (err) {
|
|
163
|
-
// `gh pr list` failure is recoverable — fall through to create. Log
|
|
164
|
-
// the error so an auth issue surfaces visibly.
|
|
165
101
|
Logger.warn?.(
|
|
166
102
|
`[single-story-close] ⚠️ \`gh pr list\` probe failed (continuing to create): ${err?.message ?? err}`,
|
|
167
103
|
);
|
|
168
104
|
}
|
|
169
105
|
|
|
170
|
-
// Nothing to merge → nothing to open. Refused before `gh pr create` so the
|
|
171
|
-
// failure names the empty diff rather than surfacing later as a zero-file
|
|
172
|
-
// squash commit on the base branch.
|
|
173
106
|
const emptyDiff = probeEmptyDiff({
|
|
174
107
|
cwd: _cwd ?? process.cwd(),
|
|
175
108
|
baseBranch,
|
|
@@ -187,10 +120,6 @@ export async function ensurePullRequestWith({
|
|
|
187
120
|
}
|
|
188
121
|
|
|
189
122
|
progress('PR', `Opening PR for ${storyBranch} → ${baseBranch}...`);
|
|
190
|
-
// The repo squash-merges and GitHub uses the PR title as the squash subject
|
|
191
|
-
// on `main`, so both fields are derived rather than typed — see
|
|
192
|
-
// `normalize-pr-title.js`. `gh-exec` spawns `gh` against the current process
|
|
193
|
-
// cwd (the worktree), so the branch read uses the same cwd.
|
|
194
123
|
const { title, body } = buildPullRequestFields({
|
|
195
124
|
storyTitle,
|
|
196
125
|
storyId,
|
|
@@ -1,44 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* phases/push.js — push the Story branch to origin.
|
|
3
3
|
*
|
|
4
|
-
* `git push
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* land-or-block backstop (the counterpart to the Epic finalize seam's
|
|
10
|
-
* `delivery-branch-missing-on-origin` blocker). `git push` exits 0 only
|
|
11
|
-
* after origin has accepted the ref, so the throw below is the origin
|
|
12
|
-
* assertion: every later close phase (PR open, auto-merge, the
|
|
13
|
-
* `closeResult` success envelope) is unreachable unless the Story branch
|
|
14
|
-
* verifiably landed on origin. No post-push `ls-remote` re-probe is
|
|
15
|
-
* added because it would re-ask a question the push exit code already
|
|
16
|
-
* answered authoritatively.
|
|
17
|
-
*
|
|
18
|
-
* Issue #4990 — the push runs in the Story worktree, not the main
|
|
19
|
-
* checkout. `core.hooksPath` is the relative `.husky/_`, so the
|
|
20
|
-
* invocation directory is what selects which tree `pre-push` resolves
|
|
21
|
-
* and measures. Pushing from the main checkout therefore validated a
|
|
22
|
-
* tree other than the one being sent — false red when that checkout sat
|
|
23
|
-
* on unrelated work, and worse, false green whenever it happened to be
|
|
24
|
-
* clean. `worktreePath` falls back to `cwd` because single-tree mode and
|
|
25
|
-
* a disabled `delivery.worktreeIsolation` both legitimately have no
|
|
26
|
-
* worktree, and there the main checkout IS the tree being pushed. The
|
|
27
|
-
* two sibling phases resolve their tree the same way
|
|
28
|
-
* (`base-sync.js`, `close-validation.js`).
|
|
29
|
-
*
|
|
30
|
-
* `gitSync` is accepted as an injected dependency rather than statically
|
|
31
|
-
* imported so the caller's (cache-busted) binding wins. The
|
|
32
|
-
* `single-story-close.js` orchestrator owns the static import; test
|
|
33
|
-
* suites mock the git-utils module URL and re-import the SUT to refresh
|
|
34
|
-
* the binding it passes in.
|
|
4
|
+
* `git push` exits 0 only once origin accepted the ref, so the throw is the
|
|
5
|
+
* origin assertion every later phase depends on. It runs from the worktree:
|
|
6
|
+
* `core.hooksPath` is relative, so the invocation directory decides which
|
|
7
|
+
* tree `pre-push` measures (the main checkout gave false greens). With no
|
|
8
|
+
* worktree, the main checkout is the pushed tree.
|
|
35
9
|
*/
|
|
36
10
|
|
|
37
11
|
import { gitSync as defaultGitSync } from '../../../git-utils.js';
|
|
38
12
|
|
|
39
13
|
/**
|
|
40
|
-
* Push the Story branch with `-u` so the upstream is set.
|
|
41
|
-
*
|
|
42
14
|
* @param {{
|
|
43
15
|
* cwd: string,
|
|
44
16
|
* worktreePath?: string|null,
|
|
@@ -56,12 +28,7 @@ export function pushStoryBranch({
|
|
|
56
28
|
}) {
|
|
57
29
|
progress('GIT', `Pushing ${storyBranch} to origin...`);
|
|
58
30
|
try {
|
|
59
|
-
//
|
|
60
|
-
// before this point, but `--skip-validation` skips that chain, and the
|
|
61
|
-
// bypass then left nothing running at all. `pre-push` is the backstop,
|
|
62
|
-
// and it only became reachable once hooks were materialized into
|
|
63
|
-
// worktrees — which is where every Story branch is built, and where the
|
|
64
|
-
// cwd below now resolves so the hook reads that tree.
|
|
31
|
+
// Never bypass hooks: under `--skip-validation`, `pre-push` is the only gate.
|
|
65
32
|
gitSync(worktreePath ?? cwd, 'push', '-u', 'origin', storyBranch);
|
|
66
33
|
progress('GIT', `✅ Pushed ${storyBranch}.`);
|
|
67
34
|
} catch (err) {
|
|
@@ -33,12 +33,7 @@ export async function handleCriticalReviewBlock({
|
|
|
33
33
|
`[single-story-close] failed to post review-block friction: ${err?.message ?? err}`,
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
|
-
//
|
|
37
|
-
// labels directly. A bare `provider.updateTicket` skips the Projects v2
|
|
38
|
-
// column sync (Story #2548), leaving the board on the Story's prior
|
|
39
|
-
// status. That is benign today only because agent::blocked and
|
|
40
|
-
// agent::executing happen to map to the same column — a coincidence, not
|
|
41
|
-
// a design, and exactly how the next drift gets in.
|
|
36
|
+
// Canonical mutator, not a bare label write, so the Projects v2 column syncs.
|
|
42
37
|
try {
|
|
43
38
|
await transitionTicketState(provider, storyId, STATE_LABELS.BLOCKED, {});
|
|
44
39
|
} catch (err) {
|
|
@@ -1,33 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/review-outcome.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* "every gate ran and found nothing" and "a gate never ran" render identically.
|
|
7
|
-
* Both surfaces the operator actually reads — the close progress stream and the
|
|
8
|
-
* cross-reference comment on the Story — now state the degraded gates
|
|
9
|
-
* explicitly, and always state them (as `none` when healthy) so an absent line
|
|
10
|
-
* can never be mistaken for a clean gate.
|
|
11
|
-
*
|
|
12
|
-
* A degraded gate is **reported, not blocking**: this review is a secondary
|
|
13
|
-
* read, and the close does not gate the merge on it. The rationale for that
|
|
14
|
-
* posture lives with the channel itself in
|
|
15
|
-
* [`review-providers/degraded-gates.js`](../../review-providers/degraded-gates.js).
|
|
16
|
-
*
|
|
17
|
-
* What this module must **not** do (Story #5193) is tell the operator that the
|
|
18
|
-
* canonical `npm run lint` close gate covered the surface instead. A stub
|
|
19
|
-
* `lint` script is a supported consumer shape, so that claim is unverifiable
|
|
20
|
-
* from here — and asserting it talks the operator out of the exact concern the
|
|
21
|
-
* degradation was raised to surface. State the posture; never vouch for
|
|
22
|
-
* coverage this module cannot see.
|
|
2
|
+
* phases/review-outcome.js — renders the review outcome, always stating the
|
|
3
|
+
* degraded gates (`none` when healthy) so "never ran" cannot read as
|
|
4
|
+
* "found nothing". Degraded is reported, not blocking — and never claim
|
|
5
|
+
* another gate covered the surface; this module cannot see that.
|
|
23
6
|
*/
|
|
24
7
|
|
|
25
8
|
import { summarizeDegradations } from '../../review-providers/degraded-gates.js';
|
|
26
9
|
|
|
27
10
|
/**
|
|
28
|
-
* Pure: the tally suffix shared by the progress line and the cross-reference
|
|
29
|
-
* comment — severity counts plus the degraded-gate state.
|
|
30
|
-
*
|
|
31
11
|
* @param {{ severity: { critical: number, high: number, medium: number, suggestion: number }, degradations?: unknown }} args
|
|
32
12
|
* @returns {string}
|
|
33
13
|
*/
|
|
@@ -40,10 +20,6 @@ export function buildOutcomeTally({ severity, degradations }) {
|
|
|
40
20
|
}
|
|
41
21
|
|
|
42
22
|
/**
|
|
43
|
-
* Pure: the progress lines announcing a completed review. Always one line
|
|
44
|
-
* naming the tally; a second, explicitly-worded line when a gate did not run so
|
|
45
|
-
* the degradation cannot be skimmed past.
|
|
46
|
-
*
|
|
47
23
|
* @param {{
|
|
48
24
|
* severity: { critical: number, high: number, medium: number, suggestion: number },
|
|
49
25
|
* degradations?: unknown,
|
|
@@ -1,26 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/review-override.js — the sanctioned, logged override of a
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Split out of `phases/review-block.js`, which owns the opposite outcome: the
|
|
6
|
-
* blocker that *holds*. Keeping the two in one module meant one file owning
|
|
7
|
-
* both "park this Story" and "ship it anyway", and the override's audit trail is
|
|
8
|
-
* substantial enough — three write surfaces, each independently best-effort —
|
|
9
|
-
* to be its own reason to change.
|
|
10
|
-
*
|
|
11
|
-
* **Why an override exists at all.** A critical review finding halts
|
|
12
|
-
* `single-story-close.js` before auto-merge, and no flag overrode a review
|
|
13
|
-
* verdict: `--skip-validation` bypasses the gate chain and `--no-auto-merge`
|
|
14
|
-
* declines to arm, but neither touches the review. So an operator who had read a
|
|
15
|
-
* finding and judged it wrong could only land by merging the PR by hand, which
|
|
16
|
-
* bypasses the gate with no record anywhere of what was overridden or why. This
|
|
17
|
-
* module does not weaken the gate; it relocates that escape hatch out of an
|
|
18
|
-
* untraceable hand-merge and into a mandatory-reason audit trail.
|
|
19
|
-
*
|
|
20
|
-
* Live provenance: Story #5007 / PR #5022, where a FALSE critical blocker — an
|
|
21
|
-
* MI finding on files `delivery.quality.gates.maintainability.ignoreGlobs`
|
|
22
|
-
* exempts, which the `check-baselines.js` ratchet correctly ignored in the same
|
|
23
|
-
* run — halted a legitimate delivery with a hand-merge as the only way out.
|
|
2
|
+
* phases/review-override.js — the sanctioned, logged override of a critical
|
|
3
|
+
* review blocker. It replaces an untraceable hand-merge (the only escape from
|
|
4
|
+
* a false blocker) with a mandatory-reason audit trail.
|
|
24
5
|
*/
|
|
25
6
|
|
|
26
7
|
import { Logger } from '../../../Logger.js';
|
|
@@ -33,22 +14,9 @@ import {
|
|
|
33
14
|
upsertStructuredComment,
|
|
34
15
|
} from '../../ticketing.js';
|
|
35
16
|
|
|
36
|
-
/** Cap on the reason text copied into the friction signal's `details`. */
|
|
37
17
|
const REASON_SIGNAL_LIMIT = 500;
|
|
38
18
|
|
|
39
19
|
/**
|
|
40
|
-
* Build the audit record posted when an operator overrides a review blocker.
|
|
41
|
-
* Pure.
|
|
42
|
-
*
|
|
43
|
-
* The body restates the count, the reason, and the fact that auto-merge was
|
|
44
|
-
* armed anyway — an override whose trail says only "overridden" is no better
|
|
45
|
-
* than the hand-merge it replaces.
|
|
46
|
-
*
|
|
47
|
-
* Module-local: an implementation detail of
|
|
48
|
-
* {@link handleOverriddenReviewBlock}, whose posted body is observable through
|
|
49
|
-
* that public entry point. Exporting it would add a public symbol no production
|
|
50
|
-
* path reaches — the exact dead-export shape this repo ratchets against.
|
|
51
|
-
*
|
|
52
20
|
* @param {{ prUrl: string, criticalCount: number, reason: string }} args
|
|
53
21
|
* @returns {string}
|
|
54
22
|
*/
|
|
@@ -70,15 +38,7 @@ function buildReviewOverrideBody({ prUrl, criticalCount, reason }) {
|
|
|
70
38
|
}
|
|
71
39
|
|
|
72
40
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* Every write here is best-effort by design: an override whose audit trail
|
|
76
|
-
* partly failed must still land the delivery the operator authorized, because
|
|
77
|
-
* the close would otherwise fail for a reason the operator cannot act on. The
|
|
78
|
-
* friction signal is the durable record — it is what makes a rising override
|
|
79
|
-
* count visible to the retro.
|
|
80
|
-
*
|
|
81
|
-
* Module-local: the two call sites below are its only callers.
|
|
41
|
+
* Best-effort: a partly failed trail must not block an authorized delivery.
|
|
82
42
|
*
|
|
83
43
|
* @param {{ post: () => Promise<unknown>, surface: string }} args
|
|
84
44
|
* @returns {Promise<boolean>} true when the record landed.
|
|
@@ -96,13 +56,8 @@ async function postAuditRecord({ post, surface }) {
|
|
|
96
56
|
}
|
|
97
57
|
|
|
98
58
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* Writes to three surfaces: the Story issue via `upsert` so a re-run does not
|
|
103
|
-
* stack duplicates; the PR via `post` so the trail is append-only on the surface
|
|
104
|
-
* a human reviews, and so a reviewer reading the PR need not open the Story to
|
|
105
|
-
* learn the blocker was overridden; and the friction stream.
|
|
59
|
+
* Records to the Story (upsert, so re-runs don't stack), the PR (append-only,
|
|
60
|
+
* where reviewers look), and the friction stream.
|
|
106
61
|
*
|
|
107
62
|
* @param {{
|
|
108
63
|
* provider: object,
|
|
@@ -1,30 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/worktree-reap.js — reap the per-Story worktree
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* local worktree is no longer needed once the PR is open. Reap is
|
|
6
|
-
* best-effort: any failure is logged loudly and the close result still
|
|
7
|
-
* reports success because the operator can clean stale worktrees out of
|
|
8
|
-
* band.
|
|
9
|
-
*
|
|
10
|
-
* **Report what happened, not what was attempted** (Story #4539). This
|
|
11
|
-
* phase used to set `worktreeReaped = true` and log "🧹 Reaped worktree"
|
|
12
|
-
* on any non-throwing call — without reading the returned envelope. Since
|
|
13
|
-
* `reap` signals refusal by *returning* `{ removed: false, reason }`
|
|
14
|
-
* rather than throwing, and a v2-era precondition refused every
|
|
15
|
-
* `story-<id>` worktree outright, the result was that no close ever
|
|
16
|
-
* actually reaped and every close said it did. Best-effort means the close
|
|
17
|
-
* still succeeds on refusal; it does not mean the close may claim an
|
|
18
|
-
* outcome it never checked.
|
|
2
|
+
* phases/worktree-reap.js — best-effort reap of the per-Story worktree once
|
|
3
|
+
* the PR is open. `reap` refuses by RETURNING `{ removed: false }`, so report
|
|
4
|
+
* what happened, never merely that the call did not throw.
|
|
19
5
|
*/
|
|
20
6
|
|
|
21
7
|
import { Logger } from '../../../Logger.js';
|
|
22
8
|
import { WorktreeManager as DefaultWorktreeManager } from '../../../worktree-manager.js';
|
|
23
9
|
|
|
24
10
|
/**
|
|
25
|
-
* Reap the worktree for a standalone Story when isolation is enabled and
|
|
26
|
-
* `reapOnSuccess` is not explicitly disabled.
|
|
27
|
-
*
|
|
28
11
|
* @param {{
|
|
29
12
|
* cwd: string,
|
|
30
13
|
* storyId: number,
|
|
@@ -56,20 +39,9 @@ export async function reapWorktreePhase({
|
|
|
56
39
|
error: (m) => Logger.error(`[single-story-close] ${m}`),
|
|
57
40
|
},
|
|
58
41
|
});
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
// always no, and supplying a ref would activate `isSafeToRemove`'s
|
|
63
|
-
// merge-reachability gate and refuse every reap with
|
|
64
|
-
// `unmerged-commits` — trading one always-refuse precondition for
|
|
65
|
-
// another.
|
|
66
|
-
//
|
|
67
|
-
// What actually makes the reap safe here is that close has already
|
|
68
|
-
// pushed `story-<id>` to origin and opened the PR, so the work is
|
|
69
|
-
// durable off-machine; and `isSafeToRemove` still refuses a dirty
|
|
70
|
-
// tree (`uncommitted-changes`), which is the check that protects
|
|
71
|
-
// unsaved work. Refusal is signalled by the returned envelope rather
|
|
72
|
-
// than by throwing — so read it.
|
|
42
|
+
// NO base ref: this runs before the merge, so a merge-reachability
|
|
43
|
+
// check would refuse every reap. Safe because the work is pushed, and
|
|
44
|
+
// a dirty tree is still refused.
|
|
73
45
|
const result = await wm.reap(storyId);
|
|
74
46
|
worktreeReaped = result?.removed === true;
|
|
75
47
|
if (worktreeReaped) {
|