mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,31 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Before this module the delivery tail had **two** divergent return
|
|
7
|
-
* contracts, both prose and neither validated:
|
|
8
|
-
* `.agents/workflows/helpers/deliver-story.md` defined one shape and
|
|
9
|
-
* `.agents/agents/story-worker.md` a different one, so a caller could not
|
|
10
|
-
* distinguish a landed Story from a parked one without re-probing GitHub.
|
|
11
|
-
* `story-deliver-terminal.schema.json` is now the SSOT both docs reference
|
|
12
|
-
* rather than restate, and this module is its only writer.
|
|
13
|
-
*
|
|
14
|
-
* Two exports carry the contract:
|
|
15
|
-
*
|
|
16
|
-
* - {@link buildTerminalEnvelope} assembles and **validates** the envelope.
|
|
17
|
-
* It throws on a schema violation rather than emitting a malformed
|
|
18
|
-
* terminal: a silently-wrong terminal is exactly the failure this Story
|
|
19
|
-
* exists to eliminate, so failing loudly at the writer is the point.
|
|
20
|
-
* - {@link NEXT_COMMANDS} is the next-command vocabulary shared with
|
|
21
|
-
* `deliver-recover.js`, so a `pending` envelope and a recovery probe
|
|
22
|
-
* name the same command for the same state instead of inventing two
|
|
23
|
-
* dialects for one condition.
|
|
24
|
-
*
|
|
25
|
-
* `TERMINAL_EXIT_CODES` maps status → process exit code. `pending` gets its
|
|
26
|
-
* **own** code (3) precisely so a caller can tell "slow CI, resume me" from
|
|
27
|
-
* "hard block, come look" without parsing stdout — the distinction the
|
|
28
|
-
* pre-#4543 pipeline collapsed by treating budget exhaustion as a block.
|
|
2
|
+
* The one terminal envelope every Story close-and-land emits — sole writer of
|
|
3
|
+
* `story-deliver-terminal.schema.json` — plus the next-command vocabulary
|
|
4
|
+
* shared with `deliver-recover.js`.
|
|
29
5
|
*/
|
|
30
6
|
|
|
31
7
|
import nodeFs from 'node:fs';
|
|
@@ -34,35 +10,20 @@ import { storyTerminalEnvelopePath } from '../config/temp-paths.js';
|
|
|
34
10
|
import { resolveConfig } from '../config-resolver.js';
|
|
35
11
|
import { validateTerminalEnvelope } from './story-deliver-terminal-schema.js';
|
|
36
12
|
|
|
37
|
-
// Re-exported so the schema split stays an implementation detail: every
|
|
38
|
-
// consumer still reaches the validator through the envelope module that owns
|
|
39
|
-
// the contract.
|
|
40
13
|
export { validateTerminalEnvelope };
|
|
41
14
|
|
|
42
15
|
export const TERMINAL_ENVELOPE_KIND = 'story-deliver-terminal';
|
|
43
16
|
|
|
44
17
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* `pending` is **3**, not 0 and not 1. Zero would tell a headless caller the
|
|
48
|
-
* Story landed when it did not; one would conflate a resumable slow-CI wait
|
|
49
|
-
* with a hard block and send the operator to diagnose branch protection that
|
|
50
|
-
* is working fine. A distinct code is what lets `/mandrel-deliver` resume without
|
|
51
|
-
* classifying.
|
|
18
|
+
* `pending` has its own code so a caller can tell a resumable slow-CI wait
|
|
19
|
+
* from a hard block without parsing stdout.
|
|
52
20
|
*/
|
|
53
21
|
export const TERMINAL_EXIT_CODES = Object.freeze({
|
|
54
22
|
landed: 0,
|
|
55
23
|
pending: 3,
|
|
56
24
|
blocked: 1,
|
|
57
25
|
failed: 1,
|
|
58
|
-
/**
|
|
59
|
-
* `escalated` reuses **2**, the code `/deliver-light` already documents for
|
|
60
|
-
* "the gate did not proceed light" — the escalation is that outcome made
|
|
61
|
-
* terminal, not a new one, so giving it a fresh code would fork a vocabulary
|
|
62
|
-
* callers already branch on. It stays distinct from `landed` (nothing was
|
|
63
|
-
* delivered) and from `blocked`/`failed` (nothing is wrong — the work simply
|
|
64
|
-
* belongs to `/mandrel-plan`).
|
|
65
|
-
*/
|
|
26
|
+
/** Reuses `/deliver-light`'s "did not proceed light" code. */
|
|
66
27
|
escalated: 2,
|
|
67
28
|
});
|
|
68
29
|
|
|
@@ -74,16 +35,10 @@ export const TERMINAL_STATUSES = Object.freeze([
|
|
|
74
35
|
'escalated',
|
|
75
36
|
]);
|
|
76
37
|
|
|
77
|
-
/** Cap on the prompt echoed into an escalation's `/mandrel-plan` next command. */
|
|
78
38
|
const PLAN_PROMPT_MAX = 200;
|
|
79
39
|
|
|
80
40
|
/**
|
|
81
|
-
*
|
|
82
|
-
* `/mandrel-plan "<prompt>"` next command: collapse newlines (a next command is one
|
|
83
|
-
* line by contract), escape backslashes and double quotes so the quoting
|
|
84
|
-
* cannot be broken out of, and cap the length so a long prompt does not turn
|
|
85
|
-
* the envelope into a transcript. Total — a non-string yields the empty
|
|
86
|
-
* string, which the escalation builder rejects rather than emitting.
|
|
41
|
+
* One line, quote-escaped, length-capped. A non-string yields `''`.
|
|
87
42
|
*
|
|
88
43
|
* @param {unknown} prompt
|
|
89
44
|
* @returns {string}
|
|
@@ -98,19 +53,11 @@ function quoteForPlan(prompt) {
|
|
|
98
53
|
return capped.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
99
54
|
}
|
|
100
55
|
|
|
101
|
-
/**
|
|
102
|
-
* The shared next-command vocabulary. Every producer of a "what now?"
|
|
103
|
-
* answer — the `pending` terminal envelope, an `escalated` one, and
|
|
104
|
-
* `deliver-recover.js` — builds its command from here, so the surfaces never
|
|
105
|
-
* drift into naming different commands for the same observed state.
|
|
106
|
-
*/
|
|
56
|
+
/** Every "what now?" answer builds its command here so surfaces never drift. */
|
|
107
57
|
export const NEXT_COMMANDS = Object.freeze({
|
|
108
58
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* `--wait` is load-bearing: without it the confirm CLI probes once and
|
|
112
|
-
* answers `pending` again, so the cumulative-budget give-up never fires and
|
|
113
|
-
* a wedged PR is never escalated to anyone.
|
|
59
|
+
* `--wait` is load-bearing: without it the cumulative-budget give-up never
|
|
60
|
+
* fires and a wedged PR is never escalated.
|
|
114
61
|
*/
|
|
115
62
|
resumeLand: (storyId) =>
|
|
116
63
|
`node .agents/scripts/single-story-confirm-merge.js --story ${storyId} --wait`,
|
|
@@ -132,26 +79,11 @@ export const NEXT_COMMANDS = Object.freeze({
|
|
|
132
79
|
/** Probe a stranded Story and print its single next command. */
|
|
133
80
|
recover: (storyId) =>
|
|
134
81
|
`node .agents/scripts/deliver-recover.js --story ${storyId}`,
|
|
135
|
-
/**
|
|
136
|
-
* Hand over-scope work to `/mandrel-plan` — the next command of an `escalated`
|
|
137
|
-
* terminal (Story #4746).
|
|
138
|
-
*
|
|
139
|
-
* The only entry here that is a slash command rather than a script, and
|
|
140
|
-
* deliberately so: the other entries resume a Story that exists, while this
|
|
141
|
-
* one names work that has no Story yet and needs planning before it can have
|
|
142
|
-
* one. It is quoted for a shell. Story #4746 addressed it to a **fresh
|
|
143
|
-
* session**; Story #5344 permits the escalating session to run it too, seeded
|
|
144
|
-
* with `escalation.reasons` — see the workflow's escalation section for the
|
|
145
|
-
* seeding contract and for the observation that motivated the old ban.
|
|
146
|
-
*/
|
|
82
|
+
/** A slash command, not a script: the work has no Story yet. */
|
|
147
83
|
escalateToPlan: (prompt) => `/mandrel-plan "${quoteForPlan(prompt)}"`,
|
|
148
84
|
});
|
|
149
85
|
|
|
150
86
|
/**
|
|
151
|
-
* Drop `undefined`-valued keys so the schema's `additionalProperties: false`
|
|
152
|
-
* and its nullable unions both stay satisfiable from one optional-argument
|
|
153
|
-
* builder signature.
|
|
154
|
-
*
|
|
155
87
|
* @param {object} obj
|
|
156
88
|
* @returns {object}
|
|
157
89
|
*/
|
|
@@ -164,22 +96,11 @@ function compact(obj) {
|
|
|
164
96
|
}
|
|
165
97
|
|
|
166
98
|
/**
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* Throws a `TypeError` naming the schema violations when the assembled
|
|
170
|
-
* object does not validate. That is deliberate: the whole point of the
|
|
171
|
-
* envelope is that a caller can trust its status without re-probing
|
|
172
|
-
* GitHub, so emitting a *malformed* one would reintroduce the ambiguity
|
|
173
|
-
* this replaces.
|
|
174
|
-
*
|
|
175
|
-
* A schema that cannot be READ is the opposite case and does not throw —
|
|
176
|
-
* see {@link validateTerminalEnvelope}. "This envelope is wrong" is worth
|
|
177
|
-
* failing on; "I could not check this envelope" is not worth destroying
|
|
178
|
-
* the return contract over.
|
|
99
|
+
* Throws a `TypeError` on a schema violation — callers trust the status
|
|
100
|
+
* without re-probing GitHub. An unreadable schema does not throw.
|
|
179
101
|
*
|
|
180
102
|
* @param {object} args
|
|
181
|
-
* @param {number|null} args.storyId `null` only for
|
|
182
|
-
* which by construction never authored a Story.
|
|
103
|
+
* @param {number|null} args.storyId `null` only for `escalated`.
|
|
183
104
|
* @param {'landed'|'pending'|'blocked'|'failed'|'escalated'} args.status
|
|
184
105
|
* @param {string} args.phase
|
|
185
106
|
* @param {string} [args.storyBranch]
|
|
@@ -193,10 +114,11 @@ function compact(obj) {
|
|
|
193
114
|
* @param {string|null} [args.nextCommand]
|
|
194
115
|
* @param {number} args.elapsedSeconds
|
|
195
116
|
* @param {object|null} [args.waitBudget]
|
|
117
|
+
* @param {{ waitedSeconds: number, expired: boolean }|null} [args.lockWait]
|
|
118
|
+
* Full-suite lock wait; `waitBudget` is merge-wait only.
|
|
196
119
|
* @param {string} [args.timestamp]
|
|
197
120
|
* @param {{ schema: object|null, error: string|null }} [args.schemaSource]
|
|
198
|
-
* Test seam
|
|
199
|
-
* envelope is assembled from named fields only.
|
|
121
|
+
* Test seam.
|
|
200
122
|
* @returns {object} The validated envelope.
|
|
201
123
|
*/
|
|
202
124
|
export function buildTerminalEnvelope({
|
|
@@ -214,14 +136,13 @@ export function buildTerminalEnvelope({
|
|
|
214
136
|
nextCommand,
|
|
215
137
|
elapsedSeconds = 0,
|
|
216
138
|
waitBudget,
|
|
139
|
+
lockWait,
|
|
217
140
|
timestamp = new Date().toISOString(),
|
|
218
141
|
schemaSource,
|
|
219
142
|
}) {
|
|
220
143
|
const envelope = compact({
|
|
221
144
|
kind: TERMINAL_ENVELOPE_KIND,
|
|
222
|
-
// `Number(null)`
|
|
223
|
-
// everything — a nullish storyId stays null and lets the schema decide
|
|
224
|
-
// whether this status is allowed to omit one.
|
|
145
|
+
// Nullish stays null (not `Number(null)` = 0); the schema decides.
|
|
225
146
|
storyId: storyId === null || storyId === undefined ? null : Number(storyId),
|
|
226
147
|
status,
|
|
227
148
|
phase,
|
|
@@ -236,12 +157,11 @@ export function buildTerminalEnvelope({
|
|
|
236
157
|
nextCommand: nextCommand ?? null,
|
|
237
158
|
elapsedSeconds: Math.max(0, Number(elapsedSeconds) || 0),
|
|
238
159
|
waitBudget: waitBudget ?? null,
|
|
160
|
+
lockWait: lockWait ?? null,
|
|
239
161
|
timestamp,
|
|
240
162
|
});
|
|
241
163
|
|
|
242
|
-
//
|
|
243
|
-
// property value is exactly what triggers the destructuring default on the
|
|
244
|
-
// other side, so production still gets the eagerly-loaded module source.
|
|
164
|
+
// `undefined` schemaSource triggers the callee's default.
|
|
245
165
|
const { valid, errors } = validateTerminalEnvelope(envelope, {
|
|
246
166
|
schemaSource,
|
|
247
167
|
});
|
|
@@ -255,23 +175,8 @@ export function buildTerminalEnvelope({
|
|
|
255
175
|
}
|
|
256
176
|
|
|
257
177
|
/**
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
* `/deliver-light`'s suitability gate already decided correctly when it
|
|
262
|
-
* overrode a `lite` self-verdict on shape; what it lacked was an outcome a
|
|
263
|
-
* session could not walk past. A mandrel-bench 2.13.0 light-arm run did
|
|
264
|
-
* exactly that — it read the gate's `escalate-plan`, then invoked `/mandrel-plan`
|
|
265
|
-
* in the same session and delivered. The continuation was not harmless:
|
|
266
|
-
* planning inside a session already framed as small work authored ONE Story
|
|
267
|
-
* against the scenario's 3-5 contract, where a fresh `/mandrel-plan` session on the
|
|
268
|
-
* identical seed authored four. Escalation silently produced the very
|
|
269
|
-
* under-decomposition the guard exists to prevent.
|
|
270
|
-
*
|
|
271
|
-
* So the outcome is a validated envelope with its own exit code, naming the
|
|
272
|
-
* `/mandrel-plan` command that owns the work, and asserting per artifact that nothing
|
|
273
|
-
* was started. Every guarantee here is enforced by the schema rather than by
|
|
274
|
-
* prose: `storyId` must be null, `escalation.created.*` are pinned `false`.
|
|
178
|
+
* The one envelope emitted before a Story exists. The schema pins `storyId`
|
|
179
|
+
* null and `escalation.created.*` false — nothing was started.
|
|
275
180
|
*
|
|
276
181
|
* @param {{
|
|
277
182
|
* prompt: string,
|
|
@@ -289,8 +194,6 @@ export function buildEscalationTerminal({
|
|
|
289
194
|
}) {
|
|
290
195
|
const quoted = quoteForPlan(prompt);
|
|
291
196
|
if (quoted === '') {
|
|
292
|
-
// An escalation whose next command is `/mandrel-plan ""` hands the operator
|
|
293
|
-
// nothing — the same walk-past-able non-outcome in envelope clothing.
|
|
294
197
|
throw new TypeError(
|
|
295
198
|
'buildEscalationTerminal: a non-empty prompt is required — the escalated terminal exists to name the /mandrel-plan invocation that owns the work',
|
|
296
199
|
);
|
|
@@ -309,8 +212,7 @@ export function buildEscalationTerminal({
|
|
|
309
212
|
: [
|
|
310
213
|
'predicted scope exceeds the light ceilings — escalate to /mandrel-plan',
|
|
311
214
|
],
|
|
312
|
-
//
|
|
313
|
-
// receipt/init call sites, so these are the assertion that it did.
|
|
215
|
+
// Asserted, not computed: escalation returns before receipt/init.
|
|
314
216
|
created: { receiptStory: false, storyBranch: false, worktree: false },
|
|
315
217
|
},
|
|
316
218
|
nextCommand: NEXT_COMMANDS.escalateToPlan(prompt),
|
|
@@ -320,8 +222,6 @@ export function buildEscalationTerminal({
|
|
|
320
222
|
}
|
|
321
223
|
|
|
322
224
|
/**
|
|
323
|
-
* Resolve the process exit code for a terminal envelope.
|
|
324
|
-
*
|
|
325
225
|
* @param {object} envelope
|
|
326
226
|
* @returns {number}
|
|
327
227
|
*/
|
|
@@ -329,16 +229,11 @@ export function exitCodeForTerminal(envelope) {
|
|
|
329
229
|
return TERMINAL_EXIT_CODES[envelope?.status] ?? 1;
|
|
330
230
|
}
|
|
331
231
|
|
|
332
|
-
/** The markers a caller scans stdout for to recover the envelope. */
|
|
333
232
|
export const TERMINAL_BEGIN_MARKER = '--- STORY DELIVER TERMINAL ---';
|
|
334
233
|
export const TERMINAL_END_MARKER = '--- END TERMINAL ---';
|
|
335
234
|
|
|
336
235
|
/**
|
|
337
|
-
*
|
|
338
|
-
*
|
|
339
|
-
* An unreadable `.agentrc.json` must not cost the run its envelope copy: the
|
|
340
|
-
* path helpers fall back to the framework-default temp root, which is still a
|
|
341
|
-
* far better outcome than no artifact at all.
|
|
236
|
+
* `undefined` on an unreadable config: the default temp root beats no copy.
|
|
342
237
|
*
|
|
343
238
|
* @param {typeof resolveConfig} resolveConfigImpl
|
|
344
239
|
* @returns {object|undefined}
|
|
@@ -352,36 +247,11 @@ function tolerantConfig(resolveConfigImpl) {
|
|
|
352
247
|
}
|
|
353
248
|
|
|
354
249
|
/**
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
*
|
|
358
|
-
* close
|
|
359
|
-
*
|
|
360
|
-
* mid-gate-chain is behaving reasonably, but the envelope it never relayed is
|
|
361
|
-
* gone: the router then has to reconstruct the Story's state from labels, and
|
|
362
|
-
* `deliver-recover.js` used to answer that reconstruction with
|
|
363
|
-
* "Implementation never finished" — false, and its re-init suggestion can put
|
|
364
|
-
* a second close on one PR. Observed four times across three workers in one
|
|
365
|
-
* consumer run. The file is the second channel, and it outlives the turn.
|
|
366
|
-
*
|
|
367
|
-
* **Best-effort by construction.** Every failure path returns `null`: a
|
|
368
|
-
* delivery must never turn a landed PR into a crash because a temp directory
|
|
369
|
-
* was unwritable. The stdout envelope above is the contract; this is a copy.
|
|
370
|
-
*
|
|
371
|
-
* **Atomic by construction.** The payload is written to a pid-scoped
|
|
372
|
-
* temporary name and renamed into place, because the reader that matters most
|
|
373
|
-
* is a router polling during a live close — a half-written file would hand it
|
|
374
|
-
* a parse error at exactly the moment it is trying to avoid guessing.
|
|
375
|
-
*
|
|
376
|
-
* A null `storyId` (the `escalated` terminal, which by construction never
|
|
377
|
-
* authored a Story) has nowhere to be filed and writes nothing.
|
|
378
|
-
*
|
|
379
|
-
* `config` is optional and resolved lazily when absent. Two of the emit sites
|
|
380
|
-
* are `catch` blocks that crashed before any config was resolved, and those
|
|
381
|
-
* are precisely the runs whose envelope is most worth keeping — so the temp
|
|
382
|
-
* root is looked up here rather than left at the framework default, which
|
|
383
|
-
* would file the artifact where a consumer's router never looks (and where
|
|
384
|
-
* the retention purge would never reap it).
|
|
250
|
+
* Disk copy of the envelope beside the Story's gate log — stdout's one reader
|
|
251
|
+
* may have ended its turn. Best-effort (every failure returns `null`; stdout
|
|
252
|
+
* is the contract) and atomic (pid-scoped tmp + rename, since a router may
|
|
253
|
+
* poll mid-close). `config` is resolved lazily because crash-path emitters
|
|
254
|
+
* have none, and the default temp root is where no router looks.
|
|
385
255
|
*
|
|
386
256
|
* @param {object} envelope A validated terminal envelope.
|
|
387
257
|
* @param {{
|
|
@@ -407,13 +277,11 @@ export function persistTerminalEnvelope(
|
|
|
407
277
|
fsImpl.renameSync(tmpPath, target);
|
|
408
278
|
return target;
|
|
409
279
|
} catch {
|
|
410
|
-
// A rename that never ran leaves the scratch file behind; drop it rather
|
|
411
|
-
// than accumulating one per failed close.
|
|
412
280
|
if (tmpPath) {
|
|
413
281
|
try {
|
|
414
282
|
fsImpl.rmSync(tmpPath, { force: true });
|
|
415
283
|
} catch {
|
|
416
|
-
//
|
|
284
|
+
// Best-effort.
|
|
417
285
|
}
|
|
418
286
|
}
|
|
419
287
|
return null;
|
|
@@ -421,33 +289,16 @@ export function persistTerminalEnvelope(
|
|
|
421
289
|
}
|
|
422
290
|
|
|
423
291
|
/**
|
|
424
|
-
*
|
|
425
|
-
*
|
|
426
|
-
*
|
|
427
|
-
* **Deliberately not `Logger.info`.** The envelope is this CLI's
|
|
428
|
-
* machine-readable contract — every invocation emits exactly ONE, and a
|
|
429
|
-
* headless caller parses it out of stdout to decide what happened.
|
|
430
|
-
* `Logger.info` is level-gated, so under the documented
|
|
431
|
-
* `AGENT_LOG_LEVEL=silent` (execution-reference § Log-level control) the
|
|
432
|
-
* envelope silently vanished and the
|
|
433
|
-
* caller got a bare exit code: precisely the "no envelope at all" outcome
|
|
434
|
-
* Story #4543 exists to remove. A contract payload must not be suppressible
|
|
435
|
-
* by a verbosity knob.
|
|
436
|
-
*
|
|
437
|
-
* Single home for the marker format so the four emit sites (the runner's
|
|
438
|
-
* terminal, the close CLI's failed-terminal catch, and both confirm-CLI
|
|
439
|
-
* paths) cannot drift apart — and, since Story #4816, the single home for the
|
|
440
|
-
* on-disk copy too, so no emit path can persist and another forget.
|
|
441
|
-
* {@link persistTerminalEnvelope} runs **first**: a caller that has read the
|
|
442
|
-
* markers off stdout can then rely on the file already being there.
|
|
292
|
+
* Not `Logger.info`: a contract payload must survive `AGENT_LOG_LEVEL=silent`.
|
|
293
|
+
* Single home of the marker format for every emit site. Persists first, so a
|
|
294
|
+
* caller that read the markers can rely on the file existing.
|
|
443
295
|
*
|
|
444
296
|
* @param {object} envelope
|
|
445
297
|
* @param {{
|
|
446
298
|
* write?: (s: string) => void,
|
|
447
299
|
* config?: object,
|
|
448
300
|
* persist?: typeof persistTerminalEnvelope,
|
|
449
|
-
* }} [opts] `write` and `persist` are test seams
|
|
450
|
-
* artifact's temp root and is threaded from whichever emit site holds one.
|
|
301
|
+
* }} [opts] `write` and `persist` are test seams.
|
|
451
302
|
* @returns {void}
|
|
452
303
|
*/
|
|
453
304
|
export function emitTerminalEnvelope(
|
|
@@ -458,28 +309,19 @@ export function emitTerminalEnvelope(
|
|
|
458
309
|
persist = persistTerminalEnvelope,
|
|
459
310
|
} = {},
|
|
460
311
|
) {
|
|
461
|
-
// Belt and braces around a copy: `persistTerminalEnvelope` already swallows
|
|
462
|
-
// its own failures, but the stdout envelope is the CONTRACT and the disk
|
|
463
|
-
// copy is a convenience. Nothing in the secondary path — including a future
|
|
464
|
-
// injected `persist` — may cost the caller the primary one.
|
|
465
312
|
try {
|
|
466
313
|
persist(envelope, { config });
|
|
467
314
|
} catch {
|
|
468
|
-
//
|
|
315
|
+
// The disk copy must never cost the caller the stdout contract.
|
|
469
316
|
}
|
|
470
|
-
//
|
|
471
|
-
// machine contract callers recover with `JSON.parse`, so pretty-printing
|
|
472
|
-
// only adds turn-resident bytes without helping any consumer.
|
|
317
|
+
// Compact JSON: pretty-printing only adds turn-resident bytes.
|
|
473
318
|
write(
|
|
474
319
|
`\n${TERMINAL_BEGIN_MARKER}\n${JSON.stringify(envelope)}\n${TERMINAL_END_MARKER}\n`,
|
|
475
320
|
);
|
|
476
321
|
}
|
|
477
322
|
|
|
478
323
|
/**
|
|
479
|
-
* Map a `runConfirmMergePhase` outcome onto the
|
|
480
|
-
* envelope (Story #4543). One writer, one shape — the two prose contracts
|
|
481
|
-
* this replaces disagreed with each other precisely because each surface
|
|
482
|
-
* assembled its own.
|
|
324
|
+
* Map a `runConfirmMergePhase` outcome onto the terminal envelope.
|
|
483
325
|
*
|
|
484
326
|
* @returns {object} A validated `story-deliver-terminal` envelope.
|
|
485
327
|
*/
|
|
@@ -492,6 +334,7 @@ export function terminalFromWaitOutcome({
|
|
|
492
334
|
prUrl,
|
|
493
335
|
autoMergeEnabled,
|
|
494
336
|
gates,
|
|
337
|
+
lockWait,
|
|
495
338
|
elapsedSeconds,
|
|
496
339
|
}) {
|
|
497
340
|
const prBase = {
|
|
@@ -504,6 +347,7 @@ export function terminalFromWaitOutcome({
|
|
|
504
347
|
storyBranch,
|
|
505
348
|
baseBranch,
|
|
506
349
|
gates,
|
|
350
|
+
lockWait,
|
|
507
351
|
elapsedSeconds,
|
|
508
352
|
};
|
|
509
353
|
|
|
@@ -515,8 +359,7 @@ export function terminalFromWaitOutcome({
|
|
|
515
359
|
pr: {
|
|
516
360
|
...prBase,
|
|
517
361
|
state: 'MERGED',
|
|
518
|
-
//
|
|
519
|
-
// admin override or with non-required checks red.
|
|
362
|
+
// Observed, not assumed: admin merges land with checks red.
|
|
520
363
|
checksStatus: waitOutcome.prProbe?.checksStatus ?? null,
|
|
521
364
|
},
|
|
522
365
|
tail: waitOutcome.tail,
|
|
@@ -539,9 +382,7 @@ export function terminalFromWaitOutcome({
|
|
|
539
382
|
});
|
|
540
383
|
}
|
|
541
384
|
|
|
542
|
-
// blocked — the classifier
|
|
543
|
-
// comment already carries the class-specific remediation, so the next
|
|
544
|
-
// command mirrors it rather than inventing a second opinion.
|
|
385
|
+
// blocked — mirror the classifier's remediation, never a second opinion.
|
|
545
386
|
const nextCommand =
|
|
546
387
|
waitOutcome.blockClass === 'checks-failed'
|
|
547
388
|
? NEXT_COMMANDS.watchCi(storyId, prNumber)
|