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.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -8,26 +8,24 @@ description:
8
8
 
9
9
  # /mandrel-deliver — reference appendix (on-demand)
10
10
 
11
- Reference-only detail split out of [`mandrel-deliver.md`](../mandrel-deliver.md) so the
12
- always-resident spine stays lean. Nothing here is a new MUST —
13
- it is the mechanics an operator consults when the matching lever is engaged.
11
+ Reference-only detail split out of [`mandrel-deliver.md`](../mandrel-deliver.md).
12
+ Nothing here is a new MUST — it is the mechanics an operator consults when the
13
+ matching lever is engaged.
14
14
 
15
15
  ## Ranges (`4922 - 4926`) {#ranges}
16
16
 
17
- A contiguous span is how an operator reads a plan run, so the dash range is a
18
- first-class id shape rather than prose to interpret — `/mandrel-deliver 4922 - 4926`
17
+ A contiguous span is a first-class id shape — `/mandrel-deliver 4922 - 4926`
19
18
  means exactly the five ids in it.
20
19
 
21
20
  **Pass the span through; never expand it by hand.** Every id-list flag on the
22
21
  delivery path takes range tokens — `resolve-stories.js --ids`,
23
- `stories-wave-tick.js --stories` and `--dispatched`, and
22
+ `deliver-run.js --stories` and `--handoff`, and
24
23
  `plan-run-epilogue.js --stories`. Normalize the operator's spacing away and hand
25
24
  the scripts one unspaced token (`--ids 4922-4926`), mixed freely with singles
26
25
  and commas (`--ids 4901,4922-4926`); overlaps dedupe. A hand-typed enumeration
27
26
  is where an id gets dropped or invented, and the drop is silent.
28
27
 
29
- The shared expander (`lib/util/parse-id-list.js`) refuses rather than guesses,
30
- so a typo fails where it was typed instead of resolving the wrong set:
28
+ The shared expander (`lib/util/parse-id-list.js`) refuses rather than guesses:
31
29
 
32
30
  | Input | Outcome |
33
31
  | --- | --- |
@@ -36,25 +34,36 @@ so a typo fails where it was typed instead of resolving the wrong set:
36
34
  | `1-4926` | Refused — above the 50-id span cap (`MAX_RANGE_SPAN`). |
37
35
  | `4922-`, `-4926`, `4922-4923-4924` | Refused as a malformed token. |
38
36
 
39
- The cap is per range token, not per run: a genuine 60-Story delivery is still
40
- expressible as two ranges, but a slipped digit cannot fan out into a live
41
- resolution sweep of thousands of issues.
37
+ The cap is per range token, not per run: a 60-Story delivery is still two
38
+ ranges.
42
39
 
43
- ## Sequencing edge cases (`stories-wave-tick.js`)
40
+ ## Sequencing edge cases (`deliver-run.js` over `stories-wave-tick.js`)
44
41
 
45
42
  **What "discovered, not declared" means concretely.** `resolve-stories.js` reads
46
43
  the graph from live state as the union of the Story bodies' `depends_on` edges
47
44
  and GitHub's native `blocked_by` edges, resolving each blocker against its real
48
- issue state rather than against anything you hand it. That is why there is no
49
- batch label to pass and why a blocker that landed in an unrelated run is simply
50
- seen as done.
45
+ issue state. That is why there is no batch label to pass and why a blocker that
46
+ landed in an unrelated run is simply seen as done.
51
47
 
52
48
  **A Story with no `agent::*` label is refused.** The audit sweep files Stories
53
49
  deliberately without one — their bodies are audit prose, not a scoped change
