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,56 +1,14 @@
1
1
  /**
2
- * lib/orchestration/diff-magnitude.js — the changed-line magnitude of a diff,
3
- * split into implementation and mandated-companion halves (Story #4856).
2
+ * lib/orchestration/diff-magnitude.js — changed-line magnitude of a diff,
3
+ * split into implementation and mandated-companion (tests, docs, baselines,
4
+ * lockfiles) halves, so obeying test-first and doc rules never inflates the
5
+ * size that bounds the light path.
4
6
  *
5
- * ## Why magnitude, and why the split
6
- *
7
- * The light path's diff backstop used to bound scope with a single
8
- * `maxFiles: 4` ceiling. Measured against this repository's own history that
9
- * ceiling was wrong in both directions:
10
- *
11
- * - **Too tight.** Of 33 real-work squash merges on `main` (excluding
12
- * release-please and `chore(baselines)` automation) only 7 — 21% — touch
13
- * four files or fewer; the median is 8. The framework's *own* narrow-diff
14
- * scale, `DEFAULT_DIFF_WIDTH.softFiles` in `review-depth.js`, is 15.
15
- * - **Blind.** A three-file, 323-line rewrite passed while a 190-file change
16
- * was rejected 47× over — even though 186 of those files were tests and its
17
- * implementation was 7 files.
18
- *
19
- * So the axis is **changed lines over implementation files**, and the companion
20
- * classes the framework itself mandates are exempt from the count: obeying
21
- * `rules/testing-standards.md` (test-first), the documentation a change of
22
- * consequence is expected to touch, and the baseline ratchets must not inflate
23
- * the number that then rejects the change. Re-counting those same 33 merges on implementation files alone moves
24
- * the four-file pass rate from 21% to 58%.
25
- *
26
- * ## Three contracts worth not rediscovering
27
- *
28
- * 1. **Additions plus deletions, never net.** A modified line counts twice
29
- * (one `+`, one `-`), which is the intended weighting. Net is actively
30
- * broken as a size signal: the merge retiring the planner snapshot is
31
- * 1119 add+del but **−803** net, so a large deletion would measure as
32
- * trivial.
33
- * 2. **A pure rename is free.** `git diff --numstat` reports `0\t0` for one,
34
- * and its path arrives in `old => new` form — normalized here to the
35
- * destination so the file still counts toward the implementation tally.
36
- * 3. **Exemption is from *counting*, never from *risk*.** Nothing here
37
- * touches sensitive-path derivation, which every caller runs over the
38
- * full changed set including companions.
39
- *
40
- * Companion matching runs through the audit suite's picomatch seam as a
41
- * **positive** glob list negated by the caller. A `!`-prefixed picomatch
42
- * pattern widens a match rather than narrowing it, so expressing the
43
- * behavior-bearing exceptions as negations would silently exempt more than
44
- * intended.
45
- *
46
- * Every export is total: no throws. {@link readNumstatRows} owns the one git
47
- * read; everything else is pure.
48
- *
49
- * The public surface is deliberately just those two functions. The numstat
50
- * parse, the rename normalization, and the companion classifier are internal:
51
- * each is fully observable through them (a stubbed `gitSpawnFn` drives the
52
- * parse, an `isCompanionFn` seam drives the classification), so exporting them
53
- * would widen the module's contract for no caller.
7
+ * Contracts: lines are additions + deletions, never net (a big deletion is
8
+ * not trivial); a pure rename is free but its file still counts; exemption
9
+ * is from counting, never from sensitive-path risk. Companion globs are a
10
+ * positive list — a `!` picomatch pattern widens rather than narrows. Every
11
+ * export is total.
54
12
  *
55
13
  * @module lib/orchestration/diff-magnitude
56
14
  */
@@ -59,27 +17,13 @@ import { matchesAnyFilePattern } from '../audit-suite/selector.js';
59
17
  import { gitSpawn } from '../git-utils.js';
