mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Owns the text + JSON envelope renderers and the `computeExitCode`
|
|
5
|
-
* helper. Extracted verbatim from `git-cleanup.js` so every named export
|
|
6
|
-
* keeps its contract.
|
|
2
|
+
* Pure text / JSON renderers and exit-code derivation for git-cleanup.
|
|
7
3
|
*
|
|
8
4
|
* @module lib/orchestration/git-cleanup/phases/render
|
|
9
5
|
*/
|
|
@@ -12,14 +8,8 @@ const TAG = '[git-cleanup]';
|
|
|
12
8
|
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
13
9
|
|
|
14
10
|
/**
|
|
15
|
-
* Pure: format a last-commit ISO timestamp as a short relative-age string
|
|
16
|
-
* for the `not-merged` skip-visibility line (Story #4395). Returns
|
|
17
|
-
* `'unknown'` when `iso` is missing or unparseable — a branch whose commit
|
|
18
|
-
* date could not be resolved (e.g. `gh`-degraded run, deleted ref) still
|
|
19
|
-
* gets a line, just without an age.
|
|
20
|
-
*
|
|
21
11
|
* @param {string|null|undefined} iso
|
|
22
|
-
* @param {number} now
|
|
12
|
+
* @param {number} now
|
|
23
13
|
* @returns {string}
|
|
24
14
|
*/
|
|
25
15
|
function formatCommitAge(iso, now) {
|
|
@@ -33,17 +23,8 @@ function formatCommitAge(iso, now) {
|
|
|
33
23
|
}
|
|
34
24
|
|
|
35
25
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* surfaces each one with its last-commit age so the operator can see why
|
|
39
|
-
* a leftover branch isn't reaped instead of hunting for it by hand.
|
|
40
|
-
*
|
|
41
|
-
* Story #5188 routes the remote-only walk's genuinely-unmerged survivors
|
|
42
|
-
* through here too. A `localExists: false` skip is marked `(remote-only)`
|
|
43
|
-
* — the same marker {@link renderCandidateRow} puts on a remote-only
|
|
44
|
-
* candidate — because the short name it prints has no local ref behind
|
|
45
|
-
* it: without the marker the operator reads the line as a local branch and
|
|
46
|
-
* hunts for a ref that `git branch` will never list.
|
|
26
|
+
* A remote-only skip is marked `(remote-only)` because its short name has
|
|
27
|
+
* no local ref behind it.
|
|
47
28
|
*
|
|
48
29
|
* @param {{ branch: string, reason: string, lastCommitAt?: string|null, localExists?: boolean }} skip
|
|
49
30
|
* @param {{ now?: number }} [opts]
|
|
@@ -57,46 +38,22 @@ export function renderNotMergedSkipLine(skip, opts = {}) {
|
|
|
57
38
|
return `${TAG} ⏭️ ${skip.branch}${scope} skipped — not merged (last commit: ${age})`;
|
|
58
39
|
}
|
|
59
40
|
|
|
60
|
-
/**
|
|
61
|
-
* Pure: render a single content-merged candidate annotation line
|
|
62
|
-
* (Story #4395). `content-merged` is a weaker signal than a merged PR or
|
|
63
|
-
* git ancestry — this note lets the operator tell it apart in both the
|
|
64
|
-
* dry-run list and the confirmation prompt.
|
|
65
|
-
*/
|
|
66
41
|
function contentMergedNote(candidate) {
|
|
67
42
|
return candidate.detectedBy === 'content-merged'
|
|
68
43
|
? ' (weaker signal — verify before deleting)'
|
|
69
44
|
: '';
|
|
70
45
|
}
|
|
71
46
|
|
|
72
|
-
/**
|
|
73
|
-
* Pure: render a single behind-the-merged-head candidate annotation.
|
|
74
|
-
*
|
|
75
|
-
* A branch whose tip is a strict ancestor of its merged PR head is a
|
|
76
|
-
* stale pre-merge snapshot — reapable, because every commit on it landed
|
|
77
|
-
* with the PR, but reapable for a different reason than a branch whose
|
|
78
|
-
* tip *matches* the merged head. It used to be skipped outright as a
|
|
79
|
-
* post-merge force-push; the note keeps the two visibly distinct in the
|
|
80
|
-
* dry-run list and the confirmation prompt so the operator can see why a
|
|
81
|
-
* branch that is not at the merged head is nonetheless offered.
|
|
82
|
-
*/
|
|
83
47
|
function behindMergeNote(candidate) {
|
|
84
48
|
return candidate.behindMerge
|
|
85
49
|
? ' (tip behind the merged head — content already landed)'
|
|
86
50
|
: '';
|
|
87
51
|
}
|
|
88
52
|
|
|
89
|
-
/** Pure: every provenance annotation a candidate row carries, in order. */
|
|
90
53
|
function candidateNotes(candidate) {
|
|
91
54
|
return `${contentMergedNote(candidate)}${behindMergeNote(candidate)}`;
|
|
92
55
|
}
|
|
93
56
|
|
|
94
|
-
/**
|
|
95
|
-
* Pure: one candidate row — its detection provenance, worktree, locality
|
|
96
|
-
* and annotations. Split out of {@link renderDryRun} so that renderer
|
|
97
|
-
* stays a loop over rows rather than growing a fourth inline ternary
|
|
98
|
-
* every time a candidate gains a new dimension.
|
|
99
|
-
*/
|
|
100
57
|
function renderCandidateRow(c) {
|
|
101
58
|
const pr = c.prNumber ? `PR #${c.prNumber}` : c.detectedBy;
|
|
102
59
|
const wt = c.hasWorktree ? ` (worktree: ${c.worktreePath})` : '';
|
|
@@ -105,15 +62,8 @@ function renderCandidateRow(c) {
|
|
|
105
62
|
}
|
|
106
63
|
|
|
107
64
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* The header states the run mode: `execute` opts into the reap wording and
|
|
112
|
-
* defaults to `false`, so a caller that forgets it still gets the harmless
|
|
113
|
-
* preview line. Prefer {@link renderCandidateList}, which derives the mode
|
|
114
|
-
* from the phase's own CLI options rather than making the caller restate
|
|
115
|
-
* it — the header used to be hardcoded to the preview wording, so an
|
|
116
|
-
* `--execute` run announced "nothing deleted" and then reaped.
|
|
65
|
+
* Prefer {@link renderCandidateList}, which derives `execute` from the CLI
|
|
66
|
+
* options.
|
|
117
67
|
*
|
|
118
68
|
* @param {{ candidates: Array, skipped?: Array, ghDegraded?: boolean }} plan
|
|
119
69
|
* @param {{ baseBranch?: string|null, now?: number, execute?: boolean }} [opts]
|
|
@@ -159,17 +109,12 @@ export function renderDryRun(plan, opts = {}) {
|
|
|
159
109
|
}
|
|
160
110
|
|
|
161
111
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* the reap path reads. Taking the whole bag (rather than a restated
|
|
165
|
-
* boolean) is the point: the driver cannot get the wording wrong because
|
|
166
|
-
* it never names the flag, so a destructive `--execute` run can no longer
|
|
167
|
-
* announce itself as a `DRY RUN (nothing deleted)` preview and then
|
|
168
|
-
* delete every candidate.
|
|
112
|
+
* Takes the whole CLI option bag — the same `dryRun` the reap path reads —
|
|
113
|
+
* so an `--execute` run can never announce itself as a dry run.
|
|
169
114
|
*
|
|
170
115
|
* @param {object} args
|
|
171
116
|
* @param {{ candidates: Array, skipped?: Array }} args.plan
|
|
172
|
-
* @param {{ dryRun?: boolean }} args.opts
|
|
117
|
+
* @param {{ dryRun?: boolean }} args.opts
|
|
173
118
|
* @param {string|null} [args.baseBranch]
|
|
174
119
|
* @returns {string[]}
|
|
175
120
|
*/
|
|
@@ -177,10 +122,6 @@ export function renderCandidateList({ plan, opts = {}, baseBranch = null }) {
|
|
|
177
122
|
return renderDryRun(plan, { baseBranch, execute: !opts.dryRun });
|
|
178
123
|
}
|
|
179
124
|
|
|
180
|
-
/**
|
|
181
|
-
* Pure: the tip / merged short-SHA pair both merged-tip skip lines quote,
|
|
182
|
-
* with a placeholder for either side the planner could not resolve.
|
|
183
|
-
*/
|
|
184
125
|
function shortShaPair(skip) {
|
|
185
126
|
return {
|
|
186
127
|
tip: skip.tipSha ? skip.tipSha.slice(0, 7) : '<unknown>',
|
|
@@ -189,11 +130,7 @@ function shortShaPair(skip) {
|
|
|
189
130
|
}
|
|
190
131
|
|
|
191
132
|
/**
|
|
192
|
-
*
|
|
193
|
-
* skip reason is not one of the latest-PR family — `renderDryRun` filters
|
|
194
|
-
* by truthy return value so unrelated skip reasons (`protected`,
|
|
195
|
-
* `current-head`, `filtered`) stay quiet here. `not-merged` gets its own
|
|
196
|
-
* renderer ({@link renderNotMergedSkipLine}).
|
|
133
|
+
* `null` for any reason outside the latest-PR / merged-tip family.
|
|
197
134
|
*
|
|
198
135
|
* @param {{ branch: string, reason: string, prNumber?: number, tipSha?: string, mergedSha?: string, detail?: string }} skip
|
|
199
136
|
* @returns {string | null}
|
|
@@ -227,25 +164,13 @@ export function renderLatestPrSkipLine(skip) {
|
|
|
227
164
|
return null;
|
|
228
165
|
}
|
|
229
166
|
|
|
230
|
-
/**
|
|
231
|
-
* Remedy text per withheld-delete reason (Story #5283). A withheld entry
|
|
232
|
-
* that named no way to proceed would read as an unexplained refusal, so
|
|
233
|
-
* every reason the executor can record gets its own next step here.
|
|
234
|
-
*/
|
|
167
|
+
/** Next step per withheld-delete reason, so a withhold never reads as an unexplained refusal. */
|
|
235
168
|
const WITHHELD_HINTS = {
|
|
236
169
|
'weak-signal-needs-confirmation':
|
|
237
170
|
'detected only by content-equivalence; re-run interactively or pass --include-content-merged',
|
|
238
171
|
};
|
|
239
172
|
|
|
240
|
-
/**
|
|
241
|
-
* Pure: render a per-branch execution line.
|
|
242
|
-
*
|
|
243
|
-
* An entry marked `skipped` is a delete the executor deliberately
|
|
244
|
-
* withheld rather than one it attempted — it must not render with the
|
|
245
|
-
* `✅` of a completed reap, which is exactly the misreport that would let
|
|
246
|
-
* an operator believe an unattended run had cleaned up a ref it left
|
|
247
|
-
* standing.
|
|
248
|
-
*/
|
|
173
|
+
/** A `skipped` entry was withheld, not attempted — never render it as ✅. */
|
|
249
174
|
export function renderExecutionLine(entry, scope) {
|
|
250
175
|
const label = scope.padEnd(8);
|
|
251
176
|
const tagName =
|
|
@@ -263,7 +188,6 @@ export function renderExecutionLine(entry, scope) {
|
|
|
263
188
|
return `${TAG} ${icon} ${label} ${tagName}${note}`;
|
|
264
189
|
}
|
|
265
190
|
|
|
266
|
-
/** Pure: render the optional prune line. */
|
|
267
191
|
export function renderPruneLine(prune) {
|
|
268
192
|
if (!prune?.attempted) return null;
|
|
269
193
|
if (!prune.ok) {
|
|
@@ -277,12 +201,8 @@ export function renderPruneLine(prune) {
|
|
|
277
201
|
}
|
|
278
202
|
|
|
279
203
|
/**
|
|
280
|
-
*
|
|
281
|
-
*
|
|
282
|
-
* branch's directory) is non-fatal — the branch ref was still reaped and
|
|
283
|
-
* the directory is handed off to the pending-cleanup sweep. Returns the
|
|
284
|
-
* operator-facing warning so the deferred signal is visible even on a
|
|
285
|
-
* clean (`ok: true`) run.
|
|
204
|
+
* A lock-class worktree removal failure (Windows file lock) is non-fatal:
|
|
205
|
+
* the ref was reaped and the directory deferred. Shown even on an `ok` run.
|
|
286
206
|
*
|
|
287
207
|
* @param {{ branch?: string, path: string, pendingCleanup?: object|null }} entry
|
|
288
208
|
* @returns {string}
|
|
@@ -295,7 +215,6 @@ export function renderDeferredLine(entry) {
|
|
|
295
215
|
return `${TAG} ⚠️ deferred ${ref}${entry.path} — worktree locked; ref reaped${handoff}`;
|
|
296
216
|
}
|
|
297
217
|
|
|
298
|
-
/** Pure: render the trailing summary line. */
|
|
299
218
|
export function renderExecutionSummary(result) {
|
|
300
219
|
if (!result.ok) {
|
|
301
220
|
return `${TAG} ❌ ${result.failures.length} failure(s) during cleanup.`;
|
|
@@ -308,8 +227,7 @@ export function renderExecutionSummary(result) {
|
|
|
308
227
|
deferredCount > 0
|
|
309
228
|
? ` (${deferredCount} worktree(s) deferred to sweep)`
|
|
310
229
|
: '';
|
|
311
|
-
//
|
|
312
|
-
// were never deleted — counting them would overstate the reap.
|
|
230
|
+
// Withheld remote entries were never deleted; don't count them.
|
|
313
231
|
const remoteDeleted = result.remote.filter((r) => !r.skipped).length;
|
|
314
232
|
const withheldCount = result.remote.length - remoteDeleted;
|
|
315
233
|
const withheldNote =
|
|
@@ -329,7 +247,6 @@ const EMPTY_RESULT = Object.freeze({
|
|
|
329
247
|
ok: true,
|
|
330
248
|
});
|
|
331
249
|
|
|
332
|
-
/** Pure: build the JSON envelope emitted in `--json` mode. */
|
|
333
250
|
export function buildJsonEnvelope({
|
|
334
251
|
dryRun,
|
|
335
252
|
baseBranch,
|
|
@@ -365,8 +282,7 @@ function legacyExitCode(plan, result) {
|
|
|
365
282
|
}
|
|
366
283
|
|
|
367
284
|
/**
|
|
368
|
-
*
|
|
369
|
-
* `(plan, result)` signature and the new multi-phase context object.
|
|
285
|
+
* Accepts `(plan, result)` or a multi-phase context object.
|
|
370
286
|
*
|
|
371
287
|
* @param {{ candidates?: Array, branchesPlan?: object, branchesResult?: object, fastForward?: object, prune?: object, stashes?: object } | { candidates: Array }} ctx
|
|
372
288
|
* @param {{ ok: boolean } | null | undefined} [legacyResult]
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Owns `parseStashList`, `planStashes`, `executeStashes`, `stashRefIndex`,
|
|
5
|
-
* and `buildAllowlistDecider`. Extracted verbatim from `git-cleanup.js`.
|
|
2
|
+
* Stash-triage phase of git-cleanup.
|
|
6
3
|
*
|
|
7
4
|
* @module lib/orchestration/git-cleanup/phases/stashes
|
|
8
5
|
*/
|
|
@@ -1,69 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lease-guard-shared.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* each carried their own copy of
|
|
8
|
-
* the operator-handle resolution and the fail-closed acquire wrapper around
|
|
9
|
-
* `ticket-lease.acquireLease` (refuse any foreign assignee, throwing an
|
|
10
|
-
* operator-facing message naming the current owner unless `--steal`). The
|
|
11
|
-
* three copies had
|
|
12
|
-
* already diverged — different `resolveOperator` signatures and different
|
|
13
|
-
* missing-handle behaviour (`null` vs `throw`) — and were synchronised only
|
|
14
|
-
* by docstring promise ("This mirrors the sibling lease guards…").
|
|
15
|
-
*
|
|
16
|
-
* This module is the single home for the kernel, modelled on the
|
|
17
|
-
* shared plumbing inside `story-close/format-autofix.js` (Story #3332,
|
|
18
|
-
* consolidated by Story #4017). The
|
|
19
|
-
* per-surface guards now differ only in injected **policy**:
|
|
20
|
-
*
|
|
21
|
-
* - **Operator candidates** — each surface supplies its own ordered
|
|
22
|
-
* candidate list (e.g. `--as` flag → `github.operatorHandle` →
|
|
23
|
-
* `git user.email` for `/mandrel-deliver`; bare `operatorHandle` for the
|
|
24
|
-
* plan/standalone paths).
|
|
25
|
-
* - **Missing-handle behaviour** — `'null'` (return null; the caller fails
|
|
26
|
-
* closed at acquire time) vs `'throw'` (refuse immediately with surface
|
|
27
|
-
* wording). The divergence between the plan path (`null`) and the
|
|
28
|
-
* standalone path (`throw`) is intentional: the plan path also calls
|
|
29
|
-
* `resolveOperator` on its best-effort release leg, where a missing
|
|
30
|
-
* handle must degrade to a `no-operator` no-op rather than throw.
|
|
31
|
-
* - **Refusal wording** — each surface renders its own operator-facing
|
|
32
|
-
* message via `renderRefusal(result, ticketId)`.
|
|
33
|
-
*
|
|
34
|
-
* A third axis, **liveness anchoring**, is gone: Story #5006 deleted the
|
|
35
|
-
* lease TTL, so every foreign claim refuses unconditionally and there is no
|
|
36
|
-
* heartbeat to anchor.
|
|
37
|
-
*
|
|
38
|
-
* The unclaimed / already-held / foreign-claim decision table itself (and
|
|
39
|
-
* the steal transfer) lives in `ticket-lease.acquireLease`; this kernel owns
|
|
40
|
-
* the refuse-by-throw boundary that the three guards previously each
|
|
41
|
-
* re-implemented.
|
|
42
|
-
*
|
|
43
|
-
* Per `.agents/rules/orchestration-error-handling.md`, failures surface via
|
|
44
|
-
* `throw new Error(...)`, never `Logger.fatal`.
|
|
2
|
+
* lease-guard-shared.js — the lease-acquisition kernel shared by lease
|
|
3
|
+
* guards; surfaces differ only in injected policy (operator candidates,
|
|
4
|
+
* missing-handle behaviour, refusal wording). The claim decision table lives
|
|
5
|
+
* in `ticket-lease.acquireLease`; this owns the refuse-by-throw boundary.
|
|
6
|
+
* Failures throw, never `Logger.fatal`.
|
|
45
7
|
*/
|
|
46
8
|
|
|
47
9
|
import { acquireLease, normalizeOperatorHandle } from './ticket-lease.js';
|
|
48
10
|
|
|
49
11
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* Each candidate is passed through the shared `normalizeOperatorHandle` so a
|
|
54
|
-
* leading `@` is stripped (the assignees API expects bare logins, not
|
|
55
|
-
* `@`-prefixed mentions) and the shipped `@[USERNAME]` placeholder maps to
|
|
56
|
-
* `null` — otherwise the assignee PATCH is rejected (HTTP 422) and the
|
|
57
|
-
* self-held-claim comparison (`owner === operator`) never matches. The first
|
|
58
|
-
* candidate that normalises to a non-null handle wins.
|
|
12
|
+
* First candidate that normalizes to a bare login (strips `@`, maps the
|
|
13
|
+
* `@[USERNAME]` placeholder to `null` — else the assignee PATCH 422s).
|
|
14
|
+
* `'null'` suits paths with a best-effort release leg, which must no-op.
|
|
59
15
|
*
|
|
60
16
|
* @param {object} opts
|
|
61
17
|
* @param {Array<string|null|undefined>} opts.candidates Ordered raw handles.
|
|
62
|
-
* @param {'null'|'throw'} [opts.missingHandleBehavior='null']
|
|
63
|
-
*
|
|
64
|
-
* configured wording.
|
|
65
|
-
* @param {string} [opts.missingHandleMessage] Error message used when
|
|
66
|
-
* `missingHandleBehavior` is `'throw'`.
|
|
18
|
+
* @param {'null'|'throw'} [opts.missingHandleBehavior='null']
|
|
19
|
+
* @param {string} [opts.missingHandleMessage]
|
|
67
20
|
* @returns {string|null} Bare operator handle, or `null` (policy `'null'`).
|
|
68
21
|
* @throws {Error} When no candidate resolves and the policy is `'throw'`.
|
|
69
22
|
*/
|
|
@@ -83,19 +36,15 @@ export function resolveOperatorFromCandidates({
|
|
|
83
36
|
}
|
|
84
37
|
|
|
85
38
|
/**
|
|
86
|
-
* Acquire a
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* Unclaimed and self-held tickets proceed — the self-held case without a
|
|
90
|
-
* write. A foreign assignee always refuses unless `steal` is set.
|
|
39
|
+
* Acquire a lease; a foreign claim without `steal` throws the surface's
|
|
40
|
+
* refusal.
|
|
91
41
|
*
|
|
92
42
|
* @param {object} opts
|
|
93
|
-
* @param {object} opts.provider
|
|
94
|
-
* @param {number} opts.ticketId
|
|
95
|
-
* @param {string} opts.operator
|
|
96
|
-
* @param {boolean} [opts.steal=false]
|
|
43
|
+
* @param {object} opts.provider
|
|
44
|
+
* @param {number} opts.ticketId
|
|
45
|
+
* @param {string} opts.operator
|
|
46
|
+
* @param {boolean} [opts.steal=false]
|
|
97
47
|
* @param {(result: object, ticketId: number) => string} opts.renderRefusal
|
|
98
|
-
* Renders the operator-facing refusal message for a refused claim.
|
|
99
48
|
* @returns {Promise<{ acquired: boolean, owner: string, previousOwner: string|null, reason: string }>}
|
|
100
49
|
* @throws {Error} When the claim is refused (`result.acquired === false`).
|
|
101
50
|
*/
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `emit-merge-unlanded.js` and `emit-merge-flip-failed.js` report the two
|
|
6
|
-
* terminal outcomes a landing attempt can reach without ending at
|
|
7
|
-
* `agent::done`. They share everything except their schema and their
|
|
8
|
-
* payload's meaning, so the Ajv compile/cache, the scope→ledger routing,
|
|
9
|
-
* and the NDJSON append live here once rather than being copy-pasted.
|
|
10
|
-
*
|
|
11
|
-
* Like its callers, this is a bare `appendFileSync` rather than a bus
|
|
12
|
-
* publish: these events fire from the `single-story-close` flow, which has
|
|
13
|
-
* no bus at all, so a direct append keeps the call site dependency-free.
|
|
2
|
+
* Shared schema-validate-and-append core for the merge-terminal lifecycle
|
|
3
|
+
* emitters (outcomes that end short of `agent::done`).
|
|
14
4
|
*/
|
|
15
5
|
|
|
16
6
|
import { appendFileSync, mkdirSync, readFileSync } from 'node:fs';
|
|
@@ -34,14 +24,8 @@ const SCHEMA_DIR = path.resolve(
|
|
|
34
24
|
);
|
|
35
25
|
|
|
36
26
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* Note the deliberate asymmetry with the `merge.unlanded` /
|
|
41
|
-
* `merge.flip-failed` schema enums, which still accept `'epic'`: archived
|
|
42
|
-
* ledger records carry `scope: 'epic'` and the schemas must keep validating
|
|
43
|
-
* them on read. The value stays READABLE; only the writer path is gone —
|
|
44
|
-
* the same split `merge-block-class.js` keeps for `predicate-refused`.
|
|
27
|
+
* Writable scopes. The schemas still accept `'epic'` so archived records
|
|
28
|
+
* keep validating on read; only the writer path is gone.
|
|
45
29
|
*/
|
|
46
30
|
const VALID_SCOPES = new Set(['story']);
|
|
47
31
|
|
|
@@ -49,9 +33,7 @@ const VALID_SCOPES = new Set(['story']);
|
|
|
49
33
|
const _validators = new Map();
|
|
50
34
|
|
|
51
35
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* @param {string} schemaFile Basename under `.agents/schemas/lifecycle/`.
|
|
36
|
+
* @param {string} schemaFile
|
|
55
37
|
* @returns {Function}
|
|
56
38
|
*/
|
|
57
39
|
function getValidator(schemaFile) {
|
|
@@ -68,9 +50,6 @@ function getValidator(schemaFile) {
|
|
|
68
50
|
}
|
|
69
51
|
|
|
70
52
|
/**
|
|
71
|
-
* Assert the fields every merge-terminal event shares. Throws with the
|
|
72
|
-
* caller's own emitter name so the message stays attributable.
|
|
73
|
-
*
|
|
74
53
|
* @param {string} emitter
|
|
75
54
|
* @param {{ scope: string, ticketId: number, prNumber: number, reason: string, elapsedSeconds: number }} fields
|
|
76
55
|
*/
|
|
@@ -98,17 +77,14 @@ export function assertMergeTerminalFields(
|
|
|
98
77
|
}
|
|
99
78
|
|
|
100
79
|
/**
|
|
101
|
-
* Validate a payload against its lifecycle schema and append exactly one
|
|
102
|
-
* NDJSON record to the scope-resolved ledger.
|
|
103
|
-
*
|
|
104
80
|
* @param {object} args
|
|
105
|
-
* @param {string} args.emitter
|
|
106
|
-
* @param {string} args.schemaFile
|
|
107
|
-
* @param {object} args.payload
|
|
81
|
+
* @param {string} args.emitter
|
|
82
|
+
* @param {string} args.schemaFile
|
|
83
|
+
* @param {object} args.payload
|
|
108
84
|
* @param {number} args.ticketId
|
|
109
85
|
* @param {string} args.timestamp
|
|
110
86
|
* @param {object} [args.config]
|
|
111
|
-
* @param {string} [args.ledgerPath]
|
|
87
|
+
* @param {string} [args.ledgerPath]
|
|
112
88
|
* @returns {{ ledgerPath: string, record: object }}
|
|
113
89
|
*/
|
|
114
90
|
export function appendLedgerEvent({
|
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* label write itself failed.
|
|
7
|
-
*
|
|
8
|
-
* Why this is not `merge.unlanded`: the merge landed. Reporting it as
|
|
9
|
-
* unlanded points the operator at branch protection, required checks, and
|
|
10
|
-
* poll budgets — none of which are the fault — while the real remedy is a
|
|
11
|
-
* re-run of `single-story-confirm-merge.js`, which is idempotent and flips
|
|
12
|
-
* the label from the already-merged PR. The two events are deliberately
|
|
13
|
-
* distinct so the ledger attributes a label-write API failure differently
|
|
14
|
-
* from a merge that never happened.
|
|
15
|
-
*
|
|
16
|
-
* The Story is still transitioned to `agent::blocked` by the caller: a
|
|
17
|
-
* merged PR whose Story sits at `agent::closing` is exactly the silent
|
|
18
|
-
* strand the must-land contract exists to prevent, so it terminates
|
|
19
|
-
* explicitly — but it terminates with the truth.
|
|
2
|
+
* Record a confirmed merge whose `agent::done` label write failed. Distinct
|
|
3
|
+
* from `merge.unlanded` because the merge landed — the remedy is re-running
|
|
4
|
+
* the idempotent confirm-merge, not chasing branch protection. The caller
|
|
5
|
+
* still blocks the Story so it is never stranded at `agent::closing`.
|
|
20
6
|
*/
|
|
21
7
|
|
|
22
8
|
import {
|
|
@@ -24,22 +10,15 @@ import {
|
|
|
24
10
|
assertMergeTerminalFields,
|
|
25
11
|
} from './emit-ledger-event.js';
|
|
26
12
|
|
|
27
|
-
/**
|
|
28
|
-
* The only block class this event carries. Distinct from every
|
|
29
|
-
* `merge.unlanded` attribution (`MERGE_UNLANDED_BLOCK_CLASSES`) because the
|
|
30
|
-
* merge is not in question here — only the label write is.
|
|
31
|
-
*/
|
|
32
13
|
export const MERGED_FLIP_FAILED_BLOCK_CLASS = 'merged-flip-failed';
|
|
33
14
|
|
|
34
15
|
/**
|
|
35
|
-
* Append exactly one `merge.flip-failed` record to the resolved ledger.
|
|
36
|
-
*
|
|
37
16
|
* @param {object} opts
|
|
38
17
|
* @param {'story'} opts.scope
|
|
39
|
-
* @param {number} opts.ticketId
|
|
40
|
-
* @param {number} opts.prNumber
|
|
41
|
-
* @param {string} opts.reason
|
|
42
|
-
* @param {number} opts.elapsedSeconds
|
|
18
|
+
* @param {number} opts.ticketId
|
|
19
|
+
* @param {number} opts.prNumber
|
|
20
|
+
* @param {string} opts.reason
|
|
21
|
+
* @param {number} opts.elapsedSeconds
|
|
43
22
|
* @param {string} [opts.timestamp]
|
|
44
23
|
* @param {object} [opts.config]
|
|
45
24
|
* @param {string} [opts.ledgerPath]
|
|
@@ -1,52 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `single-story-close` flow, and a bare append keeps the call site simple and
|
|
9
|
-
* dependency-free. This was the shape that outlived the lifecycle bus — Story
|
|
10
|
-
* #5024 retired the bus, leaving this path the only lifecycle-ledger writer.
|
|
11
|
-
*
|
|
12
|
-
* Ledger destination (Story #4426 AC4): `storyLedgerPath(null, ticketId)`
|
|
13
|
-
* — the standalone story-scope destination
|
|
14
|
-
* `temp/standalone/stories/story-<id>/lifecycle.ndjson`, where `ticketId`
|
|
15
|
-
* is the storyId. The `single-story-close` path has no parent Epic to
|
|
16
|
-
* anchor a run directory to, mirroring the `eid === null` standalone
|
|
17
|
-
* convention `signalsFile` already uses for Story-level signals.
|
|
18
|
-
*
|
|
19
|
-
* A caller may always override the destination via `ledgerPath` (tests,
|
|
20
|
-
* or a future caller with a non-default temp layout).
|
|
21
|
-
*
|
|
22
|
-
* Distinct from:
|
|
23
|
-
* - `epic.merge.blocked` — AutomergePredicate's "not safe to arm yet"
|
|
24
|
-
* signal, evaluated BEFORE arming. `merge.unlanded` fires AFTER a
|
|
25
|
-
* delivery flow has already finished trying and gives up.
|
|
26
|
-
* - `epic.blocked` / `story.blocked` — the generic `agent::blocked`
|
|
27
|
-
* transition signal. `merge.unlanded` is the merge-specific
|
|
28
|
-
* diagnosis a `*.blocked` transition is typically paired with, not a
|
|
29
|
-
* replacement for it.
|
|
30
|
-
*
|
|
31
|
-
* The emit is best-effort in the sense that a failure to append MUST NOT
|
|
32
|
-
* mask the underlying blocked-state transition the caller is already
|
|
33
|
-
* driving — callers should treat this the same way
|
|
34
|
-
* `emitStoryHeartbeat` documents: catch, log, and proceed with the label
|
|
35
|
-
* flip / friction comment regardless.
|
|
36
|
-
*
|
|
37
|
-
* Schema contract (merge.unlanded.schema.json):
|
|
38
|
-
* { event, scope, ticketId, prNumber, blockClass, reason,
|
|
39
|
-
* elapsedSeconds, timestamp? }
|
|
40
|
-
*
|
|
41
|
-
* The schema declares `additionalProperties: false`, so this emitter's
|
|
42
|
-
* signature is deliberately narrow: only the schema-allowed fields are
|
|
43
|
-
* accepted. `blockClass` MUST be a valid `merge.unlanded` attribution from
|
|
44
|
-
* `merge-block-class.js` (`MERGE_UNLANDED_BLOCK_CLASSES` — the four
|
|
45
|
-
* `classifyMergeBlock` outputs plus the directly-emitted `predicate-refused`,
|
|
46
|
-
* Story #4472). For a post-arm poll-exhaustion block, pass the classifier's
|
|
47
|
-
* verdict straight through (`classifyMergeBlock(...)` returns
|
|
48
|
-
* `{ blockClass, reason }`); the predicate/armer refusal paths pass
|
|
49
|
-
* `predicate-refused` / a classified arm failure directly.
|
|
2
|
+
* Append one `merge.unlanded` record to the Story's lifecycle ledger when a
|
|
3
|
+
* delivery run gives up without a confirmed merge (after arming, unlike the
|
|
4
|
+
* pre-arm `epic.merge.blocked`). Callers must catch a failed append and still
|
|
5
|
+
* drive the blocked-state transition. The schema forbids extra properties, so
|
|
6
|
+
* the signature is narrow; `blockClass` must be a `merge-block-class.js`
|
|
7
|
+
* value.
|
|
50
8
|
*/
|
|
51
9
|
|
|
52
10
|
import { isValidBlockClass } from '../merge-block-class.js';
|
|
@@ -56,27 +14,16 @@ import {
|
|
|
56
14
|
} from './emit-ledger-event.js';
|
|
57
15
|
|
|
58
16
|
/**
|
|
59
|
-
* Append exactly one `merge.unlanded` NDJSON record to the resolved
|
|
60
|
-
* lifecycle ledger.
|
|
61
|
-
*
|
|
62
17
|
* @param {object} opts
|
|
63
|
-
* @param {'story'} opts.scope
|
|
64
|
-
*
|
|
65
|
-
* @param {number} opts.
|
|
66
|
-
* @param {
|
|
67
|
-
* @param {string} opts.
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* @param {
|
|
71
|
-
*
|
|
72
|
-
* @param {number} opts.elapsedSeconds Elapsed watch/poll time when the
|
|
73
|
-
* run gave up.
|
|
74
|
-
* @param {string} [opts.timestamp] ISO-8601 wall clock. Defaults to
|
|
75
|
-
* now().
|
|
76
|
-
* @param {object} [opts.config] Optional resolved config for
|
|
77
|
-
* tempRoot.
|
|
78
|
-
* @param {string} [opts.ledgerPath] Override for tests / non-default
|
|
79
|
-
* layouts.
|
|
18
|
+
* @param {'story'} opts.scope
|
|
19
|
+
* @param {number} opts.ticketId
|
|
20
|
+
* @param {number} opts.prNumber
|
|
21
|
+
* @param {string} opts.blockClass
|
|
22
|
+
* @param {string} opts.reason
|
|
23
|
+
* @param {number} opts.elapsedSeconds
|
|
24
|
+
* @param {string} [opts.timestamp]
|
|
25
|
+
* @param {object} [opts.config]
|
|
26
|
+
* @param {string} [opts.ledgerPath]
|
|
80
27
|
* @returns {{ ledgerPath: string, record: object }}
|
|
81
28
|
*/
|
|
82
29
|
export function emitMergeUnlanded(opts) {
|