mandrel 2.60.0 → 2.62.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 (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,17 +1,7 @@
1
1
  /**
2
- * run-epilogue.js — real per-run closeout for `/mandrel-deliver --run`.
3
- *
4
- * After the last Story in a multi-Story plan-run lands, this module:
5
- * 1. Selects the cross-Story audit lens roster over the combined landed
6
- * tip vs base (deterministic `selectAudits` — host walks lenses).
7
- * 2. Rolls up friction follow-ups across every Story in the run and
8
- * files/posts them on the primary Story.
9
- * 3. Reports what the per-Story land tails left the run's container Epics
10
- * in — closed, or still open (Story #5139; read-only since #5280).
11
- *
12
- * There is no inert planner-only path: `planRunEpilogue` enumerates steps
13
- * and `runPlanRunEpilogue` executes them. Single-Story runs skip the
14
- * epilogue (`applicable: false`).
2
+ * Per-run closeout after the last Story of a multi-Story run lands: optional
3
+ * audit roster, friction roll-up, and a read-only container-Epic report.
4
+ * Single-Story runs are `applicable: false`.
15
5
  *
16
6
  * @module lib/orchestration/run-epilogue
17
7
  */
@@ -33,18 +23,8 @@ import {
33
23
  import { upsertStructuredComment } from './ticketing.js';
34
24
 
35
25
  /**
36
- * Canonical epilogue step kinds, in execution order.
37
- *
38
- * A fourth step — a cross-Story spec/acceptance coherence check — was removed
39
- * in Story #5341: it re-read every Story body to post a comment nothing read
40
- * back, on the one run shape (N>1) where that re-read costs the most. ADR
41
- * `20260917-5341` carries the reasoning.
42
- *
43
- * `audit-roster` is **opt-in** since Story #5343 (`--audit-roster`): it is
44
- * the one step that asks the host to spend a sub-agent per selected lens,
45
- * and a run whose operator did not ask for an audit sweep paid that cost —
46
- * plus a `plan-run-audit-roster` comment nobody acted on — on every N>1 run.
47
- * The other two steps are reporting and stay on by default.
26
+ * Step kinds in execution order. `audit-roster` is opt-in (`--audit-roster`)
27
+ * because it costs a sub-agent per lens; the other two are reporting.
48
28
  *
49
29
  * @type {readonly ['audit-roster', 'follow-up-rollup', 'epic-close']}
50
30
  */
@@ -55,25 +35,9 @@ export const RUN_EPILOGUE_STEP_KINDS = Object.freeze([
55
35
  ]);
56
36
 
57
37
  /**
58
- * Report which container Epics this run's Stories left closed, and which are
59
- * still open.
60
- *
61
- * **It derives nothing and writes nothing.** It used to: it walked every Story
62
- * and re-ran the full rollup, closing containers itself. That made sense while
63
- * the rollup only fired on the edges someone had wired, and the epilogue was
64
- * the backstop for the ones that were missed. Every child state change is now
65
- * an edge — init, post-land, the supersede close — so by the time the last
66
- * Story of a run has landed, its container has already been derived from a
67
- * complete child set by that Story's own land tail. Re-deriving here would ask
68
- * the same question a second time and answer it identically, at the cost of a
69
- * full re-read per Story and a second writer on the same issue.
70
- *
71
- * What survives is the report, which is why the step exists at all: one place
72
- * an operator reads to see what a multi-Story run did to its containers. A
73
- * pending Epic here is a real signal — it means a land tail's rollup declined
74
- * to close, and the tail's own outcome says why.
75
- *
76
- * Non-fatal throughout: a container it cannot read is simply not reported.
38
+ * Report which container Epics are closed vs still open. Read-only: each land
39
+ * tail already derived its container, so a pending Epic here means a tail's
40
+ * rollup declined to close. Unreadable containers are omitted.
77
41
  *
78
42
  * @param {{ stories: string[], provider: object }} opts
79
43
  * @returns {Promise<{ kind: string, closed: number[], pending: number[] }>}
@@ -81,8 +45,7 @@ export const RUN_EPILOGUE_STEP_KINDS = Object.freeze([
81
45
  async function executeEpicClose({ stories, provider }) {
82
46
  const closed = new Set();
83
47
  const pending = new Set();
84
- // Siblings share a container: resolve each distinct Epic once, however many
85
- // of the run's Stories point at it.
48
+ // Siblings share a container: report each Epic once.
86
49
  const seen = new Set();
87
50
 
88
51
  for (const raw of stories) {
@@ -108,11 +71,8 @@ async function executeEpicClose({ stories, provider }) {
108
71
  }
109
72
 
110
73
  /**
111
- * Read one Story's container Epic, or null.
112
- *
113
- * One request per Story via the declared parent port. Degrades to null on any
114
- * failure and on a provider without the port — this is a report, and a
115
- * container it could not read is better omitted than guessed at.
74
+ * Null on any failure or a provider without `getParentIssue` — omitted, never
75
+ * guessed.
116
76
  *
117
77
  * @param {{ storyId: number, provider: object }} opts
118
78
  * @returns {Promise<object|null>}
@@ -165,14 +125,10 @@ function normalizeStoryIds(stories) {
165
125
  }
166
126
 
167
127
  /**
168
- * Enumerate the ordered epilogue steps for a completed run.
169
- *
170
128
  * @param {object} args
171
129
  * @param {string} args.planRunId
172
130
  * @param {Array<string|number|{ id?: string|number, slug?: string }>} args.stories
173
- * @param {boolean} [args.auditRoster] Opt into the cross-Story audit roster
174
- * (Story #5343). Default `false`: the roster spawns auditors and posts a
175
- * comment the operator has to act on, so it runs only when asked for.
131
+ * @param {boolean} [args.auditRoster] Default `false`.
176
132
  * @returns {object}
177
133
  */
178
134
  export function planRunEpilogue({
@@ -199,9 +155,7 @@ export function planRunEpilogue({
199
155
  };
200
156
  }
201
157
 
202
- // Positional `/mandrel-deliver 101 102` has no plan-run label. Synthesize a
203
- // stable adhoc id from the sorted Story set so the epilogue still
204
- // anchors comments / audit roster without requiring `--run`.
158
+ // Positional delivery has no plan-run label: synthesize a stable adhoc id.
205
159
  const effectiveRunId =
206
160
  runId ??
207
161
  `adhoc-${[...ids].sort((a, b) => Number(a) - Number(b)).join('-')}`;
@@ -237,10 +191,7 @@ export function planRunEpilogue({
237
191
  }
238
192
 
239
193
  /**
240
- * How many first-parent commits of the base ref to scan when looking for the
241
- * run's landed squash-merges. The epilogue fires immediately after the run's
242
- * last Story lands, so the run's merges sit within the first handful of
243
- * commits; the limit only bounds the pathological case.
194
+ * The run's merges sit near the tip; this only bounds the pathological case.
244
195
  * @type {number}
245
196
  */
246
197
  const BASE_SCAN_LIMIT = 500;
@@ -249,8 +200,7 @@ const BASE_SCAN_LIMIT = 500;
249
200
  const FIELD_SEP = '\x1f';
250
201
 
251
202
  /**
252
- * Read the base ref's first-parent history as `{ sha, parents, subject }`
253
- * records, newest-first.
203
+ * Newest-first.
254
204
  *
255
205
  * @param {object} args
256
206
  * @param {string} args.cwd
@@ -300,35 +250,12 @@ function readFirstParentHistory({ cwd, baseRef, scanLimit, git }) {
300
250
  return { ok: true, commits };
301
251
  }
302
252
 
303
- /**
304
- * One trailing `(#<n>)` / `(refs #<n>)` marker, anchored at the end of what
305
- * is left of a subject after the markers to its right have been peeled off.
306
- */
307
253
  const TRAILING_MARKER_RE = /\s*\((?:refs\s+)?#(\d+)\)$/;
308
254
 
309
255
  /**
310
- * Peel the **trailing run** of `(#<n>)` markers off a squash subject.
311
- *
312
- * The shape this parses is fixed by the close pipeline plus GitHub: the PR
313
- * title `normalizePrTitle` writes ends with `(#<storyId>)`, and GitHub's
314
- * squash appends ` (#<prNumber>)` to it — so a landed Story merge reads
315
- * `<subject> (#<storyId>) (#<prNumber>)` and the Story's own marker is the
316
- * *second-to-last* marker, not the last one. Both are returned; the caller
317
- * decides which ids it cares about.
318
- *
319
- * Why the trailing run rather than a substring scan (the bug this replaces):
320
- * `subject.includes('(#101)')` matched the id **anywhere**, so an unrelated
321
- * later commit quoting an old marker — canonically a revert, whose subject
322
- * embeds the reverted title verbatim: `revert: "fix: x (#101) (#900)" (#950)`
323
- * — anchored the run on a far-older commit and inflated the roster diff with
324
- * everything in between. Peeling from the right stops at the first character
325
- * that is not part of a marker (the closing quote, above), so a quoted marker
326
- * is structurally out of reach.
327
- *
328
- * The `refs #` form is accepted because it is the other PR-title shape this
329
- * repo's own history carries (`feat(x): … (refs #4575) (#4582)`) — the
330
- * `refs #<id>` convention from `rules/git-conventions.md`. A plain substring
331
- * scan for `(#4575)` never matched those at all.
256
+ * Peel the trailing run of `(#<n>)` / `(refs #<n>)` markers off a squash
257
+ * subject (`<title> (#<storyId>) (#<prNumber>)`). Only the trailing run
258
+ * counts, so a revert quoting an old title can't anchor the run on an ancient commit.
332
259
  *
333
260
  * @param {string} subject
334
261
  * @returns {number[]} Marker ids, right-to-left (PR number first).
@@ -345,27 +272,15 @@ function trailingMarkerIds(subject) {
345
272
  }
346
273
 
347
274
  /**
348
- * Resolve the **pre-run base sha**: the commit the base branch pointed at
349
- * before the run's first Story landed.
350
- *
351
- * Why not `origin/main...HEAD` (the bug this replaces): the epilogue runs
352
- * *after* the run's last Story lands, so HEAD in the main checkout is either
353
- * `origin/main` itself or an ancestor of it. The three-dot merge-base is then
354
- * HEAD, and the diff is empty **by construction** — it never reported the
355
- * run's real diff. Rolling HEAD back does not help, so branch-reaping /
356
- * cleanup ordering is not the cause; the refs being compared are.
357
- *
358
- * The derivation walks the base ref's first-parent history for the run's
359
- * landed squash-merges. Every Story PR title carries a `(#<storyId>)` suffix
360
- * (guaranteed by `normalizePrTitle` in the close pipeline) and GitHub uses the
361
- * PR title as the squash subject, so the marker is a reliable, offline handle
362
- * that does **not** depend on the Story branches still existing. The earliest
363
- * such merge's first parent is the pre-run base.
275
+ * The commit the base pointed at before the run's first Story landed: the
276
+ * first parent of the earliest first-parent squash-merge carrying a run
277
+ * Story's `(#<storyId>)` marker. `origin/main...HEAD` would be empty by
278
+ * construction, since the epilogue runs after the last land.
364
279
  *
365
280
  * @param {object} args
366
- * @param {Array<string|number>} args.stories - Story ids in the run.
281
+ * @param {Array<string|number>} args.stories
367
282
  * @param {string} args.cwd
368
- * @param {string} [args.baseRef] - Remote-tracking base ref, e.g. `origin/main`.
283
+ * @param {string} [args.baseRef] - e.g. `origin/main`.
369
284
  * @param {number} [args.scanLimit]
370
285
  * @param {{ gitSpawn: Function }} [args.git]
371
286
  * @returns {{ resolved: true, baseSha: string, mergeSha: string, storyId: number, baseRef: string }
@@ -395,8 +310,7 @@ export function resolveRunBaseSha({
395
310
  return { resolved: false, baseRef, reason: history.reason };
396
311
  }
397
312
 
398
- // `git log` is newest-first; walk backwards so the first hit is the
399
- // *earliest* merge belonging to the run.
313
+ // Walk oldest-first so the first hit is the run's earliest merge.
400
314
  const wanted = new Set(ids);
401
315
  for (let i = history.commits.length - 1; i >= 0; i -= 1) {
402
316
  const commit = history.commits[i];
@@ -431,8 +345,6 @@ export function resolveRunBaseSha({
431
345
  }
432
346
 
433
347
  /**
434
- * List the files the run changed: `<pre-run base>...<baseRef>`.
435
- *
436
348
  * @returns {{ ok: true, files: string[] } | { ok: false, reason: string }}
437
349
  */
438
350
  function listChangedFiles({ cwd, baseSha, headRef, git }) {
@@ -461,8 +373,7 @@ function listChangedFiles({ cwd, baseSha, headRef, git }) {
461
373
  }
462
374
 
463
375
  /**
464
- * Resolve the run's combined landed diff, or an explicit reason it could not
465
- * be computed. Never conflates "could not compute" with "zero files changed".
376
+ * Never conflates "could not compute" with "zero files changed".
466
377
  *
467
378
  * @returns {{ resolved: boolean, changedFiles: string[], baseSha: string|null,
468
379
  * mergeSha: string|null, baseRef: string, reason: string|null }}
@@ -506,8 +417,7 @@ function resolveCombinedDiff({ stories, cwd, baseRef, git }) {
506
417
  }
507
418
 
508
419
  /**
509
- * The diff line of the roster comment. An unresolved base MUST read as a
510
- * loud failure, never as `Changed files considered: 0`.
420
+ * An unresolved base reads as a loud failure, never as zero files.
511
421
  *
512
422
  * @param {ReturnType<typeof resolveCombinedDiff>} diff
513
423
  * @returns {string[]}
@@ -544,12 +454,6 @@ function resolveBaseRef(config) {
544
454
  }
545
455
 
546
456
  /**
547
- * Render the `plan-run-audit-roster` comment body.
548
- *
549
- * Split out of `executeAuditRoster` in Story #5341: the executor's job is to
550
- * resolve the diff and select the lenses, and a hundred lines of rendering
551
- * between those two facts and the result is what hid them.
552
- *
553
457
  * @param {object} args
554
458
  * @returns {string}
555
459
  */
@@ -573,11 +477,7 @@ function renderAuditRosterBody({
573
477
  ? selectedAudits.map((lens) => `- \`${lens}\``)
574
478
  : ['- _(none — docs-only or no matching change-set lenses)_']),
575
479
  '',
576
- // Story #4949 — the roster used to name the lenses and say nothing about
577
- // how to dispatch them, which made a serial walk (and a nested
578
- // coordinator) fully compliant with it. The lenses are read-only and share
579
- // no write paths, so they are the textbook independent fan-out; naming the
580
- // shape here is what turns that from an option into the instruction.
480
+ // Lenses are read-only and independent; state the fan-out shape explicitly.
581
481
  '**Dispatch shape (MUST): flat, parallel, one turn.** Spawn one ' +
582
482
  '`auditor` sub-agent per lens listed above and issue every one of those ' +
583
483
  'spawns in a SINGLE turn — no nested fan-out, no serial walk. A ' +
@@ -624,11 +524,8 @@ async function executeAuditRoster({
624
524
  baseRef: resolveBaseRef(config),
625
525
  git,
626
526
  });
627
- // Hand `selectAudits` the change set we just resolved — never a git range for
628
- // it to re-derive. This function runs in the main checkout *after* the run's
629
- // Stories merged, so every range it could name (`main...HEAD`) is empty by
630
- // construction; asking for one is how the roster came to select lenses from
631
- // zero files while printing the correct file list beside them (Story #4571).
527
+ // Pass the resolved change set, never a range: post-merge, any range
528
+ // `selectAudits` could derive is empty by construction.
632
529
  const lensGrounding = diff.resolved ? 'diff' : 'keyword-only';
633
530
  let selectedAudits = [];
634
531
  if (Number.isInteger(primaryId) && primaryId > 0) {
@@ -667,14 +564,9 @@ async function executeAuditRoster({
667
564
  return {
668
565
  kind: 'audit-roster',
669
566
  selectedAudits,
670
- // Whether the lenses above were chosen from the run's landed files
671
- // (`diff`) or, with no resolvable base, from the primary Story's prose
672
- // alone (`keyword-only`). The two are not interchangeable: a keyword-only
673
- // roster cannot select a lens that declares no keywords, so its silence
674
- // about a lens says nothing about the code.
567
+ // A keyword-only roster's silence about a lens says nothing about the code.
675
568
  lensGrounding,
676
- // `null` — not `0` — when unresolved: a zero count must only ever mean
677
- // "the run genuinely changed nothing".
569
+ // `null`, not `0`, when unresolved.
678
570
  changedFileCount: diff.resolved ? diff.changedFiles.length : null,
679
571
  changedFiles: diff.resolved ? diff.changedFiles : null,
680
572
  baseResolution: {
@@ -688,16 +580,6 @@ async function executeAuditRoster({
688
580
  }
689
581
 
690
582
  /**
691
- * Compose the run-scope routed proposals.
692
- *
693
- * Story #4850 — `runToken` and `anchorStoryIds` are INPUTS. This used to
694
- * compose with the primary Story's numeric id standing in for the run and then
695
- * rewrite the rendered title/body by regex over a `plan-run \d+` substring,
696
- * which meant the composer's own wording could not be changed without silently
697
- * breaking the patch. `anchorStoryIds` is what lets the composer tell a corpus
698
- * confined to this run from one spanning the whole surviving window, so it
699
- * never titles the latter as if it were the former.
700
- *
701
583
  * @param {object} args
702
584
  * @returns {object}
703
585
  */
@@ -722,8 +604,6 @@ function composeRunProposals({
722
604
  }
723
605
 
724
606
  /**
725
- * Hand the run-scope proposals to the graduator (injectable for tests).
726
- *
727
607
  * @param {object} args
728
608
  * @returns {Promise<object>}
729
609
  */
@@ -741,8 +621,6 @@ function fileRunProposals({
741
621
  provider,
742
622
  config,
743
623
  currentRepo: repos.currentRepo,
744
- // The resolved bucket object, not a re-split of the slug: routing is
745
- // decided once in `github/framework-repo.js`.
746
624
  frameworkRepo: repos.repos.framework,
747
625
  platformRepo: repos.repos.platform,
748
626
  routedProposals: proposals,
@@ -758,9 +636,6 @@ async function executeFollowUpRollup({
758
636
  cwd,
759
637
  graduateFn = graduateRetroProposals,
760
638
  }) {
761
- // Shared with the story-scoped gather (Story #4649): `storyId` + `details`
762
- // are what the composer's recovery-netting keys on, and two hand-rolled
763
- // copies of this loop are how they got dropped in the first place.
764
639
  const { signals, window: frictionWindow } = await gatherRunFrictionSignals(
765
640
  stories,
766
641
  config,
@@ -816,9 +691,6 @@ async function executeFollowUpRollup({
816
691
  }
817
692
 
818
693
  /**
819
- * Render the run-scope roll-up and publish it — the one place that decides
820
- * where it goes.
821
- *
822
694
  * @param {object} args
823
695
  * @returns {Promise<void>}
824
696
  */
@@ -839,12 +711,7 @@ async function publishRunRollup({
839
711
  storyId: primaryId,
840
712
  proposals,
841
713
  graduated,
842
- // Story #4578 — the run's Story count is what lets an empty roll-up
843
- // render as a flagged claim ("0 signals across N Stories") rather than
844
- // as "nothing to follow up".
845
714
  storyCount,
846
- // Story #4828 — and the corpus is what lets a zero-proposal or
847
- // zero-filed roll-up name what it saw instead of rendering as clean.
848
715
  signalCount,
849
716
  categories,
850
717
  }).replace(
@@ -861,10 +728,8 @@ async function publishRunRollup({
861
728
  }
862
729
 
863
730
  /**
864
- * Assemble the `follow-up-rollup` step result. Split out of
865
- * `executeFollowUpRollup` in Story #5341: the literal had grown to carry
866
- * every suspicion the roll-up can raise, and the reporting shape is what
867
- * callers read, not how it was gathered.
731
+ * The step result carries every suspect flag so the CLI never regexes the
732
+ * comment body.
868
733
  *
869
734
  * @param {object} args
870
735
  * @returns {object}
@@ -884,31 +749,14 @@ function buildRollupStepResult({
884
749
  signalCount: signals.length,
885
750
  storyCount,
886
751
  filed: graduated.filed?.length ?? 0,
887
- // Story #4850 — the recurrence window the gather actually applied, and what
888
- // it dropped. `signalCount` alone cannot distinguish "the window is bounded
889
- // at 30 days and 40 rows aged out" from "nothing older exists", and an
890
- // operator triaging a roll-up needs to know which corpus produced it.
752
+ // What the age window excluded, so a bounded corpus is distinguishable.
891
753
  frictionWindow,
892
- // Story #4828 — everything below is what the roll-up saw and what became
893
- // of it. The pre-#4828 result reported `signalCount` and `filed` and
894
- // nothing in between, so nine signals routing into one proposal whose
895
- // every filing attempt errored rendered as `{signalCount: 9, filed: 0,
896
- // discarded: []}` — arithmetically consistent, and indistinguishable from
897
- // a run with nothing to do.
898
754
  proposalCount,
899
- // The categories the corpus actually contained, so a zero-proposal
900
- // roll-up names its own input rather than asserting emptiness.
901
755
  categories,
902
756
  filingErrors: Array.isArray(graduated.errors) ? graduated.errors : [],
903
757
  filingSkipped: outcome.blockingSkipReasons,
904
- // Signals in, nothing out — not even a below-threshold row.
905
758
  zeroProposalSuspect: outcome.zeroProposals,
906
- // Proposals cleared the threshold and the filer produced none of them.
907
759
  unfiledProposalSuspect: outcome.unfiledProposals,
908
- // Story #4824 — a roll-up that discards every candidate must still name
909
- // what it discarded. Rendering that as "nothing to follow up" is how a
910
- // defect recurring once per Story survived eighteen consecutive Stories.
911
- // Surfaced on the step result so the CLI need not regex the comment body.
912
760
  discarded: proposals.discarded.map((item) => ({
913
761
  category: item.category,
914
762
  occurrences: item.occurrences,
@@ -917,16 +765,12 @@ function buildRollupStepResult({
917
765
  tools: item.tools ?? [],
918
766
  fingerprint: item.fingerprint ?? null,
919
767
  })),
920
- // Story #4578 — zero signals across a multi-Story run is a claim, not a
921
- // clean bill of health. Surfaced on the step result so the CLI can warn
922
- // the operator without re-deriving it from the comment prose.
923
768
  emptyRollupSuspect: signals.length === 0 && storyCount > 1,
924
769
  };
925
770
  }
926
771
 
927
772
  /**
928
- * Execute the per-run epilogue. Throws only on programmer misuse; step
929
- * failures are collected into `errors[]`.
773
+ * Throws only on programmer misuse; step failures collect into `errors[]`.
930
774
  *
931
775
  * @param {object} args
932
776
  * @param {string} args.planRunId
@@ -934,13 +778,10 @@ function buildRollupStepResult({
934
778
  * @param {object} args.provider
935
779
  * @param {object} [args.config]
936
780
  * @param {string} [args.cwd]
937
- * @param {{ gitSpawn: Function }} [args.git] - Injection seam for tests.
938
- * @param {typeof selectAudits} [args.selectAuditsFn] - Injection seam for tests.
939
- * @param {typeof graduateRetroProposals} [args.graduateFn] - Injection seam so
940
- * the roll-up's reporting layer can be asserted against a filer that fails
941
- * (Story #4828) without spawning a real `gh`.
942
- * @param {boolean} [args.auditRoster] Opt into the audit-roster step
943
- * (Story #5343); default `false`.
781
+ * @param {{ gitSpawn: Function }} [args.git]
782
+ * @param {typeof selectAudits} [args.selectAuditsFn]
783
+ * @param {typeof graduateRetroProposals} [args.graduateFn]
784
+ * @param {boolean} [args.auditRoster] Default `false`.
944
785
  * @returns {Promise<object>}
945
786
  */
946
787
  export async function runPlanRunEpilogue({
@@ -1,54 +1,15 @@
1
1
  /**
2
- * run-scoped-config.js — pin the config values a delivery run was seeded
3
- * from, and fail closed when the file they came from changed underneath it.
4
- *
5
- * The problem this exists for: `single-story-init.js` resolves config and
6
- * seeds `story-<id>` from `project.baseBranch`; `single-story-close` used to
7
- * re-resolve the SAME key and run close-validation, format-autofix, the gate
8
- * baseline and base-sync against its own second answer. Nothing pinned the
9
- * first value and nothing checked the two agreed — and the window between
10
- * them is however long implementation takes. A concurrent session editing
11
- * `.agentrc.json` / `.agentrc.local.json` mid-run therefore base-synced a
12
- * Story against a base it was never seeded from, which surfaced only as an
13
- * ordinary content conflict with nothing pointing at config.
14
- *
15
- * The base a Story was seeded from is a property of **that run**, not of
16
- * whatever the config file says later. So init pins it and close reads the
17
- * pin back.
18
- *
19
- * ## Where the pin lives
20
- *
21
- * The init envelope on disk — `<tempRoot>/orchestration/story-init-result-<id>.log`,
22
- * written by `single-story-init.js` via `emitTerseResult`. Story #5343 retired
23
- * the `story-init` ticket comment (the delivery-comment diet), so the envelope
24
- * is the pin's home; it is written before init returns and read at close, well
25
- * before the post-land tail purges the temp tree.
26
- *
27
- * That is a hard cutover, not a dual read. The envelope is written by the same
28
- * process, in the same run, that seeds the branch — so if it is gone, the temp
29
- * tree was reaped and this is a much later close, exactly the case a stale
30
- * `story-init` comment would have answered with equal uncertainty. A missing
31
- * pin is never a refusal: it degrades to the currently-resolved config with a
32
- * loud, announced warning, and close simply cannot confirm the base.
33
- *
34
- * ## Adding another run-scoped key
35
- *
36
- * Add one row to `RUN_SCOPED_CONFIG_KEYS`. Both halves — the pin init writes
37
- * and the comparison close makes — enumerate that registry, so a new key
38
- * needs no second mechanism, no reader change and no writer change. Only
39
- * `baseBranch` is enforced today because only its corruption is destructive
40
- * (a wrong base merged into the Story branch permanently contaminates the
41
- * branch and its PR diff); ceremony profile, quality floors and the
42
- * concurrency cap are deliberately NOT pinned here.
2
+ * Pin the config a delivery run was seeded from (in the init envelope) and
3
+ * fail closed at close when the config changed underneath it — a concurrent
4
+ * edit would otherwise base-sync the Story onto a base it was never seeded
5
+ * from. A missing pin degrades to current config with a loud warning.
43
6
  */
44
7
 
45
8
  import { readRunScopedPin } from './story-init-envelope.js';
46
9
 
47
10
  /**
48
- * The run-scoped config registry. One row per key whose value belongs to the
49
- * run that seeded the Story rather than to the current contents of the config
50
- * file. `read` resolves the key from a resolved config (including its
51
- * default); `label` is the dotted config path the operator has to go fix.
11
+ * Keys whose value belongs to the seeding run. Only `baseBranch`: a wrong base
12
+ * permanently contaminates the branch. Init and close both walk this registry.
52
13
  *
53
14
  * @type {Record<string, { read: (config: object) => unknown, label: string }>}
54
15
  */
@@ -60,14 +21,8 @@ const RUN_SCOPED_CONFIG_KEYS = {
60
21
  };
61
22
 
62
23
  /**
63
- * Snapshot the run-scoped config values from a resolved config. This is the
64
- * write half of the pin: `single-story-init.js` records the returned object
65
- * on its init envelope so close can compare against it later.
66
- *
67
- * @param {object} config Resolved config (`resolveConfig` output).
68
- * @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys] Registry override — the
69
- * default is the module registry; supplying one is how a caller (or a test)
70
- * exercises the registry-driven property without a second mechanism.
24
+ * @param {object} config Resolved config.
25
+ * @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys]
71
26
  * @returns {Record<string, unknown>} the pinned values, keyed by config key.
72
27
  */
73
28
  export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
@@ -79,14 +34,7 @@ export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
79
34
  }
80
35
 
81
36
  /**
82
- * Compare the receipt's pinned values against the currently-resolved ones,
83
- * one registry row at a time. Split out of `resolveRunScopedConfig` so the
84
- * row walk and the three outcomes it feeds (confirmed / conflict / unpinned)
85
- * read separately.
86
- *
87
- * A row the receipt pins nothing for is `unpinned`, not a conflict: an older
88
- * receipt simply predates that registry row, and falling back to current
89
- * config for it is correct as long as the fallback is announced.
37
+ * A row with no pinned value is `unpinned` (an older receipt), not a conflict.
90
38
  *
91
39
  * @param {{
92
40
  * pinned: Record<string, unknown>,
@@ -119,11 +67,6 @@ function comparePinToCurrent({ pinned: pin, current, keys }) {
119
67
  }
120
68
 
121
69
  /**
122
- * Build the refusal message for a mid-run config change. Names BOTH values
123
- * for every conflicting key — the pinned one and the one config resolves to
124
- * now — because "which base was this branch actually seeded from" is the
125
- * question the operator could not previously answer.
126
- *
127
70
  * @param {{ storyId: number, conflicts: Array<{ label: string, pinned: unknown, current: unknown }> }} args
128
71
  * @returns {string}
129
72
  */
@@ -144,14 +87,8 @@ function formatRunScopedConflict({ storyId, conflicts }) {
144
87
  }
145
88
 
146
89
  /**
147
- * Resolve the run-scoped config for a close, preferring the run's pin over a
148
- * fresh resolution of the config file.
149
- *
150
- * Throws on disagreement — fail closed, before any gate, format-autofix or
151
- * base-sync has run, with both values named. Never silently prefers either
152
- * side: preferring the pin would base-sync correctly but hide a config change
153
- * the operator needs to know about, and preferring current config is the bug
154
- * this module exists to close.
90
+ * Throws on disagreement, before any gate or base-sync runs — silently
91
+ * preferring either side would hide the config change.
155
92
  *
156
93
  * @param {{
157
94
  * storyId: number,
@@ -165,9 +102,7 @@ function formatRunScopedConflict({ storyId, conflicts }) {
165
102
  * confirmed: boolean,
166
103
  * receiptStatus: string,
167
104
  * warning: string|null,
168
- * }>} `confirmed` is true only when every key came from the receipt and
169
- * agreed with current config — i.e. when downstream remediation may safely
170
- * assume the pinned value is the one in play.
105
+ * }>} `confirmed` only when every key was pinned and agreed.
171
106
  */
172
107
  export async function resolveRunScopedConfig({
173
108
  storyId,
@@ -180,8 +115,7 @@ export async function resolveRunScopedConfig({
180
115
  const receipt = readPinFn({ storyId: Number(storyId), config });
181
116
 
182
117
  if (!receipt) {
183
- // A missing pin is a real state, not an error — but the fallback is
184
- // announced, because a silent one reintroduces exactly the bug above.
118
+ // Not an error, but never a silent fallback.
185
119
  const warning =
186
120
  `Run-scoped config could not be read from the run's init envelope ` +
187
121
  `(no runScopedConfig pin for Story #${storyId}); falling back to the ` +
@@ -227,8 +161,6 @@ export async function resolveRunScopedConfig({
227
161
  }
228
162
 
229
163
  /**
230
- * Render `label=value` pairs for the operator-facing lines above.
231
- *
232
164
  * @param {Record<string, unknown>} values
233
165
  * @param {typeof RUN_SCOPED_CONFIG_KEYS} keys
234
166
  * @returns {string}
@@ -1,45 +1,18 @@
1
1
  /**
2
- * close-note.js — the human-readable `note` on close's result record
3
- * (Story #5266).
2
+ * close-note.js — the human-readable `note` on close's result record.
4
3
  *
5
- * ## Why this is its own module
6
- *
7
- * The note used to branch on `waitedForMerge` — whether close *waited* — and
8
- * not on `merged`. A bounded wait that expired with the PR still open
9
- * therefore wrote "Close-and-land: PR merge confirmed … the issue closed"
10
- * into `story-close-result-<id>.log` **beside `merged: false`**, while the
11
- * schema-validated terminal envelope correctly reported
12
- * `status: pending, phase: confirm-merge`. That log is what close's summary
13
- * line points the operator at, so the contradiction is what gets read first:
14
- * a merge that never happened, reported as confirmed.
15
- *
16
- * The invariant this module exists to hold:
17
- *
18
- * > **No note may assert a state the same object denies.**
19
- *
20
- * Every branch below is therefore derived from the result's OWN
21
- * `merged` / `directMerged` / `autoMergeEnabled` / `landCompleted` fields —
22
- * the ones the note ships next to — so no input can produce a note that
23
- * contradicts them. Story #5279 added the fourth, because `merged: true`
24
- * used to imply the flip, the issue close and the post-land tail: a direct
25
- * squash-merge under `--no-wait-merge`, and a merge whose `agent::done` write
26
- * failed, now reach it with none of the three, and reusing the confirmed
27
- * wording for them would reintroduce the defect above one field over. The
28
- * unmerged branches deliberately claim nothing about the Story's label state
29
- * either: close's ending may be `pending` OR `blocked` with the same
30
- * `merged: false`, and the terminal envelope is the authority on which. They
31
- * also avoid the merge-completion vocabulary entirely — no `agent::done`, no
32
- * "the merge confirms" — so that a reader skimming for those words cannot
33
- * take a next-step instruction for a report of what happened.
4
+ * Invariant: no note may assert a state the same object denies, so every
5
+ * branch derives from the result's own fields. A merge is not a completed
6
+ * land (`landCompleted`), and the unmerged branches claim nothing about label
7
+ * state and avoid merge-completion vocabulary — the terminal envelope is the
8
+ * authority on pending vs blocked.
34
9
  */
35
10
 
36
11
  /**
37
- * The one line the note is not allowed to get wrong.
38
- *
39
12
  * @param {{ merged?: boolean, directMerged?: boolean,
40
13
  * autoMergeEnabled?: boolean, landCompleted?: boolean }} result
41
14
  * `landCompleted` — did THIS run flip `agent::done`, close the issue and
42
- * run the post-land tail? Defaults to `merged`, the pre-#5279 equivalence.
15
+ * run the post-land tail? Defaults to `merged`.
43
16
  * @returns {string}
44
17
  */
45
18
  export function deriveCloseNote({