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,52 +1,14 @@
1
1
  /**
2
- * conventional-subject.js — the pure Conventional-Commit rules behind the
3
- * squash-merge subject a standalone Story lands on `main`.
4
- *
5
- * Split out of `normalize-pr-title.js` so the rules that decide
6
- * what the release notes say are testable without a git read. The three rules
7
- * here each closed a defect observed live on `main`:
8
- *
9
- * 1. **Type precedence follows release impact.** A multi-commit Story used
10
- * to resolve its type off a hand-ordered list in which `docs` outranked
11
- * `chore` for no stated reason. Story #5004 (`chore(gates)`, `docs(ci)`,
12
- * `chore(baselines)`) therefore landed as
13
- * `docs: check/CI gate sweep …` — a change that deleted five
14
- * `lib/checks` modules, two CLIs and a dependency, filed under
15
- * documentation. `TYPE_RANK` now mirrors `changelog-sections` in
16
- * `release-please-config.json`: rank IS how visible the type is in the
17
- * release notes. Types that render identically (the six `hidden: true`
18
- * ones) share a rank, because there is no honest ordering between them —
19
- * those ties break on how much of the branch carries the type, then on
20
- * the Story's primary (oldest) commit.
21
- *
22
- * 2. **Casing leaves acronyms alone.** The old synthesizer lowercased the
23
- * first character unconditionally to satisfy commitlint's `subject-case`
24
- * rule, which turned Story #5002's "CRAP surface diet" into
25
- * `refactor: cRAP surface diet`. `shapeDescription` lowercases only when
26
- * the leading word is not an all-caps token, so CRAP / CI / QA / API
27
- * survive. That is a deliberate, narrow trade: commitlint's
28
- * `subject-case` treats ANY leading capital as sentence-case and would
29
- * flag `CRAP surface diet` — but commitlint never runs on a PR title or
30
- * a GitHub squash subject (see `rules/git-conventions.md` §
31
- * Conventional Commits), so the rule it would fail is not a gate this
32
- * subject passes through, while a mangled acronym is permanent in the
33
- * changelog.
34
- *
35
- * 3. **A breaking change survives the squash.** release-please only sees a
36
- * breaking change through a `!` in the subject or a `BREAKING CHANGE:`
37
- * footer. Story #5004 removed `project.commands.lintBaseline` from a
38
- * schema block that is `additionalProperties: false` — a hard consumer
39
- * break — described in prose in the commit body and therefore invisible
40
- * to the parser. `collectBreakingNotes` reads the footer out of any
41
- * constituent commit (or a Story-body declaration) and `markBreaking`
42
- * puts the `!` where the parser looks.
2
+ * conventional-subject.js — pure Conventional-Commit rules for the squash
3
+ * subject a Story lands on `main`: type precedence by release impact,
4
+ * acronym-safe casing (commitlint never sees a squash subject, but a mangled
5
+ * acronym is permanent in the changelog), and a breaking change that
6
+ * survives the squash as a `!`.
43
7
  */
44
8
 
45
9
  /**
46
- * The Conventional-Commit types Mandrel accepts. Mirrors
47
- * `commitlint.config.js` → `type-enum` and `release-please-config.json` →
48
- * `changelog-sections`. Kept in sync by hand (single hard-cutover, no
49
- * shim) — adding a type means touching all three.
10
+ * Mirrors commitlint `type-enum` and release-please `changelog-sections`;
11
+ * kept in sync by hand.
50
12
  */