54
- with verifiable acceptance criteria — so resolving one means dispatching a
55
- worker at an unenriched body, after taking its lease. Route it through
56
- `/mandrel-plan` first, which applies `agent::ready` at the end of planning.
57
- `--allow-unlabelled` is the deliberate escape hatch.
50
+ with verifiable acceptance criteria. Route it through `/mandrel-plan` first,
51
+ which applies `agent::ready` at the end of planning. `--allow-unlabelled` is
52
+ the deliberate escape hatch.
53
+
54
+ **Inspecting a beat without taking one.** `deliver-run.js` writes — the ledger,
55
+ the prompts. The tick underneath it is read-only and answers "what *would* the
56
+ next beat do?":
57
+
58
+ ```bash
59
+ node .agents/scripts/stories-wave-tick.js --stories <id,id,...> --probe-live
60
+ ```
61
+
62
+ Its envelope is the beat's scheduling half verbatim — `ready`, `inFlight`,
63
+ `inFlightReservation`, `footprintGuard`, `foreignHeld`, `wedged`. Read it when
64
+ a slot is unfilled and you want to know why before acting. Do **not** drive a
65
+ run from it: without the ledger the init window reopens, and the same Story is
66
+ handed out twice.
58
67
 
59
68
  **The non-zero exit codes.** **2** — `cycleError`: the graph is
60
69
  self-referential; fix `depends_on`, do not retry. **3** — `wedged`: nothing
@@ -74,69 +83,62 @@ turn, not a slow beat.
74
83
  Each beat re-probes live state: it re-resolves the graph, classifies **done**
75
84
  (`agent::done` or a closed issue — including foreign blockers that landed in
76
85
  another run), and derives **in-flight** from live `agent::executing` /
77
- `agent::closing` labels. You never compute `done` or `in-flight` — that
78
- accounting is read from reality every beat.
79
-
80
- **`--dispatched` is the one thing you must tell it.** List every
81
- Story id you have spawned this run. Live state cannot instantly report a Story
82
- you dispatched moments ago: `single-story-init.js` publishes `agent::executing`
83
- before the worktree install (ahead of the multi-minute install, so the
84
- window is short rather than minutes-long), but it is not
85
- zero — until the label lands the Story still reads `agent::ready` and, without
86
- `--dispatched`, the next beat would hand it back and a second sub-agent would
87
- join the first on the same branch and worktree, interleaving commits.
88
- `--dispatched` closes that residual same-run window. The rule is
89
- **append-only: add each id as you dispatch it and never remove one.** The flag
86
+ `agent::closing` labels. You never compute `done` or `in-flight`.
87
+
88
+ **The run ledger closes the init window, and you maintain nothing.** Until
89
+ `single-story-init.js` publishes `agent::executing`, a just-dispatched Story
90
+ still reads `agent::ready`, and an unaugmented beat would hand it out again.
91
+ `deliver-run.js` records every id it hands out in
92
+ `<tempRoot>/run-<id>/ledger.json` and seeds the next beat with it. The ledger
90
93
  is additive, not authoritative — the probe unions it into the label-derived set
91
- and then filters it against live state, so an id that has since gone
92
- `agent::done` is dropped for you. Re-listing an id costs nothing and cannot
93
- double-count a slot; *omitting* one is the only way to get this wrong. This is
94
- why `--dispatched` is not the retired `--done` bookkeeping, and why
95
- `--in-flight` remains rejected under `--probe-live`.
94
+ and filters it against live state, so an id that has gone `agent::done` drops
95
+ out. A missing or corrupt ledger costs one extra beat of the init window, never
96
+ the run. The run id is a stable digest of the Story id set, so every beat of
97
+ one run finds the same ledger; `--run-id` pins it explicitly.
98
+
99
+ **A spawn that never reached init is the ledger's one sharp edge.** If a spawn
100
+ dies before `single-story-init.js` runs, the id stays ledgered and is withheld
101
+ as in flight on every later beat — an empty `ready[]` with a non-zero
102
+ `inFlight` that reads like a healthy wait. The beat names it: every ledgered id
103
+ live state still reports as `agent::ready` appears in `stalledDispatch[]`, with
104
+ the recovery in `stalledDispatchReason` — its **own** reason, not a footprint
105
+ withhold and not a foreign lease.
106
+
107
+ It is a report, not a release: a slow init and a dead spawn look identical, and
108
+ auto-releasing would re-dispatch a live Story onto its own branch. So the
109
+ operator owns the call: confirm no worker is running, remove the id from
110
+ `dispatched` in `<tempRoot>/run-<id>/ledger.json` (deleting the file works too,
111
+ at the cost of reopening the init window for the rest), and beat again with
112
+ `--run-id <id>` so the same run directory is reused.
96
113
 
