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,10 +1,6 @@
1
1
  /**
2
- * story-follow-ups.js — capture actionable follow-ups from a landed Story.
3
- *
4
- * Replaces the unwired Epic retro as the default closeout for v2: after a
5
- * Story merges, read its standalone `signals.ndjson` friction stream, compose
6
- * routed proposals, auto-file follow-up issues (when enabled), and upsert a
7
- * structured `follow-ups` comment on the Story.
2
+ * Capture follow-ups from a landed Story's friction stream: compose routed
3
+ * proposals, auto-file them, and publish the roll-up.
8
4
  *
9
5
  * @module lib/orchestration/story-follow-ups
10
6
  */
@@ -34,21 +30,14 @@ import { upsertStructuredComment } from './ticketing.js';
34
30
  const FOLLOW_UPS_COMMENT_TYPE = 'follow-ups';
35
31
 
36
32
  /**
37
- * Publish a rendered roll-up — as a `follow-ups` comment when the run actually
38
- * filed something, and as a run artifact under the temp root when it did not.
39
- *
40
- * Story #5341 made the filing the condition. The comment had been
41
- * unconditional, and the corpus it rendered is dominated by noise: #5324's
42
- * roll-up carried 116 signals and filed nothing, and #4653 / #4833 / #4834 /
43
- * #4836 record filings that were false or leaked from fixtures. A comment that
44
- * says "nothing to do" on every Story trains its readers to skip the one that
45
- * does not — while the roll-up itself is still written, so nothing is lost,
46
- * only moved off the ticket.
33
+ * Comment on the ticket only when something was filed; otherwise park the
34
+ * roll-up as a temp artifact — a "nothing to do" comment on every Story trains
35
+ * readers to skip the one that matters.
47
36
  *
48
37
  * @param {object} args
49
- * @param {number} args.anchorId — the ticket the roll-up belongs to.
50
- * @param {string} args.body — the rendered roll-up.
51
- * @param {number} args.filedCount — issues this roll-up actually filed.
38
+ * @param {number} args.anchorId
39
+ * @param {string} args.body
40
+ * @param {number} args.filedCount
52
41
  * @param {object} args.provider
53
42
  * @param {object} [args.config]
54
43
  * @returns {Promise<{ posted: boolean, artifactPath: string|null, summary: string }>}
@@ -66,8 +55,6 @@ export async function publishFollowUpsRollup({
66
55
  }
67
56
 
68
57
  /**
69
- * Post the roll-up as the `follow-ups` structured comment.
70
- *
71
58
  * @param {object} args
72
59
  * @returns {Promise<{ posted: true, artifactPath: null, summary: string }>}
73
60
  */
@@ -86,8 +73,6 @@ async function postFollowUpsComment({ anchorId, body, filedCount, provider }) {
86
73
  }
87
74
 
88
75
  /**
89
- * Write the roll-up to the run artifacts under the temp root.
90
- *
91
76
  * @param {object} args
92
77
  * @returns {Promise<{ posted: false, artifactPath: string, summary: string }>}
93
78
  */
@@ -103,42 +88,17 @@ async function parkFollowUpsRollup({ anchorId, body, config }) {
103
88
  };
104
89
  }
105
90
 
106
- /** Milliseconds in one day — the unit `frictionWindowDays` is expressed in. */
107
91
  const MS_PER_DAY = 24 * 60 * 60 * 1000;
108
92
 
109
- /** Window bound applied when `frictionWindowDays` is unset. */
110
- const DEFAULT_FRICTION_WINDOW_DAYS = 30;
111
-
112
93
  /**
113
- * How many days back the run-scope recurrence window reaches (Story #4850).
114
- *
115
- * Defaults to 30 rather than to "unbounded": the widened cross-run window
116
- * exists to let a once-per-Story defect reach the ≥ 2 threshold, and 30 days is
117
- * long enough for that while short enough that a defect fixed last month stops
118
- * re-routing. An absent, non-integer, or sub-1 value takes the default — the
119
- * runtime AJV in `config-settings-schema-delivery.js` rejects those at load, so
120
- * reaching this fallback means the config never went through the validator.
121
- *
122
- * @param {object} [config]
123
- * @returns {number}
94
+ * Long enough for a once-per-Story defect to recur, short enough that a
95
+ * defect fixed last month stops re-routing.
124
96
  */