51
13
  const CONVENTIONAL_TYPES = Object.freeze([
52
14
  'feat',
@@ -63,11 +25,8 @@ const CONVENTIONAL_TYPES = Object.freeze([
63
25
  ]);
64
26
 
65
27
  /**
66
- * Release-impact rank per type — LOWER wins. Derived from
67
- * `changelog-sections` in `release-please-config.json`: the five types that
68
- * render a visible section are ordered by how much a reader needs to see
69
- * them, and the six `hidden: true` types share the bottom rank because the
70
- * release notes draw no distinction between them.
28
+ * Release-impact rank, LOWER wins, from `changelog-sections`; the hidden
29
+ * types tie because the release notes don't distinguish them.
71
30
  *
72
31
  * @type {Readonly<Record<string, number>>}
73
32
  */
@@ -85,48 +44,28 @@ const TYPE_RANK = Object.freeze({
85
44
  ci: 5, // hidden
86
45
  });
87
46
 
88
- /** Rank for a type absent from `TYPE_RANK` — always loses. */
89
47
  const UNRANKED = Number.MAX_SAFE_INTEGER;
90
48
 
91
49
  const TYPE_GROUP = CONVENTIONAL_TYPES.join('|');
92
50
 
93
- // Anchored Conventional-Commit header matcher:
94
- // <type>(<optional scope>)<optional !>: <non-empty description>
95
- // Mirrors the shape `@commitlint/config-conventional` enforces (a known
96
- // type, an optional parenthesised scope, an optional breaking `!`, a
97
- // colon-space separator, and a non-empty subject). Used for the pure
98
- // "is this already conventional?" check and to pull the type off a branch
99
- // commit subject without spawning commitlint per call.
51
+ // <type>(<scope>)?!?: <description> — the shape config-conventional enforces.
100
52
  const CONVENTIONAL_HEADER_RE = new RegExp(
101
53
  `^(?:${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?!?: \\S.*$`,
102
54
  );
103
55
  const LEADING_TYPE_RE = new RegExp(
104
56
  `^(${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?(!?):`,
105
57
  );
106
- // Splits a conventional header into `<type><scope?>`, `<!?>`, `<description>`
107
- // so the breaking marker can be inserted at the one position the parser reads.
108
58
  const HEADER_PARTS_RE = new RegExp(
109
59
  `^((?:${TYPE_GROUP})(?:\\([^()\\r\\n]+\\))?)(!?): (.*)$`,
110
60
  );
111
61
 
112
- /**
113
- * The Conventional-Commits breaking footer, in both spellings the spec
114
- * defines (`BREAKING CHANGE:` and the hyphenated `BREAKING-CHANGE:`). Case is
115
- * significant — the spec requires uppercase, and so does
116
- * `conventional-commits-parser`'s default `noteKeywords`, so matching
117
- * case-insensitively here would announce breaks release-please will not.
118
- */
62
+ /** Case-sensitive, as the parser's `noteKeywords` are. */
119
63
  const BREAKING_FOOTER_RE = /^BREAKING[ -]CHANGE:[ \t]*(.*)$/;
120
64
 
121
- /** A git-trailer-shaped line (`Some-Token: value`) — ends a footer's text. */
122
65
  const TRAILER_RE = /^[A-Za-z][A-Za-z-]*:[ \t]/;
123
- /** An opening or closing markdown code fence: ``` or ~~~, optionally indented. */
124
66
  const FENCE_RE = /^\s{0,3}(`{3,}|~{3,})/;
125
67
 
126
68
  /**
127
- * True iff `subject` is a parseable Conventional Commit subject under the
128
- * repo's type vocabulary. Pure.
129
- *
130
69
  * @param {string} subject
131
70
  * @returns {boolean}
132
71
  */
@@ -136,9 +75,6 @@ export function isConventionalSubject(subject) {
136
75
  }
137
76
 
138
77
  /**
139
- * Extract the Conventional-Commit `type` from a single commit subject, or
140
- * `null` when the subject is not conventional. Pure.
141
- *
142
78
  * @param {string} subject
143
79
  * @returns {string|null}
144
80
  */
@@ -149,10 +85,8 @@ function parseConventionalType(subject) {
149
85
  }
150
86
 
151
87
  /**
152
- * Order two type candidates: release impact first, then how much of the
153
- * branch carries the type, then the earliest commit that used it. The second
154
- * and third keys only ever decide a tie inside the hidden tier — every
155
- * visible type holds its rank alone.
88
+ * Rank, then commit count, then earliest use (the tie-breaks only matter in
89
+ * the hidden tier).
156
90
  *
157
91
  * @param {{rank: number, count: number, firstIndex: number}} a
158
92
  * @param {{rank: number, count: number, firstIndex: number}} b
@@ -165,12 +99,8 @@ function compareTypeCandidates(a, b) {
165
99
  }
166
100
 
167
101
  /**
168
- * Pick the type the squash subject should carry from the branch's own commit
169
- * subjects. Returns `null` when no subject is conventional.
170
- *
171
- * `subjects` MUST be oldest-first: the final tie-break reads index 0 as the
172
- * Story's primary commit, the one whose type the operator chose before any
173
- * fixup or baseline-refresh commit piled on.
102
+ * `subjects` MUST be oldest-first: the last tie-break treats index 0 as the
103
+ * Story's primary commit.
174
104
  *
175
105
  * @param {string[]} subjects Commit subjects, oldest first.
176
106
  * @returns {string|null}
@@ -199,11 +129,8 @@ export function pickDominantType(subjects) {
199
129
  }
200
130
 
201
131
  /**
202
- * True when the leading word of `text` is an all-caps token — an acronym the
203
- * synthesizer must not touch. Requires two or more letters so a stray leading
204
- * "A" or "I" still lowercases; punctuation and digits are ignored so
205
- * `CRAP:`, `CI/CD` and `API-surface` all read as acronyms while `A11y` does
206
- * not.
132
+ * Leading all-caps word of 2+ letters (non-letters ignored), so `CI/CD` is an
133
+ * acronym but a lone "A" or `A11y` is not.
207
134
  *
208
135
  * @param {string} text
209
136
  * @returns {boolean}
@@ -215,10 +142,7 @@ function leadsWithAcronym(text) {
215
142
  }
216
143
 
217
144
  /**
218
- * Shape a human Story title into the description half of a synthesized
219
- * Conventional-Commit subject: lowercase the first character so the subject
220
- * reads as a sentence fragment, EXCEPT when the leading word is an acronym.
221
- * Pure.
145
+ * Lowercase the first character unless the leading word is an acronym.
222
146
  *
223
147
  * @param {string} text
224
148
  * @returns {string}
@@ -231,10 +155,7 @@ export function shapeDescription(text) {
231
155
  }
232
156
 
233
157
  /**
234
- * Insert the breaking-change `!` into a conventional subject, at the one
235
- * position `conventional-commits-parser` reads it: immediately before the
236
- * colon, after any scope. A subject that already carries `!`, or that is not
237
- * conventional, is returned unchanged. Pure.
158
+ * Insert `!` before the colon (after any scope); otherwise unchanged.
238
159
  *
239
160
  * @param {string} subject
240
161
  * @returns {string}
@@ -248,9 +169,7 @@ export function markBreaking(subject) {
248
169
  }
249
170
 
250
171
  /**
251
- * Pull the text of one `BREAKING CHANGE:` footer out of `lines`, starting at
252
- * the footer line itself. The note runs to the end of its paragraph: a blank
253
- * line, another trailer, or the end of the message closes it.
172
+ * A footer note runs until a blank line, another trailer, or the end.
254
173
  *
255
174
  * @param {string[]} lines
256
175
  * @param {number} start Index of the matched footer line.
@@ -271,22 +190,8 @@ function readFooterNote(lines, start, head) {
271
190
  }
272
191
 
273
192
  /**
274
- * Scan one commit message (or the Story body) for breaking-change evidence.
275
- *
276
- * @param {string} text
277
- * @param {boolean} readHeaderBang Whether line 0 is a commit header whose `!`
278
- * counts. False for the Story body, which has no header.
279
- * @returns {{ breaking: boolean, notes: string[], subject: string|null }}
280
- */
281
- /**
282
- * Blank every line inside a markdown code fence, keeping line indices intact.
283
- *
284
- * A Story `## Spec` that documents this very contract quotes the footer in a
285
- * fence; reading that as a declaration ships a `<type>!:` subject and a release
286
- * note for a break nobody made. Fenced spans are the only place the anchored
287
- * footer regex can fire on non-footer text — an indented block or a blockquote
288
- * already fails the `^` anchor. Blanking rather than dropping means a fence
289
- * also closes an open footer note, which is what a paragraph break would do.
193
+ * Blank lines inside code fences, so a quoted footer is not a declaration;
194
+ * blanking (not dropping) keeps indices and closes an open note.
290
195
  *
291
196
  * @param {string[]} lines
292
197
  * @returns {string[]}
@@ -302,6 +207,11 @@ function blankFencedLines(lines) {
302
207
  });
303
208
  }
304
209
 
210
+ /**
211
+ * @param {string} text
212
+ * @param {boolean} readHeaderBang False for the Story body, which has no header.
213
+ * @returns {{ breaking: boolean, notes: string[], subject: string|null }}
214
+ */
305
215
  function scanForBreaking(text, readHeaderBang) {
306
216
  const lines = blankFencedLines(String(text ?? '').split('\n'));
307
217
  const notes = [];
@@ -334,23 +244,9 @@ function scanForBreaking(text, readHeaderBang) {
334
244
  }
335
245
 
336
246
  /**
337
- * Collect the branch's breaking-change declarations.
338
- *
339
- * Two sources, both honoured:
340
- *
341
- * - **Any constituent commit** — a `BREAKING CHANGE:` / `BREAKING-CHANGE:`
342
- * footer, or a `!` in the header. This is the path a maker takes while
343
- * writing the commit that does the breaking.
344
- * - **The Story body** — the same footer, written as its own line anywhere
345
- * in the Story issue (the `## Spec` block is the natural home). This is
346
- * the declarative path: `/mandrel-plan` can state the break up front and close
347
- * propagates it even when no individual commit remembered the footer.
348
- * Only the footer form counts; prose describing a break does not, because
349
- * a keyword-free sentence is exactly what release-please cannot parse.
350
- *
351
- * When something is breaking but no footer supplied text, the `!` commit's
352
- * own description becomes the note — the fallback Conventional Commits
353
- * itself prescribes for a `!` header with no footer.
247
+ * Breaking declarations from any commit (footer or header `!`) or a footer
248
+ * line in the Story body; prose never counts. With no footer text, the `!`
249
+ * commit's description is the note, per the spec.
354
250
  *
355
251
  * @param {{ commitMessages?: string[], storyBody?: string }} args
356
252
  * @returns {{ breaking: boolean, notes: string[] }}
@@ -1,28 +1,8 @@
1
1
  /**
2
- * phases/graphql-preflight.js — the one precondition a standalone close
3
- * checks before it spends anything (Story #5355).
4
- *
5
- * A Story delivered from a Claude Code web session ran the entire
6
- * close-validation gate chain, synced from the base branch and pushed, then
7
- * died in the `pull-request` phase on `gh pr create` with a raw HTTP 403:
8
- * GitHub's GraphQL API is unreachable from that session, and `gh` routes the
9
- * whole `gh pr` surface through it. That 403 was a fact about the session,
10
- * knowable before the first gate ran, that the operator paid roughly five
11
- * minutes of gates to learn.
12
- *
13
- * ## Why this is not a pre-gate step
14
- *
15
- * It sits beside `pre-gate-steps.js` and inverts every clause of that
16
- * module's contract, which is why it does not live inside it. Those steps
17
- * commit to `story-<id>`, run from the gate phase, and may **never** fail the
18
- * close, because each is the refresh half of a loop whose enforcement half
19
- * runs immediately afterwards. This one commits nothing, runs from the runner
20
- * during `init`, and exists precisely to fail the close — before a single
21
- * gate is spawned and before anything is pushed. One module, one contract.
22
- *
23
- * What it must never do is fail a *healthy* close, which is why an ambiguous
24
- * probe is fail-open at its source (`probeGraphqlAvailability`) and a
25
- * throwing probe is fail-open here.
2
+ * phases/graphql-preflight.js — refuse the close during `init` when GitHub
3
+ * GraphQL (which all of `gh pr` needs) is unreachable, before any gate runs
4
+ * or anything is pushed. It must never fail a healthy close: ambiguous or
5
+ * throwing probes are fail-open.
26
6
  */
27
7
 
28
8
  import {
@@ -37,16 +17,8 @@ import {
37
17
  } from '../../ticketing.js';
38
18
 
39
19
  /**
40
- * Announce a refused preflight on the Story: a `friction` comment carrying
41
- * the blocker and its remedy, then the `agent::blocked` transition the
42
- * terminal envelope's `blocked` status promises the operator.
43
- *
44
- * Both writes are best-effort and warn rather than throw, for the reason
45
- * `handleSyncFailure` gives: a notification-side failure must not replace the
46
- * real blocker with a secondary one — and here the notification travels the
47
- * very API surface that is already suspect. Both go through the canonical
48
- * mutators; a bare `updateTicket` would skip the Projects v2 column sync and
49
- * strand the board on the Story's prior status.
20
+ * Best-effort: a notification failure must not replace the real blocker.
21
+ * Canonical mutators only, so the Projects v2 column syncs.
50
22
  *
51
23
  * @param {{ provider: object, storyId: number, reason: string,
52
24
  * progress: (tag: string, msg: string) => void }} args
@@ -85,16 +57,7 @@ async function announcePreflightBlock({ provider, storyId, reason, progress }) {
85
57
  }
86
58
 
87
59
  /**
88
- * Preflight GitHub's GraphQL reachability before the close spends anything.
89
- *
90
- * One cheap API read decides it. An `available` verdict returns null and the
91
- * close proceeds exactly as a run with no preflight would; a refusing verdict
92
- * announces the block on the Story and returns the descriptor the runner
93
- * turns into a `blocked` terminal envelope at phase `init`.
94
- *
95
- * The probe cannot throw, but a caller-injected one can, and a preflight that
96
- * takes down a close it was meant to protect is the one outcome worse than
97
- * the late 403 — so a throwing probe is logged and treated as available.
60
+ * A throwing (injected) probe is treated as available.
98
61
  *
99
62
  * @param {{
100
63
  * storyId: number,
@@ -102,12 +65,8 @@ async function announcePreflightBlock({ provider, storyId, reason, progress }) {
102
65
  * progress: (tag: string, msg: string) => void,
103
66
  * ghFacade?: { api: Function },
104
67
  * probe?: typeof probeGraphqlAvailability,
105
- * }} args
106
- * `ghFacade` is the run's own `gh` facade, so the preflight asks the same
107
- * boundary the pull-request phase will later ask rather than a second one
108
- * that could answer differently.
109
- * @returns {Promise<{ verdict: string, reason: string }|null>} null when the
110
- * close may proceed.
68
+ * }} args `ghFacade` is the run's own, so it asks the same boundary the PR phase will.
69
+ * @returns {Promise<{ verdict: string, reason: string }|null>} null to proceed.
111
70
  */
112
71
  export async function runGraphqlPreflight({
113
72
  storyId,
@@ -0,0 +1,49 @@
1
+ /**
2
+ * phases/lock-wait-pending.js — a close whose full-suite lock wait expired
3
+ * ends `pending`, not `failed`: nothing was spawned, pushed or labelled, so
4
+ * the next command is the same close.
5
+ */
6
+ import {
7
+ buildTerminalEnvelope,
8
+ NEXT_COMMANDS,
9
+ } from '../../story-deliver-terminal.js';
10
+
11
+ /**
12
+ * @param {{
13
+ * storyId: number,
14
+ * storyBranch: string,
15
+ * baseBranch: string,
16
+ * lockWait: { waitedSeconds: number, expired: boolean }|null,
17
+ * elapsedSeconds: number,
18
+ * }} args
19
+ * @returns {{ result: object, terminal: object, note: string }} The close
20
+ * result, the validated `pending` envelope, and the operator line.
21
+ */
22
+ export function lockWaitPending({
23
+ storyId,
24
+ storyBranch,
25
+ baseBranch,
26
+ lockWait,
27
+ elapsedSeconds,
28
+ }) {
29
+ const nextCommand = NEXT_COMMANDS.close(storyId);
30
+ return {
31
+ result: {
32
+ storyId,
33
+ standalone: true,
34
+ action: 'deferred',
35
+ reason: 'full-suite-lock-wait-expired',
36
+ },
37
+ terminal: buildTerminalEnvelope({
38
+ storyId,
39
+ status: 'pending',
40
+ phase: 'close-validation',
41
+ storyBranch,
42
+ baseBranch,
43
+ lockWait,
44
+ nextCommand,
45
+ elapsedSeconds,
46
+ }),
47
+ note: `⏸ Story #${storyId}: another full suite held the host lock past the wait budget — resume with: ${nextCommand}`,
48
+ };
49
+ }
@@ -1,41 +1,8 @@
1
1
  /**
2
- * normalize-pr-title.js — guarantee the standalone-Story PR title is a
3
- * valid Conventional Commit subject so the squash-merge subject on `main`
4
- * parses for release-please.
5
- *
6
- * Story #3969 (framework gap). The repo squash-merges, and GitHub uses the
7
- * PR title as the squash-commit subject. `buildPullRequest` previously
8
- * emitted the raw human issue title (`<storyTitle> (#<id>)`), which is a
9
- * plain description ("Rename the published npm package…") that
10
- * release-please's Conventional-Commit parser rejects:
11
- *
12
- * ❯ commit could not be parsed: … Rename the published npm package …
13
- * ❯ error: unexpected token ' ' at 1:7, valid tokens [(, !, :]
14
- * ❯ commits: 0 → no release cut
15
- *
16
- * The `commit-msg` commitlint Husky hook only validates *local* commits and
17
- * never runs on a GitHub-UI squash-merge title, so nothing mechanized the
18
- * documented "author the PR title in conventional form" contract. This
19
- * module mechanizes it.
20
- *
21
- * Contract (pure where possible — the only side effect is an injectable
22
- * `git log` read):
23
- *
24
- * - If `storyTitle` is **already** a parseable Conventional Commit
25
- * subject, it is preserved verbatim and suffixed with `(#<storyId>)`.
26
- * No re-prefixing, no double type.
27
- * - Otherwise the title is **synthesized** into conventional form:
28
- * `<type>: <descriptive text> (#<storyId>)`. The `type` is derived
29
- * from the branch's own (already-conventional) commit subjects when
30
- * available, falling back to a safe configured default (`chore`).
31
- * - Either way, a branch (or Story) that declares a breaking change gets
32
- * the `!` marker and a `BREAKING CHANGE:` footer on the PR body.
33
- *
34
- * The rules that decide *what* the subject says now live in
35
- * `conventional-subject.js` — type precedence, acronym-safe casing, and
36
- * breaking-change collection are pure and unit-tested there. What is left
37
- * here is the git read those rules consume and the assembly of the two
38
- * strings `gh pr create` needs.
2
+ * normalize-pr-title.js — make the PR title (GitHub's squash subject) a
3
+ * Conventional Commit so release-please can parse it; commitlint never sees
4
+ * a squash title. The subject rules live in `conventional-subject.js`; this
5
+ * module does the git read and assembles the `gh pr create` strings.
39
6
  */
40
7
 
41
8
  import { gitSpawn as defaultGitSpawn } from '../../../git-utils.js';
@@ -48,28 +15,14 @@ import {
48
15
  shapeDescription,
49
16
  } from './conventional-subject.js';
50
17
 
51
- /** Safe default Conventional-Commit type when none can be derived. */
52
18
  const DEFAULT_CONVENTIONAL_TYPE = 'chore';
53
19
 
54
- /**
55
- * Record separator between whole commit messages in the `git log` read. A NUL
56
- * cannot occur inside a commit message, so splitting on it is unambiguous —
57
- * unlike a blank-line or subject-prefix heuristic, which a commit body can
58
- * forge.
59
- */
20
+ /** NUL cannot occur in a commit message, so a body cannot forge a split. */
60
21
  const RECORD_SEP = '\u0000';
61
22
 
62
23
  /**
63
- * Read the branch's own commits (those unique to the Story branch relative to
64
- * the base branch) as whole messages — subject AND body, because the body is
65
- * where a `BREAKING CHANGE:` footer lives.
66
- *
67
- * Returns `[]` when the read fails, which degrades every downstream rule to
68
- * its safe default (type `chore`, no breaking marker) rather than throwing a
69
- * close that is otherwise healthy.
70
- *
71
- * Oldest-first (`--reverse`) is load-bearing: `pickDominantType` breaks a tie
72
- * on the Story's primary commit, which is the first one authored.
24
+ * Whole messages (bodies carry the breaking footer), oldest-first for the
25
+ * type tie-break. A failed read returns `[]`, degrading to safe defaults.
73
26
  *
74
27
  * @param {{
75
28
  * storyBranch: string,
@@ -119,16 +72,8 @@ function readBranchCommits({
119
72
  }
120
73
 
121
74
  /**
122
- * Produce the PR title and the breaking-change notes that belong with it.
123
- *
124
- * - Already-conventional `storyTitle` → preserved verbatim + `(#<id>)`.
125
- * - Otherwise → `<derivedType>: <shaped storyTitle> (#<id>)`.
126
- * - Empty / missing `storyTitle` → `<derivedType>: story #<id>`.
127
- * - Breaking → `!` inserted before the colon in either shape.
128
- *
129
- * `commitMessages` is the branch read (`readBranchCommits`); passing `[]`
130
- * yields the safe default type and no breaking marker. `storyBody` is the
131
- * Story issue's body, scanned for a declared `BREAKING CHANGE:` footer.
75
+ * A conventional title is kept verbatim; prose is synthesized as
76
+ * `<derivedType>: <shaped title>`. Either gets `(#<id>)` and, if breaking, `!`.
132
77
  *
133
78
  * @param {{
134
79
  * storyTitle: string,
@@ -151,9 +96,6 @@ function normalizePrTitle({
151
96
  storyBody,
152
97
  });
153
98
 
154
- // Already conventional → preserve verbatim (the maker's own casing and
155
- // scope survive), append the id reference. Only the breaking marker may be
156
- // added, and only when it is not already there.
157
99
  const subject = isConventionalSubject(trimmed)
158
100
  ? trimmed
159
101
  : synthesizeSubject({ description: trimmed, storyId, commitMessages });
@@ -163,8 +105,6 @@ function normalizePrTitle({
163
105
  }
164
106
 
165
107
  /**
166
- * Build a conventional subject for a Story whose title is plain prose.
167
- *
168
108
  * @param {{ description: string, storyId: number|string, commitMessages: string[] }} args
169
109
  * @returns {string}
170
110
  */
@@ -176,16 +116,8 @@ function synthesizeSubject({ description, storyId, commitMessages }) {
176
116
  }
177
117
 
178
118
  /**
179
- * Build the PR body.
180
- *
181
- * The `Closes #<id>` footer is what auto-closes the Story on merge. A
182
- * `BREAKING CHANGE:` footer goes LAST, as the spec requires, so that a repo
183
- * configured to use the PR body as the squash-commit message hands
184
- * release-please a parseable note rather than prose. When the squash body is
185
- * built from the constituent commit messages instead (GitHub's default, and
186
- * this repo's setting), the note still reaches `main` through whichever
187
- * commit carried the footer — and the `!` in the subject carries the signal
188
- * either way.
119
+ * `Closes #<id>` auto-closes the Story; a breaking footer goes LAST, per the
120
+ * spec, for repos that squash with the PR body.
189
121
  *
190
122
  * @param {{ storyId: number|string, breakingNotes?: string[] }} args
191
123
  * @returns {string}
@@ -203,13 +135,8 @@ function buildPrBody({ storyId, breakingNotes }) {
203
135
  }
204
136
 
205
137
  /**
206
- * Derive the two strings `gh pr create` needs. One `git log` read serves both
207
- * halves: the commit SUBJECTS decide the type, and the commit BODIES — plus
208
- * the Story body — decide whether this is a breaking change.
209
- *
210
- * A declared break is announced on the progress channel, because a `!` the
211
- * operator did not expect in the squash subject should be visible while the
212
- * close is running rather than discovered in the release notes.
138
+ * A declared break is announced on progress so an unexpected `!` is seen
139
+ * during the close, not in the release notes.
213
140
  *
214
141
  * @param {{ storyTitle: string, storyId: number|string, storyBody?: string,
215
142
  * storyBranch: string, baseBranch: string, cwd?: string,