60
18
 
61
19
  /**
62
- * Paths whose churn is a **mandated companion** of a change rather than the
63
- * change itself, exempt from the implementation line and file counts.
64
- *
65
- * Deliberately absent, and load-bearing in their absence: `.agentrc.json`,
66
- * `.agents/schemas/**`, `.github/workflows/**`, and `package.json`. Those are
67
- * "config" by file type but behavior by effect, and `.agents/schemas/audit-rules.json`
68
- * is the sensitive-path SSOT — exempting it would let a change widen the very
69
- * allowlist that decides whether it is risky.
70
- *
71
- * Note the anchoring: `baselines/**` is the generated baseline **data** at the
72
- * repository root. The baseline *schemas* under `.agents/schemas/baselines/`
73
- * are unanchored by this pattern and therefore still count as implementation.
74
- *
75
- * Markdown is exempt wholesale, which includes `.agents/workflows/**` and
76
- * `.agents/rules/**`. That is intended: rewriting a workflow contract is not
77
- * *effort* the way a module rewrite is, and its real guards are the close-time
78
- * context-budget, doc-link, and docs-reference-sync gates — none of which this
79
- * ceiling replaces.
20
+ * Mandated-companion paths, exempt from implementation counts. Deliberately
21
+ * absent: `.agentrc.json`, `.agents/schemas/**` (incl. the sensitive-path
22
+ * SSOT), `.github/workflows/**`, `package.json` — behavior by effect.
23
+ * `baselines/**` is root-anchored, so baseline schemas still count. Markdown
24
+ * (incl. workflows/rules) is exempt; its guards are the close-time doc gates.
80
25
  */