125
- function resolveFrictionWindowDays(config) {
126
- const raw = config?.delivery?.feedbackLoop?.frictionWindowDays;
127
- const days = Number(raw);
128
- return Number.isInteger(days) && days >= 1
129
- ? days
130
- : DEFAULT_FRICTION_WINDOW_DAYS;
131
- }
97
+ const FRICTION_WINDOW_DAYS = 30;
132
98
 
133
99
  /**
134
- * Resolve the follow-up ownership buckets for the retro composer and the
135
- * graduator walk.
136
- *
137
- * Routing itself lives in `github/framework-repo.js` — this is the slug-shaped
138
- * adapter the composer wants (`composeRoutedProposals` renders slugs in prose)
139
- * plus the `{owner, repo}` map `graduate()` routes on. The `platform` bucket
140
- * has **no default**: an unconfigured shared-infra repo stays `null` so a
141
- * caller reports it rather than filing platform-owned work somewhere plausible.
100
+ * Slug-shaped adapter over `resolveOwnershipRepos`. `platform` has no default:
101
+ * unconfigured stays `null` so platform work is never filed somewhere plausible.
142
102
  *
143
103
  * @param {object} [config]
144
104
  * @returns {{ frameworkRepo: string, consumerRepo: string, platform: (string|null), currentRepo: { owner: string, repo: string }, repos: { consumer: object|null, framework: object|null, platform: object|null } }}
@@ -146,9 +106,7 @@ function resolveFrictionWindowDays(config) {
146
106
  export function resolveFollowUpRepos(config) {
147
107
  const repos = resolveOwnershipRepos(config);
148
108
  const consumerRepo = formatRepoSlug(repos.consumer) ?? DEFAULT_FRAMEWORK_REPO;
149
- // `resolveOwnershipRepos` always resolves the framework bucket (it defaults
150
- // to the mirror constant), and both slugs above are well-formed by
151
- // construction — so neither the render nor the split can yield a blank half.
109
+ // The framework bucket always resolves, so neither slug can be blank.
152
110
  const frameworkRepo = formatRepoSlug(repos.framework);
153
111
  const [cOwner, cRepo] = consumerRepo.split('/');
154
112
  const currentRepo = { owner: cOwner, repo: cRepo };
@@ -166,19 +124,8 @@ export function resolveFollowUpRepos(config) {
166
124
  }
167
125
 
168
126
  /**
169
- * Gather the Story's friction signals for the composer.
170
- *
171
- * **`storyId` and `details` are load-bearing (Story #4649).** This function
172
- * used to flatten every record to `{ category, source }`, which silently
173
- * dropped exactly the two fields `netOutRecoveredIncidents` keys on — so the
174
- * Story #4622 recovery-netting could never fire on real data, and every
175
- * transient friction event survived to be auto-filed. The composer's unit
176
- * tests passed throughout, because they fed it synthetic signals carrying
177
- * both fields that no production path ever produced. Preserve them.
178
- *
179
- * The record's own `storyId` is preferred over the argument so a stream that
180
- * carries foreign rows attributes each one correctly; the argument is the
181
- * fallback for records written before the field existed.
127
+ * Signals keep `storyId` and `details` — recovery netting keys on both. The
128
+ * record's own `storyId` wins; the argument is the fallback.
182
129
  *
183
130
  * @param {number} storyId
184
131
  * @param {object} [config]
@@ -199,13 +146,7 @@ export async function gatherStoryFrictionSignals(storyId, config) {
199
146
  }
200
147
 
201
148
  /**
202
- * Identity of one physical signal row, for de-duplication.
203
- *
204
- * `eventId` is minted by every producer (`diagnose-friction.js` and
205
- * `runtime-friction.js` both `crypto.randomUUID()` it), so it is the primary
206
- * key. A row predating the field falls back to its physical `file:line`,
207
- * which is equally stable — the same row read through two passes over the
208
- * same tree yields the same coordinates.
149
+ * De-dup key: the producer-minted `eventId`, else the stable `file:line`.
209
150
  *
210
151
  * @param {unknown} parsed
211
152
  * @param {string} file
@@ -226,55 +167,19 @@ function signalIdentity(parsed, file, lineNumber) {
226
167
  }
227
168
 
228
169
  /**
229
- * Gather friction signals for the run-scoped roll-up, over the **whole
230
- * surviving recurrence window** rather than the run's own Stories
231
- * (Story #4824).
232
- *
233
- * The recurrence threshold in `retro-proposals.js` is ≥ 2 occurrences, and
234
- * the window it was measured over was one run's Story ids. A defect that
235
- * fires exactly **once per Story** — which is what a systemic framework
236
- * defect looks like — therefore scored 1 on every Story and was discarded as
237
- * a singleton, forever. Eighteen consecutive Stories filed nothing.
238
- *
239
- * So the gather reduces over every `signals.ndjson` still present under the
240
- * configured temp root: `<tempRoot>/standalone/stories/story-<sid>/` and
241
- * `<tempRoot>/run-<eid>/stories/story-<sid>/`. Temp-tree auto-purge
242
- * shortening that window is acceptable — a short window under-counts, and
243
- * therefore fails toward *not* filing, which is the safe direction.
244
- *
245
- * The run's own Stories are still gathered explicitly first. The discovery
246
- * walk resolves through the identical path helpers, so it is provably a
247
- * superset; the explicit pass makes "never fewer signals than before" a
248
- * property of the code rather than of an argument about path resolution.
249
- * {@link signalIdentity} de-duplicates the overlap, so one event can never be
250
- * counted twice and inflate a singleton into a fabricated recurrence.
251
- *
252
- * Homed beside {@link gatherStoryFrictionSignals} on purpose: the two used to
253
- * be independent copies of the same loop in two modules, and they drifted in
254
- * exactly the way that made the recovery-netting unreachable (Story #4649).
255
- * One reader, one normalizer, no second place to forget a field.
256
- *
257
- * Unusable ids are skipped rather than throwing — a roll-up must not fail the
258
- * epilogue over one malformed entry.
259
- *
260
- * **Bounded by age, not by run (Story #4850).** Widening the window to the
261
- * whole surviving temp tree also made it unbounded in *time*: a defect fixed
262
- * weeks ago kept its occurrences on disk and kept re-routing forever, burying
263
- * a genuine new regression underneath a historical ledger. Rows older than
264
- * `delivery.feedbackLoop.frictionWindowDays` (default 30) are excluded, as are
265
- * rows carrying no `ts` a `Date` can read — excluding an undateable row is the
266
- * direction that fails toward under-counting, and under-counting fails toward
267
- * not filing. Both exclusions are **counted and reported**, so a caller can
268
- * tell a bounded window from an unbounded one without reading prose.
269
- *
270
- * A recovery marker is written after the incident it cancels, so a marker can
271
- * never fall outside a window its incident is inside — the netting cannot be
272
- * broken by the age floor.
170
+ * Gather over every surviving `signals.ndjson` under the temp root, not just
171
+ * the run's Stories — a systemic defect fires once per Story, so a per-run
172
+ * window never reaches the ≥ 2 threshold. The run's own Stories are read
173
+ * first (guaranteeing a superset) and {@link signalIdentity} de-dups the
174
+ * overlap so no event counts twice. Rows older than
175
+ * {@link FRICTION_WINDOW_DAYS} or with an unreadable `ts` are excluded and
176
+ * counted; every shrinkage fails toward not filing. A recovery marker always
177
+ * postdates its incident, so the age floor cannot break netting. Bad ids are
178
+ * skipped, never thrown.
273
179
  *
274
180
  * @param {Array<number|string>} storyIds The run's own Stories.
275
181
  * @param {object} [config]
276
- * @param {{ now?: number }} [clock] Injected epoch-ms seam so a test can pin
277
- * the window without touching the system clock.
182
+ * @param {{ now?: number }} [clock]
278
183
  * @returns {Promise<{
279
184
  * signals: Array<{ category: string, source: 'framework'|'consumer', storyId: number, ts: string|null, details: object }>,
280
185
  * window: { days: number, cutoff: string, excludedStale: number, excludedUnparseable: number },
@@ -285,7 +190,7 @@ export async function gatherRunFrictionSignals(
285
190
  config,
286
191
  { now = Date.now() } = {},
287
192
  ) {
288
- const days = resolveFrictionWindowDays(config);
193
+ const days = FRICTION_WINDOW_DAYS;
289
194
  const cutoffMs = now - days * MS_PER_DAY;
290
195
  const signals = [];
291
196
  const seen = new Set();
@@ -339,28 +244,8 @@ export async function gatherRunFrictionSignals(
339
244
  }
340
245
 
341
246
  /**
342
- * Render the empty-roll-up line.
343
- *
344
- * Story #4578 — an empty roll-up over a multi-Story run must NOT read as
345
- * success. The pre-#4578 text ("No friction signals — nothing to follow up")
346
- * was *truthful* about the stream and *false* about the run: a 7-Story
347
- * delivery containing a mid-run git outage, a parked worker, and a
348
- * four-round acceptance critic rendered byte-identically to a genuinely
349
- * clean run. An operator cannot tell "nothing went wrong" from "the
350
- * telemetry never fired", and the second is likeliest exactly when the run
351
- * went worst.
352
- *
353
- * So the line is a function of `storyCount`:
354
- * - `storyCount <= 1` → the honest, quiet reading is retained. A single
355
- * Story that emitted nothing plausibly *was* clean, and crying wolf on
356
- * every clean Story is how a warning channel gets tuned out.
357
- * - `storyCount > 1` → zero signals across N Stories is a **claim**, and
358
- * the surrounding text says so and names the two readings, rather than
359
- * asserting the flattering one.
360
- *
361
- * This mirrors the sibling precedent in `run-epilogue.js`'s
362
- * `renderDiffLines`, which refuses to let an unresolvable base diff render
363
- * as "0 changed files".
247
+ * Zero signals over one Story reads as quiet; over N > 1 it is flagged as a
248
+ * claim, since "telemetry never fired" looks identical to a clean run.
364
249
  *
365
250
  * @param {number} storyCount
366
251
  * @returns {string[]}
@@ -381,11 +266,7 @@ function renderEmptyRollupLines(storyCount) {
381
266
  ];
382
267
  }
383
268
 
384
- /**
385
- * Skip reasons that are a deliberate outcome rather than a broken loop. A
386
- * roll-up whose every proposal was skipped for one of these filed nothing
387
- * *on purpose*; anything else is the loop failing quietly.
388
- */
269
+ /** Deliberate skips; any other skip reason is the loop failing quietly. */
389
270
  const BENIGN_SKIP_REASONS = new Set([
390
271
  'already-filed',
391
272
  'toggle-disabled',
@@ -395,8 +276,6 @@ const BENIGN_SKIP_REASONS = new Set([
395
276
  ]);
396
277
 
397
278
  /**
398
- * Summarize a category corpus for the "name what you saw" lines. Pure.
399
- *
400
279
  * @param {Array<{ category?: string }>} signals
401
280
  * @returns {Array<{ category: string, occurrences: number }>}
402
281
  */
@@ -415,26 +294,14 @@ export function summarizeSignalCategories(signals) {
415
294
  }
416
295
 
417
296
  /**
418
- * Classify what a roll-up's own numbers say about it — the reporting-layer
419
- * assertion Story #4828 adds. Pure, so the run epilogue's step result and the
420
- * rendered comment cannot disagree about whether a roll-up succeeded.
421
- *
422
- * Two suspect shapes, both of which previously rendered as success:
423
- *
424
- * - `zeroProposals` — signals were gathered and **nothing** came out, not
425
- * even a below-threshold row. That is the third instance of the failure
426
- * mode Story #4578 fixed for the zero-signal case and Story #4824 for the
427
- * all-discarded case: an all-empty routed result is silence, and a routing
428
- * regression is exactly what it looks like.
429
- * - `unfiledProposals` — proposals cleared the threshold and none were
430
- * filed for a reason that is not a deliberate one. This is what actually
431
- * happened in Story #4828: `gh issue create` rejected every call over an
432
- * absent label, the error landed in a bucket nobody rendered, and the
433
- * roll-up reported `filed: 0`.
297
+ * Pure, so the epilogue's step result and the comment agree. Suspect shapes:
298
+ * `zeroProposals` (signals in, not even a discarded row out — looks exactly
299
+ * like a routing regression) and `unfiledProposals` (actionable proposals,
300
+ * none filed, for a non-benign reason).
434
301
  *
435
302
  * @param {object} args
436
303
  * @param {number} args.signalCount
437
- * @param {number} args.proposalCount framework + consumer
304
+ * @param {number} args.proposalCount
438
305
  * @param {number} args.discardedCount
439
306
  * @param {number} args.filedCount
440
307
  * @param {string[]} [args.filingErrors]
@@ -469,8 +336,6 @@ export function assessRollupOutcome({
469
336
  }
470
337
 
471
338
  /**
472
- * Render the "N signals in, zero proposals out" warning (Story #4828).
473
- *
474
339
  * @param {number} signalCount
475
340
  * @param {Array<{ category: string, occurrences: number }>} categories
476
341
  * @returns {string[]}
@@ -491,9 +356,6 @@ function renderZeroProposalLines(signalCount, categories) {
491
356
  }
492
357
 
493
358
  /**
494
- * Render the "proposals cleared the threshold but none were filed" warning
495
- * (Story #4828).
496
- *
497
359
  * @param {number} proposalCount
498
360
  * @param {string[]} filingErrors
499
361
  * @param {string[]} blockingSkipReasons
@@ -518,18 +380,7 @@ function renderUnfiledProposalLines(
518
380
  }
519
381
 
520
382
  /**
521
- * Render one discarded (below-threshold) roll-up row (Story #4824).
522
- *
523
- * The pre-#4824 row was `` `category` ×N `` and nothing else. That is exactly
524
- * how a defect firing once per Story stayed invisible for eighteen
525
- * consecutive Stories: an operator reading "×1" cannot tell a one-off from a
526
- * systemic defect whose window was too narrow to see it recur. The row now
527
- * names the emitting tools, the bucket fingerprint, and the number of
528
- * distinct Stories it spans — the cross-run count the widened recurrence
529
- * window produces.
530
- *
531
- * Every added field is optional so a caller passing a hand-built proposals
532
- * object (or an older persisted one) still renders.
383
+ * Descriptive fields are optional so hand-built or older proposals render.
533
384
  *
534
385
  * @param {{ category: string, occurrences: number, tools?: string[], fingerprint?: string, storyCount?: number }} item
535
386
  * @returns {string}
@@ -550,10 +401,6 @@ function renderDiscardedItem(item) {
550
401
  }
551
402
 
552
403
  /**
553
- * Normalize the two loosely-typed inputs into the four buckets every section
554
- * renderer reads. Absorbs the optional-chain / nullish-coalesce cluster that
555
- * otherwise all lands on `buildFollowUpsCommentBody` (Story #4926).
556
- *
557
404
  * @param {object|null|undefined} proposals
558
405
  * @param {object|null|undefined} graduated
559
406
  * @returns {{ filed: object[], framework: object[], consumer: object[],
@@ -571,8 +418,6 @@ function normalizeRollupBuckets(proposals, graduated) {
571
418
  }
572
419
 
573
420
  /**
574
- * Render the "**Filed**" section, or nothing when no proposal was filed.
575
- *
576
421
  * @param {object[]} filed
577
422
  * @returns {string[]}
578
423
  */
@@ -589,8 +434,7 @@ function renderFiledSection(filed) {
589
434
  }
590
435
 
591
436
  /**
592
- * Render the "**Actionable (not auto-filed)**" fallback — the command stanzas
593
- * an operator runs by hand when auto-filing produced nothing.
437
+ * Hand-run command stanzas, shown only when auto-filing produced nothing.
594
438
  *
595
439
  * @param {object[]} actionable framework + consumer, in that order
596
440
  * @param {object[]} filed
@@ -608,8 +452,6 @@ function renderActionableSection(actionable, filed) {
608
452
  }
609
453
 
610
454
  /**
611
- * Render the "**Below threshold (not filed)**" section.
612
- *
613
455
  * @param {object[]} discarded
614
456
  * @returns {string[]}
615
457
  */
@@ -625,10 +467,6 @@ function renderDiscardedSection(discarded) {
625
467
  }
626
468
 
627
469
  /**
628
- * Render the all-empty branch. Story #4828 — "no proposals" has two readings,
629
- * and only one of them is a quiet run. Signals gathered but nothing routed is
630
- * the third instance of the silence Stories #4578 and #4824 each fixed once.
631
- *
632
470
  * @param {{ empty: boolean, outcome: {zeroProposals: boolean},
633
471
  * signalCount: number, categories: object[], storyCount: number }} args
634
472
  * @returns {string[]}
@@ -650,8 +488,7 @@ function renderEmptySection({
650
488
  }
651
489
 
652
490
  /**
653
- * Build the machine-readable twin of the rendered prose. Every suspect flag
654
- * above has a field here so a caller never has to regex the body.
491
+ * Machine-readable twin of the prose, so callers never regex the body.
655
492
  *
656
493
  * @param {object} args
657
494
  * @returns {object}
@@ -669,17 +506,10 @@ function buildRollupPayload({
669
506
  return {
670
507
  storyId,
671
508
  storyCount,
672
- // Story #4828 — the corpus the roll-up actually read. Without it a
673
- // reader cannot tell "0 proposals because nothing recurred" from
674
- // "0 proposals because routing broke".
675
509
  signalCount,
676
510
  categories,
677
511
  framework: framework.map((i) => i.category),
678
512
  consumer: consumer.map((i) => i.category),
679
- // Story #4824 — the machine-readable twin of the row above. A bare
680
- // category list could not distinguish a genuine one-off from a
681
- // recurrence the window was too narrow to see, so the count, the
682
- // cross-Story span, and the shape fingerprint ride along.
683
513
  discarded: discarded.map((i) => ({
684
514
  category: i.category,
685
515
  occurrences: i.occurrences,
@@ -687,12 +517,7 @@ function buildRollupPayload({
687
517
  fingerprint: i.fingerprint ?? null,
688
518
  })),
689
519
  filed: filed.map((i) => ({ category: i.category, url: i.url ?? null })),
690
- // Story #4578 — an empty roll-up over N>1 Stories is a claim worth
691
- // flagging, not a success. Machine-readable twin of the warning
692
- // prose so a caller need not regex the body.
693
520
  emptyRollupSuspect: storyCount > 1 && empty && signalCount === 0,
694
- // Story #4828 — the two remaining shapes that used to render as
695
- // success. Machine-readable twins of the warning prose above.
696
521
  zeroProposalSuspect: outcome.zeroProposals,
697
522
  unfiledProposalSuspect: outcome.unfiledProposals,
698
523
  filingErrors,
@@ -707,11 +532,8 @@ function buildRollupPayload({
707
532
  * storyCount?: number,
708
533
  * signalCount?: number,
709
534
  * categories?: Array<{ category: string, occurrences: number }>,
710
- * }} args - `storyCount` (default 1) is how many Stories the roll-up spans;
711
- * it decides whether an empty result reads as quiet or as a flagged claim.
712
- * `signalCount` / `categories` (Story #4828) are what the roll-up actually
713
- * gathered, so a zero-proposal or zero-filed outcome can name its own
714
- * corpus instead of rendering as a clean run.
535
+ * }} args - `storyCount` (default 1) decides whether an empty result reads
536
+ * as quiet or as a flagged claim.
715
537
  * @returns {string}
716
538
  */
717
539
  export function buildFollowUpsCommentBody({
@@ -782,8 +604,6 @@ export function buildFollowUpsCommentBody({
782
604
  }
783
605
 
784
606
  /**
785
- * Compose the routed proposals for one Story's friction corpus.
786
- *
787
607
  * @param {number} sid
788
608
  * @param {Array<object>} signals
789
609
  * @param {object} [config]
@@ -797,17 +617,11 @@ function composeStoryProposals(sid, signals, config) {
797
617
  frameworkRepo: repos.frameworkRepo,
798
618
  consumerRepo: repos.consumerRepo,
799
619
  signals,
800
- // Derived, not hardcoded `[]` (Story #4649). This is the escape hatch
801
- // the retired story-scope threshold carve-out was standing in for: a
802
- // Story still parked at `agent::blocked` files at a single occurrence,
803
- // while one that blocked and self-resolved nets out entirely.
804
620
  unresolvedBlockedEvents: deriveUnresolvedBlockedEvents(signals),
805
621
  });
806
622
  }
807
623
 
808
624
  /**
809
- * Hand one Story's routed proposals to the graduator.
810
- *
811
625
  * @param {object} args
812
626
  * @returns {Promise<object>}
813
627
  */
@@ -818,8 +632,6 @@ function fileStoryProposals({ sid, proposals, provider, config, cwd }) {
818
632
  provider,
819
633
  config,
820
634
  currentRepo: repos.currentRepo,
821
- // The resolved bucket object, not a re-split of the slug: routing is
822
- // decided once in `github/framework-repo.js`.
823
635
  frameworkRepo: repos.repos.framework,
824
636
  platformRepo: repos.repos.platform,
825
637
  routedProposals: proposals,
@@ -828,18 +640,8 @@ function fileStoryProposals({ sid, proposals, provider, config, cwd }) {
828
640
  }
829
641
 
830
642
  /**
831
- * Capture and persist Story follow-ups. Never throws — the land must not
832
- * fail because follow-up filing flaked.
833
- *
834
- * Story #4543 retired the `captureFollowUpsAfterConfirm` action-gate wrapper
835
- * (and its `withConfirmFollowUps` sibling) that used to front this function.
836
- * Re-deriving "did the merge land?" from a confirmation envelope's `action`
837
- * field was the coupling that made close-and-land — the DEFAULT path — skip
838
- * capture entirely: the gate only opened on the standalone CLI's `done`, and
839
- * a belated manual confirm could not backfill because the Story was already
840
- * `agent::done` (confirm returns `noop`, the gate never opens). The shared
841
- * land tail (`single-story-close/phases/post-land.js`) now calls this
842
- * directly, after the merge is already confirmed.
643
+ * Called by the land tail after the merge is confirmed. Never throws — the
644
+ * land must not fail because follow-up filing flaked.
843
645
  *
844
646
  * @param {object} args
845
647
  * @param {number} args.storyId
@@ -901,10 +703,6 @@ export async function captureStoryFollowUps({
901
703
  }
902
704
 
903
705
  /**
904
- * Report a failed capture without failing the close around it — follow-up
905
- * capture is a reporting step, so a provider or filesystem fault degrades the
906
- * report and never the land.
907
- *
908
706
  * @param {number} sid
909
707
  * @param {unknown} err
910
708
  * @param {((tag: string, msg: string) => void)} [progress]
@@ -1,18 +1,7 @@
1
1
  /**
2
- * story-init-envelope.js — read back the envelope `single-story-init.js`
3
- * writes for one Story.
4
- *
5
- * Init routes its full result object to
6
- * `<tempRoot>/orchestration/story-init-result-<id>.log` through
7
- * `emitTerseResult`, wrapped in the same `--- STORY INIT RESULT ---` markers
8
- * the legacy inline dump used. Story #5343 retired the `story-init` ticket
9
- * comment that duplicated it, which makes this file the durable record of
10
- * what a run was seeded with — most load-bearingly the `runScopedConfig` pin
11
- * `run-scoped-config.js` compares against at close.
12
- *
13
- * Total and non-throwing: a missing, unreadable or unparseable envelope
14
- * resolves to `null`, and the caller reports the degrade. Reading it is
15
- * always best-effort — the temp tree is reapable by design.
2
+ * Read back the init envelope `single-story-init.js` writes — the record of
3
+ * what a run was seeded with, including the `runScopedConfig` pin. Never
4
+ * throws: anything unreadable is `null` (the temp tree is reapable).
16
5
  *
17
6
  * @module lib/orchestration/story-init-envelope
18
7
  */
@@ -23,8 +12,6 @@ import path from 'node:path';
23
12
  import { orchestrationLogDir } from '../config/temp-paths.js';
24
13
 
25
14
  /**
26
- * Read one Story's init envelope, or `null` when there is none to read.
27
- *
28
15
  * @param {{
29
16
  * storyId: number|string,
30
17
  * config?: object,
@@ -38,8 +25,7 @@ function readStoryInitEnvelope({ storyId, config, readFileFn = readFileSync }) {
38
25
  `story-init-result-${storyId}.log`,
39
26
  );
40
27
  try {
41
- // The log brackets the pretty JSON with human markers, so take the
42
- // outermost brace span rather than parsing the whole file.
28
+ // Markers bracket the JSON: take the outermost brace span.
43
29
  const fence = /\{[\s\S]*\}/.exec(readFileFn(file, 'utf8'));
44
30
  const payload = fence ? JSON.parse(fence[0]) : null;
45
31
  return payload && typeof payload === 'object' ? payload : null;
@@ -49,11 +35,6 @@ function readStoryInitEnvelope({ storyId, config, readFileFn = readFileSync }) {
49
35
  }
50
36
 
51
37
  /**
52
- * The `runScopedConfig` pin off one Story's init envelope, or `null` when the
53
- * envelope is absent or carries none. The write half is
54
- * `run-scoped-config.js#pinRunScopedConfig`, which `single-story-init.js`
55
- * records on the envelope this reads back.
56
- *
57
38
  * @param {{
58
39
  * storyId: number|string,
59
40
  * config?: object,
@@ -33,12 +33,8 @@ export async function handleRemoteVerificationFailure({
33
33
  `[single-story-init] failed to post remote-verification friction: ${err?.message ?? err}`,
34
34
  );
35
35
  }
36
- // Story #4539 — the canonical mutator. This is the path where the
37
- // skipped Projects v2 column sync (Story #2548) visibly drifts: the
38
- // Story is still agent::ready (To Do) when the remote probe fails, so
39
- // a direct label write leaves the board reading To Do for a blocked
40
- // Story. single-story-init.js's own comment explains exactly why this
41
- // must not bypass the mutator.
36
+ // Use the canonical mutator: a direct label write skips the Projects v2
37
+ // column sync and leaves the board reading To Do for a blocked Story.
42
38
  try {
43
39
  await transitionTicketState(provider, storyId, STATE_LABELS.BLOCKED, {});
44
40
  } catch (err) {
@@ -1,30 +1,10 @@
1
1
  /**
2
- * lib/orchestration/story-reachability.js — Story `depends_on` graph walk.
3
- *
4
- * Houses the transitive-predecessor closure over the story-level
5
- * `depends_on` graph. Extracted from `./ticket-validator-conflicts.js`
6
- * under Story #3995 to break the `file-assumptions.js ↔
7
- * ticket-validator-conflicts.js` import cycle: both the conflict gate and
8
- * the wave-aware file-assumption gate need this graph traversal, so
9
- * pulling it down into a dependency-free leaf lets both import it from
10
- * below rather than from each other.
11
- *
12
- * This is a pure graph utility — no I/O, no policy. Its behaviour is
13
- * unchanged from the original `computeStoryReachability`.
2
+ * Dependency-free leaf (breaks a conflicts ↔ file-assumptions import cycle).
14
3
  */
15
4
 
16
5
  /**
17
- * Compute transitive predecessor sets over the story-level `depends_on`
18
- * graph. The returned map is `Map<storySlug, Set<storySlug>>`, where the
19
- * set contains every story reachable by following `depends_on` edges from
20
- * the key (i.e. every story the key transitively depends on).
21
- *
22
- * BFS, no cycles assumed — callers must run `assertAcyclic` first.
23
- *
24
- * Exported so both the conflict gate (`ticket-validator-conflicts.js`)
25
- * and the wave-aware file-assumption gate (`file-assumptions.js`) can
26
- * reuse the same transitive-predecessor walk rather than re-deriving the
27
- * `depends_on` closure.
6
+ * `Map<storySlug, Set<storySlug>>` of every Story each key transitively
7
+ * depends on. Assumes an acyclic graph — run `assertAcyclic` first.
28
8
  */
29
9
  export function computeStoryReachability(stories) {
30
10
  const reach = new Map();