mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/options.js — CLI / injection option parsing for
|
|
3
|
-
* `single-story-close`.
|
|
4
|
-
*
|
|
5
|
-
* Handles the conditional param-vs-CLI branch and all flag defaults in one
|
|
6
|
-
* place so the main `runSingleStoryClose` body stays focused on close
|
|
7
|
-
* pipeline logic. Each `??` operator counts as a branch in escomplex; the
|
|
8
|
-
* `resolveFlag` helper keeps the cyclomatic complexity tally bounded.
|
|
2
|
+
* phases/options.js — CLI / injection option parsing for `single-story-close`.
|
|
9
3
|
*/
|
|
10
4
|
|
|
11
5
|
import path from 'node:path';
|
|
@@ -19,13 +13,8 @@ import { PROJECT_ROOT } from '../../../project-root.js';
|
|
|
19
13
|
import { isOperatorMergeReason } from './auto-merge.js';
|
|
20
14
|
|
|
21
15
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* Returns `undefined` when neither is supplied — that absence is itself the
|
|
25
|
-
* answer here, letting each caller below apply its own default (a `!!` coerce,
|
|
26
|
-
* a config lookup, or a deliberate `undefined` passed further down). The
|
|
27
|
-
* former third `defaultValue` parameter was dropped in Story #4961: no call
|
|
28
|
-
* site passed it, so it documented a mode nobody used.
|
|
16
|
+
* Param beats parsed arg; `undefined` lets each caller apply its own default.
|
|
17
|
+
* (A helper, since each `??` counts toward cyclomatic complexity.)
|
|
29
18
|
*
|
|
30
19
|
* @template T
|
|
31
20
|
* @param {T|undefined} paramValue
|
|
@@ -37,13 +26,7 @@ function resolveFlag(paramValue, parsedValue) {
|
|
|
37
26
|
}
|
|
38
27
|
|
|
39
28
|
/**
|
|
40
|
-
*
|
|
41
|
-
* close flags share (Story #5266 deduplicated them): absence is preserved so
|
|
42
|
-
* the reader downstream applies its own config default, and a junk value is
|
|
43
|
-
* treated as absent rather than coerced into a bound nobody asked for.
|
|
44
|
-
*
|
|
45
|
-
* `min` is what separates them: `--max-wait-seconds 0` is a typo (a
|
|
46
|
-
* zero-second wait), while `--rerun-advisory 0` is the meaningful default.
|
|
29
|
+
* Junk reads as absent (so the config default applies), never coerced.
|
|
47
30
|
*
|
|
48
31
|
* @param {unknown} value
|
|
49
32
|
* @param {number} min
|
|
@@ -54,26 +37,9 @@ function intAtLeast(value, min) {
|
|
|
54
37
|
}
|
|
55
38
|
|
|
56
39
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* auto-merge phase, because two of its four inputs are not knowable at
|
|
61
|
-
* parse time: the resolved config (whose `cwd` this parse produces) and the
|
|
62
|
-
* actual arm outcome. Resolving it here — once, where every input exists —
|
|
63
|
-
* is what makes `delivery.routing.closeAndLand` governable at all.
|
|
64
|
-
*
|
|
65
|
-
* Precedence, highest first:
|
|
66
|
-
* 1. `--no-wait-merge` / injected opt-out — always wins.
|
|
67
|
-
* 2. **Operator owns the merge** (`--no-auto-merge`, or
|
|
68
|
-
* `delivery.ci.autoMerge: "strict"`): the PR was deliberately left
|
|
69
|
-
* un-armed, so there is nothing for close to land. Resting at
|
|
70
|
-
* `agent::closing` for the human IS the documented contract for both
|
|
71
|
-
* surfaces; waiting would only burn the poll budget and then block a
|
|
72
|
-
* perfectly healthy Story. An explicit `--wait-merge` cannot override
|
|
73
|
-
* this — you cannot land-in-one-close a PR you refused to arm — so the
|
|
74
|
-
* caller is told rather than silently ignored.
|
|
75
|
-
* 3. Explicit `--wait-merge` / injected boolean.
|
|
76
|
-
* 4. `delivery.routing.closeAndLand` (framework default `true`).
|
|
40
|
+
* Precedence: `--no-wait-merge`; then an un-armed PR (operator owns the
|
|
41
|
+
* merge — not even `--wait-merge` can land it); then `--wait-merge`; then
|
|
42
|
+
* `delivery.routing.closeAndLand`.
|
|
77
43
|
*
|
|
78
44
|
* @param {{
|
|
79
45
|
* waitForMergeExplicit?: boolean,
|
|
@@ -105,21 +71,9 @@ export function resolveWaitForMerge({
|
|
|
105
71
|
}
|
|
106
72
|
|
|
107
73
|
/**
|
|
108
|
-
* Flags
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* `git log -S dryRun` over it is empty in every revision — so an operator who
|
|
112
|
-
* trusted it got a real base-sync merge, an `agent::blocked` Story, and a
|
|
113
|
-
* terminal envelope that then captured `deliver-recover`'s routing.
|
|
114
|
-
* `--no-evidence` names a working flag on the gate wrappers
|
|
115
|
-
* (`evidence-gate.js`), but the slot this CLI parsed had no reader at all.
|
|
116
|
-
*
|
|
117
|
-
* Deleting them from the descriptor is NOT enough. `parseSprintArgs` runs
|
|
118
|
-
* `parseArgs` with `strict: false`, so an unknown flag is silently ignored and
|
|
119
|
-
* the close proceeds for real — the identical injury, now with no help text to
|
|
120
|
-
* explain it. Fail closed instead, exactly as `parseMergeWatchMode` does for an
|
|
121
|
-
* unrecognized mode: throw during option parsing, before the first phase, so
|
|
122
|
-
* the CLI boundary reports `failed` at phase `init` and nothing is mutated.
|
|
74
|
+
* Flags once advertised but never implemented. Parsing is `strict: false`,
|
|
75
|
+
* so an unknown flag would be silently ignored and the close run for real;
|
|
76
|
+
* reject them before any phase instead.
|
|
123
77
|
*/
|
|
124
78
|
const RETIRED_FLAGS = Object.freeze({
|
|
125
79
|
'--dry-run':
|
|
@@ -129,13 +83,10 @@ const RETIRED_FLAGS = Object.freeze({
|
|
|
129
83
|
});
|
|
130
84
|
|
|
131
85
|
/**
|
|
132
|
-
*
|
|
86
|
+
* Matches `--flag` and `--flag=value` only.
|
|
133
87
|
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* @param {string[]} argv argv tail (`process.argv.slice(2)`)
|
|
138
|
-
* @throws {Error} naming the flag, why it is gone, and that nothing was mutated
|
|
88
|
+
* @param {string[]} argv
|
|
89
|
+
* @throws {Error}
|
|
139
90
|
*/
|
|
140
91
|
function assertNoRetiredFlags(argv) {
|
|
141
92
|
for (const [flag, why] of Object.entries(RETIRED_FLAGS)) {
|
|
@@ -149,12 +100,7 @@ function assertNoRetiredFlags(argv) {
|
|
|
149
100
|
}
|
|
150
101
|
|
|
151
102
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* `waitForMerge` is deliberately **not** resolved here — see
|
|
155
|
-
* {@link resolveWaitForMerge}. This returns the raw operator intent
|
|
156
|
-
* (`waitForMergeExplicit` / `noWaitForMerge`) for the runner to resolve once
|
|
157
|
-
* the config and the arm outcome exist.
|
|
103
|
+
* Returns raw wait-for-merge intent; the runner resolves it after the arm.
|
|
158
104
|
*
|
|
159
105
|
* @param {{ storyIdParam, cwdParam, skipValidationParam, skipSyncParam, noAutoMergeParam, waitForMergeParam, noWaitForMergeParam, maxWaitSecondsParam, mergeWatchModeParam, rerunAdvisoryParam, overrideReviewBlockParam }} raw
|
|
160
106
|
* @returns {{ storyId, cwd, skipValidation, skipSync, noAutoMerge, waitForMergeExplicit, noWaitForMerge, maxWaitSeconds, mergeWatchMode, rerunAdvisory, overrideReviewBlock }}
|
|
@@ -172,22 +118,14 @@ export function parseCloseOptions({
|
|
|
172
118
|
rerunAdvisoryParam,
|
|
173
119
|
overrideReviewBlockParam,
|
|
174
120
|
}) {
|
|
175
|
-
// An injecting caller
|
|
176
|
-
// so
|
|
177
|
-
// stand-in object that copied every `*Param` into the slot of the same name —
|
|
178
|
-
// which is precisely what `resolveFlag` already does below, preferring the
|
|
179
|
-
// param over the parsed slot. One expression per flag now serves both
|
|
180
|
-
// callers, so a new flag is added in one place instead of two that can drift.
|
|
181
|
-
// The guard runs on the argv door only: an injecting caller supplies
|
|
182
|
-
// `storyIdParam` and never reads argv, so the host process's flags (a test
|
|
183
|
-
// runner's, say) are none of its business.
|
|
121
|
+
// An injecting caller never reads argv (the host's flags are not its
|
|
122
|
+
// business), so `parsed` stays empty and the retired-flag guard is skipped.
|
|
184
123
|
let parsed = {};
|
|
185
124
|
if (storyIdParam === undefined) {
|
|
186
125
|
assertNoRetiredFlags(process.argv.slice(2));
|
|
187
126
|
parsed = parseSprintArgs();
|
|
188
127
|
}
|
|
189
|
-
//
|
|
190
|
-
// config default when neither flag was supplied.
|
|
128
|
+
// Undefined when unsupplied, so the closeAndLand default applies.
|
|
191
129
|
const waitForMergeExplicit = resolveFlag(
|
|
192
130
|
waitForMergeParam,
|
|
193
131
|
parsed.waitForMerge,
|
|
@@ -200,22 +138,12 @@ export function parseCloseOptions({
|
|
|
200
138
|
return {
|
|
201
139
|
storyId: resolveFlag(storyIdParam, parsed.storyId),
|
|
202
140
|
cwd: path.resolve(cwdParam ?? parsed.cwd ?? PROJECT_ROOT),
|
|
203
|
-
// `undefined`
|
|
204
|
-
//
|
|
205
|
-
// headless caller with no host tool-invocation ceiling can keep
|
|
206
|
-
// single-block semantics without editing the consumer's config.
|
|
141
|
+
// Unsupplied values stay `undefined` so config defaults apply; 0 is a
|
|
142
|
+
// typo for a wait but a meaningful rerun allowance.
|
|
207
143
|
maxWaitSeconds: intAtLeast(maxWaitSeconds, 1),
|
|
208
|
-
// `undefined` when unsupplied — the merge wait then reads
|
|
209
|
-
// `delivery.mergeWatch.mode`. The two merge-watch flags stay composable and
|
|
210
|
-
// mode-agnostic: `--merge-watch-mode async` picks the posture, and an
|
|
211
|
-
// explicit `--max-wait-seconds` still wins over that posture's probe cap.
|
|
212
144
|
mergeWatchMode: parseMergeWatchMode(
|
|
213
145
|
resolveFlag(mergeWatchModeParam, parsed.mergeWatchMode),
|
|
214
146
|
),
|
|
215
|
-
// Story #5266 — `undefined` when unsupplied, so the merge wait reads
|
|
216
|
-
// `delivery.ci.rerunAdvisory` (default 0). An explicit 0 is preserved as
|
|
217
|
-
// an explicit 0: it means "spend nothing", which is also the default, but
|
|
218
|
-
// an operator who typed it must not have it read as absent.
|
|
219
147
|
rerunAdvisory: intAtLeast(rerunAdvisory, 0),
|
|
220
148
|
skipValidation: !!resolveFlag(skipValidationParam, parsed.skipValidation),
|
|
221
149
|
skipSync: !!resolveFlag(skipSyncParam, parsed.skipSync),
|
|
@@ -225,10 +153,7 @@ export function parseCloseOptions({
|
|
|
225
153
|
? waitForMergeExplicit
|
|
226
154
|
: undefined,
|
|
227
155
|
noWaitForMerge: !!resolveFlag(noWaitForMergeParam, parsed.noWaitForMerge),
|
|
228
|
-
//
|
|
229
|
-
// critical blocker blocking. An injecting caller passes the reason string
|
|
230
|
-
// directly; both doors run the same validating parser, so neither can arm
|
|
231
|
-
// a reasonless override.
|
|
156
|
+
// Both doors validate, so neither can arm a reasonless override.
|
|
232
157
|
overrideReviewBlock: parseOverrideReviewBlock(
|
|
233
158
|
resolveFlag(overrideReviewBlockParam, parsed.overrideReviewBlock),
|
|
234
159
|
),
|
|
@@ -1,32 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* phases/post-land.js — the
|
|
2
|
+
* phases/post-land.js — the land tail, the one seam both landing surfaces
|
|
3
|
+
* (the in-close wait and the standalone confirm CLI) reach, so "landed"
|
|
4
|
+
* means the whole tail ran on either.
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Follow-up capture was the sharpest edge — it lived only on the standalone
|
|
8
|
-
* `single-story-confirm-merge.js` path, which close-and-land (the DEFAULT)
|
|
9
|
-
* is explicitly told to skip, so per-Story follow-ups were captured *never*
|
|
10
|
-
* on the default path, and a belated manual confirm could not backfill (the
|
|
11
|
-
* Story is already `agent::done`, so confirm short-circuits `noop` and the
|
|
12
|
-
* capture's `action === 'done'` gate never opens).
|
|
13
|
-
*
|
|
14
|
-
* This module folds every such step into one phase both landing surfaces
|
|
15
|
-
* reach — the in-close wait (`phases/confirm-merge.js`) and the standalone
|
|
16
|
-
* `single-story-confirm-merge.js` CLI — so the two paths cannot diverge and
|
|
17
|
-
* "landed" means the whole tail ran.
|
|
18
|
-
*
|
|
19
|
-
* **Per-step booleans, not an aggregate.** {@link runPostLandTail} reports
|
|
20
|
-
* each step's outcome individually. That is not bookkeeping fastidiousness:
|
|
21
|
-
* the worktree-reap defect this repo fixed existed because a phase reported
|
|
22
|
-
* an outcome it never checked, and a single `tailOk: true` bit invites that
|
|
23
|
-
* class of bug straight back. A degraded step is visible in the terminal
|
|
24
|
-
* envelope without failing an otherwise-healthy land.
|
|
25
|
-
*
|
|
26
|
-
* **Never throws.** The merge already landed — the code is on the base
|
|
27
|
-
* branch. Failing the land because a Projects v2 mutation flaked would
|
|
28
|
-
* report a false negative about work that is demonstrably done. Every step
|
|
29
|
-
* is best-effort and records its own reason.
|
|
6
|
+
* Reports per-step booleans, never one aggregate bit, so a step cannot claim
|
|
7
|
+
* an outcome it never checked. Never throws: the merge already landed, and a
|
|
8
|
+
* flaky step must degrade the report, not the land.
|
|
30
9
|
*/
|
|
31
10
|
|
|
32
11
|
import path from 'node:path';
|
|
@@ -51,12 +30,7 @@ import { releaseStoryLease as defaultReleaseStoryLease } from '../../single-stor
|
|
|
51
30
|
import { captureStoryFollowUps as defaultCaptureStoryFollowUps } from '../../story-follow-ups.js';
|
|
52
31
|
|
|
53
32
|
/**
|
|
54
|
-
*
|
|
55
|
-
* across concurrent closes. Keyed on the **main checkout** (never a
|
|
56
|
-
* worktree): every concurrent `single-story-close` runs its tail against the
|
|
57
|
-
* same `cwd`, so anchoring the lock under that checkout's `.git` directory
|
|
58
|
-
* makes them all contend on one file. `.git` is always present, is one per
|
|
59
|
-
* checkout, and is never itself tracked, so it is a safe rendezvous home.
|
|
33
|
+
* Under the MAIN checkout's `.git`, so every concurrent close contends on one file.
|
|
60
34
|
*
|
|
61
35
|
* @param {string} cwd Main checkout root.
|
|
62
36
|
* @returns {string}
|
|
@@ -66,9 +40,7 @@ function postLandLockPath(cwd) {
|
|
|
66
40
|
}
|
|
67
41
|
|
|
68
42
|
/**
|
|
69
|
-
*
|
|
70
|
-
* each step's own body free of defensive boilerplate while guaranteeing the
|
|
71
|
-
* module-level never-throws contract.
|
|
43
|
+
* Converts any throw into `{ ok: false, detail }`.
|
|
72
44
|
*
|
|
73
45
|
* @template T
|
|
74
46
|
* @param {() => Promise<{ ok: boolean, detail?: string|null }>} run
|
|
@@ -94,13 +66,8 @@ async function step(run, { name, progress }) {
|
|
|
94
66
|
}
|
|
95
67
|
|
|
96
68
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* Calls `captureStoryFollowUps` **directly** rather than through the
|
|
100
|
-
* `captureFollowUpsAfterConfirm` action-gate wrapper: by the time the tail
|
|
101
|
-
* runs, the merge is already confirmed, so re-deriving that fact from a
|
|
102
|
-
* confirmation envelope's `action` field is the exact coupling that made
|
|
103
|
-
* the default path skip capture entirely.
|
|
69
|
+
* Calls capture directly, not via the `action`-gated wrapper: the merge is
|
|
70
|
+
* already confirmed, and that gate never opens on an already-done Story.
|
|
104
71
|
*/
|
|
105
72
|
async function stepFollowUps({
|
|
106
73
|
storyId,
|
|
@@ -125,11 +92,7 @@ async function stepFollowUps({
|
|
|
125
92
|
|
|
126
93
|
/**
|
|
127
94
|
* Re-assert the Projects v2 Status column against the bot's late write.
|
|
128
|
-
*
|
|
129
|
-
* A `skipped` envelope (`no-project`, `not-on-project`, `no-meta`) is a
|
|
130
|
-
* **success**: the board the helper would defend does not exist, so there
|
|
131
|
-
* is nothing to get wrong. Only a genuine `drifted` outcome — the helper
|
|
132
|
-
* fired, polled, and still lost — degrades the step.
|
|
95
|
+
* `skipped` (no board) is success; only `drifted` degrades.
|
|
133
96
|
*/
|
|
134
97
|
async function stepStatusResync({
|
|
135
98
|
storyId,
|
|
@@ -156,14 +119,7 @@ async function stepStatusResync({
|
|
|
156
119
|
};
|
|
157
120
|
}
|
|
158
121
|
|
|
159
|
-
/**
|
|
160
|
-
* Reap the local `story-<id>` ref. GitHub deletes the *remote* branch on
|
|
161
|
-
* squash-merge (`--delete-branch`), but the local ref lingers in the main
|
|
162
|
-
* checkout until something prunes it.
|
|
163
|
-
*
|
|
164
|
-
* An absent ref is a success, not a failure — the sweep is idempotent and
|
|
165
|
-
* a previous run (or the init-time merged-sweep) may have already reaped it.
|
|
166
|
-
*/
|
|
122
|
+
/** Reap the local `story-<id>` ref; already absent is success. */
|
|
167
123
|
async function stepRefCleanup({ cwd, storyBranch, progress, gitSpawnFn }) {
|
|
168
124
|
const exists = gitSpawnFn(
|
|
169
125
|
cwd,
|
|
@@ -185,14 +141,8 @@ async function stepRefCleanup({ cwd, storyBranch, progress, gitSpawnFn }) {
|
|
|
185
141
|
}
|
|
186
142
|
|
|
187
143
|
/**
|
|
188
|
-
* Fast-forward local `baseBranch` so the next Story seeds from
|
|
189
|
-
*
|
|
190
|
-
* `single-story-init.js` imports (rather than shelling out to
|
|
191
|
-
* `/git-cleanup`), which is the established in-process composition pattern.
|
|
192
|
-
*
|
|
193
|
-
* `already-up-to-date` is a success. A dirty tree is a legitimate, expected
|
|
194
|
-
* skip on a shared checkout — another worker is mid-flight — so it degrades
|
|
195
|
-
* the step's report without pretending the base moved.
|
|
144
|
+
* Fast-forward local `baseBranch` so the next Story seeds from this merge. A
|
|
145
|
+
* dirty shared checkout is an expected skip that degrades the report.
|
|
196
146
|
*/
|
|
197
147
|
async function stepBaseFastForward({
|
|
198
148
|
cwd,
|
|
@@ -228,16 +178,7 @@ async function stepBaseFastForward({
|
|
|
228
178
|
};
|
|
229
179
|
}
|
|
230
180
|
|
|
231
|
-
/**
|
|
232
|
-
* Purge this Story's spent temp artifacts now that its merge is confirmed
|
|
233
|
-
* (Story #4794).
|
|
234
|
-
*
|
|
235
|
-
* The engine already emits its own one-line summary and returns a disabled
|
|
236
|
-
* policy as `skipped` with no errors, so this step needs no branching of its
|
|
237
|
-
* own: errors degrade it, everything else — including a deliberate
|
|
238
|
-
* config-disabled no-op — is a success. Reporting a disabled purge as a failed
|
|
239
|
-
* step would train readers to ignore the field.
|
|
240
|
-
*/
|
|
181
|
+
/** Only errors degrade; a config-disabled purge is success. */
|
|
241
182
|
async function stepTempPurge({ storyId, config, purgeStoryTempArtifactsFn }) {
|
|
242
183
|
const result = await purgeStoryTempArtifactsFn({ storyId, config });
|
|
243
184
|
const errors = result?.errors ?? [];
|
|
@@ -245,32 +186,9 @@ async function stepTempPurge({ storyId, config, purgeStoryTempArtifactsFn }) {
|
|
|
245
186
|
}
|
|
246
187
|
|
|
247
188
|
/**
|
|
248
|
-
* Release the
|
|
249
|
-
* (
|
|
250
|
-
*
|
|
251
|
-
* The close used to release here-ish — immediately after the PR was opened
|
|
252
|
-
* and armed, before the merge wait ran — so a Story's ticket read *unassigned*
|
|
253
|
-
* for the entire window its PR was open, and indefinitely on the
|
|
254
|
-
* operator-merge path where a human owns the land. The claim is the only
|
|
255
|
-
* ticket-visible record of who owns in-flight work, so dropping it at PR
|
|
256
|
-
* creation is dropping it at exactly the wrong moment.
|
|
257
|
-
*
|
|
258
|
-
* It lives in the tail rather than in either landing surface because the tail
|
|
259
|
-
* is the one seam **both** reach — the in-close merge wait
|
|
260
|
-
* (`phases/confirm-merge.js`) and the standalone
|
|
261
|
-
* `single-story-confirm-merge.js` CLI. Homing it anywhere else re-opens the
|
|
262
|
-
* surface divergence this module exists to close.
|
|
263
|
-
*
|
|
264
|
-
* Idempotent by construction: `releaseStoryLease` no-ops when the resolved
|
|
265
|
-
* operator is no longer the recorded owner, so a re-run (or the belated
|
|
266
|
-
* manual confirm that backfills an already-`agent::done` Story) reports the
|
|
267
|
-
* no-op reason rather than yanking a claim someone else has since taken.
|
|
268
|
-
*
|
|
269
|
-
* A `released: false` no-op is **not** a step failure: an already-released
|
|
270
|
-
* ticket is the desired end state, and reporting it as `false` would train
|
|
271
|
-
* readers to ignore the field. Only a throw — an unreachable API, an
|
|
272
|
-
* unresolvable operator identity — degrades the step, and like every tail
|
|
273
|
-
* step that degrades the report, never the land.
|
|
189
|
+
* Release the lease only once the merge is confirmed: the claim is the
|
|
190
|
+
* ticket's record of who owns in-flight work. Idempotent (no-ops for a
|
|
191
|
+
* non-owner); a `released: false` no-op is success, only a throw degrades.
|
|
274
192
|
*/
|
|
275
193
|
async function stepLeaseRelease({
|
|
276
194
|
storyId,
|
|
@@ -292,26 +210,13 @@ async function stepLeaseRelease({
|
|
|
292
210
|
};
|
|
293
211
|
}
|
|
294
212
|
|
|
295
|
-
/**
|
|
296
|
-
* The whole-repository sweep an operator runs when the automatic reap could
|
|
297
|
-
* not finish its job. Named in the warning itself so the next step is in the
|
|
298
|
-
* message rather than in a runbook nobody opens mid-incident.
|
|
299
|
-
*/
|
|
213
|
+
/** Named in the reap warning so the remedy is in the message. */
|
|
300
214
|
const REAP_SWEEP_REMEDY = 'node .agents/scripts/prune-plan-run-labels.js';
|
|
301
215
|
|
|
302
216
|
/**
|
|
303
|
-
* Roll the
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
* seam both a single- and a multi-Story run reach. The run epilogue that used
|
|
307
|
-
* to own the Epic close runs at N>1 only, so a container whose last open
|
|
308
|
-
* child was one Story stayed open forever.
|
|
309
|
-
*
|
|
310
|
-
* Unlike the reap, the outcome IS reported in the returned `tail`. The
|
|
311
|
-
* distinction is what an operator can act on: a stale cohort label is read by
|
|
312
|
-
* nothing, whereas an Epic left open or showing the wrong column is a visible
|
|
313
|
-
* board state someone will otherwise correct by hand, so a false here earns
|
|
314
|
-
* its line in the envelope.
|
|
217
|
+
* Roll up the container Epic; here because only this seam fires for both
|
|
218
|
+
* single- and multi-Story runs. Reported in `tail` (unlike the label reap):
|
|
219
|
+
* a wrong Epic state is visible and actionable.
|
|
315
220
|
*
|
|
316
221
|
* @returns {Promise<{ ok: boolean, detail: string|null }>}
|
|
317
222
|
*/
|
|
@@ -339,28 +244,9 @@ async function stepEpicRollup({
|
|
|
339
244
|
}
|
|
340
245
|
|
|
341
246
|
/**
|
|
342
|
-
* Reap the cohort labels the
|
|
343
|
-
*
|
|
344
|
-
*
|
|
345
|
-
* single- and multi-Story runs: the multi-Story run epilogue is keyed on a
|
|
346
|
-
* synthesized ad-hoc id, never sees the cohort label, and reports
|
|
347
|
-
* `applicable: false` at N=1 — which is the planning default, so wiring the
|
|
348
|
-
* reap there would leave the common case unreaped forever.
|
|
349
|
-
*
|
|
350
|
-
* Best-effort in the strongest sense the tail offers: the outcome is
|
|
351
|
-
* deliberately NOT reported in the returned `tail` envelope. A per-step
|
|
352
|
-
* boolean is the right shape for a step whose failure degrades the *report of
|
|
353
|
-
* the land* — a missed follow-up, an unresynced status column. Label
|
|
354
|
-
* vocabulary hygiene is not that: nothing downstream reads a cohort label as
|
|
355
|
-
* an input, so a failed reap costs one stale label. Surfacing it in the
|
|
356
|
-
* envelope would make a close whose label read flaked terminate differently
|
|
357
|
-
* from one where no label was reapable, for no difference an operator can act
|
|
358
|
-
* on. The failure is named in a warning instead, and the whole-repository
|
|
359
|
-
* sweep (`node .agents/scripts/prune-plan-run-labels.js`) collects whatever
|
|
360
|
-
* the automatic path misses.
|
|
361
|
-
*
|
|
362
|
-
* Never reaps a zero-issue label: that shape is indistinguishable from a label
|
|
363
|
-
* an in-flight persist has just minted, so the opt-in stays off here.
|
|
247
|
+
* Reap the Story's cohort labels (the run epilogue never sees them). Not
|
|
248
|
+
* reported in `tail`: nothing reads a cohort label, so a failure only warns.
|
|
249
|
+
* Never reaps a zero-issue label — it may be one a persist just minted.
|
|
364
250
|
*/
|
|
365
251
|
async function stepPlanRunLabelReap({
|
|
366
252
|
storyId,
|
|
@@ -396,26 +282,11 @@ async function stepPlanRunLabelReap({
|
|
|
396
282
|
}
|
|
397
283
|
|
|
398
284
|
/**
|
|
399
|
-
* Run the
|
|
400
|
-
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
403
|
-
*
|
|
404
|
-
* after the ref reap so `git branch -D` is not fighting a checkout that just
|
|
405
|
-
* moved HEAD.
|
|
406
|
-
*
|
|
407
|
-
* **Cross-process serialization (Story #4622).** The two local-checkout
|
|
408
|
-
* mutations — `stepRefCleanup` (`git branch -D`) and `stepBaseFastForward`
|
|
409
|
-
* (fast-forward `baseBranch`) — run inside a best-effort cross-process lock
|
|
410
|
-
* keyed on the main checkout. Under concurrent delivery (multiple
|
|
411
|
-
* story-workers closing against one shared checkout + per-Story worktrees),
|
|
412
|
-
* an unserialized tail races on the `main` ref and the worktree registry —
|
|
413
|
-
* the `refCleanup:false` ("used by worktree") / `baseFastForward:false`
|
|
414
|
-
* ("not-fast-forward") signature reported in swarm-os friction #579. The
|
|
415
|
-
* GitHub-touching steps stay OUTSIDE the lock so a contended checkout never
|
|
416
|
-
* delays them. The lock is never load-bearing: on sustained contention the
|
|
417
|
-
* bounded wait expires and the mutations run anyway (proceeding is the same
|
|
418
|
-
* best-effort contract every tail step already has).
|
|
285
|
+
* Run the post-land tail, sequentially. The ref reap and fast-forward (the
|
|
286
|
+
* local-checkout mutations, reap first) run under a cross-process lock on the
|
|
287
|
+
* main checkout, since concurrent closes race on the base ref and worktree
|
|
288
|
+
* registry; GitHub steps stay outside it. The lock is best-effort: on
|
|
289
|
+
* timeout the mutations run anyway.
|
|
419
290
|
*
|
|
420
291
|
* @param {object} args
|
|
421
292
|
* @param {number} args.storyId
|
|
@@ -425,18 +296,18 @@ async function stepPlanRunLabelReap({
|
|
|
425
296
|
* @param {object} args.provider
|
|
426
297
|
* @param {object} [args.config]
|
|
427
298
|
* @param {(tag: string, msg: string) => void} [args.progress]
|
|
428
|
-
* @param {Function} [args.captureStoryFollowUpsFn]
|
|
429
|
-
* @param {Function} [args.emitCloseRecoveredFrictionFn]
|
|
430
|
-
* @param {Function} [args.emitRecoveredFrictionMarkerFn]
|
|
431
|
-
* @param {Function} [args.reassertStatusColumnFn]
|
|
432
|
-
* @param {Function} [args.gitSpawnFn]
|
|
433
|
-
* @param {Function} [args.planFastForwardFn]
|
|
434
|
-
* @param {Function} [args.executeFastForwardFn]
|
|
435
|
-
* @param {Function} [args.acquireLockWithWaitFn]
|
|
436
|
-
* @param {Function} [args.purgeStoryTempArtifactsFn]
|
|
437
|
-
* @param {Function} [args.releaseStoryLeaseFn]
|
|
438
|
-
* @param {Function} [args.reapPlanRunLabelsForStoryFn]
|
|
439
|
-
* @param {Function} [args.rollUpEpicForStoryFn]
|
|
299
|
+
* @param {Function} [args.captureStoryFollowUpsFn]
|
|
300
|
+
* @param {Function} [args.emitCloseRecoveredFrictionFn]
|
|
301
|
+
* @param {Function} [args.emitRecoveredFrictionMarkerFn]
|
|
302
|
+
* @param {Function} [args.reassertStatusColumnFn]
|
|
303
|
+
* @param {Function} [args.gitSpawnFn]
|
|
304
|
+
* @param {Function} [args.planFastForwardFn]
|
|
305
|
+
* @param {Function} [args.executeFastForwardFn]
|
|
306
|
+
* @param {Function} [args.acquireLockWithWaitFn]
|
|
307
|
+
* @param {Function} [args.purgeStoryTempArtifactsFn]
|
|
308
|
+
* @param {Function} [args.releaseStoryLeaseFn]
|
|
309
|
+
* @param {Function} [args.reapPlanRunLabelsForStoryFn]
|
|
310
|
+
* @param {Function} [args.rollUpEpicForStoryFn]
|
|
440
311
|
* @returns {Promise<{ followUps: boolean, statusResync: boolean, refCleanup: boolean, baseFastForward: boolean, tempPurge: boolean, leaseRelease: boolean, epicRollup: boolean, details: Record<string, string|null> }>}
|
|
441
312
|
*/
|
|
442
313
|
export async function runPostLandTail({
|
|
@@ -462,20 +333,9 @@ export async function runPostLandTail({
|
|
|
462
333
|
}) {
|
|
463
334
|
progress?.('POST-LAND', `🧾 Running land tail for Story #${storyId}...`);
|
|
464
335
|
|
|
465
|
-
// The
|
|
466
|
-
//
|
|
467
|
-
//
|
|
468
|
-
// whole tail, so a marker written there would arrive too late to net
|
|
469
|
-
// anything out of the very run that produced the incident. Each emit is
|
|
470
|
-
// conditional on an un-recovered record already present, so a Story that
|
|
471
|
-
// never hit the incident gets no spurious (and bucket-suppressing) row.
|
|
472
|
-
// - `close-failed` — Story #4649.
|
|
473
|
-
// - `story-blocked` — a Story that blocked then reached
|
|
474
|
-
// `agent::done` (Story #4654); resolves the occurrence-1 force-file.
|
|
475
|
-
// - `merge-wait-exhausted` — a merge that spent its whole budget and
|
|
476
|
-
// landed on a later resume (Story #4654); the residual case the
|
|
477
|
-
// `frictionForTerminal` budget guard cannot suppress at the source.
|
|
478
|
-
// Best-effort and never throws, exactly like every other tail step.
|
|
336
|
+
// The land resolves this Story's friction incidents. Mark them recovered
|
|
337
|
+
// BEFORE follow-up capture reads the stream; each emit fires only over an
|
|
338
|
+
// un-recovered record, so no spurious rows.
|
|
479
339
|
await emitCloseRecoveredFrictionFn({ storyId, config });
|
|
480
340
|
await emitRecoveredFrictionMarkerFn({
|
|
481
341
|
storyId,
|
|
@@ -511,9 +371,6 @@ export async function runPostLandTail({
|
|
|
511
371
|
}),
|
|
512
372
|
{ name: 'status-column resync', progress },
|
|
513
373
|
);
|
|
514
|
-
// Story #5189 — the cohort label's end of life. Runs with the other
|
|
515
|
-
// GitHub-touching steps (outside the checkout lock) and contributes nothing
|
|
516
|
-
// to `tail`; see `stepPlanRunLabelReap` for why that omission is the point.
|
|
517
374
|
await step(
|
|
518
375
|
() =>
|
|
519
376
|
stepPlanRunLabelReap({
|
|
@@ -525,9 +382,6 @@ export async function runPostLandTail({
|
|
|
525
382
|
{ name: 'plan-run label reap', progress },
|
|
526
383
|
);
|
|
527
384
|
|
|
528
|
-
// Story #5205 — the container Epic's state is derived from its children, so
|
|
529
|
-
// the child reaching `agent::done` is the edge that can close it. Runs with
|
|
530
|
-
// the other GitHub-touching steps, outside the checkout lock.
|
|
531
385
|
const epicRollup = await step(
|
|
532
386
|
() =>
|
|
533
387
|
stepEpicRollup({
|
|
@@ -540,8 +394,6 @@ export async function runPostLandTail({
|
|
|
540
394
|
{ name: 'epic rollup', progress },
|
|
541
395
|
);
|
|
542
396
|
|
|
543
|
-
// Local-checkout mutations: serialized behind a best-effort cross-process
|
|
544
|
-
// lock (Story #4622). Acquire once, run both steps, release in `finally`.
|
|
545
397
|
const lockCfg = config?.delivery?.postLandLock ?? {};
|
|
546
398
|
const lock = await acquireLockWithWaitFn({
|
|
547
399
|
lockPath: postLandLockPath(cwd),
|
|
@@ -551,9 +403,6 @@ export async function runPostLandTail({
|
|
|
551
403
|
ownerId: `post-land-${storyId}`,
|
|
552
404
|
});
|
|
553
405
|
if (!lock.acquired) {
|
|
554
|
-
// Never load-bearing: proceed anyway. The bounded wait already gave the
|
|
555
|
-
// concurrent holder its window; blocking the land on a lock we could not
|
|
556
|
-
// take would turn a best-effort damper into a false negative.
|
|
557
406
|
progress?.(
|
|
558
407
|
'POST-LAND',
|
|
559
408
|
`⚠️ post-land lock not acquired (${lock.reason}); proceeding unserialized.`,
|
|
@@ -581,18 +430,12 @@ export async function runPostLandTail({
|
|
|
581
430
|
if (lock.acquired) lock.release();
|
|
582
431
|
}
|
|
583
432
|
|
|
584
|
-
//
|
|
585
|
-
// validation evidence are spent. Runs LAST so a purge can never race a step
|
|
586
|
-
// that still reads them, and outside the checkout lock because it touches
|
|
587
|
-
// only the temp tree. Its `signals.ndjson` survives by construction.
|
|
433
|
+
// After every step that reads the temp artifacts; `signals.ndjson` survives.
|
|
588
434
|
const tempPurge = await step(
|
|
589
435
|
() => stepTempPurge({ storyId, config, purgeStoryTempArtifactsFn }),
|
|
590
436
|
{ name: 'temp purge', progress },
|
|
591
437
|
);
|
|
592
438
|
|
|
593
|
-
// Story #4860 — the merge is confirmed, so the operator's claim on this
|
|
594
|
-
// Story has finally done its job. Released here rather than at PR creation
|
|
595
|
-
// so the ticket stays assigned for the whole time its PR is open.
|
|
596
439
|
const leaseRelease = await step(
|
|
597
440
|
() =>
|
|
598
441
|
stepLeaseRelease({
|