97
114
  **Cross-run de-confliction is automatic.** A Story another
98
115
  operator is delivering is withheld without any bookkeeping from you: the probe
99
116
  reads the Story's assignee lease and, when it belongs to a different operator,
100
117
  withholds the Story and reports it in the envelope's
101
118
  `foreignHeld: [{ id, holder }]` (with `foreignHeldReason`). That is not a
102
- failure or a wedge — the holder's run owns the branch, and this run picks the
103
- Story up automatically once their lease clears. Init is the backstop: it
104
- refuses a Story already labelled `agent::executing`, or one whose lease a
105
- different operator holds, unless you pass `--steal`. Assignee-based withholding
106
- needs `github.operatorHandle` set (in `.agentrc.local.json`); without it the
107
- probe logs a warning and leans on init's lease refusal alone.
119
+ failure or a wedge — this run picks the Story up once their lease clears. Init
120
+ is the backstop: it refuses a Story already labelled `agent::executing`, or one
121
+ whose lease a different operator holds, unless you pass `--steal`.
122
+ Assignee-based withholding needs `github.operatorHandle` set (in
123
+ `.agentrc.local.json`); without it the probe logs a warning and leans on init's
124
+ lease refusal alone.
108
125
 
109
126
  **Overlapping footprints are reserved across beats, not just within one.** A
110
127
  Story sharing a **concrete** path with a still-implementing Story is withheld
111
128
  and named in `inFlightReservation: { available, withheld: [{ id, blockedBy,
112
129
  reason, source, paths }], note }`, where `reason` is `in-flight-earlier-beat` or
113
130
  `foreign-lease`. Like `foreignHeld` this is neither a failure nor a wedge — the
114
- Story re-admits automatically once its blocker leaves the in-flight set — and
115
- it exists so an unfilled slot is explained rather than mysterious. A **glob**
116
- footprint (or the UNKNOWN sentinel for an unparseable body) reserves nothing
117
- across beats; it still serializes its own beat. Reservation needs the in-flight
118
- Stories' footprints, so it is a `--probe-live` capability: under `--dag` the
119
- report is `available: false` and selection de-conflicts within the beat only.
131
+ Story re-admits automatically once its blocker leaves the in-flight set. A
132
+ **glob** footprint (or the UNKNOWN sentinel for an unparseable body) reserves
133
+ nothing across beats; it still serializes its own beat. Reservation is a
134
+ `--probe-live` capability: under `--dag` the report is `available: false` and
135
+ selection de-conflicts within the beat only.
120
136
 
