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
|
@@ -7,9 +7,7 @@
|
|
|
7
7
|
* node .agents/scripts/plan-run-epilogue.js --stories 1,2,3
|
|
8
8
|
* node .agents/scripts/plan-run-epilogue.js --stories 101-104 # inclusive range
|
|
9
9
|
*
|
|
10
|
-
* Keyed on the delivered id set
|
|
11
|
-
* synthesized from `--stories`. Story #4540 retired the `--run <planRunId>`
|
|
12
|
-
* label-resolution branch along with the `plan-run::<id>` label itself.
|
|
10
|
+
* Keyed on the delivered id set via a synthesized `adhoc-<sorted-ids>` run id.
|
|
13
11
|
*/
|
|
14
12
|
|
|
15
13
|
import './lib/runtime-deps/ensure-installed.js';
|
|
@@ -25,7 +23,7 @@ import { expandIdList } from './lib/util/parse-id-list.js';
|
|
|
25
23
|
const CLI_OPTIONS = {
|
|
26
24
|
stories: { type: 'string' },
|
|
27
25
|
cwd: { type: 'string' },
|
|
28
|
-
/**
|
|
26
|
+
/** Opt-in; see `run-epilogue.js` RUN_EPILOGUE_STEP_KINDS. */
|
|
29
27
|
'audit-roster': { type: 'boolean', default: false },
|
|
30
28
|
};
|
|
31
29
|
|
|
@@ -36,9 +34,7 @@ const CLI_OPTIONS = {
|
|
|
36
34
|
* createProviderImpl?: typeof createProvider,
|
|
37
35
|
* runPlanRunEpilogueImpl?: typeof runPlanRunEpilogue,
|
|
38
36
|
* logger?: { info: Function, warn: Function },
|
|
39
|
-
* }} [deps]
|
|
40
|
-
* implementation (`.agents/rules/test-seams.md` rules 1-2), so the CLI path
|
|
41
|
-
* and every production caller are unchanged.
|
|
37
|
+
* }} [deps]
|
|
42
38
|
* @returns {Promise<object>}
|
|
43
39
|
*/
|
|
44
40
|
export async function main(argv = process.argv.slice(2), deps = {}) {
|
|
@@ -60,14 +56,8 @@ export async function main(argv = process.argv.slice(2), deps = {}) {
|
|
|
60
56
|
const config = resolveConfigImpl({ cwd });
|
|
61
57
|
const provider = createProviderImpl(config);
|
|
62
58
|
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
// set, and the synthesized `adhoc-<ids>` id it already used for positional
|
|
66
|
-
// runs is now the only id it needs.
|
|
67
|
-
// Range tokens expand here too (`--stories 101-104`): /mandrel-deliver blesses the
|
|
68
|
-
// dash range at the operator surface, so the id set the epilogue is keyed on
|
|
69
|
-
// must read the same shape. Rejecting a bad token is deliberate — the old
|
|
70
|
-
// silent filter turned a typo into an empty, wrongly-keyed rollup.
|
|
59
|
+
// Ranges expand as at the operator surface; a bad token throws rather than
|
|
60
|
+
// silently producing an empty, wrongly-keyed rollup.
|
|
71
61
|
const { ids: stories, error: storiesError } = expandIdList(values.stories, {
|
|
72
62
|
flag: '--stories',
|
|
73
63
|
prefix: '[plan-run-epilogue] ',
|
|
@@ -96,14 +86,9 @@ export async function main(argv = process.argv.slice(2), deps = {}) {
|
|
|
96
86
|
}
|
|
97
87
|
|
|
98
88
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* The roster's changed-file set is the input the host walks its audit lenses
|
|
103
|
-
* against; a silent absence would read as "nothing changed" and the lens walk
|
|
104
|
-
* would look complete while covering nothing. Not fatal — with no diff the
|
|
105
|
-
* selector degrades to keyword-only lens selection, so the rest of the
|
|
106
|
-
* roster is still useful.
|
|
89
|
+
* Warn (not fatal) when the combined landed diff is unresolvable under
|
|
90
|
+
* `--audit-roster`: silence would read as "nothing changed" and the lens walk
|
|
91
|
+
* would look complete while covering nothing.
|
|
107
92
|
*
|
|
108
93
|
* @param {object} result - `runPlanRunEpilogue` envelope.
|
|
109
94
|
* @param {{ warn: Function }} [logger]
|
|
@@ -124,20 +109,9 @@ function warnOnUnresolvedBase(result, logger = Logger) {
|
|
|
124
109
|
}
|
|
125
110
|
|
|
126
111
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* The failure this exists to prevent is a *reassuring* one. The roll-up read
|
|
131
|
-
* "No friction signals — nothing to follow up" for a 7-Story run that
|
|
132
|
-
* contained a mid-run git outage, a parked worker needing an operator
|
|
133
|
-
* resume, and an acceptance critic that needed four rounds. Nothing was
|
|
134
|
-
* broken in the roll-up — the stream really was empty — but the report was
|
|
135
|
-
* indistinguishable from a clean run, so the retro loop that exists to learn
|
|
136
|
-
* from a run was silently blind to that run's pain.
|
|
137
|
-
*
|
|
138
|
-
* Not fatal: a genuinely friction-free multi-Story run is possible, and this
|
|
139
|
-
* cannot tell the two apart — which is precisely why it asks the operator
|
|
140
|
-
* rather than asserting either reading.
|
|
112
|
+
* Warn on a zero-signal roll-up over a multi-Story run: it is
|
|
113
|
+
* indistinguishable from a run whose friction went unrecorded, so the
|
|
114
|
+
* operator decides which it was.
|
|
141
115
|
*
|
|
142
116
|
* @param {object} result - `runPlanRunEpilogue` envelope.
|
|
143
117
|
* @param {{ warn: Function }} [logger]
|
|
@@ -1,84 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* pr-watch-with-update.js — the single CI-watch
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* pr-watch-with-update.js — the single CI-watch CLI for Story delivery.
|
|
4
|
+
* Polls the PR's required checks to a terminal state via `watchPrToTerminal`,
|
|
5
|
+
* recovering from `BEHIND` with bounded `gh pr update-branch` calls.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* it); this CLI is now its only caller. Story #5024 retired the bus
|
|
13
|
-
* outright, so there is no bus to create — this is a direct, synchronous
|
|
14
|
-
* watch with a real exit code.
|
|
15
|
-
*
|
|
16
|
-
* Slow-vs-failed semantics (Story #4358):
|
|
17
|
-
* - GREEN — every required check terminal + green → exit 0, unless the
|
|
18
|
-
* no-rerun guard says otherwise (below).
|
|
19
|
-
* - RED — one or more required checks genuinely failed → exit 1
|
|
20
|
-
* IMMEDIATELY, consuming no resume budget. On red the CLI
|
|
21
|
-
* disarms native auto-merge and writes
|
|
22
|
-
* `temp/story-<id>-ci-digest.{json,md}` (failing check name,
|
|
23
|
-
* head SHA, run id + run link, a `gh run view --log-failed`
|
|
24
|
-
* tail, and a coarse classification). The digest is scoped by
|
|
25
|
-
* filename, so it requires `--story` (Story #4539: the digest
|
|
26
|
-
* was Epic-scoped and therefore never written on the only
|
|
27
|
-
* delivery path v2 has).
|
|
28
|
-
* - STILL-RUNNING — the poll cap fired with checks still pending and
|
|
29
|
-
* none failed; the watcher re-armed up to
|
|
30
|
-
* `delivery.ci.watch.maxResumes` times, then returned a
|
|
31
|
-
* `still-running` verdict → exit 2 (NEVER 1, NEVER
|
|
32
|
-
* `timed_out`). The CLI prints the `gh pr checks --watch`
|
|
33
|
-
* handoff so the host can keep polling on its own cadence.
|
|
34
|
-
* - UNRESOLVED — every observed required check is green but the observed
|
|
35
|
-
* set does not reconcile with the repository's own verdict
|
|
36
|
-
* (Story #4873) → exit 2, same "keep watching" semantics as
|
|
37
|
-
* still-running. Withholding is the point: this watcher has
|
|
38
|
-
* reported green on a PR GitHub was reporting as BLOCKED.
|
|
39
|
-
* - NOT-YET-STARTED — the attach window was spent and NO required context
|
|
40
|
-
* ever attached, while the pull request itself kept reading back
|
|
41
|
-
* fine (Story #4890) → exit 2, the same "keep watching"
|
|
42
|
-
* semantics. This used to map onto the red exit code, which
|
|
43
|
-
* misroutes the caller twice over: the module reserves exit 1 for
|
|
44
|
-
* a required check that GENUINELY FAILED, and the red path writes
|
|
45
|
-
* a CI digest naming the failing check — so a caller routed onto
|
|
46
|
-
* it by a set that was merely empty found nothing to read. A
|
|
47
|
-
* still-empty required set is a slow condition, and the module
|
|
48
|
-
* already models slow as exit 2. A `gh` fault the PR probe cannot
|
|
49
|
-
* see past is still exit 1.
|
|
50
|
-
*
|
|
51
|
-
* Two GitHub oracles are deliberately not trusted on a single reading
|
|
52
|
-
* (Story #4873). An EMPTY `gh pr checks --required` probe is re-resolved
|
|
53
|
-
* within {@link REQUIRED_CONTEXT_ATTACH_WINDOW_MS} before it is believed —
|
|
54
|
-
* a ruleset attaches its required contexts asynchronously, and a required
|
|
55
|
-
* context that is an aggregator job gated on every other tier is by
|
|
56
|
-
* construction the LAST to appear (#4890 measured 16m52s), so a watch launched
|
|
57
|
-
* right after `gh pr create` used to fail a delivery whose CI had not been
|
|
58
|
-
* asked to start yet. And a GREEN verdict is issued only after
|
|
59
|
-
* {@link reconcileGreenVerdict} confirms the repository agrees; an
|
|
60
|
-
* unreconcilable set reports unresolved instead of green.
|
|
61
|
-
*
|
|
62
|
-
* No-rerun enforcement (Story #4865). `rules/ci-remediation.md` § Verifier
|
|
63
|
-
* forbids re-running a failed job to reach green; this CLI is the point
|
|
64
|
-
* that enforces it. Enforcement acts on the **first red** — GitHub's native
|
|
65
|
-
* auto-merge fires server-side and races any post-green detection, so a
|
|
66
|
-
* green can already have merged by the time it is observed. On red the
|
|
67
|
-
* watcher disarms auto-merge and records the head SHA; on green it reads
|
|
68
|
-
* the digest and adjudicates: a green on the SAME head SHA is a forbidden
|
|
69
|
-
* re-run (exit 1, `agent::blocked`, a `file-ci-gap.js` intake filing
|
|
70
|
-
* required), while
|
|
71
|
-
* a green on a NEW head SHA is a fix at source — the digest is retired,
|
|
72
|
-
* auto-merge is re-armed, and the delivery proceeds. A delivery that never
|
|
73
|
-
* went red has no digest and is untouched. Mechanism:
|
|
74
|
-
* `lib/orchestration/ci-rerun-guard.js`.
|
|
75
|
-
*
|
|
76
|
-
* Config (Story #4356 namespace, read via `getCiDelivery`):
|
|
77
|
-
* - `delivery.ci.watch.pollIntervalMs`
|
|
78
|
-
* - `delivery.ci.watch.maxPolls`
|
|
79
|
-
* - `delivery.ci.watch.maxResumes`
|
|
80
|
-
* - `delivery.ci.watch.attachWindowMs` (Story #4890)
|
|
81
|
-
* CLI flags override config; config overrides the framework fallback.
|
|
7
|
+
* No-rerun enforcement (`rules/ci-remediation.md` § Verifier) acts on the
|
|
8
|
+
* FIRST red, because native auto-merge fires server-side and races any
|
|
9
|
+
* post-green detection: red disarms auto-merge and records the head SHA in a
|
|
10
|
+
* digest; a later green on the SAME SHA is a forbidden re-run, on a NEW SHA a
|
|
11
|
+
* fix at source (digest retired, auto-merge re-armed).
|
|
82
12
|
*
|
|
83
13
|
* Usage:
|
|
84
14
|
* node .agents/scripts/pr-watch-with-update.js --pr <n> --story <id>
|
|
@@ -87,7 +17,6 @@
|
|
|
87
17
|
*/
|
|
88
18
|
import { parseArgs } from 'node:util';
|
|
89
19
|
import { runAsCli } from './lib/cli-utils.js';
|
|
90
|
-
import { getCiDelivery } from './lib/config/ci.js';
|
|
91
20
|
import { resolveConfig } from './lib/config-resolver.js';
|
|
92
21
|
import { gh as defaultGh } from './lib/gh-exec.js';
|
|
93
22
|
import { Logger } from './lib/Logger.js';
|
|
@@ -95,7 +24,6 @@ import {
|
|
|
95
24
|
blockStoryDelivery,
|
|
96
25
|
classifyFailure,
|
|
97
26
|
classifyGreenVerdict,
|
|
98
|
-
disarmAutoMerge,
|
|
99
27
|
formatRerunViolation,
|
|
100
28
|
readCiDigest,
|
|
101
29
|
resolveDigestScope,
|
|
@@ -104,34 +32,24 @@ import {
|
|
|
104
32
|
writeCiDigest,
|
|
105
33
|
} from './lib/orchestration/ci-rerun-guard.js';
|
|
106
34
|
import { watchPrToTerminal } from './lib/orchestration/pr-watch.js';
|
|
107
|
-
import {
|
|
35
|
+
import {
|
|
36
|
+
disarmAutoMerge,
|
|
37
|
+
enableAutoMergeWith,
|
|
38
|
+
} from './lib/orchestration/single-story-close/phases/auto-merge.js';
|
|
108
39
|
import { sleep as defaultSleep } from './lib/util/poll-loop.js';
|
|
109
40
|
|
|
110
41
|
/** Exit code reserved for the slow-but-not-red `still-running` verdict. */
|
|
111
42
|
export const STILL_RUNNING_EXIT_CODE = 2;
|
|
112
43
|
|
|
113
44
|
/**
|
|
114
|
-
* How long
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
* asynchronously, and the arrival latency is set by the SLOWEST context in the
|
|
119
|
-
* set. Story #4873 measured tens of seconds on a cold repo and calibrated the
|
|
120
|
-
* window at 90s; #4890 measured **16m52s** on this repository, because its
|
|
121
|
-
* required context is an aggregator job gated on every other tier and is
|
|
122
|
-
* therefore, by construction, the last check to appear. A 90s window still
|
|
123
|
-
* exhausted, so the watch still aborted on a PR whose CI was working exactly
|
|
124
|
-
* as designed.
|
|
125
|
-
*
|
|
126
|
-
* The default therefore covers a late aggregator with margin rather than a
|
|
127
|
-
* fast ruleset, and it is operator-tunable on the `delivery.ci.watch.*` ladder
|
|
128
|
-
* (`attachWindowMs`) for a repository whose contexts arrive on a different
|
|
129
|
-
* cadence. Spending the window costs nothing but wall-clock on a PR nobody
|
|
130
|
-
* could merge yet; exhausting it too early costs the whole delivery.
|
|
45
|
+
* How long an EMPTY required-context probe keeps being retried. Rulesets
|
|
46
|
+
* attach contexts asynchronously and an aggregator context gated on every
|
|
47
|
+
* other tier arrives last (~17 min measured), so the default covers that with
|
|
48
|
+
* margin: waiting costs wall-clock, giving up early costs the delivery.
|
|
131
49
|
*/
|
|
132
50
|
export const REQUIRED_CONTEXT_ATTACH_WINDOW_MS = 1_200_000;
|
|
133
51
|
|
|
134
|
-
/** Framework fallbacks when
|
|
52
|
+
/** Framework fallbacks when no CLI flag supplies a value. */
|
|
135
53
|
export const WATCH_DEFAULTS = Object.freeze({
|
|
136
54
|
pollIntervalMs: 10_000,
|
|
137
55
|
maxPolls: 180,
|
|
@@ -141,25 +59,15 @@ export const WATCH_DEFAULTS = Object.freeze({
|
|
|
141
59
|
});
|
|
142
60
|
|
|
143
61
|
/**
|
|
144
|
-
* Merge
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
* `BLOCKED` is the measured false-green: the watcher's `gh pr checks
|
|
148
|
-
* --required` set came back SMALLER than branch protection's — a context
|
|
149
|
-
* attached after the first probe, so it was never in `requiredChecks` — every
|
|
150
|
-
* check the watcher knew about was green, and it reported green while GitHub
|
|
151
|
-
* still refused the merge. `UNKNOWN` / an unreadable probe is not a
|
|
152
|
-
* reconciliation either: it is the absence of the second opinion, and a green
|
|
153
|
-
* verdict is exactly the verdict that must not be issued on absent evidence.
|
|
62
|
+
* Merge states that confirm an observed all-green required set. `BLOCKED`
|
|
63
|
+
* means branch protection enforces a context the watch never observed (it
|
|
64
|
+
* attached after the first probe); `UNKNOWN`/unreadable is absent evidence.
|
|
154
65
|
*/
|
|
155
66
|
const RECONCILED_MERGE_STATES = Object.freeze(
|
|
156
67
|
new Set(['CLEAN', 'UNSTABLE', 'HAS_HOOKS', 'BEHIND', 'DRAFT']),
|
|
157
68
|
);
|
|
158
69
|
|
|
159
70
|
/**
|
|
160
|
-
* Does an observed-green required set reconcile with the repository's own
|
|
161
|
-
* verdict on the PR? Pure — exported so the rule is reviewable as code.
|
|
162
|
-
*
|
|
163
71
|
* @param {{ observedRequired?: string[], mergeStateStatus?: string|null }} args
|
|
164
72
|
* @returns {{ reconciled: boolean, mergeStateStatus: string|null, reason: string }}
|
|
165
73
|
*/
|
|
@@ -208,12 +116,7 @@ async function defaultMergeStateProbe({ prRef }) {
|
|
|
208
116
|
}
|
|
209
117
|
}
|
|
210
118
|
|
|
211
|
-
/**
|
|
212
|
-
* Adapt the watch loop's own `ghPrViewFn` port — which already spawns
|
|
213
|
-
* `gh pr view --json mergeStateStatus` for BEHIND recovery — into the
|
|
214
|
-
* reconciliation probe, so a caller that injected one port does not have to
|
|
215
|
-
* inject a second for the same `gh` call.
|
|
216
|
-
*/
|
|
119
|
+
/** Reuse an injected `ghPrViewFn` port as the merge-state probe. */
|
|
217
120
|
function mergeStateProbeFromView(ghPrViewFn) {
|
|
218
121
|
return async ({ prUrl, repo, cwd }) => {
|
|
219
122
|
try {
|
|
@@ -230,22 +133,11 @@ function mergeStateProbeFromView(ghPrViewFn) {
|
|
|
230
133
|
}
|
|
231
134
|
|
|
232
135
|
/**
|
|
233
|
-
* Run the watch, re-
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
* Re-arming the whole call is what makes convergence possible: the required
|
|
239
|
-
* check NAMES are resolved once per `watchPrToTerminal` call, so a context that
|
|
240
|
-
* attaches minutes later is only ever seen by a fresh call.
|
|
241
|
-
*
|
|
242
|
-
* `probePrResolvable` is the **structural** classifier, re-read every round: a
|
|
243
|
-
* required set that is empty while the pull request itself reads back fine is
|
|
244
|
-
* CI that has not started, so the window is worth spending; a pull request that
|
|
245
|
-
* does not read back at all is a `gh` fault, so the window is not spent on it
|
|
246
|
-
* and the caller reports the failure immediately. `gh` overloads its exit code
|
|
247
|
-
* across both conditions, and this deliberately does not fall back to matching
|
|
248
|
-
* its stderr prose — a human-readable string is not a classification contract.
|
|
136
|
+
* Run the watch, re-running the whole call while the required set is EMPTY
|
|
137
|
+
* (names resolve once per call, so a late context needs a fresh call) until
|
|
138
|
+
* the attach window is spent. `probePrResolvable` separates CI-not-started
|
|
139
|
+
* (PR reads back) from a `gh` fault (it does not) structurally — never from
|
|
140
|
+
* stderr prose.
|
|
249
141
|
*
|
|
250
142
|
* @returns {Promise<object>} the watch result plus `attachRetries`, and
|
|
251
143
|
* `prResolvable` whenever the required set stayed empty.
|
|
@@ -260,11 +152,8 @@ async function watchWithAttachWindow({
|
|
|
260
152
|
logger,
|
|
261
153
|
}) {
|
|
262
154
|
const deadline = nowMsFn() + attachWindowMs;
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
// sets one) would otherwise spin the window out as a tight loop. Flooring
|
|
266
|
-
// the assumed cadence at 5s bounds the attempts without changing the
|
|
267
|
-
// wall-clock bound that governs a real watch.
|
|
155
|
+
// Cap retries too (cadence floored at 5s) so a zero poll interval cannot
|
|
156
|
+
// spin the wall-clock window as a tight loop.
|
|
268
157
|
const maxRetries = Math.ceil(
|
|
269
158
|
attachWindowMs / Math.max(retryIntervalMs, 5000),
|
|
270
159
|
);
|
|
@@ -300,40 +189,19 @@ function parsePositiveInt(raw, fallback) {
|
|
|
300
189
|
}
|
|
301
190
|
|
|
302
191
|
/**
|
|
303
|
-
* Resolve
|
|
304
|
-
*
|
|
305
|
-
* the precedence ladder is reviewable. `flags` are the raw string values
|
|
306
|
-
* from `parseArgs` (or numbers, in tests); a nullish flag falls through
|
|
307
|
-
* to config, and a nullish config field falls through to the default.
|
|
192
|
+
* Resolve poll knobs: a nullish or malformed flag falls back to
|
|
193
|
+
* {@link WATCH_DEFAULTS}.
|
|
308
194
|
*
|
|
309
195
|
* @param {object} opts
|
|
310
|
-
* @param {object
|
|
311
|
-
* @param {object} [opts.flags] `{ pollIntervalMs, maxPolls, maxResumes, maxUpdates, attachWindowMs }`.
|
|
196
|
+
* @param {object} [opts.flags]
|
|
312
197
|
* @returns {{ pollIntervalMs: number, maxPolls: number, maxResumes: number, maxUpdates: number, attachWindowMs: number }}
|
|
313
198
|
*/
|
|
314
|
-
export function resolveWatchKnobs({
|
|
315
|
-
const
|
|
316
|
-
const
|
|
317
|
-
parsePositiveInt(
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
flags.pollIntervalMs,
|
|
321
|
-
watch.pollIntervalMs,
|
|
322
|
-
WATCH_DEFAULTS.pollIntervalMs,
|
|
323
|
-
),
|
|
324
|
-
maxPolls: pick(flags.maxPolls, watch.maxPolls, WATCH_DEFAULTS.maxPolls),
|
|
325
|
-
maxResumes: pick(
|
|
326
|
-
flags.maxResumes,
|
|
327
|
-
watch.maxResumes,
|
|
328
|
-
WATCH_DEFAULTS.maxResumes,
|
|
329
|
-
),
|
|
330
|
-
maxUpdates: pick(flags.maxUpdates, undefined, WATCH_DEFAULTS.maxUpdates),
|
|
331
|
-
attachWindowMs: pick(
|
|
332
|
-
flags.attachWindowMs,
|
|
333
|
-
watch.attachWindowMs,
|
|
334
|
-
WATCH_DEFAULTS.attachWindowMs,
|
|
335
|
-
),
|
|
336
|
-
};
|
|
199
|
+
export function resolveWatchKnobs({ flags = {} } = {}) {
|
|
200
|
+
const knobs = {};
|
|
201
|
+
for (const [key, fallback] of Object.entries(WATCH_DEFAULTS)) {
|
|
202
|
+
knobs[key] = parsePositiveInt(flags[key], fallback);
|
|
203
|
+
}
|
|
204
|
+
return knobs;
|
|
337
205
|
}
|
|
338
206
|
|
|
339
207
|
/** Default re-arm: the sanctioned auto-merge enablement path. */
|
|
@@ -342,13 +210,9 @@ function defaultReArm({ cwd, prNumber }) {
|
|
|
342
210
|
}
|
|
343
211
|
|
|
344
212
|
/**
|
|
345
|
-
* Red path
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
* A disarm failure is a **blocker**, not a warning: an armed PR whose
|
|
350
|
-
* required check went red can still be merged by GitHub the instant a
|
|
351
|
-
* re-run turns it green, which is precisely what this guard exists to stop.
|
|
213
|
+
* Red path: disarm auto-merge FIRST (the race-free moment), then record the
|
|
214
|
+
* digest keyed to the red head SHA. A disarm failure blocks — an armed PR
|
|
215
|
+
* merges the instant a re-run turns it green.
|
|
352
216
|
*
|
|
353
217
|
* @returns {Promise<{ headSha: string|null, disarm: object, digestPaths: object|null, blocked: boolean }>}
|
|
354
218
|
*/
|
|
@@ -365,7 +229,7 @@ async function handleRedWatch({
|
|
|
365
229
|
blockFn,
|
|
366
230
|
logger,
|
|
367
231
|
}) {
|
|
368
|
-
const disarm = disarmFn({ prRef
|
|
232
|
+
const disarm = await disarmFn({ prRef });
|
|
369
233
|
const scope = resolveDigestScope({ storyId });
|
|
370
234
|
const headSha = scope ? headShaFn({ prRef, cwd }) : null;
|
|
371
235
|
let digestPaths = null;
|
|
@@ -419,9 +283,7 @@ async function handleRedWatch({
|
|
|
419
283
|
}
|
|
420
284
|
|
|
421
285
|
/**
|
|
422
|
-
* Green path
|
|
423
|
-
* scope recorded, and return the exit code with the report the caller
|
|
424
|
-
* prints.
|
|
286
|
+
* Green path: adjudicate the green against any recorded red digest.
|
|
425
287
|
*
|
|
426
288
|
* @returns {Promise<{ verdict: string, reason: string, exitCode: number, headSha: string|null, reArmed?: boolean, blocked?: boolean }>}
|
|
427
289
|
*/
|
|
@@ -459,12 +321,8 @@ async function evaluateGreenWatch({
|
|
|
459
321
|
const headSha = headShaFn({ prRef, cwd });
|
|
460
322
|
const { verdict, reason } = classifyGreenVerdict({ digest, headSha });
|
|
461
323
|
if (verdict === 'fix-at-source' || verdict === 'rerun-permitted') {
|
|
462
|
-
//
|
|
463
|
-
//
|
|
464
|
-
// `unreproducible-tier` verdict for THIS head, so there is no fix at
|
|
465
|
-
// source to make. Retiring the digest spends the allowance with it, which
|
|
466
|
-
// is what makes it exactly one: a second red writes a fresh digest that
|
|
467
|
-
// carries none.
|
|
324
|
+
// `rerun-permitted`: `file-ci-gap.js` proved a capacity/unreproducible
|
|
325
|
+
// verdict for THIS head. Retiring the digest spends the one allowance.
|
|
468
326
|
retireDigestFn({ storyId, tempRoot, cwd });
|
|
469
327
|
const reArm = await reArmFn({ cwd, prNumber });
|
|
470
328
|
const reArmed = Boolean(reArm?.enabled);
|
|
@@ -496,11 +354,7 @@ async function evaluateGreenWatch({
|
|
|
496
354
|
}
|
|
497
355
|
|
|
498
356
|
/**
|
|
499
|
-
*
|
|
500
|
-
*
|
|
501
|
-
* Split out of `runPrWatch` because config resolution must not abort the
|
|
502
|
-
* watch: a broken `.agentrc` should degrade to defaults, not turn a CI probe
|
|
503
|
-
* into a crash.
|
|
357
|
+
* A broken `.agentrc` degrades to defaults rather than aborting the watch.
|
|
504
358
|
*
|
|
505
359
|
* @param {{ config?: object, tempRoot?: string, logger: object, flags: object }} params
|
|
506
360
|
* @returns {{ knobs: object, effectiveTempRoot: string, cwd: string }}
|
|
@@ -508,18 +362,14 @@ async function evaluateGreenWatch({
|
|
|
508
362
|
function resolveWatchContext({ config, tempRoot, logger, flags }) {
|
|
509
363
|
const resolvedConfig =
|
|
510
364
|
config !== undefined ? config : safeResolveConfig(logger);
|
|
511
|
-
const knobs = resolveWatchKnobs({
|
|
365
|
+
const knobs = resolveWatchKnobs({ flags });
|
|
512
366
|
const effectiveTempRoot =
|
|
513
367
|
tempRoot ?? resolvedConfig?.project?.paths?.tempRoot ?? 'temp';
|
|
514
368
|
return { knobs, effectiveTempRoot, cwd: process.cwd() };
|
|
515
369
|
}
|
|
516
370
|
|
|
517
371
|
/**
|
|
518
|
-
*
|
|
519
|
-
*
|
|
520
|
-
* Each injectable port is spread in only when supplied so the port keeps its
|
|
521
|
-
* own default — passing `undefined` explicitly would override a default with
|
|
522
|
-
* nothing and break every caller that relies on it.
|
|
372
|
+
* Ports are spread in only when supplied so the watch keeps its own defaults.
|
|
523
373
|
*
|
|
524
374
|
* @param {object} params
|
|
525
375
|
* @returns {object}
|
|
@@ -552,13 +402,8 @@ function buildWatchArgs({
|
|
|
552
402
|
}
|
|
553
403
|
|
|
554
404
|
/**
|
|
555
|
-
*
|
|
556
|
-
*
|
|
557
|
-
*
|
|
558
|
-
* The two are distinguished structurally — never against `gh`'s stderr prose
|
|
559
|
-
* (Story #4890) — because they route oppositely: CI that has not started is
|
|
560
|
-
* slow (exit 2, keep watching), while an unreadable PR is a `gh` / access
|
|
561
|
-
* fault (exit 1).
|
|
405
|
+
* No required check attached (slow, exit 2) vs. unreadable PR (`gh` fault,
|
|
406
|
+
* exit 1).
|
|
562
407
|
*
|
|
563
408
|
* @param {object} params
|
|
564
409
|
* @returns {number} exit code
|
|
@@ -599,13 +444,8 @@ function reportUnattachedOrError({
|
|
|
599
444
|
}
|
|
600
445
|
|
|
601
446
|
/**
|
|
602
|
-
* Settle
|
|
603
|
-
*
|
|
604
|
-
* Never green on an undercount (Story #4873): the observed set is whatever
|
|
605
|
-
* `gh pr checks --required` returned on the FIRST probe, so a context a
|
|
606
|
-
* ruleset attached later can leave every check we knew about green while
|
|
607
|
-
* GitHub still refuses the merge. An unreconcilable set reports unresolved
|
|
608
|
-
* (exit 2, keep watching) rather than a false green or a false red.
|
|
447
|
+
* Settle an all-green watch. The observed set is from the FIRST probe and may
|
|
448
|
+
* undercount, so an unreconcilable set exits 2 rather than a false green.
|
|
609
449
|
*
|
|
610
450
|
* @param {object} params
|
|
611
451
|
* @returns {Promise<number>} exit code
|
|
@@ -660,9 +500,7 @@ async function settleGreenWatch({
|
|
|
660
500
|
}
|
|
661
501
|
|
|
662
502
|
/**
|
|
663
|
-
*
|
|
664
|
-
* checks still pending and none failed. Never exit 1, never `timed_out` —
|
|
665
|
-
* hand off to the host's interval loop and exit 2.
|
|
503
|
+
* Poll cap and resume budget exhausted, none red: hand off, exit 2.
|
|
666
504
|
*
|
|
667
505
|
* @param {object} params
|
|
668
506
|
* @returns {number} exit code
|
|
@@ -681,11 +519,8 @@ function reportStillRunning({ result, envelope, logger, print }) {
|
|
|
681
519
|
}
|
|
682
520
|
|
|
683
521
|
/**
|
|
684
|
-
*
|
|
685
|
-
*
|
|
686
|
-
* `promotePendingToStillRunning` has rewritten the pending entries, and a
|
|
687
|
-
* still-running check is slow, not red — including it here would let it become
|
|
688
|
-
* the digest's "primary" failing check and mispoint the diagnosis.
|
|
522
|
+
* Failing checks. `still-running` is excluded: it is slow, not red, and would
|
|
523
|
+
* otherwise become the digest's primary failing check.
|
|
689
524
|
*
|
|
690
525
|
* @param {Record<string, string>} outcomes
|
|
691
526
|
* @returns {Array<{ name: string, outcome: string }>}
|
|
@@ -703,9 +538,6 @@ function collectFailures(outcomes) {
|
|
|
703
538
|
}
|
|
704
539
|
|
|
705
540
|
/**
|
|
706
|
-
* Genuine red check — exit 1 immediately, disarm auto-merge, write the digest,
|
|
707
|
-
* and surface the fix-loop handoff.
|
|
708
|
-
*
|
|
709
541
|
* @param {object} params
|
|
710
542
|
* @returns {Promise<number>} exit code
|
|
711
543
|
*/
|
|
@@ -762,44 +594,34 @@ async function settleRedWatch({
|
|
|
762
594
|
}
|
|
763
595
|
|
|
764
596
|
/**
|
|
765
|
-
* Run the watch
|
|
766
|
-
*
|
|
767
|
-
*
|
|
768
|
-
*
|
|
769
|
-
* 0 → all required checks green (and the no-rerun guard cleared them).
|
|
770
|
-
* 1 → a required check genuinely failed (red), OR the green was reached
|
|
771
|
-
* by a forbidden re-run of the same commit, OR the pull request itself
|
|
772
|
-
* could not be read (a `gh` / access fault).
|
|
773
|
-
* 2 → slow-but-not-red: still-running (cap + resume budget exhausted, none
|
|
774
|
-
* red), an unreconcilable green, or no required context attached within
|
|
775
|
-
* the attach window while the PR kept reading back fine (#4890).
|
|
597
|
+
* Run the watch and resolve to the exit code: 0 green (guard cleared);
|
|
598
|
+
* 1 red, forbidden same-SHA re-run, or unreadable PR; 2 slow-but-not-red
|
|
599
|
+
* (still running, unreconcilable green, or no context attached in the window).
|
|
776
600
|
*
|
|
777
601
|
* @param {object} opts
|
|
778
602
|
* @param {number} opts.prNumber
|
|
779
|
-
* @param {string|null} [opts.repo]
|
|
603
|
+
* @param {string|null} [opts.repo]
|
|
780
604
|
* @param {number|string} [opts.maxUpdates]
|
|
781
605
|
* @param {number|string} [opts.pollIntervalMs]
|
|
782
606
|
* @param {number|string} [opts.maxPolls]
|
|
783
607
|
* @param {number|string} [opts.maxResumes]
|
|
784
|
-
* @param {number|string} [opts.attachWindowMs]
|
|
785
|
-
*
|
|
786
|
-
*
|
|
787
|
-
* @param {
|
|
788
|
-
* @param {
|
|
789
|
-
* @param {Function} [opts.
|
|
790
|
-
* @param {Function} [opts.
|
|
791
|
-
* @param {Function} [opts.
|
|
792
|
-
* @param {Function} [opts.
|
|
793
|
-
* @param {Function} [opts.
|
|
794
|
-
* @param {Function} [opts.
|
|
795
|
-
* @param {Function} [opts.
|
|
796
|
-
* @param {Function} [opts.
|
|
797
|
-
* @param {Function} [opts.
|
|
798
|
-
* @param {Function} [opts.reArmAutoMergeFn] inject for tests (default enableAutoMergeWith)
|
|
799
|
-
* @param {Function} [opts.blockDeliveryFn] inject for tests (default blockStoryDelivery)
|
|
608
|
+
* @param {number|string} [opts.attachWindowMs]
|
|
609
|
+
* @param {object|null} [opts.config]
|
|
610
|
+
* @param {string} [opts.tempRoot]
|
|
611
|
+
* @param {Function} [opts.ghPrChecksFn]
|
|
612
|
+
* @param {Function} [opts.ghPrViewFn]
|
|
613
|
+
* @param {Function} [opts.ghPrUpdateBranchFn]
|
|
614
|
+
* @param {Function} [opts.sleepFn]
|
|
615
|
+
* @param {Function} [opts.writeDigestFn]
|
|
616
|
+
* @param {Function} [opts.readDigestFn]
|
|
617
|
+
* @param {Function} [opts.retireDigestFn]
|
|
618
|
+
* @param {Function} [opts.headShaFn]
|
|
619
|
+
* @param {Function} [opts.disarmAutoMergeFn]
|
|
620
|
+
* @param {Function} [opts.reArmAutoMergeFn]
|
|
621
|
+
* @param {Function} [opts.blockDeliveryFn]
|
|
800
622
|
* @param {object} [opts.logger]
|
|
801
|
-
* @param {(line: string) => void} [opts.print]
|
|
802
|
-
* @returns {Promise<number>}
|
|
623
|
+
* @param {(line: string) => void} [opts.print]
|
|
624
|
+
* @returns {Promise<number>}
|
|
803
625
|
*/
|
|
804
626
|
export async function runPrWatch({
|
|
805
627
|
prNumber,
|
|
@@ -838,22 +660,13 @@ export async function runPrWatch({
|
|
|
838
660
|
flags: { pollIntervalMs, maxPolls, maxResumes, maxUpdates, attachWindowMs },
|
|
839
661
|
});
|
|
840
662
|
|
|
841
|
-
// `gh`
|
|
842
|
-
//
|
|
843
|
-
// the first probe with a misleading `gh-checks-failed:status=1` (#4890). The
|
|
844
|
-
// repository therefore travels two sanctioned ways, never as a composed ref:
|
|
845
|
-
// - a real `--repo` flag on the watch ports, which build their own argv;
|
|
846
|
-
// - a canonical PR URL for the no-rerun-guard helpers, which take a bare
|
|
847
|
-
// ref and no repository of their own.
|
|
848
|
-
// With `--repo` omitted, `gh` infers the repository from the cwd's remote.
|
|
663
|
+
// `gh` parses `<owner/repo>#<n>` as a branch name, so the repo travels as a
|
|
664
|
+
// `--repo` flag on watch ports and as a PR URL for the guard helpers.
|
|
849
665
|
const prRef = String(prNumber);
|
|
850
666
|
const guardPrRef = repo
|
|
851
667
|
? `https://github.com/${repo}/pull/${prNumber}`
|
|
852
668
|
: prRef;
|
|
853
669
|
|
|
854
|
-
// One merge-state probe, resolved once and used for both readings that need
|
|
855
|
-
// the repository's own view of the PR: the empty-required-set classification
|
|
856
|
-
// below, and the green-verdict reconciliation further down.
|
|
857
670
|
const probeMergeState =
|
|
858
671
|
mergeStateProbeFn ??
|
|
859
672
|
(ghPrViewFn ? mergeStateProbeFromView(ghPrViewFn) : defaultMergeStateProbe);
|
|
@@ -876,14 +689,10 @@ export async function runPrWatch({
|
|
|
876
689
|
retryIntervalMs: knobs.pollIntervalMs,
|
|
877
690
|
sleepFn: sleepFn ?? defaultSleep,
|
|
878
691
|
nowMsFn,
|
|
879
|
-
// Structural, not prose: the PR reads back ⇒ `gh` works and the empty
|
|
880
|
-
// required set is CI that has not started yet.
|
|
881
692
|
probePrResolvable: async () => (await readMergeState()) !== null,
|
|
882
693
|
logger,
|
|
883
694
|
});
|
|
884
695
|
|
|
885
|
-
// Always print the final outcomes map so the operator (and the
|
|
886
|
-
// workflow log) can see exactly which check blocked.
|
|
887
696
|
const envelope = {
|
|
888
697
|
prNumber,
|
|
889
698
|
checkOutcomes: result.outcomes,
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Provider — token resolution
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* → throws with an instructive error. `execSync` is indirected through a
|
|
6
|
-
* holder so tests can swap it.
|
|
7
|
-
*
|
|
8
|
-
* Extracted from `../github.js` in Story #1846 / Task #1855 — see that
|
|
9
|
-
* Story for the broader split rationale.
|
|
2
|
+
* GitHub Provider — token resolution: GITHUB_TOKEN / GH_TOKEN env →
|
|
3
|
+
* `gh auth token` → instructive throw. `execSync` sits behind a holder so
|
|
4
|
+
* tests can swap it.
|
|
10
5
|
*/
|
|
11
6
|
|
|
12
7
|
import { execSync as defaultExecSync } from 'node:child_process';
|