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,53 +1,20 @@
1
1
  /**
2
- * epic-rollup.js — derive a container Epic's board state from its children.
3
- *
4
- * A container Epic is never delivered, so nothing in the delivery engine
5
- * ever writes to it. That left it inert on the board for the whole run it
6
- * was the subject of: `columnForLabels` reads `agent::*` labels and the
7
- * container carries none by construction, so the Status sync always skipped
8
- * it; and the only closure lived in the multi-Story run epilogue, which a
9
- * single-Story delivery never reaches.
10
- *
11
- * This module is the one place that answers "what state is this Epic in?"
12
- * — by asking its children — and the one place that writes the answer.
13
- * {@link rollUpEpicForStory} is invoked from **every edge that changes a
14
- * child's state**: the `agent::executing` flip in `single-story-init.js`, the
15
- * post-land tail, and the supersede close in `plan-persist`. Holding at N=1
16
- * was never the hard part — the gap was that a container only re-derived on
17
- * the edges someone had remembered to wire, so a cohort superseded by a
18
- * re-plan left its Epic open with no child that would ever move again.
19
- * Because every trigger is a child state change, the fallback scan reads
20
- * `state: 'all'`: "did this reopen work under a container I already closed?"
21
- * is always a live question.
22
- *
23
- * Three invariants shape the writes:
24
- *
25
- * 1. **The Epic never gains an `agent::*` label.** That absence keeps the
26
- * container out of the bare `/mandrel-deliver` ready list and outside
27
- * `lint-issue-body.js`, so the derived column goes to the board
28
- * directly via `ColumnSync.setColumn` rather than through a label.
29
- * 2. **Status recomputes in both directions; closure is one-way.** A
30
- * reopened child pulls a closed Epic's Status back to `In Progress`
31
- * and MUST NOT reopen the issue — an operator who closed a container
32
- * deliberately is not overruled by a reopened child.
33
- * 3. **Never throws.** Every step degrades with a reason. A stale
34
- * container costs tidiness; a delivery failed on a board mutation
2
+ * epic-rollup.js — derive a container Epic's board state from its children
3
+ * and write it. Invoked from every edge that changes a child's state (init,
4
+ * post-land, supersede close), since a never-delivered container has no
5
+ * other writer.
6
+ *
7
+ * Invariants:
8
+ * 1. The Epic never gains an `agent::*` label (keeps it off the ready list
9
+ * and out of body lint); the column goes straight to the board.
10
+ * 2. Status recomputes both ways; closure is one-way — a reopened child
11
+ * pulls Status back but never reopens the issue.
12
+ * 3. Never throws: a stale container costs tidiness, a failed delivery
35
13
  * costs a landed Story its terminal envelope.
36
- * 4. **Closure requires an authoritative child list.** Invariant 3 makes
37
- * every read degrade rather than fail, which is right for the writes
38
- * that recompute next tick and wrong for the one that does not. When
39
- * the native sub-issue read fails, the body checklist still answers
40
- * "who are the children" — but no longer "are these *all* of them",
41
- * and closing on that difference shut an Epic over 23 open children
42
- * (Story #5210). Degraded reads keep the Status and assignee writes
43
- * and lose only the close.
14
+ * 4. Closure needs an authoritative child list. A degraded native read
15
+ * keeps the Status/assignee writes (they self-correct) but never closes.
44
16
  *
45
17
  * @module lib/orchestration/epic-rollup
46
- * @see Story #5205
47
- * @see Story #5210 — fail closed on a degraded child read.
48
- * @see Story #5255 — a closed child contributes no `agent::*` state.
49
- * @see Story #5280 — every child edge derives; the parent resolves in one
50
- * call; the reads carry one declared shape.
51
18
  */
52
19
 
53
20
  import { Logger } from '../Logger.js';
@@ -63,17 +30,8 @@ import { resolveOperatorFromCandidates } from './lease-guard-shared.js';
63
30
  import { anyChildLanded, deriveParentState } from './ticketing/bulk.js';
64
31
 
