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
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description:
3
3
  Execute one Story end-to-end: story-<id> from main, implemented in a worktree
4
- (optional ## Slicing checkpoints), derived-level ceremony, PR against main.
4
+ (optional ## Slicing checkpoints), profile-resolved ceremony, PR against main.
5
5
  mandatoryReads: [deliver-digest.md]
6
6
  ---
7
7
 
@@ -18,13 +18,12 @@ mandatoryReads: [deliver-digest.md]
18
18
  The **one** delivery engine in v2:
19
19
 
20
20
  ```text
21
- single-story-init.js → implement + commits → derived-level ceremony → push
21
+ single-story-init.js → implement + commits → ceremony → push
22
22
  ──hand-off──▶ single-story-close.js (gates, PR → main, agent::closing)
23
23
  → CI watch + merge → single-story-confirm-merge.js (agent::done)
24
24
  ```
25
25
 
26
- An `Epic: #N` reference marks a v1 ticket — **stop** and re-plan. Engine
27
- traits and prerequisites: reference § Engine invariants.
26
+ Engine traits and prerequisites: reference § Engine invariants.
28
27
 
29
28
  ## Who owns which step
30
29
 
@@ -33,8 +32,9 @@ that dispatched the work**, never to a spawned worker.
33
32
 
34
33
  - **Inline dispatch** (a one-Story run — digest § 1): one session is both
35
34
  roles and walks Steps 0→7, no hand-off.
36
- - **Sub-agent dispatch**: the `story-worker` stops at Step 2.5 with the branch
37
- pushed and returns a hand-off; the dispatching `/mandrel-deliver` session runs Step 3
35
+ - **Sub-agent dispatch**: the `story-worker` boots on the `promptPath`
36
+ `deliver-run.js` wrote for it, stops at Step 2.5 with the branch pushed and
37
+ returns a hand-off; the dispatching `/mandrel-deliver` session runs Step 3
38
38
  **in its own turn** and **serializes the tail — one close at a time across
39
39
  the run**, even though implementation ran in parallel (reference § Step 3).
40
40
 
@@ -84,22 +84,21 @@ live in [`acceptance-self-eval.md`](acceptance-self-eval.md). **`proceed`** →
84
84
  Step 2. **`block`** → **do not close**: post a `friction` comment and flip
85
85
  `agent::blocked` (reference § Step 1a).
86
86
 
87
- ## Step 2 — Ceremony (profile + derived level)
87
+ ## Step 2 — Ceremony (the profile alone)
88
88
 
89
- Ceremony is `delivery.routing.ceremonyProfile` × the **derived change level**,
90
- never a planner-authored verdict. **Digest § 3** is the incantation (change set
91
- once, derive the level, resolve critics with `ceremony-routing.js`); edge cases
92
- are reference § Step 2. Hard gates always run in Step 3 — the derived level
93
- never disables them; do **not** pre-run the chain here — Step 2.5's credited
94
- suite run is the sole exception.
89
+ The acceptance verdict owner comes from `delivery.routing.ceremonyProfile` and
90
+ nothing else — not the diff, not the dispatch mode, never a planner-authored
91
+ verdict. **Digest § 3** is the incantation (change set once, derive the level
92
+ for review depth, resolve the owner with `ceremony-routing.js`) and the one
93
+ home of the rule; edge cases are reference § Step 2. Hard gates always run in
94
+ Step 3 — nothing here disables them; do **not** pre-run the chain here —
95
+ Step 2.5's credited suite run is the sole exception.
95
96
 
96
97
  ### Step 2.5 — The one credited suite run, the push, then hand off
97
98
 
98
- After the self-eval loop's last fix commit, run the suite **once** in the
99
- worktree through the depositor — `evidence-gate.js … --gate test -- npm test`,
100
- spelled out in **digest § 5**. It runs whatever `npm test` resolves to and
101
- stamps that, so the `test` credit is earned on any runner and only a *later*
102
- commit invalidates it. Red → fix, commit, re-run.
99
+ After the self-eval loop's last fix commit, run the one credited suite run
100
+ in the worktree — **digest § 5** is its only home and carries the
101
+ invocation. Red → fix, commit, re-run.
103
102
 
104
103
  Push `story-<storyId>` to `origin`, confirming the remote ref moved. Then
105
104
  (sub-agent dispatch only) return the hand-off — Story id, `workCwd`,
@@ -53,10 +53,7 @@ the first `createIssue`, and refuses any pair of same-wave siblings that both
53
53
  declare a path (or one of which declares a covering glob) — naming the pair,
54
54
  the paths and the two remedies (merge them, or order them with `depends_on`).
55
55
  Such a pair cannot be co-dispatched, so the split buys no parallelism and
56
- costs a delivery session per Story. It replaced the acceptance partition,
57
- which refused only byte-identical acceptance text across siblings — a shape
58
- model output does not produce — so it never fired on the fragmentation it was
59
- meant to catch. **N=1 can never trip the refusal.**
56
+ costs a delivery session per Story. **N=1 can never trip the refusal.**
60
57
 
61
58
  A draft of more than one Story also stops at **Gate #2** for operator
62
59
  approval, `--force-review` or not: a split always earns eyes. `--yes`
@@ -65,8 +62,7 @@ auto-proceeds, as at every other gate.
65
62
  ## Unknown triage — AFK vs HITL
66
63
 
67
64
  Every open question interrogation surfaces is triaged by **who can resolve
68
- it**, not parked in one bucket (a shape borrowed from the Wayfinder skill's
69
- HITL/AFK ticket typing):
65
+ it**, not parked in one bucket:
70
66
 
71
67
  - **AFK** (away from keyboard — the agent resolves it alone): the answer is a
72
68
  fact something already records — third-party docs, a dependency's API
@@ -106,7 +102,7 @@ not re-deriving which assumptions were really the agent's to make.
106
102
 
107
103
  Gate #1 stops for exactly two things — the sharpened plan intent and any HITL
108
104
  unknown — and everything else the envelope surfaced collapses to **one
109
- advisory line** beneath it (Story #5312). Nothing on that line stops the run,
105
+ advisory line** beneath it. Nothing on that line stops the run,
110
106
  reroutes it, or is invoked by `/mandrel-plan`; each item names something the
111
107
  operator may prefer to do instead, and the run proceeds either way. Under
112
108
  `--yes` the line is recorded and planning continues — an unattended run has
@@ -128,8 +124,7 @@ The line names, in order, whichever of these the envelope carries:
128
124
  the same shape with a different owner.
129
125
  - **`memoryPoolAdvisory.recommend`** — name
130
126
  [`/memory-consolidate`](../memory-consolidate.md), quoting its
131
- `reasons[]`. The one arm left measures the `MEMORY.md` index against the
132
- harness's byte cap; a stale pool degrades recall, it does not make the plan
127
+ `reasons[]`. A stale pool degrades recall, it does not make the plan
133
128
  wrong.
134
129
  - **`complexitySignals.uiSurface`** — name [`/prototype`](../prototype.md)
135
130
  and stop there. The signal carries **no routing authority and adds no
@@ -138,8 +133,8 @@ The line names, in order, whichever of these the envelope carries:
138
133
  lenses gate on, and whether any predicted path matches a web lens
139
134
  `filePattern` in `audit-rules.json`; a project with no rendered frontend
140
135
  resolves falsey and the offer never fires. `/mandrel-plan` must never invoke
141
- it — operator invocation is the entire design, because the value is a human
142
- looking at a layout before its UI acceptance criteria are frozen. Under
136
+ it — the value is a human looking at a layout before its UI acceptance
137
+ criteria are frozen. Under
143
138
  `--yes` the offer is recorded and planning proceeds — no reroute, no
144
139
  prototype written, no gate raised.
145
140
 
@@ -149,11 +144,10 @@ The envelope's `complexitySignals` field carries the paths the seed predicts,
149
144
  their repo state (existing paths predict refactors; missing predict creates)
150
145
  and the `audit-rules.json` sensitive-path classes the footprint intersects —
151
146
  `routingAuthority: false`, no `route` field. They ground the authoring
152
- template's pre-resolved `changes[]` and the `/prototype` offer, nothing else.
153
- Story #5312 deleted the plan-side lite claim that used to read them
154
- (`--route-downgrade-reason`, the persist shape backstop, the `route::lite`
155
- hint): every Story lands through the same engine and the same close gates,
156
- and ceremony is derived from the landed diff at close.
147
+ template's pre-resolved `changes[]` and the `/prototype` offer, nothing else:
148
+ every Story lands through the same engine and the same close gates, and the
149
+ acceptance verdict owner follows the operator's ceremony profile — never
150
+ anything a plan authored.
157
151
 
158
152
  ## Correct-by-construction authoring template
159
153
 
@@ -162,22 +156,22 @@ and ceremony is derived from the landed diff at close.
162
156
  `complexitySignals` ran:
163
157
 
164
158
  - **`verify[]` entries are commands.** There is no tier suffix and no
165
- `manual:<reason>` escape (Story #5312): write the exact command or test
159
+ `manual:<reason>` escape: write the exact command or test
166
160
  path the deliverer runs and the acceptance critic reads as evidence.
167
161
  - **`changes[]` names what the deliverer authors.** Generated artifacts —
168
162
  quality baselines, generated test indexes, migration journals, lockfiles —
169
163
  are omitted: the work regenerates them, the refresh is a close-gate concern,
170
164
  and a declared shared artifact path reserves a footprint that needlessly
171
165
  serializes sibling Stories at dispatch.
172
- - **`changes[]` arrive pre-resolved to creates-vs-refactors.** Every path
173
- the seed predicted is probed against the repo: an existing path is
174
- emitted with `assumption: "refactors-existing"`, a missing one with
175
- `assumption: "creates"`. The persist gates stay authoritative — they probe
176
- the base branch ref, not the working tree — but a `creates` on a path that
177
- exists at base, or a `refactors-existing` on one that does not, is a
178
- dry-run **warning**, not a rejection; only a `deletes` naming an absent
179
- path is refused. A plain-string bullet or a trailing parenthetical is
180
- repaired into the object form by probing base, and the repair is reported.
166
+ - **`changes[]` entries are bare paths.** The skeleton emits each seed-predicted
167
+ path as a bare string and persist derives its assumption by probing the base
168
+ branch ref — present is a `refactors-existing`, absent a `creates` — and
169
+ reports each derivation on the dry-run's repair list. Pin
170
+ `{path, assumption}` only when the probe would get it wrong; a `creates` on
171
+ a path that exists at base, or a `refactors-existing` on one that does not,
172
+ is then a dry-run **warning**, not a rejection. `deletes` stays explicit —
173
+ a bare path can never express a removal — and a `deletes` naming a path
174
+ absent at base is the one `changes[]` shape still refused.
181
175
  - **Keep `## Spec` at contract-level prose** — interfaces, invariants,
182
176
  load-bearing constraints; no per-file behavior narration — and as long as
183
177
  the work needs. There is no word or token budget.
@@ -188,23 +182,22 @@ kept — passes the persist ticket validators with no round-trip.
188
182
  ### Authored entry shape
189
183
 
190
184
  Each `stories.json` entry: `slug` (`^[a-z0-9][a-z0-9-]*$`), `type: "story"`,
191
- `title`, `body` (`goal`, optional `spec`, `changes[{path, assumption}]` —
192
- `creates|refactors-existing|deletes`, `non_goals`, `reason_to_exist`),
193
- top-level `acceptance[]`, `verify[]` (each a **bare command** — there is no
194
- tier suffix), and `depends_on[]` (a sibling slug, or `#<id>` for an existing
195
- open Story).
185
+ `title`, `body` (`goal`, optional `spec`, `changes[]` — a **bare path string**
186
+ by default, or `{path, assumption}` with
187
+ `creates|refactors-existing|deletes` to pin one, `non_goals`,
188
+ `reason_to_exist`), top-level `acceptance[]`, `verify[]` (each a **bare
189
+ command** — there is no tier suffix), and `depends_on[]` (a sibling slug, or
190
+ `#<id>` for an existing open Story).
196
191
 
197
192
  Author `acceptance[]` **without** the `AC-<n>:` handle: the body renderer
198
193
  numbers each checkbox from its array position, so a carried handle renders
199
194
  doubled. Persist normalises one off rather than refusing, and names the strip
200
195
  on the dry-run's repair list.
201
196
 
202
- Nothing in that shape inventories the repo for the author. `changes[]` arrives
203
- pre-resolved against the working tree, and Phase 8's
204
- `validateStoryFileAssumptions` re-probes every `{path, assumption}` at persist
205
- as a hard error — so the grounding contract is the author's own targeted reads
206
- plus that gate. There is no pre-computed codebase snapshot to fall back on,
207
- and no manifest-derived replacement to build.
197
+ Nothing in that shape inventories the repo for the author: the grounding
198
+ contract is the author's own targeted reads plus Phase 8's
199
+ `validateStoryFileAssumptions`, which re-probes every resolved
200
+ `{path, assumption}` at persist.
208
201
 
209
202
  ### Per-Story audit provenance (`provenance`)
210
203
 
@@ -232,20 +225,16 @@ work this plan already tracked.
232
225
  | Present but empty (`{}`) | Nothing. "Owns no findings" is a real answer. |
233
226
  | **Absent** | The **whole seed's** footers (the union) — the recall-safe default. |
234
227
 
235
- **The union fallback is load-bearing, not legacy.** Leaving the authoring agent
236
- to hand-carry provenance out of the seed's HTML comments was measured to fail —
237
- a remembered step is no step at all — and the mechanical union carry is what
238
- closed it. Attribution is additive: it sharpens a plan that opts in and changes
239
- nothing for one that does not. Never remove the fallback to "finish the
240
- migration".
241
-
242
- Attribution is what makes the next sweep's dedup answerable rather than
243
- arbitrary. Under the union every sibling carried every key, so a finding
244
- confirming against several open Stories could only pick one at random, and a
245
- key whose owning Story had since **closed** was masked by any open neighbour —
246
- a genuine regression filed as a routine update. With ownership stamped, the
247
- issue carrying a finding's own fingerprint decides both the match and its
248
- state (`lib/findings/route-finding.js`).
228
+ **The union fallback is load-bearing, not legacy** — hand-carrying provenance
229
+ out of the seed's HTML comments is a step an author forgets. Attribution is
230
+ additive: it sharpens a plan that opts in and changes nothing for one that
231
+ does not. Never remove the fallback to "finish the migration".
232
+
233
+ Attribution makes the next sweep's dedup answerable: under the union a finding
234
+ confirming against several open Stories can only pick one, and a key whose
235
+ owning Story has **closed** is masked by an open neighbour. With ownership
236
+ stamped, the issue carrying a finding's own fingerprint decides both the match
237
+ and its state (`lib/findings/route-finding.js`).
249
238
 
250
239
  The audit path authors this mechanically from the per-group footers the seed
251
240
  already carries — see [`audit-to-stories`](../audit-to-stories.md). A `--seed`
@@ -255,24 +244,17 @@ or `--tickets` plan has nothing to attribute and omits the field.
255
244
 
256
245
  The conflict passes run **twice**: once over the raw `stories.json` payload
257
246
  (alongside the freshness, file-assumption and sizing gates), and again over the
258
- **assembled, footer-stamped bodies** — the artifact persist actually posts.
259
- The second pass is not belt-and-braces. The canonical authoring shape carries
260
- `acceptance[]` / `verify[]` at the ticket's top level and assembly folds them
261
- into the body, so the passes that scan `body.acceptance` / `body.verify`
262
- saw two empty arrays on the real payload and emitted nothing; the two
263
- substring-match advisories that depended on it are retired, leaving
264
- `shared-editor` as the one conflict kind. Both passes complete before the first
265
- `createIssue`, so a refusal still costs no writes.
266
-
267
- `shared-editor` findings are rendered into the posted `plan-summary` comment,
268
- directly beneath the wave table: the table promises which Stories can run
269
- together, and a path two same-wave Stories both write is exactly where that
270
- promise breaks. Promise and caveat belong on one durable surface — previously
271
- the caveat was a stderr warning nobody kept.
272
-
273
- Every conflict class is advisory (Story #5312 retired the
274
- `planning.failOn*` / `requireExplicitCrossStoryDeps` upgrade knobs with the
275
- registry and fan-out findings): co-editing one file is routine and often
247
+ **assembled, footer-stamped bodies** — the artifact persist actually posts,
248
+ where top-level `acceptance[]` / `verify[]` have been folded in. `shared-editor`
249
+ is the one conflict kind. Both passes complete before the first `createIssue`,
250
+ so a refusal still costs no writes.
251
+
252
+ `shared-editor` findings are rendered into the plan-summary section of every
253
+ Story's posted `story-plan-state` comment, directly beneath the wave table: the
254
+ table promises which Stories can run together, and a path two same-wave Stories
255
+ both write is exactly where that promise breaks.
256
+
257
+ Every conflict class is advisory: co-editing one file is routine and often
276
258
  correct — the delivery scheduler already serializes file-overlapping Stories —
277
259
  and a path reference matched by substring can read as a dependency a prose
278
260
  mention never meant. A finding names the Stories and the fix (a `depends_on`
@@ -282,10 +264,10 @@ edge, or folding the shared edit into one Story) for the operator to weigh.
282
264
 
283
265
  A `--tickets` envelope carries a third author prompt beside
284
266
  `systemPrompts.story` and `systemPrompts.storySplitRules`:
285
- **`systemPrompts.storyTicketsRules`**. It exists because a
286
- source ticket arrives already in Story shape — rendered `AC-<n>:` checkboxes,
287
- a `## Verify` list, a `## Changes` footprint — and an author reading it as a
288
- template carries that shape forward instead of re-deriving it. The addendum
267
+ **`systemPrompts.storyTicketsRules`**. A source ticket arrives already in
268
+ Story shape — rendered `AC-<n>:` checkboxes, a `## Verify` list, a
269
+ `## Changes` footprint — and an author reading it as a template carries that
270
+ shape forward instead of re-deriving it. The addendum
289
271
  binds the author to re-derive `acceptance[]` from the goal, to express
290
272
  mechanical checks (a refreshed baseline, a lint exiting 0, a regenerated
291
273
  index) as `verify[]` commands rather than acceptance items, and to take the
@@ -318,19 +300,19 @@ template-only prose.
318
300
 
319
301
  ### Supersede-map partition
320
302
 
321
- `plan-persist` refuses a partial supersede map **before** it creates any
322
- Story, the same fail-closed shape as the collision refusal: every id passed to
323
- `--tickets` must be claimed by **exactly one** Story, and no Story may
324
- claim an id that was not a source ticket. With N>1 the mapping is not
325
- total by default — an authored map is the only thing that can say
326
- `#11-#14 → #20` while `#15 → #21`, which a blanket "superseded by
327
- this plan-run" reference could not.
303
+ `plan-persist` completes the supersede map **before** it creates any Story,
304
+ splitting it by who can be right. **Refused, fail-closed:** a Story claiming
305
+ an id that was never a source ticket, and two Stories claiming the same id —
306
+ the first would close an issue nobody asked about, the second cannot say which
307
+ Story replaced it. **Assigned with a warning:** a source id no Story claimed
308
+ goes to the primary Story, because this plan is replacing it either way and
309
+ only the bookkeeping was open. With N>1 an authored map is still the only
310
+ thing that can say `#11-#14 → #20` while `#15 → #21`, so author one whenever
311
+ the default is not what you mean.
328
312
 
329
313
  ## The pre-mortem critic — operator-invoked
330
314
 
331
- The maker-blind **pre-mortem** critic is not a step of the spine (Story #5312
332
- retired step 2.5 with the consolidation critic, whose one deterministic input
333
- was a `## Delivery Slicing` table no Story carries). Run it when the operator
315
+ The maker-blind **pre-mortem** critic is not a step of the spine. Run it when the operator
334
316
  asks for it, after Author and before Persist — the last point a finding folds
335
317
  into a re-author:
336
318
 
@@ -369,30 +351,33 @@ a re-author round.
369
351
 
370
352
  ## What `--dry-run` actually gates
371
353
 
372
- `plan-persist.js --dry-run` is the same command with GitHub writes suppressed,
373
- and every gate runs before the first `createIssue` would fire. Since
374
- Story #5312 the gates split two ways, and the dry-run is where the second
375
- half is read:
354
+ A bare `plan-persist.js` runs the whole gate list write-free and then, on a
355
+ clean list, persists in the same invocation; `--dry-run` is that same first
356
+ half with the second suppressed. Either way every gate runs before the first
357
+ `createIssue` would fire. The gates split two ways, and the dry-run output is
358
+ where the second half is read:
376
359
 
377
360
  **Hard — the run refuses:** a body that does not parse, a ticket that is not
378
- a Story, an empty `acceptance[]` or `verify[]`, an unknown or cyclic
379
- `depends_on`, the acceptance partition at N>1, the supersede partition, a
380
- forbidden commit-subject prefix, and a `deletes` entry naming a path absent
381
- at base.
361
+ a Story, an empty `acceptance[]`, an unknown or cyclic `depends_on`, the
362
+ same-wave collision refusal at N>1, a supersede claim on a non-source id or
363
+ one claimed twice, and a `deletes` entry naming a path absent at base.
364
+ Commit subjects are not scanned — the `commit-msg` hook and
365
+ `normalize-pr-title.js` enforce them.
382
366
 
383
367
  **Warnings — listed, then the persist proceeds:** a `creates` on a path that
384
368
  exists at base or a `refactors-existing` on one that does not (including a
385
369
  path the base branch deleted or renamed, named with the removing commit), a
386
- goal or acceptance path absent at base, a `verify[]` command naming an absent
387
- test file, an `open-question` in a body (`Flag if…`, `TBD`, a trailing `?`),
388
- and a `pinned-identifier` in an acceptance item — a backticked bare symbol
370
+ goal or acceptance path absent at base, an empty `verify[]`, a source id
371
+ assigned to the primary Story by default, a `verify[]` command naming an
372
+ absent test file, an `open-question` in a body (`Flag if…`, `TBD`, a trailing
373
+ `?`), and a `pinned-identifier` in an acceptance item — a backticked bare symbol
389
374
  that is not a path, a label, a kebab token, a flag or a command, which the
390
375
  advisory `changes[]` is free to reshape out from under the criterion. The
391
376
  list also names every **repair** the run applied — a plain-string bullet or a
392
377
  trailing parenthetical rewritten into `{ path, assumption }` by probing base,
393
- and an `AC-<n>:` handle normalised off an acceptance item. The same list rides the result
394
- envelope as `warnings[]` and `repairs[]`, so a `--chain-on-clean` run loses
395
- nothing.
378
+ and an `AC-<n>:` handle normalised off an acceptance item. The same list rides
379
+ the result envelope as `warnings[]` and `repairs[]`, carried from the
380
+ write-free pass onto the chained run's envelope.
396
381
 
397
382
  A dry run that comes back clean has paid for every deterministic refusal, so
398
383
  the real persist has nothing left to discover except network failure.
@@ -417,23 +402,17 @@ leave the common follow-up plan with nowhere to file itself. The three-Story
417
402
  threshold governs **creation** only, where it still holds: at two Stories a
418
403
  pair of ids is as easy to carry as one container id.
419
404
 
420
- On a yes, pass `--epic <id>`. Persist then:
421
-
422
- 1. resolves the id **before the first create** (dry run included) — it must be
423
- **open** and carry `type::epic`, or the run hard-errors having written
424
- nothing;
425
- 2. after the Stories exist, appends one `- [ ] #N` row per new Story to the
426
- Epic's checklist via `appendEpicChildIds`, which is idempotent and preserves
427
- existing rows' **checked state**, their order, and the fingerprint marker;
428
- 3. mirrors a native sub-issue edge per child.
405
+ On a yes, pass `--epic <id>`. Persist resolves it **before the first create**
406
+ (dry run included) — it must be **open** and carry `type::epic`, or the run
407
+ hard-errors having written nothing — then appends a `- [ ] #N` checklist row
408
+ and a native sub-issue edge per new Story.
429
409
 
430
410
  The refusal posture is the **opposite** of creation's, deliberately. Creation
431
411
  degrades (an unensurable label just skips the container) because the operator
432
- never named one. Adoption cannot: the operator named a specific id, so silently
433
- not adopting it would leave them believing their Stories were filed somewhere
434
- they were not. Hence a hard error, raised while nothing has been written and
435
- the fix is free. Once the Stories are live the posture flips back — a failed
436
- checklist write or sub-issue edge only warns.
412
+ never named one; adoption names a specific id, so silently not adopting it
413
+ would misfile the Stories. Hence a hard error, raised while nothing has been
414
+ written. Once the Stories are live the posture flips back — a failed checklist
415
+ write or sub-issue edge only warns.
437
416
 
438
417
  **Only open Epics are adoptable.** A closed Epic is a finished body of work;
439
418
  joining one would reopen a container the epilogue deliberately closed and
@@ -446,11 +425,9 @@ raised before any I/O.
446
425
  ### Creating a new container (N>2)
447
426
 
448
427
  Above two Stories, `/mandrel-plan` offers to group them under one `type::epic`
449
- container. Confirmed, persist opens it **after** the Stories — its body embeds
450
- their issue numbers and its sub-issue edges need their database ids — and
451
- links every created Story both ways it can: a `- [ ] #N` body checklist and a
452
- native GitHub sub-issue edge. Both are written because each survives what the
453
- other does not; the delivery-side reader unions them.
428
+ container. Confirmed, persist opens it **after** the Stories and links every
429
+ created Story both ways: a `- [ ] #N` body checklist and a native GitHub
430
+ sub-issue edge, which the delivery-side reader unions.
454
431
 
455
432
  What the Epic must never carry: an `agent::*` label (that absence keeps it out
456
433
  of the bare `/mandrel-deliver` ready list and outside the `type::story`-scoped
@@ -458,18 +435,13 @@ body lint), a `## Spec`, an `acceptance[]` / `verify[]`, or any path, finding
458
435
  or rationale a child does not already hold. It is a container; unique content
459
436
  here is content no delivering agent reads.
460
437
 
461
- What the **Stories** never gain is an `Epic: #N` footer. Linkage is
462
- parent→child only, which is exactly why every existing refusal of that footer
463
- still stands and each Story stays independently deliverable (ADR
464
- `20260905-5139`).
438
+ Linkage runs parent→child only, which is why each Story stays independently
439
+ deliverable (ADR `20260905-5139`).
465
440
 
466
441
  Degradation is deliberate: an unensurable `type::epic` label skips the Epic
467
- entirely (an unlabelled container is not a container), while a failed
468
- sub-issue edge only warns — the checklist still lists every child. Either way
469
- the Stories are untouched and deliver by id. A resumed persist adopts an
470
- existing Epic carrying the same fingerprint, which is keyed on the title **and
471
- the exact child set**, so a run grouping different Stories never adopts the
472
- wrong container.
442
+ entirely, while a failed sub-issue edge only warns. Either way the Stories are
443
+ untouched and deliver by id. A resumed persist adopts an existing Epic whose
444
+ fingerprint matches the title **and the exact child set**.
473
445
 
474
446
  ## Cross-plan `depends_on` (`#<id>`)
475
447
 
@@ -483,9 +455,8 @@ opened and never had to name.
483
455
  `complexitySignals.predictedPaths`, each carrying the `overlappingPaths[]` that
484
456
  matched. Overlap is computed on **declared footprints** and not on prose, using
485
457
  the same `storyFootprint` the wave runner uses to withhold colliding Stories at
486
- dispatch — so the planner sees the collision the runtime would later enforce,
487
- one layer earlier and while it is still cheap to order around. A seed naming no
488
- paths short-circuits to `[]` with no provider call at all.
458
+ dispatch — the collision the runtime would later enforce, seen while it is
459
+ still cheap to order around. A seed naming no paths short-circuits to `[]`.
489
460
 
490
461
  It stays advisory: two Stories can touch a shared barrel file with no real
491
462
  ordering between them, and only the operator knows.
@@ -495,9 +466,9 @@ a Story already open is not scheduled by this run, so it has no position in the
495
466
  topological sort and cannot close a cycle back into a Story that does not exist
496
467
  yet. They are validated **before any create** (dry run included): each must
497
468
  resolve to an **open `type::story`**, and a closed issue, a container Epic, a
498
- missing id or a non-Story hard-errors with every bad ref named in one pass. The
499
- strictness is the point — a blocker that can never be satisfied reads to the
500
- delivery engine as a permanent wedge rather than as an error worth reporting.
469
+ missing id or a non-Story hard-errors with every bad ref named in one pass — a
470
+ blocker that can never be satisfied would read to the delivery engine as a
471
+ permanent wedge.
501
472
 
502
473
  Persist renders the entry unchanged as a `blocked by #<id>` footer line and
503
474
  mirrors the native `blocked_by` edge, which is the same pair of surfaces a
@@ -508,13 +479,13 @@ state.
508
479
  ## Ready means fully persisted
509
480
 
510
481
  `agent::ready` is the **terminal** step, not part of the creating POST.
511
- The order is: create unlabelled → upsert `story-plan-state` on
512
- every Story → upsert `plan-summary` on the primary → flip every Story to
513
- `agent::ready`.
482
+ The order is: create unlabelled → upsert `story-plan-state` on every Story (one
483
+ comment carrying the plan summary: story set, delivery order, deliver command)
484
+ → flip every Story to `agent::ready`.
514
485
 
515
486
  This is what lets `/mandrel-deliver` trust the label: a Story carrying
516
- `agent::ready` always has its persist receipt on the ticket, so nothing can
517
- pick it up mid-write and read a half-persisted plan.
487
+ `agent::ready` always has the operator's delivery instructions on the ticket,
488
+ so nothing can pick it up mid-write and act on a half-persisted plan.
518
489
 
519
490
  ## Resuming a failed persist
520
491
 
@@ -546,47 +517,34 @@ them **envelope-first**:
546
517
 
547
518
  | Channel | When it wins |
548
519
  | --- | --- |
549
- | Envelope `sourceTickets[]` | **The normal path.** Written by step 1's `--out`, then read from `--plan-context <file>` or auto-discovered at `<plan-dir>/plan-context.json`. No ids to re-type. |
520
+ | Envelope `sourceTickets[]` | **The normal path.** Written by step 1 to `<tempRoot>/plan-<slug>/` (or wherever `--out` points), then read from `--plan-context <file>` or auto-discovered at `<plan-dir>/plan-context.json`. No ids to re-type. |
550
521
  | `--source-tickets <ids>` | Explicit **override** for hand-driven runs (no captured envelope, or deliberately narrowing the set). Wins over the envelope; a disagreement is warned about, not silently reconciled. |
551
522
 
552
523
  The result envelope's `supersede.sourceTicketOrigin` reports which channel was
553
- used (`envelope` \| `flag` \| `none`).
554
-
555
- Every path with no envelope is **audible** — persist cannot tell a legitimate
556
- `--seed` run from a `--tickets` run whose envelope was never captured, so it
557
- says so rather than deciding silently:
558
-
559
- | Situation | Behaviour |
560
- | --- | --- |
561
- | Neither `--plan-dir` nor `--plan-context` | **Warn** — nothing was read; only `--source-tickets` can supply ids. |
562
- | Auto-discovered `<plan-dir>/plan-context.json` absent | **Warn** — degrade to `--source-tickets`; a `--seed` run legitimately has none. |
563
- | Explicit `--plan-context` missing | **Fatal** — the operator named a file and meant it. |
564
- | Envelope present but unparseable | **Fatal** — a corrupt envelope is not "no source tickets"; treating it as such is how a `--tickets` run used to report success having superseded nothing. |
524
+ used (`envelope` \| `flag` \| `none`). Every path with no envelope is
525
+ **audible**: an absent envelope warns and degrades to `--source-tickets` (a
526
+ `--seed` run legitimately has none), while an explicitly named but missing
527
+ `--plan-context`, or an unparseable envelope, is **fatal**.
565
528
 
566
529
  Whichever channel supplies them, the supersede-map partition above still
567
- fail-closes: a `--tickets` run whose Stories forgot `supersedes[]` is now
568
- **caught** (`source ticket #N is not claimed by any Story`) instead of
569
- partitioning an empty set and passing vacuously.
530
+ fail-closes: a `--tickets` run whose Stories forgot `supersedes[]` is
531
+ **caught** (`source ticket #N is not claimed by any Story`).
570
532
 
571
533
  ## Closing superseded source tickets
572
534
 
573
535
  **Default on.** After the Stories exist, persist comments on each source
574
536
  issue naming the specific Story that claims it — plus that Story's optional
575
537
  per-supersede `note` — and closes it with reason **`not_planned`**
576
- (`state_reason`). Nothing has shipped at persist time and the issue will not
577
- be actioned in its own right, so `not_planned` is the honest reason;
578
- `completed` would be a lie. This is what keeps the tracker from asserting
579
- that already-planned work is still unowned, and it writes down the supersede
580
- link that makes the history readable.
581
-
582
- | Behaviour | Contract |
583
- | --- | --- |
584
- | Default | Comment + close every source ticket as `not_planned`, **clearing its `agent::*` label** in the same write — a retired ticket has no agent state, and `agent::done` would claim a delivery that never happened. |
585
- | `--no-close-superseded` | Skips all commenting and closing. Story creation is unchanged. Use it for a genuinely partial supersede — when the plan folded in only *part* of an issue and the remainder must stay open. |
586
- | `--dry-run` | Posts no comment and closes nothing; reports what it would have done. |
587
- | Re-run | Idempotent — the comment is keyed off a `superseded-by` structured-comment marker, and an already-closed source is skipped. |
588
- | Already closed / deleted / inaccessible | Skipped and reported. Never throws. |
589
- | Close-phase failure | **Never fails the run.** Stories stay created; the result envelope's `supersede` report names which tickets were and were not closed so the operator can finish by hand. |
538
+ (`state_reason`) — nothing has shipped at persist time, so `completed` would
539
+ be a lie.
540
+
541
+ The default also **clears the source's `agent::*` label** in the same write — a
542
+ retired ticket has no agent state. Pass **`--no-close-superseded`** for a
543
+ genuinely partial supersede — when the plan folded in only *part* of an issue
544
+ and the remainder must stay open. The phase is idempotent (keyed off a
545
+ `superseded-by` marker), skips already-closed or inaccessible sources, and
546
+ **never fails the run**: its `supersede` report names which tickets were and
547
+ were not closed so the operator can finish by hand.
590
548
 
591
549
  `--seed` / `--seed-file` modes have no source tickets, so no close phase
592
550
  runs at all.
@@ -110,6 +110,18 @@ ledger, conforming to [`qa-ledger.schema.json`](../../schemas/qa-ledger.schema.j
110
110
  session. This is the single findings channel across all three workflows — there
111
111
  is no per-workflow finding schema.
112
112
 
113
+ ## Coverage tiers and the missing test
114
+
115
+ For the surface an item points at, gather the tests that exercise it and
116
+ classify each by path per
117
+ [`testing-standards.md` § The Three Tiers](../../rules/testing-standards.md#the-three-tiers)
118
+ — a `.feature` file is **acceptance**, a path containing `/contract/` or
119
+ `.contract.test.` is **contract**, and a path containing `.test.` or
120
+ `__tests__/` is **unit**; a skipped test leaves its tier uncovered. Then take
121
+ the lowest tier with no live test (unit → contract → acceptance) and write one
122
+ concrete sentence describing the test that would close it — the item's
123
+ `missingTest` (`null` when every tier is covered).
124
+
113
125
  ## Triage — classify → route → disposition → promote
114
126
 
115
127
  Route the ledger through the shared classify/route/dedup/promote core. The