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,49 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* seeds `story-<id>` from `project.baseBranch`; `single-story-close` used to
|
|
7
|
-
* re-resolve the SAME key and run close-validation, format-autofix, the gate
|
|
8
|
-
* baseline and base-sync against its own second answer. Nothing pinned the
|
|
9
|
-
* first value and nothing checked the two agreed — and the window between
|
|
10
|
-
* them is however long implementation takes. A concurrent session editing
|
|
11
|
-
* `.agentrc.json` / `.agentrc.local.json` mid-run therefore base-synced a
|
|
12
|
-
* Story against a base it was never seeded from, which surfaced only as an
|
|
13
|
-
* ordinary content conflict with nothing pointing at config.
|
|
14
|
-
*
|
|
15
|
-
* The base a Story was seeded from is a property of **that run**, not of
|
|
16
|
-
* whatever the config file says later. So init pins it and close reads the
|
|
17
|
-
* pin back.
|
|
18
|
-
*
|
|
19
|
-
* ## Where the pin lives
|
|
20
|
-
*
|
|
21
|
-
* The `story-init` structured comment, not a temp log: the post-land tail
|
|
22
|
-
* purges the temp tree, while the ticket comment survives every close re-run
|
|
23
|
-
* and every recovery path. `single-story-init.js` already upserts that
|
|
24
|
-
* comment; `pinRunScopedConfig` supplies the block it records, and
|
|
25
|
-
* `resolveRunScopedConfig` reads it back through the existing
|
|
26
|
-
* `findStructuredComment` seam.
|
|
27
|
-
*
|
|
28
|
-
* ## Adding another run-scoped key
|
|
29
|
-
*
|
|
30
|
-
* Add one row to `RUN_SCOPED_CONFIG_KEYS`. Both halves — the pin init writes
|
|
31
|
-
* and the comparison close makes — enumerate that registry, so a new key
|
|
32
|
-
* needs no second mechanism, no reader change and no writer change. Only
|
|
33
|
-
* `baseBranch` is enforced today because only its corruption is destructive
|
|
34
|
-
* (a wrong base merged into the Story branch permanently contaminates the
|
|
35
|
-
* branch and its PR diff); ceremony profile, quality floors and the
|
|
36
|
-
* concurrency cap are deliberately NOT pinned here.
|
|
2
|
+
* Pin the config a delivery run was seeded from (in the init envelope) and
|
|
3
|
+
* fail closed at close when the config changed underneath it — a concurrent
|
|
4
|
+
* edit would otherwise base-sync the Story onto a base it was never seeded
|
|
5
|
+
* from. A missing pin degrades to current config with a loud warning.
|
|
37
6
|
*/
|
|
38
7
|
|
|
39
|
-
import {
|
|
40
|
-
import { findStructuredComment } from './ticketing.js';
|
|
8
|
+
import { readRunScopedPin } from './story-init-envelope.js';
|
|
41
9
|
|
|
42
10
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* file. `read` resolves the key from a resolved config (including its
|
|
46
|
-
* default); `label` is the dotted config path the operator has to go fix.
|
|
11
|
+
* Keys whose value belongs to the seeding run. Only `baseBranch`: a wrong base
|
|
12
|
+
* permanently contaminates the branch. Init and close both walk this registry.
|
|
47
13
|
*
|
|
48
14
|
* @type {Record<string, { read: (config: object) => unknown, label: string }>}
|
|
49
15
|
*/
|
|
@@ -55,14 +21,8 @@ const RUN_SCOPED_CONFIG_KEYS = {
|
|
|
55
21
|
};
|
|
56
22
|
|
|
57
23
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* in the `story-init` receipt so close can compare against it later.
|
|
61
|
-
*
|
|
62
|
-
* @param {object} config Resolved config (`resolveConfig` output).
|
|
63
|
-
* @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys] Registry override — the
|
|
64
|
-
* default is the module registry; supplying one is how a caller (or a test)
|
|
65
|
-
* exercises the registry-driven property without a second mechanism.
|
|
24
|
+
* @param {object} config Resolved config.
|
|
25
|
+
* @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys]
|
|
66
26
|
* @returns {Record<string, unknown>} the pinned values, keyed by config key.
|
|
67
27
|
*/
|
|
68
28
|
export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
|
|
@@ -74,71 +34,39 @@ export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
|
|
|
74
34
|
}
|
|
75
35
|
|
|
76
36
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* Three distinct non-success states, all reported rather than collapsed —
|
|
80
|
-
* the whole point of this module is that a fallback is never silent:
|
|
81
|
-
* - `absent`: no `story-init` comment on the ticket. Real and expected —
|
|
82
|
-
* the upsert is best-effort (init logs and continues on failure), and a
|
|
83
|
-
* recovery path may close a Story whose init predates this receipt.
|
|
84
|
-
* - `unreadable`: the comment exists but carries no parseable JSON payload.
|
|
85
|
-
* - `provider-error`: the comment read itself failed.
|
|
37
|
+
* A row with no pinned value is `unpinned` (an older receipt), not a conflict.
|
|
86
38
|
*
|
|
87
39
|
* @param {{
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
40
|
+
* pinned: Record<string, unknown>,
|
|
41
|
+
* current: Record<string, unknown>,
|
|
42
|
+
* keys: typeof RUN_SCOPED_CONFIG_KEYS,
|
|
91
43
|
* }} args
|
|
92
|
-
* @returns {
|
|
44
|
+
* @returns {{
|
|
45
|
+
* values: Record<string, unknown>,
|
|
46
|
+
* conflicts: Array<{ label: string, pinned: unknown, current: unknown }>,
|
|
47
|
+
* unpinned: string[],
|
|
48
|
+
* }}
|
|
93
49
|
*/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (!comment) {
|
|
110
|
-
return {
|
|
111
|
-
status: 'absent',
|
|
112
|
-
values: null,
|
|
113
|
-
detail: 'no story-init comment on the ticket',
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
const payload = parseFencedJsonComment(comment);
|
|
117
|
-
if (!payload || typeof payload !== 'object') {
|
|
118
|
-
return {
|
|
119
|
-
status: 'unreadable',
|
|
120
|
-
values: null,
|
|
121
|
-
detail: 'story-init comment carries no parseable JSON payload',
|
|
122
|
-
};
|
|
50
|
+
function comparePinToCurrent({ pinned: pin, current, keys }) {
|
|
51
|
+
const values = {};
|
|
52
|
+
const conflicts = [];
|
|
53
|
+
const unpinned = [];
|
|
54
|
+
for (const [key, spec] of Object.entries(keys)) {
|
|
55
|
+
const pinned = pin?.[key];
|
|
56
|
+
if (pinned === undefined || pinned === null) {
|
|
57
|
+
unpinned.push(spec.label);
|
|
58
|
+
values[key] = current[key];
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
values[key] = pinned;
|
|
62
|
+
if (pinned !== current[key]) {
|
|
63
|
+
conflicts.push({ label: spec.label, pinned, current: current[key] });
|
|
64
|
+
}
|
|
123
65
|
}
|
|
124
|
-
|
|
125
|
-
// pinned values as top-level payload fields (`baseBranch` has been recorded
|
|
126
|
-
// there since Story #831). Reading the payload itself as the fallback block
|
|
127
|
-
// is what lets a Story initialized by an older init still close against its
|
|
128
|
-
// own pinned base instead of degrading to the fallback warning.
|
|
129
|
-
const block =
|
|
130
|
-
payload.runScopedConfig && typeof payload.runScopedConfig === 'object'
|
|
131
|
-
? payload.runScopedConfig
|
|
132
|
-
: payload;
|
|
133
|
-
return { status: 'found', values: block, detail: null };
|
|
66
|
+
return { values, conflicts, unpinned };
|
|
134
67
|
}
|
|
135
68
|
|
|
136
69
|
/**
|
|
137
|
-
* Build the refusal message for a mid-run config change. Names BOTH values
|
|
138
|
-
* for every conflicting key — the pinned one and the one config resolves to
|
|
139
|
-
* now — because "which base was this branch actually seeded from" is the
|
|
140
|
-
* question the operator could not previously answer.
|
|
141
|
-
*
|
|
142
70
|
* @param {{ storyId: number, conflicts: Array<{ label: string, pinned: unknown, current: unknown }> }} args
|
|
143
71
|
* @returns {string}
|
|
144
72
|
*/
|
|
@@ -159,21 +87,14 @@ function formatRunScopedConflict({ storyId, conflicts }) {
|
|
|
159
87
|
}
|
|
160
88
|
|
|
161
89
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* Throws on disagreement — fail closed, before any gate, format-autofix or
|
|
166
|
-
* base-sync has run, with both values named. Never silently prefers either
|
|
167
|
-
* side: preferring the pin would base-sync correctly but hide a config change
|
|
168
|
-
* the operator needs to know about, and preferring current config is the bug
|
|
169
|
-
* this module exists to close.
|
|
90
|
+
* Throws on disagreement, before any gate or base-sync runs — silently
|
|
91
|
+
* preferring either side would hide the config change.
|
|
170
92
|
*
|
|
171
93
|
* @param {{
|
|
172
|
-
* provider: object,
|
|
173
94
|
* storyId: number,
|
|
174
95
|
* config: object,
|
|
175
96
|
* keys?: typeof RUN_SCOPED_CONFIG_KEYS,
|
|
176
|
-
*
|
|
97
|
+
* readPinFn?: typeof readRunScopedPin,
|
|
177
98
|
* progress?: (tag: string, msg: string) => void,
|
|
178
99
|
* }} args
|
|
179
100
|
* @returns {Promise<{
|
|
@@ -181,57 +102,39 @@ function formatRunScopedConflict({ storyId, conflicts }) {
|
|
|
181
102
|
* confirmed: boolean,
|
|
182
103
|
* receiptStatus: string,
|
|
183
104
|
* warning: string|null,
|
|
184
|
-
* }>} `confirmed`
|
|
185
|
-
* agreed with current config — i.e. when downstream remediation may safely
|
|
186
|
-
* assume the pinned value is the one in play.
|
|
105
|
+
* }>} `confirmed` only when every key was pinned and agreed.
|
|
187
106
|
*/
|
|
188
107
|
export async function resolveRunScopedConfig({
|
|
189
|
-
provider,
|
|
190
108
|
storyId,
|
|
191
109
|
config,
|
|
192
110
|
keys = RUN_SCOPED_CONFIG_KEYS,
|
|
193
|
-
|
|
111
|
+
readPinFn = readRunScopedPin,
|
|
194
112
|
progress,
|
|
195
113
|
}) {
|
|
196
114
|
const current = pinRunScopedConfig(config, keys);
|
|
197
|
-
const receipt =
|
|
198
|
-
provider,
|
|
199
|
-
storyId,
|
|
200
|
-
findCommentFn,
|
|
201
|
-
});
|
|
115
|
+
const receipt = readPinFn({ storyId: Number(storyId), config });
|
|
202
116
|
|
|
203
|
-
if (receipt
|
|
204
|
-
//
|
|
205
|
-
// announced, because a silent one reintroduces exactly the bug above.
|
|
117
|
+
if (!receipt) {
|
|
118
|
+
// Not an error, but never a silent fallback.
|
|
206
119
|
const warning =
|
|
207
|
-
`Run-scoped config could not be read from the run's init
|
|
208
|
-
`(
|
|
209
|
-
`(${describeValues(current, keys)}). This close
|
|
210
|
-
'was seeded from these values.';
|
|
120
|
+
`Run-scoped config could not be read from the run's init envelope ` +
|
|
121
|
+
`(no runScopedConfig pin for Story #${storyId}); falling back to the ` +
|
|
122
|
+
`currently-resolved config (${describeValues(current, keys)}). This close ` +
|
|
123
|
+
'cannot confirm the Story was seeded from these values.';
|
|
211
124
|
progress?.('PIN', `⚠️ ${warning}`);
|
|
212
125
|
return {
|
|
213
126
|
values: current,
|
|
214
127
|
confirmed: false,
|
|
215
|
-
receiptStatus:
|
|
128
|
+
receiptStatus: 'absent',
|
|
216
129
|
warning,
|
|
217
130
|
};
|
|
218
131
|
}
|
|
219
132
|
|
|
220
|
-
const values = {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (pinned === undefined || pinned === null) {
|
|
226
|
-
unpinned.push(spec.label);
|
|
227
|
-
values[key] = current[key];
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
values[key] = pinned;
|
|
231
|
-
if (pinned !== current[key]) {
|
|
232
|
-
conflicts.push({ label: spec.label, pinned, current: current[key] });
|
|
233
|
-
}
|
|
234
|
-
}
|
|
133
|
+
const { values, conflicts, unpinned } = comparePinToCurrent({
|
|
134
|
+
pinned: receipt,
|
|
135
|
+
current,
|
|
136
|
+
keys,
|
|
137
|
+
});
|
|
235
138
|
|
|
236
139
|
if (conflicts.length > 0) {
|
|
237
140
|
throw new Error(formatRunScopedConflict({ storyId, conflicts }));
|
|
@@ -245,26 +148,19 @@ export async function resolveRunScopedConfig({
|
|
|
245
148
|
return {
|
|
246
149
|
values,
|
|
247
150
|
confirmed: false,
|
|
248
|
-
receiptStatus:
|
|
151
|
+
receiptStatus: 'found',
|
|
249
152
|
warning,
|
|
250
153
|
};
|
|
251
154
|
}
|
|
252
155
|
|
|
253
156
|
progress?.(
|
|
254
157
|
'PIN',
|
|
255
|
-
`📌 Run-scoped config pinned by the
|
|
158
|
+
`📌 Run-scoped config pinned by the init envelope (${describeValues(values, keys)}).`,
|
|
256
159
|
);
|
|
257
|
-
return {
|
|
258
|
-
values,
|
|
259
|
-
confirmed: true,
|
|
260
|
-
receiptStatus: receipt.status,
|
|
261
|
-
warning: null,
|
|
262
|
-
};
|
|
160
|
+
return { values, confirmed: true, receiptStatus: 'found', warning: null };
|
|
263
161
|
}
|
|
264
162
|
|
|
265
163
|
/**
|
|
266
|
-
* Render `label=value` pairs for the operator-facing lines above.
|
|
267
|
-
*
|
|
268
164
|
* @param {Record<string, unknown>} values
|
|
269
165
|
* @param {typeof RUN_SCOPED_CONFIG_KEYS} keys
|
|
270
166
|
* @returns {string}
|
|
@@ -1,45 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* close-note.js — the human-readable `note` on close's result record
|
|
3
|
-
* (Story #5266).
|
|
2
|
+
* close-note.js — the human-readable `note` on close's result record.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* into `story-close-result-<id>.log` **beside `merged: false`**, while the
|
|
11
|
-
* schema-validated terminal envelope correctly reported
|
|
12
|
-
* `status: pending, phase: confirm-merge`. That log is what close's summary
|
|
13
|
-
* line points the operator at, so the contradiction is what gets read first:
|
|
14
|
-
* a merge that never happened, reported as confirmed.
|
|
15
|
-
*
|
|
16
|
-
* The invariant this module exists to hold:
|
|
17
|
-
*
|
|
18
|
-
* > **No note may assert a state the same object denies.**
|
|
19
|
-
*
|
|
20
|
-
* Every branch below is therefore derived from the result's OWN
|
|
21
|
-
* `merged` / `directMerged` / `autoMergeEnabled` / `landCompleted` fields —
|
|
22
|
-
* the ones the note ships next to — so no input can produce a note that
|
|
23
|
-
* contradicts them. Story #5279 added the fourth, because `merged: true`
|
|
24
|
-
* used to imply the flip, the issue close and the post-land tail: a direct
|
|
25
|
-
* squash-merge under `--no-wait-merge`, and a merge whose `agent::done` write
|
|
26
|
-
* failed, now reach it with none of the three, and reusing the confirmed
|
|
27
|
-
* wording for them would reintroduce the defect above one field over. The
|
|
28
|
-
* unmerged branches deliberately claim nothing about the Story's label state
|
|
29
|
-
* either: close's ending may be `pending` OR `blocked` with the same
|
|
30
|
-
* `merged: false`, and the terminal envelope is the authority on which. They
|
|
31
|
-
* also avoid the merge-completion vocabulary entirely — no `agent::done`, no
|
|
32
|
-
* "the merge confirms" — so that a reader skimming for those words cannot
|
|
33
|
-
* take a next-step instruction for a report of what happened.
|
|
4
|
+
* Invariant: no note may assert a state the same object denies, so every
|
|
5
|
+
* branch derives from the result's own fields. A merge is not a completed
|
|
6
|
+
* land (`landCompleted`), and the unmerged branches claim nothing about label
|
|
7
|
+
* state and avoid merge-completion vocabulary — the terminal envelope is the
|
|
8
|
+
* authority on pending vs blocked.
|
|
34
9
|
*/
|
|
35
10
|
|
|
36
11
|
/**
|
|
37
|
-
* The one line the note is not allowed to get wrong.
|
|
38
|
-
*
|
|
39
12
|
* @param {{ merged?: boolean, directMerged?: boolean,
|
|
40
13
|
* autoMergeEnabled?: boolean, landCompleted?: boolean }} result
|
|
41
14
|
* `landCompleted` — did THIS run flip `agent::done`, close the issue and
|
|
42
|
-
* run the post-land tail? Defaults to `merged
|
|
15
|
+
* run the post-land tail? Defaults to `merged`.
|
|
43
16
|
* @returns {string}
|
|
44
17
|
*/
|
|
45
18
|
export function deriveCloseNote({
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* single-story-close/failed-terminal.js — the `failed`
|
|
3
|
-
* emits when a phase
|
|
4
|
-
*
|
|
5
|
-
* Split out of `single-story-close.js` so the CLI entry stays an entry: it
|
|
6
|
-
* parses args, dispatches the runner, and maps a terminal onto an exit code.
|
|
7
|
-
* The reasoning about which gates had run by the time a phase died belongs
|
|
8
|
-
* with the envelope it feeds, not in the file that owns process lifetime.
|
|
9
|
-
*
|
|
10
|
-
* The runner deliberately throws rather than returning a failure (a red gate
|
|
11
|
-
* must not look like a return value), so without this the most common
|
|
12
|
-
* non-happy ending — a failing close-validation gate — would emit **no
|
|
13
|
-
* envelope at all**, exiting 1 with only a stderr line while the workflow
|
|
14
|
-
* docs promise the agent a `failed` envelope naming the phase.
|
|
2
|
+
* single-story-close/failed-terminal.js — the `failed` envelope a close
|
|
3
|
+
* emits when a phase throws, so a crashed close still reports which phase
|
|
4
|
+
* died and which gates had run.
|
|
15
5
|
*/
|
|
16
6
|
|
|
17
7
|
import { Logger } from '../../Logger.js';
|
|
@@ -21,16 +11,12 @@ import {
|
|
|
21
11
|
} from '../story-deliver-terminal.js';
|
|
22
12
|
|
|
23
13
|
/**
|
|
24
|
-
* The
|
|
25
|
-
*
|
|
14
|
+
* The phase order `setPhase` walks; it MUST track `runPrePushPhases`, since
|
|
15
|
+
* it decides which gates had cleared when a later phase died.
|
|
26
16
|
*/
|
|
27
17
|
const PHASE_ORDER = Object.freeze([
|
|
28
18
|
'init',
|
|
29
19
|
'wrong-tree-guard',
|
|
30
|
-
// Story #5172 — base-sync now precedes close-validation, so the tree the
|
|
31
|
-
// gates validate is the tree the push sends. The order here is not
|
|
32
|
-
// decoration: it is how a failed terminal decides which gates had already
|
|
33
|
-
// cleared, so it MUST track `runPrePushPhases`.
|
|
34
20
|
'base-sync',
|
|
35
21
|
'close-validation',
|
|
36
22
|
'push',
|
|
@@ -42,7 +28,6 @@ const PHASE_ORDER = Object.freeze([
|
|
|
42
28
|
'done',
|
|
43
29
|
]);
|
|
44
30
|
|
|
45
|
-
/** Each reported gate and the pipeline phase that decides it. */
|
|
46
31
|
const GATE_PHASES = Object.freeze([
|
|
47
32
|
['validation', 'close-validation'],
|
|
48
33
|
['baseSync', 'base-sync'],
|
|
@@ -50,18 +35,9 @@ const GATE_PHASES = Object.freeze([
|
|
|
50
35
|
]);
|
|
51
36
|
|
|
52
37
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* `runner.js#baselinesEnvelopeGates`, so the two endings of one run cannot
|
|
57
|
-
* key the same gate differently.
|
|
58
|
-
*
|
|
59
|
-
* Deliberately a local copy rather than an import: several close suites
|
|
60
|
-
* replace that module wholesale via `t.mock.module`, and a named import here
|
|
61
|
-
* would fail to link against a mock that does not re-export the constant —
|
|
62
|
-
* turning an unrelated test's mock into a load error on the CLI's own entry
|
|
63
|
-
* path. `tests/close-validation-gates-enum.test.js` pins the two lists
|
|
64
|
-
* against each other so the copy cannot drift.
|
|
38
|
+
* Mirrors `BASELINES_GATE_NAMES` in `lib/close-validation/gates.js`. A local
|
|
39
|
+
* copy, not an import, because close suites mock that module wholesale and a
|
|
40
|
+
* named import would fail to link; a test pins the two lists equal.
|
|
65
41
|
*/
|
|
66
42
|
const BASELINES_ENTRY_NAMES = Object.freeze([
|
|
67
43
|
'check-baselines',
|
|
@@ -70,21 +46,8 @@ const BASELINES_ENTRY_NAMES = Object.freeze([
|
|
|
70
46
|
]);
|
|
71
47
|
|
|
72
48
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* This used to RECONSTRUCT them: it inferred, from the phase the run died in
|
|
77
|
-
* plus the name of the failing gate, what the two split entries "must have"
|
|
78
|
-
* done — and it did so over a hardcoded pair, so every failed close reported
|
|
79
|
-
* both split names whether or not the run had ever registered them. A repo
|
|
80
|
-
* whose config resolves to the unsplit `check-baselines`, or to only one half
|
|
81
|
-
* of the pair, got envelope keys for gates that did not exist; a run that
|
|
82
|
-
* died at `init` got them too, reported as `skipped`, which reads as "the
|
|
83
|
-
* gate was turned off" rather than "there was no such gate".
|
|
84
|
-
*
|
|
85
|
-
* Reporting instead of reconstructing removes the whole class: an outcome
|
|
86
|
-
* appears only for a gate the run actually observed, and the runner tags
|
|
87
|
-
* exactly that set onto the error (`err.closeGates`).
|
|
49
|
+
* Baselines outcomes the run actually observed (`err.closeGates`) — reported,
|
|
50
|
+
* never reconstructed, so a gate the run never registered cannot appear.
|
|
88
51
|
*
|
|
89
52
|
* @param {Record<string, string>|null|undefined} observedGates
|
|
90
53
|
* @returns {Record<string, 'passed'|'failed'|'skipped'>}
|
|
@@ -98,30 +61,12 @@ function baselinesGatesObserved(observedGates) {
|
|
|
98
61
|
}
|
|
99
62
|
|
|
100
63
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* The schema's contract: "A gate the run skipped … reports `skipped` rather
|
|
104
|
-
* than being omitted, so a missing gate is never mistaken for a passing one."
|
|
105
|
-
* The previous shape named only the gate that died and omitted the rest
|
|
106
|
-
* entirely — exactly the ambiguity the contract forbids.
|
|
107
|
-
*
|
|
108
|
-
* Reconstructed from the phase order, which is sound because the pipeline is
|
|
109
|
-
* strictly sequential: reaching phase N means every gate before it completed.
|
|
110
|
-
* A gate whose phase the run never reached is `skipped`; one the operator
|
|
111
|
-
* turned off via `--skip-validation` / `--skip-sync` is `skipped` too (it did
|
|
112
|
-
* not pass — it never ran).
|
|
113
|
-
*
|
|
114
|
-
* Story #5172 — the reported set also carries the baselines entries under
|
|
115
|
-
* their own names, so a failed close says WHICH half of the baselines gate
|
|
116
|
-
* breached instead of a single generic verdict. Story #5279 — those names
|
|
117
|
-
* are REPORTED from `observedGates`, never reconstructed, so only a gate the
|
|
118
|
-
* run registered can appear.
|
|
64
|
+
* Every gate's outcome, never omitted (a missing gate would read as passing);
|
|
65
|
+
* an unreached or operator-skipped gate is `skipped`.
|
|
119
66
|
*
|
|
120
67
|
* @param {string} phase The phase the run died in.
|
|
121
68
|
* @param {{ skipValidation?: boolean, skipSync?: boolean,
|
|
122
69
|
* observedGates?: Record<string, string>|null }} args
|
|
123
|
-
* Parsed CLI args, plus the per-gate outcomes the runner tagged onto the
|
|
124
|
-
* error.
|
|
125
70
|
* @returns {Record<string, 'passed'|'failed'|'skipped'>}
|
|
126
71
|
*/
|
|
127
72
|
export function gatesForFailedPhase(phase, args = {}) {
|
|
@@ -138,31 +83,13 @@ export function gatesForFailedPhase(phase, args = {}) {
|
|
|
138
83
|
}
|
|
139
84
|
|
|
140
85
|
/**
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
* `err.closePhase` is tagged by the runner's phase tracker.
|
|
146
|
-
*
|
|
147
|
-
* **Never throws.** This runs on the path that already has one failure in
|
|
148
|
-
* hand, so a second failure here must not REPLACE the first: an
|
|
149
|
-
* envelope-build error surfacing as the run's cause sends the operator to
|
|
150
|
-
* diagnose the wrong thing entirely — a close whose PR had already merged
|
|
151
|
-
* once reported a schema `ENOENT` as its fatal error, because the worktree
|
|
152
|
-
* holding the script had been reaped mid-run. On failure this returns null
|
|
153
|
-
* and the caller rethrows the original.
|
|
154
|
-
*
|
|
155
|
-
* `err.closeGates` — tagged by the runner — carries the per-gate outcomes the
|
|
156
|
-
* run observed, which is what lets the reported gates name the baselines
|
|
157
|
-
* entries that actually ran (Story #5172 / #5279) instead of a hardcoded pair.
|
|
86
|
+
* Never throws: a build failure here must not replace the original error as
|
|
87
|
+
* the run's reported cause, so it returns null and the caller rethrows.
|
|
88
|
+
* `err.closePhase` and `err.closeGates` are tagged by the runner.
|
|
158
89
|
*
|
|
159
90
|
* @param {unknown} err
|
|
160
91
|
* @param {{ storyId?: string|number, skipValidation?: boolean, skipSync?: boolean }} args
|
|
161
|
-
*
|
|
162
|
-
* flags `gatesForFailedPhase` needs.
|
|
163
|
-
* @returns {object|null} A validated envelope, or null when even the story id
|
|
164
|
-
* is unknown (a usage error — there is nothing to report an envelope about)
|
|
165
|
-
* or the envelope itself could not be assembled.
|
|
92
|
+
* @returns {object|null} null when the story id is unknown or assembly failed.
|
|
166
93
|
*/
|
|
167
94
|
export function failedTerminalFor(err, args = {}) {
|
|
168
95
|
const phase = err?.closePhase ?? 'init';
|