81
26
  const COMPANION_PATH_GLOBS = Object.freeze([
82
- // Tests — mandated by rules/testing-standards.md's test-first discipline.
83
27
  '**/__tests__/**',
84
28
  '**/*.test.js',
85
29
  '**/*.test.mjs',
@@ -88,24 +32,17 @@ const COMPANION_PATH_GLOBS = Object.freeze([
88
32
  '**/*.test.tsx',
89
33
  'tests/**',
90
34
  'features/**',
91
- // Documentation — the prose a change of consequence is expected to refresh.
92
35
  'docs/**',
93
36
  '**/*.md',
94
- // Generated baseline data — written by the ratchets, not hand-authored.
95
37
  'baselines/**',
96
- // Lockfiles — regenerated wholesale; their line count means nothing.
97
38
  'package-lock.json',
98
39
  'pnpm-lock.yaml',
99
40
  'yarn.lock',
100
41
  ]);
101
42
 
102
43
  /**
103
- * Normalize a `git diff --numstat` path field to the single file it names.
104
- * Rename rows arrive as `old => new` or with a braced infix
105
- * (`dir/{old => new}/file.js`); both resolve to the destination, so a renamed
106
- * implementation file still counts as one implementation file.
107
- *
108
- * Pure and total.
44
+ * Resolve a numstat rename (`old => new` or `dir/{old => new}/f.js`) to its
45
+ * destination.
109
46
  *
110
47
  * @param {string} raw
111
48
  * @returns {string}
@@ -123,14 +60,8 @@ function normalizeNumstatPath(raw) {
123
60
  }
124
61
 
125
62
  /**
126
- * Parse `git diff --numstat` output into per-file rows.
127
- *
128
- * Binary rows (`-\t-\tpath`) contribute zero text lines without poisoning the
129
- * parse. Any line that does not match the numstat shape makes the whole result
130
- * untrustworthy, so the function returns `null` — the "magnitude unknown"
131
- * signal every caller fails closed (or fails open) on deliberately.
132
- *
133
- * Pure and total.
63
+ * Parse numstat rows. Binary rows count zero lines; any malformed line
64
+ * returns `null` ("magnitude unknown").
134
65
  *
135
66
  * @param {unknown} stdout
136
67
  * @returns {Array<{ additions: number, deletions: number, path: string }>|null}
@@ -153,11 +84,8 @@ function parseNumstatRows(stdout) {
153
84
  }
154
85
 
155
86
  /**
156
- * True when `file` is a mandated companion rather than implementation.
157
- *
158
- * Pure and total — a throwing matcher resolves to `false`, which counts the
159
- * file as implementation. That is the conservative direction: a
160
- * classification failure must never shrink the measured magnitude.
87
+ * A throwing matcher yields `false` (implementation): a classification
88
+ * failure must never shrink the magnitude.
161
89
  *
162
90
  * @param {unknown} file
163
91
  * @param {{ matchFn?: typeof matchesAnyFilePattern }} [deps]
@@ -173,11 +101,7 @@ function isCompanionPath(file, { matchFn = matchesAnyFilePattern } = {}) {
173
101
  }
174
102
 
175
103
  /**
176
- * Read the per-file numstat rows for the `baseRef...headRef` diff. The one
177
- * side-effecting function in this module.
178
- *
179
- * Total — never throws; returns `null` on any git failure or unparseable
180
- * output.
104
+ * Numstat rows for `baseRef...headRef`; `null` on any failure.
181
105
  *
182
106
  * @param {{
183
107
  * baseRef?: string,
@@ -210,20 +134,9 @@ export function readNumstatRows({
210
134
  }
211
135
 
212
136
  /**
213
- * Summarize a diff's magnitude, splitting implementation from mandated
214
- * companions.
215
- *
216
- * `implFiles` is counted from `changedFiles` — the canonical
217
- * `git diff --name-only` enumeration produced by `change-set.js` — rather than
218
- * from the numstat rows, so file counting uses clean paths from the one
219
- * enumerator every other consumer reads. `implLines` comes from the numstat
220
- * rows, which is the only surface carrying line counts.
221
- *
222
- * Returns `null` when either input is unusable: the magnitude is then *unknown*,
223
- * which is deliberately distinct from *zero* so a caller can fail closed on the
224
- * absence of evidence.
225
- *
226
- * Pure and total.
137
+ * Summarize magnitude. Files come from `change-set.js`'s canonical
138
+ * enumeration, lines from numstat. `null` (unknown, distinct from zero)
139
+ * when either input is unusable.
227
140
  *
228
141
  * @param {{
229
142
  * changedFiles?: unknown,
@@ -248,10 +161,7 @@ export function summarizeDiffMagnitude({
248
161
  (f) => typeof f === 'string' && f.trim() !== '',
249
162
  );
250
163
 
251
- // A classification failure resolves to "implementation" — the conservative
252
- // direction, since counting a companion as implementation can only ever make
253
- // the measured magnitude larger. Guarded here as well as inside the default
254
- // classifier so an injected one cannot break this function's totality.
164
+ // Guarded again so an injected classifier cannot break totality.
255
165
  const isCompanion = (file) => {
256
166
  try {
257
167
  return isCompanionFn(file) === true;
@@ -2,12 +2,8 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
 
4
4
  /**
5
- * Read an explicit list of doc files relative to `docsRoot`, returning one
6
- * `{ name, path, content }` object per file that exists and reads cleanly.
7
- * Missing or unreadable files are skipped silently. Order is preserved from
8
- * the input list. This is the shared read/normalize seam the per-Epic docs
9
- * digest builds on (Story #4338) so there is a single home for the fs read
10
- * path.
5
+ * Read doc files relative to `docsRoot`, in input order; missing or
6
+ * unreadable files are skipped.
11
7
  *
12
8
  * @param {{ files: string[], docsRoot?: string }} args
13
9
  * @returns {Promise<Array<{ name: string, path: string, content: string }>>}
@@ -1,34 +1,14 @@
1
1
  /**
2
- * docs-digest.js — per-run docs digest builder (Story #4338).
3
- *
4
- * `/mandrel-deliver` story sub-agents previously re-read every file in
5
- * `project.docsContextFiles` on every Story, re-paying the full docs payload
6
- * per child. This module produces a single **digest** — one compact markdown
7
- * outline per configured doc — that the parent threads into every child prompt
8
- * once. The digest gives each child enough shape (path, size, heading outline
9
- * with line numbers, and the first paragraph under each `##` section) to decide
10
- * which full files to pull on demand, instead of ingesting the whole set up
11
- * front.
12
- *
13
- * The heavy lifting of reading + normalizing doc bodies is delegated to
14
- * `doc-reader.js` (`readDocFiles`), keeping a single home for the fs read path.
15
- *
16
- * Story #4433 extends this module with {@link ensureDocsDigest}, a shared
17
- * generate-and-write export so the planner-context surface
18
- * (`plan-context.js` / `authoring-context.js`) can produce a session docs
19
- * digest without duplicating the mkdir+writeFile plumbing shared by
20
- * `plan-context.js` / `authoring-context.js` and the `/mandrel-deliver` workflow.
2
+ * docs-digest.js — a compact outline of `project.docsContextFiles` (path,
3
+ * size, headings with line numbers, first `##` paragraph) so agents pull
4
+ * full docs on demand instead of ingesting the whole set per Story.
21
5
  */
22
6
 
23
7
  import fs from 'node:fs';
24
8
  import path from 'node:path';
25
9
  import { readDocFiles } from './doc-reader.js';
26
10
 
27
- /**
28
- * Level-2 / level-3 markdown heading matcher. Mirrors the outline granularity
29
- * the planning-context budget already uses so the two surfaces agree on what a
30
- * "section" is.
31
- */
11
+ /** `##`/`###` headings — the planning-context budget's section granularity. */
32
12
  const HEADING_RE = /^(#{2,3})\s+(.+?)\s*$/;
33
13
 
34
14
  function byteLen(s) {
@@ -37,10 +17,6 @@ function byteLen(s) {
37
17
  }
38
18
 
39
19
  /**
40
- * Extract the heading outline (level + text + 1-based line number) from a
41
- * markdown body. Line numbers let a child jump straight to the section it
42
- * needs when it pulls the full file.
43
- *
44
20
  * @param {string} content
45
21
  * @returns {Array<{ level: number, text: string, line: number }>}
46
22
  */
@@ -56,12 +32,10 @@ function extractOutline(content) {
56
32
  }
57
33
 
58
34
  /**
59
- * The first non-empty paragraph that follows a given heading line, up to the
60
- * next heading or a blank-line paragraph break. Returns '' when the section
61
- * has no prose (e.g. a heading immediately followed by a sub-heading).
35
+ * First paragraph under a heading; '' when the section has no prose.
62
36
  *
63
- * @param {string[]} lines full doc split into lines
64
- * @param {number} headingLine 1-based line of the heading
37
+ * @param {string[]} lines
38
+ * @param {number} headingLine 1-based
65
39
  * @returns {string}
66
40
  */
67
41
  function firstParagraphAfter(lines, headingLine) {
@@ -79,9 +53,6 @@ function firstParagraphAfter(lines, headingLine) {
79
53
  }
80
54
 
81
55
  /**
82
- * Render one doc's digest section: path + byte size, then a bulleted heading
83
- * outline where each `##` bullet carries the first paragraph beneath it.
84
- *
85
56
  * @param {{ path: string, content: string }} doc
86
57
  * @returns {string} markdown block
87
58
  */
@@ -110,15 +81,12 @@ function renderDocSection(doc) {
110
81
  }
111
82
 
112
83
  /**
113
- * Build the per-run docs digest markdown from the configured docs context
114
- * files. Missing files are skipped silently (the read seam returns only the
115
- * files it could stat + read). Returns `null` when there is nothing to digest
116
- * — i.e. `docsContextFiles` is empty/unset — so callers surface a null
117
- * `docsDigestPath` rather than writing an empty file.
84
+ * Build the digest; missing files are skipped. `null` when nothing is
85
+ * readable, so callers report a null `docsDigestPath` instead of an empty
86
+ * file.
118
87
  *
119
88
  * @param {{ docsContextFiles?: string[], docsRoot?: string }} args
120
- * @returns {Promise<string|null>} the digest markdown, or null when there are
121
- * no files to digest.
89
+ * @returns {Promise<string|null>}
122
90
  */
123
91
  export async function buildDocsDigest({ docsContextFiles, docsRoot } = {}) {
124
92
  const files = Array.isArray(docsContextFiles) ? docsContextFiles : [];
@@ -142,14 +110,8 @@ export async function buildDocsDigest({ docsContextFiles, docsRoot } = {}) {
142
110
  }
143
111
 
144
112
  /**
145
- * Build the docs digest and write it to `outputPath`, returning `null` (no
146
- * write) when there is nothing to digest. This is the single shared
147
- * generate-and-persist export both digest producers call: the per-run
148
- * `/mandrel-deliver` docs digest (`helpers/deliver-story.md`) and the planner-
149
- * context digest (`plan-context.js` → `authoring-context.js`, Story
150
- * #4433). Callers own path construction (temp-root layout, run id, etc.)
151
- * so both surfaces can keep — or deliberately share — their own convention;
152
- * this function only owns "build digest, ensure parent dir, write file".
113
+ * Build and write the digest (`null`, no write, when empty). Shared by the
114
+ * deliver and planner surfaces; callers own path construction.
153
115
  *
154
116
  * @param {{ docsContextFiles?: string[], docsRoot?: string, outputPath: string }} args
155
117
  * @returns {Promise<{ digest: string, outputPath: string } | null>}
@@ -1,25 +1,12 @@
1
1
  /**
2
- * epic-candidates.js — rank the open container Epics a new plan could join.
3
- *
4
- * Story #5155. `plan-persist` has always been able to *create* a container
5
- * Epic, and to re-adopt one whose fingerprint matches the exact cohort it is
6
- * re-persisting. Neither helps the case this module exists for: a second plan,
7
- * days later, adding work that belongs under the Epic a first plan opened. The
8
- * fingerprint is keyed on the child set, so a different cohort never matches
9
- * it — by design, since adopting the wrong container silently mis-files a run.
10
- *
11
- * So the join has to be a **decision**, not a hash collision: this module
12
- * surfaces every open Epic with an overlap score, and the operator picks at
13
- * Gate #3. The list is deliberately **complete rather than thresholded** — a
14
- * low score is evidence for the operator to weigh, and hiding a candidate is
15
- * how a plan silently opens its second container for one body of work.
16
- *
17
- * Scoring reuses `duplicate-search.js`'s tokenizer and Jaccard overlap rather
18
- * than growing a second similarity notion in the codebase; like that module's,
19
- * it is a triage signal and not a semantic search.
2
+ * epic-candidates.js — rank the open container Epics a new plan could join,
3
+ * for the operator to pick at Gate #3 (joining a different cohort is a
4
+ * decision, not a fingerprint match). The list is complete, never
5
+ * thresholded: hiding a low scorer is how one body of work gets two
6
+ * containers. Scoring reuses `duplicate-search.js`'s tokenizer and overlap —
7
+ * a triage signal, not semantic search.
20
8
  *
21
9
  * @module lib/orchestration/epic-candidates
22
- * @see Story #5155
23
10
  */
24
11
 
25
12
  import { overlapScore, tokenize } from '../duplicate-search.js';
@@ -29,8 +16,6 @@ import { concurrentMap, FANOUT_CONCURRENCY } from '../util/concurrent-map.js';
29
16
  import { isEpicTicket, readEpicChildIds } from './epic-container.js';
30
17
 
31
18
  /**
32
- * Build an issue URL for an Epic the provider returned without one.
33
- *
34
19
  * @param {number} id
35
20
  * @param {{ owner?: string, repo?: string }} [opts]
36
21
  * @returns {string}
@@ -41,16 +26,8 @@ function buildEpicUrl(id, { owner, repo } = {}) {
41
26
  }
42
27
 
43
28
  /**
44
- * Fetch the titles of an Epic's children, for scoring only.
45
- *
46
- * Child titles matter because a container's own title and goal are short and
47
- * abstract ("Auth hardening", one paragraph), while the seed that should match
48
- * it is concrete. The children are where the shared vocabulary actually lives.
49
- *
50
- * Entirely best-effort: no `getTicket`, an unreadable child, or a throw all
51
- * degrade to fewer title tokens, never to a failed envelope. A candidate that
52
- * scores low because its children could not be read is still *listed* — the
53
- * operator sees every open Epic regardless.
29
+ * Child titles carry the concrete vocabulary an abstract Epic title lacks.
30
+ * Best-effort: failures only reduce tokens.
54
31
  *
55
32
  * @param {{ childIds: number[], provider: object }} opts
56
33
  * @returns {Promise<string>} Space-joined child titles ('' when none resolved).
@@ -75,17 +52,11 @@ async function readChildTitles({ childIds, provider }) {
75
52
  }
76
53
 
77
54
  /**
78
- * Score one open Epic against the seed.
79
- *
80
55
  * @param {{ epic: object, seedTokens: Set<string>, provider: object, owner?: string, repo?: string }} opts
81
56
  * @returns {Promise<{ id: number, title: string, url: string, score: number, childIds: number[] }|null>}
82
57
  */
83
58
  async function scoreEpic({ epic, seedTokens, provider, owner, repo }) {
84
- // `listTicketsByLabel` hands back the declared ticket shape, in which `id`
85
- // is the issue number. The `number`-then-`id` fallback this replaced read as
86
- // defensive and was not: on that shape it never fired, and on a raw REST
87
- // payload it was the only thing standing between this and scoring an Epic
88
- // under its database id.
59
+ // Declared ticket shape: `id` is the issue number.
89
60
  const id = Number(epic?.id);
90
61
  if (!Number.isInteger(id) || id <= 0) return null;
91
62
 
@@ -94,9 +65,7 @@ async function scoreEpic({ epic, seedTokens, provider, owner, repo }) {
94
65
  const childIds = readEpicChildIds(body);
95
66
  const childTitles = await readChildTitles({ childIds, provider });
96
67
 
97
- // The fingerprint marker and checklist ids are machine noise; the tokenizer
98
- // drops short and non-alphabetic tokens, so the corpus is effectively the
99
- // title, the `## Goal` prose and the child titles.
68
+ // The tokenizer drops marker/id noise.
100
69
  const corpus = `${title}\n${body}\n${childTitles}`;
101
70
  const score = overlapScore(seedTokens, tokenize(corpus));
102
71
 
@@ -110,16 +79,8 @@ async function scoreEpic({ epic, seedTokens, provider, owner, repo }) {
110
79
  }
111
80
 
112
81
  /**
113
- * Find every open container Epic, ranked by overlap with the seed.
114
- *
115
- * **Only open Epics are candidates.** A closed Epic is a completed body of
116
- * work; joining one would reopen a container the epilogue deliberately closed,
117
- * and silently re-scope a finished plan. The operator files a new Epic or
118
- * reopens the old one by hand.
119
- *
120
- * Failures degrade to `[]` — like the duplicate search, this is a triage
121
- * signal offered at a gate, and no plan should fail to be authored because
122
- * the Epic listing was unavailable.
82
+ * Every open container Epic ranked by seed overlap. Closed Epics are
83
+ * finished work and never candidates. Failures degrade to `[]`.
123
84
  *
124
85
  * @param {{
125
86
  * seed: string,
@@ -156,8 +117,7 @@ export async function findOpenEpicCandidates({ seed, provider, owner, repo }) {
156
117
  { concurrency: FANOUT_CONCURRENCY },
157
118
  );
158
119
 
159
- // Descending score, then ascending id: a stable order for two Epics that
160
- // tie, so the same backlog always renders the same list.
120
+ // Ties break on id.
161
121
  return scored
162
122
  .filter((c) => c !== null)
163
123
  .sort((a, b) => b.score - a.score || a.id - b.id);
@@ -1,22 +1,9 @@
1
1
  /**
2
- * epic-checklist.js — edit a live Epic body's child checklist in place.
3
- *
4
- * Story #5155. `epic-container.js` describes the *shape* of a container and
5
- * renders one from scratch; this module is the other operation adoption needs
6
- * — amending a body that already exists, written by someone else, possibly
7
- * hand-edited since.
8
- *
9
- * The two are deliberately separate. Composing may assume everything about the
10
- * text because it produced all of it; amending may assume almost nothing and
11
- * must treat every line it did not come to change as untouchable: the `## Goal`
12
- * prose, the fingerprint marker, the item order, and above all the **checked
13
- * state** of existing rows. An operator who ticked `- [x] #41` is recording
14
- * that the Story landed, and a re-render would silently discard it.
15
- *
16
- * So the edit is a surgical line insertion rather than a re-render.
2
+ * epic-checklist.js — amend a live, possibly hand-edited Epic body's child
3
+ * checklist by surgical line insertion, never a re-render: goal prose,
4
+ * markers, order and existing checked state are untouchable.
17
5
  *
18
6
  * @module lib/orchestration/epic-checklist
19
- * @see Story #5155
20
7
  */
21
8
 
22
9
  import {
@@ -41,13 +28,8 @@ function findLastChecklistIndex(lines) {
41
28
  }
42
29
 
43
30
  /**
44
- * Where the new rows go, as a `[index, deleteCount]` splice target.
45
- *
46
- * Three placements, in priority order, each preserving a different thing:
47
- * replacing the empty-container placeholder (which would otherwise stand above
48
- * rows that contradict it), appending after the last existing row (which keeps
49
- * original-then-appended order on read-back), or opening the section for a body
50
- * that never had one.
31
+ * Splice target: replace the empty placeholder, else append after the last
32
+ * row, else open under the heading.
51
33
  *
52
34
  * @param {string[]} lines
53
35
  * @returns {[number, number]|null} `null` when there is no section to extend.
@@ -69,14 +51,10 @@ function locateInsertion(lines) {
69
51
  }
70
52
 
71
53
  /**
72
- * Append child ids to an existing Epic body's checklist, idempotently.
73
- *
74
- * Idempotence is the load-bearing property: a resumed or re-run persist calls
75
- * this again with the same cohort, and a second copy of every row would make
76
- * the container claim children it does not have.
54
+ * Append child ids idempotently — a re-run persist passes the same cohort.
77
55
  *
78
- * @param {string} body The Epic's current body.
79
- * @param {number[]} childIds Ids to add.
56
+ * @param {string} body
57
+ * @param {number[]} childIds
80
58
  * @returns {string} The updated body (byte-identical when nothing was added).
81
59
  */
82
60
  export function appendEpicChildIds(body, childIds) {
@@ -92,9 +70,7 @@ export function appendEpicChildIds(body, childIds) {
92
70
  const target = locateInsertion(lines);
93
71
 
94
72
  if (target === null) {
95
- // A hand-written or foreign Epic with no checklist section. Add one rather
96
- // than refusing: `isEpicTicket` already treats such a ticket as a real
97
- // Epic, so the adoption must not be the one place that disagrees.
73
+ // No section: add one, since `isEpicTicket` counts this as an Epic.
98
74
  return `${text.replace(/\n+$/, '')}\n\n${CHILDREN_HEADING}\n\n${rows.join('\n')}\n`;
99
75
  }
100
76