65
32
  /**
66
- * Derived states that mean "children are moving" — the window in which the
67
- * Epic carries an owner. `agent::blocked` counts: a blocked child is still
68
- * this operator's problem, and dropping the assignee at the moment someone
69
- * needs to be found would invert the signal.
70
- *
71
- * "Blocked" here means an **open** blocked child. `deriveParentState` stopped
72
- * reading closed children's `agent::*` labels in Story #5255 — a superseded
73
- * Story closed while still wearing `agent::blocked` is not someone's problem
74
- * to pick up, and the stale label used to derive `agent::blocked` forever,
75
- * which both held an owner on the container and pinned it open past the
76
- * `derived !== DONE` bail below.
33
+ * Derived states in which the Epic carries an owner. An (open) blocked child
34
+ * counts: that is exactly when someone needs to be found.
77
35
  */
78
36
  const IN_FLIGHT_STATES = new Set([
79
37
  AGENT_LABELS.EXECUTING,
@@ -81,28 +39,15 @@ const IN_FLIGHT_STATES = new Set([
81
39
  ]);
82
40
 
83
41
  /**
84
- * How many child reads a rollup keeps in flight.
85
- *
86
- * Matches the cap `resolve-stories.js` uses for the same shape of work — a
87
- * fan-out of independent single-issue GETs against one repo — because the
88
- * constraint being respected is GitHub's, not this module's: enough overlap to
89
- * collapse a 58-child Epic from 58 sequential round-trips, well under the
90
- * burst threshold that earns a secondary rate limit. The children of one Epic
91
- * are order-independent, so the serial loop this replaces was paying
92
- * `sum(round-trips)` for nothing.
93
- *
94
- * Deliberately not exported. Nothing outside this module reads the number, and
95
- * an export only tests import fails the production dead-export gate.
42
+ * Child reads in flight; matches `resolve-stories.js`, under GitHub's
43
+ * secondary-rate-limit burst threshold. Not exported: a test-only export
44
+ * fails the production dead-export gate.
96
45
  */
97
46
  const FETCH_CONCURRENCY = 5;
98
47
 
99
48
  /**
100
- * Resolve the handle the Epic is assigned to while its children run.
101
- *
102
- * Deliberately the **non-throwing** resolution (`missingHandleBehavior:
103
- * 'null'`), unlike the Story lease's: a container with no owner recorded is
104
- * a cosmetic gap, and refusing the whole rollup over it would cost the
105
- * Status write and the closure too.
49
+ * Non-throwing, unlike the Story lease: a missing owner is cosmetic and must
50
+ * not cost the Status write and closure.
106
51
  *
107
52
  * @param {object} config Resolved `.agentrc.json` config.
108
53
  * @returns {string|null} Bare login, or null when none is configured.
@@ -115,8 +60,6 @@ function resolveEpicOwner(config) {
115
60
  }
116
61
 
117
62
  /**
118
- * Normalize an issue's assignee list to bare logins.
119
- *
120
63
  * @param {unknown} raw
121
64
  * @returns {string[]}
122
65
  */
@@ -128,8 +71,6 @@ function normalizeAssignees(raw) {
128
71
  }
129
72
 
130
73
  /**
131
- * Is this issue already closed?
132
- *
133
74
  * @param {{ state?: string }} issue
134
75
  * @returns {boolean}
135
76
  */
@@ -138,20 +79,10 @@ function isClosed(issue) {
138
79
  }
139
80
 
140
81
  /**
141
- * Fetch one child, or say why it does not count as one.
142
- *
143
- * Throws on a genuine read failure so the bounded fan-out around it rejects on
144
- * the first — the conservative answer, not a lazy one: `deriveParentState`
145
- * reads "all children done" off the list it is handed, so a silently dropped
146
- * child could close a container with work still open under it.
147
- *
148
- * The one id it declines to fail on is a **body-only** one that resolves to
149
- * nothing. The checklist is hand-editable prose, so a row can cite an issue
150
- * that was deleted, transferred or mistyped, and no re-run will ever make it
151
- * resolve — treating that as a failed read pins the container `pending`
152
- * forever over a typo. A *native* id that will not resolve keeps failing the
153
- * batch: the backend vouched for that edge, so its absence is a real read
154
- * problem and next tick may well answer.
82
+ * Fetch one child. Throws on a failed read, since a silently dropped child
83
+ * could let the container close over open work. Exception: an unresolvable
84
+ * body-only id (a checklist typo no re-run fixes) is dropped; an
85
+ * unresolvable native id still fails.
155
86
  *
156
87
  * @param {{ childId: number, droppable: boolean, provider: object }} opts
157
88
  * @returns {Promise<{ childId: number, child: object|null }>}
@@ -164,15 +95,9 @@ async function readOneChild({ childId, droppable, provider }) {
164
95
  }
165
96
 
166
97
  /**
167
- * Read every child of one Epic, freshly, bounded.
168
- *
169
- * Returns `null` when any child the Epic genuinely claims is unreadable, and
170
- * otherwise the children that count plus the ones refused by name.
171
- *
172
- * Note the scope: this validates the **readability of the ids it was given**,
173
- * never the **completeness of the id list**. Completeness is
174
- * `nativeReadFailed`'s job in {@link rollUpOneEpic} — checking only this one
175
- * is what let three readable ids stand in for 58 (Story #5210).
98
+ * Read every child; `null` when any claimed child is unreadable. Validates
99
+ * readability of the given ids, never completeness of the list — that is
100
+ * `nativeReadFailed`'s job.
176
101
  *
177
102
  * @param {{ epicId: number, childIds: number[], bodyOnlyIds?: number[], provider: object }} opts
178
103
  * @returns {Promise<{ children: object[], refused: Array<{ childId: number, reason: string }> }|null>}
@@ -199,9 +124,7 @@ async function readChildren({ epicId, childIds, bodyOnlyIds = [], provider }) {
199
124
  return null;
200
125
  }
201
126
 
202
- // Classified after the fan-out, in input order, so the warnings an operator
203
- // reads and the `refused` list a caller reports do not depend on which
204
- // round-trip happened to finish first.
127
+ // Classify in input order so output is independent of fetch timing.
205
128
  const children = [];
206
129
  const refused = [];
207
130
  for (const { childId, child } of read) {
@@ -214,10 +137,7 @@ async function readChildren({ epicId, childIds, bodyOnlyIds = [], provider }) {
214
137
  continue;
215
138
  }
216
139
  if (isEpicTicket(child)) {
217
- // A container under a container. It has no `agent::*` label by
218
- // construction, so `deriveParentState` would read it as neither done nor
219
- // in flight and stall the parent on a child that is itself derived.
220
- // Nesting containers is out of scope entirely; say so and move on.
140
+ // A nested container has no `agent::*` label and would stall the parent.
221
141
  refused.push({ childId, reason: 'epic-typed-child' });
222
142
  Logger.warn(
223
143
  `[epic-rollup] Epic #${epicId}: child #${childId} is itself a container ` +
@@ -232,8 +152,6 @@ async function readChildren({ epicId, childIds, bodyOnlyIds = [], provider }) {
232
152
  }
233
153
 
234
154
  /**
235
- * Push the derived column onto the Epic's board item.
236
- *
237
155
  * @param {{ epicId: number, column: string|null, columnSync: object }} opts
238
156
  * @returns {Promise<{ column: string|null, detail: string|null }>}
239
157
  */
@@ -249,13 +167,8 @@ async function applyColumn({ epicId, column, columnSync }) {
249
167
  }
250
168
 
251
169
  /**
252
- * Record the operator as the Epic's owner, additively.
253
- *
254
- * The additive assignees mutation is the only one that cannot evict a login
255
- * another run wrote between our read and our write, so it is the only one
256
- * used here — and the reason the assignee is never removed when the Epic
257
- * closes. A closed container naming who delivered it is useful; a removal
258
- * would need the replacing endpoint and would race every concurrent run.
170
+ * Add the owner. Additive only: it cannot evict a concurrent run's login,
171
+ * which is also why the assignee is never removed on close.
259
172
  *
260
173
  * @param {{ epicId: number, epic: object, owner: string|null, provider: object }} opts
261
174
  * @returns {Promise<{ assigned: boolean, detail: string|null }>}
@@ -274,13 +187,8 @@ async function applyOwner({ epicId, epic, owner, provider }) {
274
187
  }
275
188
 
276
189
  /**
277
- * Close a container whose children are all finished.
278
- *
279
- * `landed` picks the reason and the sentence, and the two must agree. A cohort
280
- * re-planned out of existence closes every child as superseded — finished, so
281
- * the container is finished too, but nothing merged. Reporting that as
282
- * `completed` over "every child Story landed" is a false claim in the one
283
- * place an operator goes to find out what a run actually delivered.
190
+ * Close a finished container: `completed` only if a child landed, else
191
+ * `not_planned` (e.g. an all-superseded cohort).
284
192
  *
285
193
  * @param {{ epicId: number, landed: boolean, provider: object }} opts
286
194
  * @returns {Promise<{ closed: boolean, detail: string|null }>}
@@ -304,14 +212,8 @@ async function applyClosure({ epicId, landed, provider }) {
304
212
  }
305
213
 
306
214
  /**
307
- * Roll one Epic up from the children it lists.
308
- *
309
- * `nativeReadFailed` splits the writes by reversibility. Column and assignee
310
- * are recomputed from scratch on every later tick, so applying them to a
311
- * possibly-truncated list costs at most a stale board cell that self-corrects.
312
- * Closure does not: it is the one write no subsequent tick undoes (invariant 2
313
- * — a reopened child pulls Status back but MUST NOT reopen the issue), so it
314
- * requires a child list we know to be complete.
215
+ * Roll one Epic up. `nativeReadFailed` blocks only closure, the one write no
216
+ * later tick undoes (invariant 4).
315
217
  *
316
218
  * @param {{ epic: object, childIds: number[], bodyOnlyIds?: number[], nativeReadFailed?: boolean, provider: object, columnSync: object, owner: string|null }} opts
317
219
  * @returns {Promise<object>} Per-Epic outcome record.
@@ -325,8 +227,6 @@ async function rollUpOneEpic({
325
227
  columnSync,
326
228
  owner,
327
229
  }) {
328
- // `epic.id` and nothing else: every read that reaches here now returns the
329
- // declared ticket shape, in which `id` IS the issue number.
330
230
  const epicId = Number(epic?.id);
331
231
  const outcome = {
332
232
  epicId,
@@ -368,10 +268,8 @@ async function rollUpOneEpic({
368
268
  }
369
269
 
370
270
  if (derived !== AGENT_LABELS.DONE) {
371
- // Not every child has landed. Reported pending only when the Epic is
372
- // still open — a closed container with an outstanding child is the
373
- // reopened-child case, whose Status we just corrected and whose issue
374
- // state is deliberately left alone.
271
+ // A closed Epic here is the reopened-child case: Status corrected, issue
272
+ // state left alone.
375
273
  outcome.pending = !isClosed(epic);
376
274
  return outcome;
377
275
  }
@@ -379,13 +277,8 @@ async function rollUpOneEpic({
379
277
  if (isClosed(epic)) return outcome;
380
278
 
381
279
  if (nativeReadFailed) {
382
- // Every child we could see has landed — but the authoritative read threw,
383
- // so "every child" is exactly the claim we cannot make. `readChildren`
384
- // above validates that the ids we were handed are *readable*; nothing
385
- // there validates that the list is *complete*, which is how an Epic with
386
- // 23 open children closed off the three its body happened to spell in the
387
- // bare `- [ ] #N` form (Story #5210). Overwrites any column/owner detail
388
- // deliberately: this is the reason the Epic is still pending.
280
+ // Every visible child landed, but the list may be incomplete. This
281
+ // detail deliberately overwrites any column/owner detail.
389
282
  outcome.pending = true;
390
283
  outcome.detail = 'child-read-degraded';
391
284
  Logger.warn(
@@ -408,18 +301,9 @@ async function rollUpOneEpic({
408
301
  }
409
302
 
410
303
  /**
411
- * Resolve this Story's container in **one** request, via the native edge.
412
- *
413
- * `getParentIssue` reads the sub-issue link backwards, which is the question
414
- * this module actually asks. The scan below is what it replaces: listing every
415
- * candidate Epic and reading each one's children until one of them mentions
416
- * the Story — O(containers) requests, all but one of them discarded.
417
- *
418
- * Returns `null` — never throws — when the provider has no such port, when the
419
- * Story has no parent, or when the parent is not a container Epic. Each of
420
- * those is "no answer *here*", and the caller's checklist scan is the other
421
- * half: linkage can legitimately exist as a body row with no native edge
422
- * behind it.
304
+ * Resolve this Story's container in one request via the native parent edge.
305
+ * `null` (never throws) means "no answer here" — linkage may still exist as
306
+ * a body checklist row, which the caller's scan covers.
423
307
  *
424
308
  * @param {{ storyId: number, provider: object }} opts
425
309
  * @returns {Promise<object|null>} Mapped parent Epic, or null.
@@ -441,21 +325,8 @@ async function parentEpicFor({ storyId, provider }) {
441
325
  }
442
326
 
443
327
  /**
444
- * Every container Epic on the board, as the fallback for a Story whose parent
445
- * edge the native read could not answer.
446
- *
447
- * **`state: 'all'`, deliberately.** The scan used to be `state: 'open'`, which
448
- * made two of this module's documented behaviours unreachable: a closed
449
- * container was never listed, so a *reopened* child could never pull its
450
- * Status back to `In Progress`, and the `isClosed(epic)` branches downstream
451
- * were dead code asserting a rule nothing could exercise. Every edge that
452
- * invokes this rollup is a child's own state change — init, post-land, the
453
- * supersede close, the epilogue — so "did this change reopen work under a
454
- * container I already closed?" is always a live question, and an open-only
455
- * listing answers it wrongly rather than partially.
456
- *
457
- * Closing stays one-way regardless: {@link rollUpOneEpic} corrects a closed
458
- * Epic's Status and never writes its issue state.
328
+ * Fallback: every container Epic. `state: 'all'` so a reopened child can
329
+ * pull a closed container's Status back (closure itself stays one-way).
459
330
  *
460
331
  * @param {{ provider: object }} opts
461
332
  * @returns {Promise<object[]>}
@@ -479,17 +350,9 @@ async function scanContainerEpics({ provider }) {
479
350
  }
480
351
 
481
352
  /**
482
- * Find the container Epics that hold a given Story, with their children.
483
- *
484
- * The lookup runs child→parent because linkage is parent→child only — a Story
485
- * body carries no pointer back, and adding one would reverse ADR
486
- * `20260726-v2-story-collapse`. It resolves the native edge first and scans
487
- * only when that answers nothing.
488
- *
489
- * The two paths differ in one thing: an Epic the *native* read named is this
490
- * Story's parent by construction, so its child list is read to derive state,
491
- * not to confirm the link. A *scanned* Epic still has to prove it lists the
492
- * Story.
353
+ * Find the container Epics holding a Story (Story bodies carry no parent
354
+ * pointer). Native edge first, scan otherwise; a scanned Epic must prove it
355
+ * lists the Story, a native parent need not.
493
356
  *
494
357
  * @param {{ storyId: number, provider: object, skipEpicIds: Set<number> }} opts
495
358
  * @returns {Promise<Array<{ epic: object, childIds: number[], nativeReadFailed: boolean, bodyOnlyIds: number[] }>>}
@@ -504,10 +367,8 @@ async function findEpicsForStory({ storyId, provider, skipEpicIds }) {
504
367
  const epicId = Number(epic?.id);
505
368
  if (!Number.isInteger(epicId)) continue;
506
369
  if (skipEpicIds.has(epicId)) continue;
507
- // Body checklist UNION native sub-issue edges — the same reader the
508
- // delivery expansion uses, now literally the same function. Reading the
509
- // body alone here is what made an Epic whose children were linked in the
510
- // GitHub UI expandable but permanently unclosable.
370
+ // Body checklist UNION native edges — the same reader delivery expansion
371
+ // uses; body alone misses children linked in the GitHub UI.
511
372
  const {
512
373
  ids: childIds,
513
374
  nativeReadFailed,
@@ -518,10 +379,7 @@ async function findEpicsForStory({ storyId, provider, skipEpicIds }) {
518
379
  onWarn: (message) => Logger.warn(message),
519
380
  });
520
381
  if (!authoritative && !childIds.includes(storyId)) {
521
- // A degraded read can truncate this Story out of its own container's
522
- // child list, which drops the Epic from the run entirely rather than
523
- // rolling it up wrongly. Non-destructive, but silent — say so, since it
524
- // is the same root cause as the refusal in `rollUpOneEpic`.
382
+ // A degraded read may have truncated this Story out; skip, but say so.
525
383
  if (nativeReadFailed) {
526
384
  Logger.warn(
527
385
  `[epic-rollup] Epic #${epicId}: skipped for Story #${storyId} on a ` +
@@ -536,13 +394,9 @@ async function findEpicsForStory({ storyId, provider, skipEpicIds }) {
536
394
  }
537
395
 
538
396
  /**
539
- * Roll every container Epic listing this Story up from its children.
540
- *
541
- * `skipEpicIds` exists for a caller that walks several Stories of one run:
542
- * siblings share a container, so without it the second Story would re-derive
543
- * — and re-close — an Epic the first already closed. Live listings filter to
544
- * open Epics and would eventually hide it, but a caller must not have to rely
545
- * on a remote read racing its own writes.
397
+ * Roll up every container Epic listing this Story. `skipEpicIds` lets a
398
+ * caller walking sibling Stories avoid re-closing a shared Epic without
399
+ * relying on a remote read racing its own writes.
546
400
  *
547
401
  * @param {{
548
402
  * storyId: number,
@@ -567,10 +421,7 @@ export async function rollUpEpicForStory({
567
421
  if (!Number.isInteger(id) || id <= 0) {
568
422
  return { ...empty, reason: 'invalid-story-id' };
569
423
  }
570
- // One of the two lookup ports is enough: `getParentIssue` answers directly
571
- // and `listTicketsByLabel` answers by scanning, and `findEpicsForStory`
572
- // degrades from either to the other. Both absent means no way to reach a
573
- // container at all.
424
+ // Either lookup port suffices.
574
425
  if (
575
426
  typeof provider?.getTicket !== 'function' ||
576
427
  typeof provider?.updateTicket !== 'function' ||
@@ -588,8 +439,7 @@ export async function rollUpEpicForStory({
588
439
  });
589
440
  if (matches.length === 0) return { ...empty, reason: 'no-container-epic' };
590
441
 
591
- // One ColumnSync across every Epic in the run: it caches the board
592
- // metadata, so sharing it spends the resolve once instead of per Epic.
442
+ // Shared so board metadata resolves once.
593
443
  const sync =
594
444
  columnSync ??
595
445
  (typeof provider.graphql === 'function'
@@ -619,8 +469,6 @@ export async function rollUpEpicForStory({
619
469
  reason: null,
620
470
  };
621
471
  } catch (err) {
622
- // The module-level never-throws contract. Both call sites are lifecycle
623
- // edges of a Story that is otherwise fine; neither may fail on this.
624
472
  const detail = String(err?.message ?? err);
625
473
  Logger.warn(`[epic-rollup] Rollup for Story #${id} failed: ${detail}`);
626
474
  return { ...empty, reason: detail };
@@ -1,26 +1,6 @@
1
1
  /**
2
- * file-assumption-enum.js — cycle-free leaf module for the canonical
3
- * file-assumption enum.
4
- *
5
- * Story #3331 relocated `FILE_ASSUMPTION_VALUES` here so the canonical
6
- * Story-body parser (`../story-body/story-body.js`) can reach the enum
7
- * without importing the Task-named `task-body-validator.js`. The runtime
8
- * file-assumption gate (`./file-assumptions.js`) imports `parseStoryBody`
9
- * from `story-body.js`; routing the enum import through this leaf keeps
10
- * the dependency graph acyclic.
11
- *
12
- * This module imports nothing. It is the single source of truth for the
13
- * assumption vocabulary; `story-body.js`, `task-body-validator.js`, and
14
- * `file-assumptions.js` all import the enum from here. `file-assumptions.js`
15
- * additionally re-exports it so legacy callers (and
16
- * `tests/file-assumptions.test.js`) keep resolving the symbol from the
17
- * runtime gate.
18
- *
19
- * Canonical assumption values a path entry may declare:
20
- * - `creates` — the path does not yet exist; the Story creates it.
21
- * - `refactors-existing` — the path exists; the Story rewrites it in place.
22
- * - `exists` — the path is read but not modified (e.g. a fixture).
23
- * - `deletes` — the path exists; the Story removes it.
2
+ * file-assumption-enum.js — the file-assumption vocabulary, in an import-free
3
+ * leaf so `story-body.js` and `file-assumptions.js` stay acyclic.
24
4
  */
25
5
 
26
6
  export const FILE_ASSUMPTION_VALUES = Object.freeze([