121
137
  **Beat-local skips are reported too**, in `footprintGuard: { mode, withheld,
122
- advisory, note }`. They used to be an unreported skip, so a Story simply
123
- vanished from `ready[]` and an unfilled slot read exactly like a cap that was
124
- never reached. Every entry in **either** report carries the colliding `paths`
125
- and a `source` tag:
126
-
127
- - `declared-overlap` — both Stories' `changes[]` named the path (or a declared
128
- glob). Intended serialization; two Stories rewriting the same generated
129
- baseline must not co-dispatch.
130
- - `scraped-overlap` — only the text evidence produced it. Real signal — a
131
- declaration is only a lower bound — but the class where a false positive is
132
- possible.
133
-
134
- **The evidence scrape excludes exactly three token sources**, each structurally
135
- incapable of naming an edit target: `audit-fingerprints` /
136
- `audit-semantic-keys` provenance footers, paths under `project.paths.tempRoot`,
137
- and markdown-link URL interiors. Nothing else is stripped — a
138
- `<!-- DECOMPOSITION -->` block's paths are genuine intent
139
- ([`instructions.md` § 7](../../instructions.md)) and still count.
138
+ advisory, note }`. Every entry in **either** report carries the colliding
139
+ `paths` and one `source` tag, `declared-overlap`: both Stories' `changes[]`
140
+ named the path, or one declared a glob. A declared footprint is the whole
141
+ footprint — `changes[]` is the only evidence a collision is scored against.
140
142
 
141
143
  **`delivery.deliverRunner.footprintGuard`** selects what a collision does:
142
144
 
@@ -147,47 +149,24 @@ and markdown-link URL interiors. Nothing else is stripped — a
147
149
 
148
150
  ## Dispatch mechanics (role-scoped by default)
149
151
 
150
- **A single-Story run executes inline.** Sub-agent isolation is
151
- load-bearing only for **concurrent** dispatch — two workers sharing a checkout
152
- would race on worktrees and branch refs — so a run resolving exactly one Story
153
- has no sibling to isolate from and pays the spawn premium for nothing (a boot is
154
- a cache write at full rate; an inline continuation is a cache read at ~10%).
155
- `resolve-stories.js` already reports it: a one-id run comes back with
156
- `dispatchMode: "inline"` whatever the Story's shape. Role-scoped spawning is
157
- retained in full for multi-Story waves, and the rule changes **where** the
158
- engine runs, never what runs — gates, PR, and terminal envelope are identical.
159
-
160
- **Read the mode; never infer it from shape.** Before spawning
161
- anything, read the Story's `dispatchMode` from the resolver envelope
162
- (`stories[].dispatchMode`, produced by `resolveStoryDispatchMode` in
163
- `lib/orchestration/complexity-gate.js`, which decides on the resolved set size
164
- alone — it does not read the Story body). A Story with `dispatchMode: "inline"`
165
- executes [`deliver-story.md`](deliver-story.md) **inline in this session** — no
166
- `story-worker` sub-agent boot and no fresh acceptance-critic sub-agents
167
- (sub-agent boots are the dominant deliver-phase token cost at trivial scope) —
168
- threading the same `docsDigestPath` / `checklistPath` / change-set discipline
169
- as a spawned worker. Inline removes model-side fan-out only: every
170
- `single-story-close.js` gate, the PR to `main`, and the terminal envelope are
171
- identical.
172
-
173
- **A trivial shape does not buy that session.** Only the
174
- one-Story rule above yields `inline`; every Story of a multi-Story run comes
175
- back `subagent` however lite its body, because the ready set below may offer
176
- several Stories on one beat and a session cannot be split between them. The
177
- Story's derived shape is still reported (it sets ceremony, and a sensitive
178
- footprint keeps the fresh acceptance critic), and the `route::lite` label
179
- remains a human-visible hint only, never the control signal — a lost or
180
- never-written label cannot misroute delivery.
181
-
182
- **Issue a beat's spawns in one turn.** A wave tick hands you a ready set, not a
183
- queue: those Stories have no dependency edge between them (the resolver already
184
- withheld any that do) and no shared write paths (each owns its own worktree and
185
- branch). Dispatch them the way
152
+ **Read the mode; never infer it from shape.** Before spawning anything, read
153
+ the Story's `dispatchMode` from the resolver envelope (`stories[].dispatchMode`,
154
+ from `resolveStoryDispatchMode` in `lib/orchestration/complexity-gate.js`,
155
+ which decides on the resolved set size alone). The rule is digest § 1: a
156
+ one-Story run is `inline`, every Story of a multi-Story run is `subagent`
157
+ however lite its body. A Story with `dispatchMode: "inline"` executes
158
+ [`deliver-story.md`](deliver-story.md) **inline in this session** — no
159
+ `story-worker` boot — threading the same `docsDigestPath` / `checklistPath` /
160
+ change-set discipline as a spawned worker. It does not touch the acceptance
161
+ verdict owner ([`deliver-digest.md`](deliver-digest.md) § 3).
162
+
163
+ **Issue a beat's spawns in one turn.** A beat hands you a ready set, not a
164
+ queue: those Stories have no dependency edge between them and no shared write
165
+ paths. Dispatch them the way
186
166
  [`parallel-tooling.md`](parallel-tooling.md) Rule 3 prescribes — **N `Agent`
187
167
  calls issued together in a single assistant turn**, one per ready Story, not
188
- `Agent` → wait → `Agent`. Serial dispatch is compliant with every other rule on
189
- this page and costs the run a full Story's implementation time per sibling for
190
- nothing; the wave aggregator is built for the parallel shape. Respect
168
+ `Agent` → wait → `Agent`. Serial dispatch costs the run a full Story's
169
+ implementation time per sibling for nothing. Respect
191
170
  `delivery.deliverRunner.concurrencyCap`: when the ready set exceeds it, slice
192
171
  into batches of `cap` and dispatch each batch in its own turn.
193
172
 
@@ -200,43 +179,25 @@ exposes agent dispatch, spawn each ready Story as its own
200
179
  sub-agent executes [`deliver-story.md`](deliver-story.md) Steps 0–2.5
201
180
  (init → implement → acceptance self-eval → **push**) and stops there; **you**
202
181
  own Step 3, serialized — see `/mandrel-deliver` § Closing what the workers hand back.
203
- Thread into its prompt: `storyId`; `docsDigestPath` (the per-run docs digest, null when
204
- `project.docsContextFiles` is unset); `checklistPath` (the footprint-matched
205
- write-time audit checklist, produced at dispatch, below); and the
206
- **change-set discipline** — the worker computes the change set once with
207
- `computeChangeSet` and hands that one list to every acceptance critic; it
208
- never lets a critic re-derive the diff.
209
-
210
- **Produce `checklistPath` before the spawn.** Compute the payload
211
- from the Story's predicted footprint (its `changes[]` / `references[]` path
212
- entries) with `buildDispatchChecklist` and write it to the run temp dir, then
213
- thread the resulting path (empty when nothing matched):
214
-
215
- ```bash
216
- node --input-type=module -e '
217
- import { buildDispatchChecklist } from "<main-repo>/.agents/scripts/lib/audit-suite/index.js";
218
- import { parse } from "<main-repo>/.agents/scripts/lib/story-body/story-body.js";
219
- // storyBody is the fetched Story issue body.
220
- const { changes, references } = parse(process.env.STORY_BODY);
221
- const { checklistPath } = buildDispatchChecklist({
222
- storyId: <storyId>, changes, references, runTempDir: "temp/run-<id>",
223
- });
224
- console.log(checklistPath ?? "");
225
- '
226
- ```
227
182
 
228
- `buildDispatchChecklist` (`lib/audit-suite/dispatch-checklist.js`) is a pure
229
- function of the footprint and the on-disk checklists; an empty match prints
230
- nothing and the worker runs with no write-time checklist — the maker-blind
231
- close-scope pass still covers it.
183
+ **The beat writes the prompt; you pass the file.** Each `ready[]` entry carries
184
+ a `promptPath` under `<tempRoot>/run-<id>/`, and that file is the whole spawn
185
+ payload: the Story id, the `workCwd` conventions, the `docsDigestPath` (null
186
+ when `project.docsContextFiles` is unset), the `checklistPath` — the
187
+ footprint-matched write-time audit checklist built from the Story's declared
188
+ `changes[]` / `references[]`, empty when nothing matched — and the
189
+ **change-set discipline** (derive the change set once with `ceremony-derive.js`
190
+ and hand that one list to the verdict owner; never let a critic re-derive the
191
+ diff). An unmatched checklist costs nothing: the maker-blind close-scope pass
192
+ still covers the Story.
232
193
 
233
194
  **Inline fallback (`roleScopedAgents: false` / no-nesting harness).** When the
234
195
  kill-switch is off, or the host cannot spawn a sub-agent at this nesting depth,
235
196
  do **not** stall: read [`deliver-story.md`](deliver-story.md) **in full** and
236
- execute it directly, in this turn, threading the same `docsDigestPath` /
237
- `checklistPath` / change-set discipline. Under `--yes` / injected helper
238
- content, execute directly without a re-read turn. The engine, gates, and
239
- terminal envelope are identical either way — only the isolation differs.
197
+ execute it directly, in this turn, following that same dispatch prompt. Under
198
+ `--yes` / injected helper content, execute directly without a re-read turn. The
199
+ engine, gates, and terminal envelope are identical either way — only the
200
+ isolation differs.
240
201
 
241
202
  ## Intent phrases (what replaced the flag table)
242
203
 
@@ -278,8 +239,7 @@ at `agent::closing` for the human merge and is **not** flipped to
278
239
  `agent::blocked` — `--wait-merge` does not override this, because the operator
279
240
  owning the merge is a decision to respect, not a fault to report. A genuine
280
241
  *arm failure* is the opposite case: nobody chose it, so close still waits and
281
- still blocks. That asymmetry is what keeps the must-land contract intact
282
- without misfiling deliberate human merges as blocks.
242
+ still blocks.
283
243
 
284
244
  ## Per-run epilogue (N>1)
285
245
 
@@ -292,117 +252,99 @@ node .agents/scripts/plan-run-epilogue.js --stories 101,102
292
252
 
293
253
  This executes, in order:
294
254
 
295
- - `audit-roster` — selects cross-Story audit lenses over the combined landed
296
- tip and posts `plan-run-audit-roster` on the primary Story; the host MUST
297
- walk each listed lens against the combined diff.
298
255
  - `follow-up-rollup` — friction follow-ups across every Story in the run
299
256
  (files issues when auto-file is on; posts `follow-ups`).
300
- - `sibling-coherence` — Spec/Acceptance coherence check across sibling bodies
301
- (`plan-run-sibling-coherence`).
302
257
  - `epic-close` — **reports** which of the run's container Epics its land tails
303
- left closed and which are still open. **Read-only** — it derives nothing:
304
- every child state change is already a rollup edge, so the container was
305
- derived from a complete child set by the last Story's own land tail.
258
+ left closed and which are still open. **Read-only** — the last Story's own
259
+ land tail already derived the container from a complete child set.
260
+
261
+ **The audit roster is opt-in** (Story #5343). Add `--audit-roster` and the run
262
+ also selects cross-Story audit lenses over the combined landed tip and posts
263
+ `plan-run-audit-roster` on the primary Story — and the host MUST then walk
264
+ every listed lens against the combined diff, one `auditor` sub-agent per lens.
265
+ That walk is expensive, so **the operator asks for it** — exactly as for the
266
+ pre-mortem plan critic. Without the flag no roster comment is posted and no
267
+ auditor is spawned.
306
268
 
307
269
  A single-Story run skips the epilogue — follow-ups are captured on merge
308
270
  confirm instead (`captureStoryFollowUps`).
309
271
 
310
272
  ## Container-Epic rollup (every N)
311
273
 
312
- A container Epic is never delivered, so nothing used to write to it during
313
- the run it was the subject of. `epic-rollup.js` derives its state from its
314
- children at **every edge that changes a child's state** — the
315
- `agent::executing` flip in `single-story-init.js`, the post-land tail
316
- (reported as the tail's `epicRollup` step), and `plan-persist`'s supersede
317
- close (reported as `supersede.epicRollup`) — which is why it holds at **N=1**,
318
- where no epilogue runs, and why a cohort superseded by a re-plan no longer
319
- strands its container open above finished work.
274
+ `epic-rollup.js` derives a container Epic's state from its children at
275
+ **every edge that changes a child's state** — the `agent::executing` flip in
276
+ `single-story-init.js`, the post-land tail (the tail's `epicRollup` step), and
277
+ `plan-persist`'s supersede close (`supersede.epicRollup`) — so it holds at
278
+ **N=1**, where no epilogue runs.
320
279
 
321
280
  - **Status** follows the children's composition (`deriveParentState` mapped
322
281
  onto the board's three options): any **open** child executing or blocked →
323
282
  `In Progress`, every child `agent::done` or closed → `Done`. A **closed**
324
- child contributes no `agent::*` state at all — its label records where it
325
- stopped, and a superseded Story closed still wearing `agent::blocked` used
326
- to pin its container open forever. It is written
327
- **directly**, never via a label: the container carries no `agent::*` label
328
- by construction, which is what keeps it out of the bare `/mandrel-deliver`
329
- ready list.
283
+ child contributes no `agent::*` state at all. It is written **directly**,
284
+ never via a label: the container carries no `agent::*` label by
285
+ construction, which keeps it out of the bare `/mandrel-deliver` ready list.
330
286
  - **Owner** — `github.operatorHandle` is added to the Epic while any child is
331
287
  in flight, through the additive assignees endpoint, and is never removed.
332
288
  - **Closure** is one-way: a container whose children are all finished closes,
333
289
  as `completed` when at least one child landed and as `not_planned` when none
334
- did (a cohort superseded by a re-plan is finished, but nothing merged). A
335
- reopened child moves Status back to `In Progress` and does **not** reopen the
336
- issue — which is why the lookup reads `state: 'all'`, since an open-only
337
- listing cannot see the container it would have to correct.
290
+ did. A reopened child moves Status back to `In Progress` and does **not**
291
+ reopen the issue.
338
292
  - The parent lookup resolves the native parent edge in **one** call
339
- (`getParentIssue`), because linkage is parent→child only; it falls back to a
340
- `type::epic` scan for a child linked by checklist alone. Children are read as
341
- the body checklist **union** the native sub-issue edges — literally the same
342
- reader `/mandrel-deliver`'s expansion uses, so an Epic can never be
343
- expandable but unclosable — bounded at 5 concurrent reads.
293
+ (`getParentIssue`), falling back to a `type::epic` scan for a child linked by
294
+ checklist alone. Children are the body checklist **union** the native
295
+ sub-issue edges — the same reader `/mandrel-deliver`'s expansion uses.
344
296
  - A checklist row citing an id that resolves to nothing is **dropped with a
345
- warning** when the native read succeeded: hand-edited prose can cite a
346
- deleted or mistyped issue, and no re-run will make it resolve. An
347
- unresolvable *native* edge still fails the read. An Epic-typed child is
348
- refused by name (`epic-typed-child`) and neither blocks nor advances the
349
- parent.
297
+ warning** when the native read succeeded; an unresolvable *native* edge
298
+ still fails the read. An Epic-typed child is refused by name
299
+ (`epic-typed-child`) and neither blocks nor advances the parent.
350
300
  - Every step is best-effort and never throws: a stale container costs
351
301
  tidiness, not a landed Story's envelope.
352
302
 
353
303
  ## Ceremony (profiles + two scopes)
354
304
 
355
- Ceremony depth is selected by `delivery.routing.ceremonyProfile`
356
- (`minimal` | `standard` | `strict`, default `standard`) and the **change level
357
- derived from the Story's own diff** — the changed files' intersection with the
358
- sensitive-path classes in `audit-rules.json`
359
- (`review-depth.js#deriveChangeLevel`), not a planner-authored verdict:
305
+ The ceremony rule is digest § 3: `delivery.routing.ceremonyProfile` alone names
306
+ the acceptance verdict owner; the change level derived from the Story's own
307
+ diff selects **review depth**.
360
308
 
