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,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,25 +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 but addressed to a **fresh session** — see
|
|
143
|
-
* the workflow's escalation section for why running it in the escalating
|
|
144
|
-
* session is forbidden.
|
|
145
|
-
*/
|
|
82
|
+
/** A slash command, not a script: the work has no Story yet. */
|
|
146
83
|
escalateToPlan: (prompt) => `/mandrel-plan "${quoteForPlan(prompt)}"`,
|
|
147
84
|
});
|
|
148
85
|
|
|
149
86
|
/**
|
|
150
|
-
* Drop `undefined`-valued keys so the schema's `additionalProperties: false`
|
|
151
|
-
* and its nullable unions both stay satisfiable from one optional-argument
|
|
152
|
-
* builder signature.
|
|
153
|
-
*
|
|
154
87
|
* @param {object} obj
|
|
155
88
|
* @returns {object}
|
|
156
89
|
*/
|
|
@@ -163,22 +96,11 @@ function compact(obj) {
|
|
|
163
96
|
}
|
|
164
97
|
|
|
165
98
|
/**
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
* Throws a `TypeError` naming the schema violations when the assembled
|
|
169
|
-
* object does not validate. That is deliberate: the whole point of the
|
|
170
|
-
* envelope is that a caller can trust its status without re-probing
|
|
171
|
-
* GitHub, so emitting a *malformed* one would reintroduce the ambiguity
|
|
172
|
-
* this replaces.
|
|
173
|
-
*
|
|
174
|
-
* A schema that cannot be READ is the opposite case and does not throw —
|
|
175
|
-
* see {@link validateTerminalEnvelope}. "This envelope is wrong" is worth
|
|
176
|
-
* failing on; "I could not check this envelope" is not worth destroying
|
|
177
|
-
* 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.
|
|
178
101
|
*
|
|
179
102
|
* @param {object} args
|
|
180
|
-
* @param {number|null} args.storyId `null` only for
|
|
181
|
-
* which by construction never authored a Story.
|
|
103
|
+
* @param {number|null} args.storyId `null` only for `escalated`.
|
|
182
104
|
* @param {'landed'|'pending'|'blocked'|'failed'|'escalated'} args.status
|
|
183
105
|
* @param {string} args.phase
|
|
184
106
|
* @param {string} [args.storyBranch]
|
|
@@ -192,10 +114,11 @@ function compact(obj) {
|
|
|
192
114
|
* @param {string|null} [args.nextCommand]
|
|
193
115
|
* @param {number} args.elapsedSeconds
|
|
194
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.
|
|
195
119
|
* @param {string} [args.timestamp]
|
|
196
120
|
* @param {{ schema: object|null, error: string|null }} [args.schemaSource]
|
|
197
|
-
* Test seam
|
|
198
|
-
* envelope is assembled from named fields only.
|
|
121
|
+
* Test seam.
|
|
199
122
|
* @returns {object} The validated envelope.
|
|
200
123
|
*/
|
|
201
124
|
export function buildTerminalEnvelope({
|
|
@@ -213,14 +136,13 @@ export function buildTerminalEnvelope({
|
|
|
213
136
|
nextCommand,
|
|
214
137
|
elapsedSeconds = 0,
|
|
215
138
|
waitBudget,
|
|
139
|
+
lockWait,
|
|
216
140
|
timestamp = new Date().toISOString(),
|
|
217
141
|
schemaSource,
|
|
218
142
|
}) {
|
|
219
143
|
const envelope = compact({
|
|
220
144
|
kind: TERMINAL_ENVELOPE_KIND,
|
|
221
|
-
// `Number(null)`
|
|
222
|
-
// everything — a nullish storyId stays null and lets the schema decide
|
|
223
|
-
// whether this status is allowed to omit one.
|
|
145
|
+
// Nullish stays null (not `Number(null)` = 0); the schema decides.
|
|
224
146
|
storyId: storyId === null || storyId === undefined ? null : Number(storyId),
|
|
225
147
|
status,
|
|
226
148
|
phase,
|
|
@@ -235,12 +157,11 @@ export function buildTerminalEnvelope({
|
|
|
235
157
|
nextCommand: nextCommand ?? null,
|
|
236
158
|
elapsedSeconds: Math.max(0, Number(elapsedSeconds) || 0),
|
|
237
159
|
waitBudget: waitBudget ?? null,
|
|
160
|
+
lockWait: lockWait ?? null,
|
|
238
161
|
timestamp,
|
|
239
162
|
});
|
|
240
163
|
|
|
241
|
-
//
|
|
242
|
-
// property value is exactly what triggers the destructuring default on the
|
|
243
|
-
// other side, so production still gets the eagerly-loaded module source.
|
|
164
|
+
// `undefined` schemaSource triggers the callee's default.
|
|
244
165
|
const { valid, errors } = validateTerminalEnvelope(envelope, {
|
|
245
166
|
schemaSource,
|
|
246
167
|
});
|
|
@@ -254,23 +175,8 @@ export function buildTerminalEnvelope({
|
|
|
254
175
|
}
|
|
255
176
|
|
|
256
177
|
/**
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* `/deliver-light`'s suitability gate already decided correctly when it
|
|
261
|
-
* overrode a `lite` self-verdict on shape; what it lacked was an outcome a
|
|
262
|
-
* session could not walk past. A mandrel-bench 2.13.0 light-arm run did
|
|
263
|
-
* exactly that — it read the gate's `escalate-plan`, then invoked `/mandrel-plan`
|
|
264
|
-
* in the same session and delivered. The continuation was not harmless:
|
|
265
|
-
* planning inside a session already framed as small work authored ONE Story
|
|
266
|
-
* against the scenario's 3-5 contract, where a fresh `/mandrel-plan` session on the
|
|
267
|
-
* identical seed authored four. Escalation silently produced the very
|
|
268
|
-
* under-decomposition the guard exists to prevent.
|
|
269
|
-
*
|
|
270
|
-
* So the outcome is a validated envelope with its own exit code, naming the
|
|
271
|
-
* `/mandrel-plan` command that owns the work, and asserting per artifact that nothing
|
|
272
|
-
* was started. Every guarantee here is enforced by the schema rather than by
|
|
273
|
-
* 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.
|
|
274
180
|
*
|
|
275
181
|
* @param {{
|
|
276
182
|
* prompt: string,
|
|
@@ -288,8 +194,6 @@ export function buildEscalationTerminal({
|
|
|
288
194
|
}) {
|
|
289
195
|
const quoted = quoteForPlan(prompt);
|
|
290
196
|
if (quoted === '') {
|
|
291
|
-
// An escalation whose next command is `/mandrel-plan ""` hands the operator
|
|
292
|
-
// nothing — the same walk-past-able non-outcome in envelope clothing.
|
|
293
197
|
throw new TypeError(
|
|
294
198
|
'buildEscalationTerminal: a non-empty prompt is required — the escalated terminal exists to name the /mandrel-plan invocation that owns the work',
|
|
295
199
|
);
|
|
@@ -308,8 +212,7 @@ export function buildEscalationTerminal({
|
|
|
308
212
|
: [
|
|
309
213
|
'predicted scope exceeds the light ceilings — escalate to /mandrel-plan',
|
|
310
214
|
],
|
|
311
|
-
//
|
|
312
|
-
// receipt/init call sites, so these are the assertion that it did.
|
|
215
|
+
// Asserted, not computed: escalation returns before receipt/init.
|
|
313
216
|
created: { receiptStory: false, storyBranch: false, worktree: false },
|
|
314
217
|
},
|
|
315
218
|
nextCommand: NEXT_COMMANDS.escalateToPlan(prompt),
|
|
@@ -319,8 +222,6 @@ export function buildEscalationTerminal({
|
|
|
319
222
|
}
|
|
320
223
|
|
|
321
224
|
/**
|
|
322
|
-
* Resolve the process exit code for a terminal envelope.
|
|
323
|
-
*
|
|
324
225
|
* @param {object} envelope
|
|
325
226
|
* @returns {number}
|
|
326
227
|
*/
|
|
@@ -328,16 +229,11 @@ export function exitCodeForTerminal(envelope) {
|
|
|
328
229
|
return TERMINAL_EXIT_CODES[envelope?.status] ?? 1;
|
|
329
230
|
}
|
|
330
231
|
|
|
331
|
-
/** The markers a caller scans stdout for to recover the envelope. */
|
|
332
232
|
export const TERMINAL_BEGIN_MARKER = '--- STORY DELIVER TERMINAL ---';
|
|
333
233
|
export const TERMINAL_END_MARKER = '--- END TERMINAL ---';
|
|
334
234
|
|
|
335
235
|
/**
|
|
336
|
-
*
|
|
337
|
-
*
|
|
338
|
-
* An unreadable `.agentrc.json` must not cost the run its envelope copy: the
|
|
339
|
-
* path helpers fall back to the framework-default temp root, which is still a
|
|
340
|
-
* far better outcome than no artifact at all.
|
|
236
|
+
* `undefined` on an unreadable config: the default temp root beats no copy.
|
|
341
237
|
*
|
|
342
238
|
* @param {typeof resolveConfig} resolveConfigImpl
|
|
343
239
|
* @returns {object|undefined}
|
|
@@ -351,36 +247,11 @@ function tolerantConfig(resolveConfigImpl) {
|
|
|
351
247
|
}
|
|
352
248
|
|
|
353
249
|
/**
|
|
354
|
-
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* close
|
|
358
|
-
*
|
|
359
|
-
* mid-gate-chain is behaving reasonably, but the envelope it never relayed is
|
|
360
|
-
* gone: the router then has to reconstruct the Story's state from labels, and
|
|
361
|
-
* `deliver-recover.js` used to answer that reconstruction with
|
|
362
|
-
* "Implementation never finished" — false, and its re-init suggestion can put
|
|
363
|
-
* a second close on one PR. Observed four times across three workers in one
|
|
364
|
-
* consumer run. The file is the second channel, and it outlives the turn.
|
|
365
|
-
*
|
|
366
|
-
* **Best-effort by construction.** Every failure path returns `null`: a
|
|
367
|
-
* delivery must never turn a landed PR into a crash because a temp directory
|
|
368
|
-
* was unwritable. The stdout envelope above is the contract; this is a copy.
|
|
369
|
-
*
|
|
370
|
-
* **Atomic by construction.** The payload is written to a pid-scoped
|
|
371
|
-
* temporary name and renamed into place, because the reader that matters most
|
|
372
|
-
* is a router polling during a live close — a half-written file would hand it
|
|
373
|
-
* a parse error at exactly the moment it is trying to avoid guessing.
|
|
374
|
-
*
|
|
375
|
-
* A null `storyId` (the `escalated` terminal, which by construction never
|
|
376
|
-
* authored a Story) has nowhere to be filed and writes nothing.
|
|
377
|
-
*
|
|
378
|
-
* `config` is optional and resolved lazily when absent. Two of the emit sites
|
|
379
|
-
* are `catch` blocks that crashed before any config was resolved, and those
|
|
380
|
-
* are precisely the runs whose envelope is most worth keeping — so the temp
|
|
381
|
-
* root is looked up here rather than left at the framework default, which
|
|
382
|
-
* would file the artifact where a consumer's router never looks (and where
|
|
383
|
-
* 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.
|
|
384
255
|
*
|
|
385
256
|
* @param {object} envelope A validated terminal envelope.
|
|
386
257
|
* @param {{
|
|
@@ -406,13 +277,11 @@ export function persistTerminalEnvelope(
|
|
|
406
277
|
fsImpl.renameSync(tmpPath, target);
|
|
407
278
|
return target;
|
|
408
279
|
} catch {
|
|
409
|
-
// A rename that never ran leaves the scratch file behind; drop it rather
|
|
410
|
-
// than accumulating one per failed close.
|
|
411
280
|
if (tmpPath) {
|
|
412
281
|
try {
|
|
413
282
|
fsImpl.rmSync(tmpPath, { force: true });
|
|
414
283
|
} catch {
|
|
415
|
-
//
|
|
284
|
+
// Best-effort.
|
|
416
285
|
}
|
|
417
286
|
}
|
|
418
287
|
return null;
|
|
@@ -420,33 +289,16 @@ export function persistTerminalEnvelope(
|
|
|
420
289
|
}
|
|
421
290
|
|
|
422
291
|
/**
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
*
|
|
426
|
-
* **Deliberately not `Logger.info`.** The envelope is this CLI's
|
|
427
|
-
* machine-readable contract — every invocation emits exactly ONE, and a
|
|
428
|
-
* headless caller parses it out of stdout to decide what happened.
|
|
429
|
-
* `Logger.info` is level-gated, so under the documented
|
|
430
|
-
* `AGENT_LOG_LEVEL=silent` (execution-reference § Log-level control) the
|
|
431
|
-
* envelope silently vanished and the
|
|
432
|
-
* caller got a bare exit code: precisely the "no envelope at all" outcome
|
|
433
|
-
* Story #4543 exists to remove. A contract payload must not be suppressible
|
|
434
|
-
* by a verbosity knob.
|
|
435
|
-
*
|
|
436
|
-
* Single home for the marker format so the four emit sites (the runner's
|
|
437
|
-
* terminal, the close CLI's failed-terminal catch, and both confirm-CLI
|
|
438
|
-
* paths) cannot drift apart — and, since Story #4816, the single home for the
|
|
439
|
-
* on-disk copy too, so no emit path can persist and another forget.
|
|
440
|
-
* {@link persistTerminalEnvelope} runs **first**: a caller that has read the
|
|
441
|
-
* 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.
|
|
442
295
|
*
|
|
443
296
|
* @param {object} envelope
|
|
444
297
|
* @param {{
|
|
445
298
|
* write?: (s: string) => void,
|
|
446
299
|
* config?: object,
|
|
447
300
|
* persist?: typeof persistTerminalEnvelope,
|
|
448
|
-
* }} [opts] `write` and `persist` are test seams
|
|
449
|
-
* artifact's temp root and is threaded from whichever emit site holds one.
|
|
301
|
+
* }} [opts] `write` and `persist` are test seams.
|
|
450
302
|
* @returns {void}
|
|
451
303
|
*/
|
|
452
304
|
export function emitTerminalEnvelope(
|
|
@@ -457,28 +309,19 @@ export function emitTerminalEnvelope(
|
|
|
457
309
|
persist = persistTerminalEnvelope,
|
|
458
310
|
} = {},
|
|
459
311
|
) {
|
|
460
|
-
// Belt and braces around a copy: `persistTerminalEnvelope` already swallows
|
|
461
|
-
// its own failures, but the stdout envelope is the CONTRACT and the disk
|
|
462
|
-
// copy is a convenience. Nothing in the secondary path — including a future
|
|
463
|
-
// injected `persist` — may cost the caller the primary one.
|
|
464
312
|
try {
|
|
465
313
|
persist(envelope, { config });
|
|
466
314
|
} catch {
|
|
467
|
-
//
|
|
315
|
+
// The disk copy must never cost the caller the stdout contract.
|
|
468
316
|
}
|
|
469
|
-
//
|
|
470
|
-
// machine contract callers recover with `JSON.parse`, so pretty-printing
|
|
471
|
-
// only adds turn-resident bytes without helping any consumer.
|
|
317
|
+
// Compact JSON: pretty-printing only adds turn-resident bytes.
|
|
472
318
|
write(
|
|
473
319
|
`\n${TERMINAL_BEGIN_MARKER}\n${JSON.stringify(envelope)}\n${TERMINAL_END_MARKER}\n`,
|
|
474
320
|
);
|
|
475
321
|
}
|
|
476
322
|
|
|
477
323
|
/**
|
|
478
|
-
* Map a `runConfirmMergePhase` outcome onto the
|
|
479
|
-
* envelope (Story #4543). One writer, one shape — the two prose contracts
|
|
480
|
-
* this replaces disagreed with each other precisely because each surface
|
|
481
|
-
* assembled its own.
|
|
324
|
+
* Map a `runConfirmMergePhase` outcome onto the terminal envelope.
|
|
482
325
|
*
|
|
483
326
|
* @returns {object} A validated `story-deliver-terminal` envelope.
|
|
484
327
|
*/
|
|
@@ -491,6 +334,7 @@ export function terminalFromWaitOutcome({
|
|
|
491
334
|
prUrl,
|
|
492
335
|
autoMergeEnabled,
|
|
493
336
|
gates,
|
|
337
|
+
lockWait,
|
|
494
338
|
elapsedSeconds,
|
|
495
339
|
}) {
|
|
496
340
|
const prBase = {
|
|
@@ -503,6 +347,7 @@ export function terminalFromWaitOutcome({
|
|
|
503
347
|
storyBranch,
|
|
504
348
|
baseBranch,
|
|
505
349
|
gates,
|
|
350
|
+
lockWait,
|
|
506
351
|
elapsedSeconds,
|
|
507
352
|
};
|
|
508
353
|
|
|
@@ -514,8 +359,7 @@ export function terminalFromWaitOutcome({
|
|
|
514
359
|
pr: {
|
|
515
360
|
...prBase,
|
|
516
361
|
state: 'MERGED',
|
|
517
|
-
//
|
|
518
|
-
// admin override or with non-required checks red.
|
|
362
|
+
// Observed, not assumed: admin merges land with checks red.
|
|
519
363
|
checksStatus: waitOutcome.prProbe?.checksStatus ?? null,
|
|
520
364
|
},
|
|
521
365
|
tail: waitOutcome.tail,
|
|
@@ -538,9 +382,7 @@ export function terminalFromWaitOutcome({
|
|
|
538
382
|
});
|
|
539
383
|
}
|
|
540
384
|
|
|
541
|
-
// blocked — the classifier
|
|
542
|
-
// comment already carries the class-specific remediation, so the next
|
|
543
|
-
// command mirrors it rather than inventing a second opinion.
|
|
385
|
+
// blocked — mirror the classifier's remediation, never a second opinion.
|
|
544
386
|
const nextCommand =
|
|
545
387
|
waitOutcome.blockClass === 'checks-failed'
|
|
546
388
|
? NEXT_COMMANDS.watchCi(storyId, prNumber)
|