mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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([