361
- | Profile | Acceptance critic | When to use |
309
+ | Profile | Acceptance verdict owner | When to use |
362
310
  | --- | --- | --- |
363
- | `minimal` | Always inline | Tiny trusted N=1 Stories |
364
- | `standard` | Derived-level routed | Default |
365
- | `strict` | Always fresh-context | High-assurance / regulated surfaces |
311
+ | `minimal` | Inline self-eval | Tiny trusted N=1 Stories |
312
+ | `standard` | Inline self-eval | Default |
313
+ | `strict` | Fresh-context critic | High-assurance / regulated surfaces |
366
314
 
367
315
  | Scope | What runs | Mechanism |
368
316
  | --- | --- | --- |
369
317
  | **Per-Story (always)** | Gates, branch discipline, close-and-land | `deliver-story` / `single-story-close` |
370
- | **Per-Story (profile + derived level)** | Acceptance critic mode; review depth | `ceremony-routing.js` + `review-depth.js` + `code-review.js` |
371
- | **Per-run (N>1)** | Audit roster · follow-up roll-up · sibling coherence | `plan-run-epilogue.js` once at run end |
318
+ | **Per-Story (profile)** | Acceptance verdict owner (the rule: digest § 3) | `ceremony-routing.js` |
319
+ | **Per-Story (derived level)** | Review depth | `review-depth.js` + `code-review.js` |
320
+ | **Per-run (N>1)** | Follow-up roll-up · container-Epic report (· audit roster on `--audit-roster`) | `plan-run-epilogue.js` once at run end |
372
321
  | **Per-Story land tail** | Follow-up capture · status resync · Epic rollup · ref cleanup · base fast-forward | `single-story-close/phases/post-land.js` (in-process, per-step reported) |
373
322
 
374
323
  ## Async merge-confirm mode (`delivery.mergeWatch.mode: "async"`)
375
324
 
376
- A slow-CI consumer can opt the close into `"async"` mode so the merge wait
377
- probes once for ~60s (catching an instant merge or an instantly-red required
378
- check) and then returns `pending` instead of burning ~5 minutes of the host
379
- tool slot polling a merge that lands after the wait would have expired anyway.
380
- When a close returns that `pending` envelope, launch its `nextCommand` as a
381
- **background** invocation (host background Bash — its completion re-invokes the
382
- agent) and move on to the next Story; `single-story-confirm-merge.js` is
383
- idempotent and owns the whole tail. Do not foreground-poll the merge. The
384
- default `"sync"` behaviour is unchanged.
385
-
386
- **On a multi-Story run, pass `--merge-watch-mode async` on every close.** Close
387
- sees one Story and cannot see run topology, so it cannot make this call for
388
- itself — you can. Implementation runs in parallel but the close tail is
389
- serialized one at a time, and under `sync` each of those closes holds the
390
- foreground for its full merge wait before the next Story's close may start.
391
- That is the run's dominant serialized cost, and it is paid per sibling:
392
-
393
- ```bash
394
- node <main-repo>/.agents/scripts/single-story-close.js \
395
- --story <storyId> --cwd <main-repo> --merge-watch-mode async
396
- ```
397
-
398
- The flag overrides `delivery.mergeWatch.mode` for that invocation only — the
399
- config default stays `"sync"`, which is right for the solo delivery that has no
400
- sibling waiting behind it. It composes with `--max-wait-seconds`: pass both and
401
- the explicit bound still wins over the async probe cap. An unrecognized value
402
- exits non-zero before any phase runs, so a typo cannot silently drop the run
403
- back onto synchronous waiting. Expect a `pending` envelope from each async
404
- close — that is the designed ending here, not a failure; background its
405
- `nextCommand` and move to the next Story's close immediately.
406
-
407
- A one-Story run should keep the `sync` default: there is no sibling to unblock,
408
- and the foreground wait is the cheapest path to `landed`.
325
+ In async mode the close arms auto-merge, probes for ~60s (catching an instant
326
+ merge or, via the head-anchored required-check predicate, an instantly-red
327
+ required check) and then returns `pending` with a `nextCommand`, instead of
328
+ holding the host tool slot for a merge that lands after the wait would have
329
+ expired anyway. When a close returns that `pending` envelope, launch its
330
+ `nextCommand` (`single-story-confirm-merge.js … --wait`) as a **background**
331
+ invocation (host background Bash — its completion re-invokes the agent) and
332
+ move on to the next Story; `single-story-confirm-merge.js` is idempotent and
333
+ owns the whole tail, and `deliver-recover.js` recovers an orphaned confirm. Do
334
+ not foreground-poll the merge. The cumulative `maxBudgetSeconds` give-up is
335
+ unchanged.
336
+
337
+ **On a multi-Story run the beat adds `--merge-watch-mode async` for you.** Close
338
+ sees one Story and cannot see run topology — `deliver-run.js` can: every
339
+ `close[]` command it renders carries the flag when the run holds more than one
340
+ Story and omits it for a run of one. Run the command it printed verbatim rather
341
+ than composing your own. Under `sync` each serialized close would hold the
342
+ foreground for its full merge wait before the next may start — the run's
343
+ dominant serialized cost, paid per sibling. Expect a `pending` envelope from
344
+ each async close — that is the designed ending here, not a failure.
345
+
346
+ The flag overrides `delivery.mergeWatch.mode` for that invocation only; the
347
+ config default stays `"sync"`. A slow-CI solo consumer may opt into `"async"`
348
+ for the same reason — a foreground wait longer than the host tool ceiling
349
+ expires `pending` anyway. Otherwise a one-Story run keeps `sync`: there is no
350
+ sibling to unblock, and the foreground wait is the cheapest path to `landed`.