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,15 +1,14 @@
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
  */
11
7
 
12
- import { signalsFile } from '../config/temp-paths.js';
8
+ import { mkdir, writeFile } from 'node:fs/promises';
9
+ import path from 'node:path';
10
+
11
+ import { orchestrationLogDir, signalsFile } from '../config/temp-paths.js';
13
12
  import { graduateRetroProposals } from '../feedback-loop/retro-proposals-graduator.js';
14
13
  import {
15
14
  DEFAULT_FRAMEWORK_REPO,
@@ -30,42 +29,76 @@ import { upsertStructuredComment } from './ticketing.js';
30
29
 
31
30
  const FOLLOW_UPS_COMMENT_TYPE = 'follow-ups';
32
31
 
33
- /** Milliseconds in one day — the unit `frictionWindowDays` is expressed in. */
34
- const MS_PER_DAY = 24 * 60 * 60 * 1000;
32
+ /**
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.
36
+ *
37
+ * @param {object} args
38
+ * @param {number} args.anchorId
39
+ * @param {string} args.body
40
+ * @param {number} args.filedCount
41
+ * @param {object} args.provider
42
+ * @param {object} [args.config]
43
+ * @returns {Promise<{ posted: boolean, artifactPath: string|null, summary: string }>}
44
+ */
45
+ export async function publishFollowUpsRollup({
46
+ anchorId,
47
+ body,
48
+ filedCount,
49
+ provider,
50
+ config,
51
+ }) {
52
+ return filedCount > 0
53
+ ? postFollowUpsComment({ anchorId, body, filedCount, provider })
54
+ : parkFollowUpsRollup({ anchorId, body, config });
55
+ }
35
56
 
36
- /** Window bound applied when `frictionWindowDays` is unset. */
37
- const DEFAULT_FRICTION_WINDOW_DAYS = 30;
57
+ /**
58
+ * @param {object} args
59
+ * @returns {Promise<{ posted: true, artifactPath: null, summary: string }>}
60
+ */
61
+ async function postFollowUpsComment({ anchorId, body, filedCount, provider }) {
62
+ await upsertStructuredComment(
63
+ provider,
64
+ anchorId,
65
+ FOLLOW_UPS_COMMENT_TYPE,
66
+ body,
67
+ );
68
+ return {
69
+ posted: true,
70
+ artifactPath: null,
71
+ summary: `Captured follow-ups for #${anchorId} (filed=${filedCount}).`,
72
+ };
73
+ }
38
74
 
39
75
  /**
40
- * How many days back the run-scope recurrence window reaches (Story #4850).
41
- *
42
- * Defaults to 30 rather than to "unbounded": the widened cross-run window
43
- * exists to let a once-per-Story defect reach the ≥ 2 threshold, and 30 days is
44
- * long enough for that while short enough that a defect fixed last month stops
45
- * re-routing. An absent, non-integer, or sub-1 value takes the default — the
46
- * runtime AJV in `config-settings-schema-delivery.js` rejects those at load, so
47
- * reaching this fallback means the config never went through the validator.
48
- *
49
- * @param {object} [config]
50
- * @returns {number}
76
+ * @param {object} args
77
+ * @returns {Promise<{ posted: false, artifactPath: string, summary: string }>}
51
78
  */
52
- function resolveFrictionWindowDays(config) {
53
- const raw = config?.delivery?.feedbackLoop?.frictionWindowDays;
54
- const days = Number(raw);
55
- return Number.isInteger(days) && days >= 1
56
- ? days
57
- : DEFAULT_FRICTION_WINDOW_DAYS;
79
+ async function parkFollowUpsRollup({ anchorId, body, config }) {
80
+ const dir = orchestrationLogDir(config);
81
+ const artifactPath = path.join(dir, `follow-ups-rollup-${anchorId}.md`);
82
+ await mkdir(dir, { recursive: true });
83
+ await writeFile(artifactPath, `${body}\n`, 'utf8');
84
+ return {
85
+ posted: false,
86
+ artifactPath,
87
+ summary: `No follow-ups filed for #${anchorId} — roll-up kept at ${artifactPath}.`,
88
+ };
58
89
  }
59
90
 
91
+ const MS_PER_DAY = 24 * 60 * 60 * 1000;
92
+
60
93
  /**
61
- * Resolve the follow-up ownership buckets for the retro composer and the
62
- * graduator walk.
63
- *
64
- * Routing itself lives in `github/framework-repo.js` — this is the slug-shaped
65
- * adapter the composer wants (`composeRoutedProposals` renders slugs in prose)
66
- * plus the `{owner, repo}` map `graduate()` routes on. The `platform` bucket
67
- * has **no default**: an unconfigured shared-infra repo stays `null` so a
68
- * caller reports it rather than filing platform-owned work somewhere plausible.
94
+ * Long enough for a once-per-Story defect to recur, short enough that a
95
+ * defect fixed last month stops re-routing.
96
+ */
97
+ const FRICTION_WINDOW_DAYS = 30;
98
+
99
+ /**
100
+ * Slug-shaped adapter over `resolveOwnershipRepos`. `platform` has no default:
101
+ * unconfigured stays `null` so platform work is never filed somewhere plausible.
69
102
  *
70
103
  * @param {object} [config]
71
104
  * @returns {{ frameworkRepo: string, consumerRepo: string, platform: (string|null), currentRepo: { owner: string, repo: string }, repos: { consumer: object|null, framework: object|null, platform: object|null } }}
@@ -73,9 +106,7 @@ function resolveFrictionWindowDays(config) {
73
106
  export function resolveFollowUpRepos(config) {
74
107
  const repos = resolveOwnershipRepos(config);
75
108
  const consumerRepo = formatRepoSlug(repos.consumer) ?? DEFAULT_FRAMEWORK_REPO;
76
- // `resolveOwnershipRepos` always resolves the framework bucket (it defaults
77
- // to the mirror constant), and both slugs above are well-formed by
78
- // 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.
79
110
  const frameworkRepo = formatRepoSlug(repos.framework);
80
111
  const [cOwner, cRepo] = consumerRepo.split('/');
81
112
  const currentRepo = { owner: cOwner, repo: cRepo };
@@ -93,19 +124,8 @@ export function resolveFollowUpRepos(config) {
93
124
  }
94
125
 
95
126
  /**
96
- * Gather the Story's friction signals for the composer.
97
- *
98
- * **`storyId` and `details` are load-bearing (Story #4649).** This function
99
- * used to flatten every record to `{ category, source }`, which silently
100
- * dropped exactly the two fields `netOutRecoveredIncidents` keys on — so the
101
- * Story #4622 recovery-netting could never fire on real data, and every
102
- * transient friction event survived to be auto-filed. The composer's unit
103
- * tests passed throughout, because they fed it synthetic signals carrying
104
- * both fields that no production path ever produced. Preserve them.
105
- *
106
- * The record's own `storyId` is preferred over the argument so a stream that
107
- * carries foreign rows attributes each one correctly; the argument is the
108
- * 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.
109
129
  *
110
130
  * @param {number} storyId
111
131
  * @param {object} [config]
@@ -126,13 +146,7 @@ export async function gatherStoryFrictionSignals(storyId, config) {
126
146
  }
127
147
 
128
148
  /**
129
- * Identity of one physical signal row, for de-duplication.
130
- *
131
- * `eventId` is minted by every producer (`diagnose-friction.js` and
132
- * `runtime-friction.js` both `crypto.randomUUID()` it), so it is the primary
133
- * key. A row predating the field falls back to its physical `file:line`,
134
- * which is equally stable — the same row read through two passes over the
135
- * same tree yields the same coordinates.
149
+ * De-dup key: the producer-minted `eventId`, else the stable `file:line`.
136
150
  *
137
151
  * @param {unknown} parsed
138
152
  * @param {string} file
@@ -153,55 +167,19 @@ function signalIdentity(parsed, file, lineNumber) {
153
167
  }
154
168
 
155
169
  /**
156
- * Gather friction signals for the run-scoped roll-up, over the **whole
157
- * surviving recurrence window** rather than the run's own Stories
158
- * (Story #4824).
159
- *
160
- * The recurrence threshold in `retro-proposals.js` is ≥ 2 occurrences, and
161
- * the window it was measured over was one run's Story ids. A defect that
162
- * fires exactly **once per Story** — which is what a systemic framework
163
- * defect looks like — therefore scored 1 on every Story and was discarded as
164
- * a singleton, forever. Eighteen consecutive Stories filed nothing.
165
- *
166
- * So the gather reduces over every `signals.ndjson` still present under the
167
- * configured temp root: `<tempRoot>/standalone/stories/story-<sid>/` and
168
- * `<tempRoot>/run-<eid>/stories/story-<sid>/`. Temp-tree auto-purge
169
- * shortening that window is acceptable — a short window under-counts, and
170
- * therefore fails toward *not* filing, which is the safe direction.
171
- *
172
- * The run's own Stories are still gathered explicitly first. The discovery
173
- * walk resolves through the identical path helpers, so it is provably a
174
- * superset; the explicit pass makes "never fewer signals than before" a
175
- * property of the code rather than of an argument about path resolution.
176
- * {@link signalIdentity} de-duplicates the overlap, so one event can never be
177
- * counted twice and inflate a singleton into a fabricated recurrence.
178
- *
179
- * Homed beside {@link gatherStoryFrictionSignals} on purpose: the two used to
180
- * be independent copies of the same loop in two modules, and they drifted in
181
- * exactly the way that made the recovery-netting unreachable (Story #4649).
182
- * One reader, one normalizer, no second place to forget a field.
183
- *
184
- * Unusable ids are skipped rather than throwing — a roll-up must not fail the
185
- * epilogue over one malformed entry.
186
- *
187
- * **Bounded by age, not by run (Story #4850).** Widening the window to the
188
- * whole surviving temp tree also made it unbounded in *time*: a defect fixed
189
- * weeks ago kept its occurrences on disk and kept re-routing forever, burying
190
- * a genuine new regression underneath a historical ledger. Rows older than
191
- * `delivery.feedbackLoop.frictionWindowDays` (default 30) are excluded, as are
192
- * rows carrying no `ts` a `Date` can read — excluding an undateable row is the
193
- * direction that fails toward under-counting, and under-counting fails toward
194
- * not filing. Both exclusions are **counted and reported**, so a caller can
195
- * tell a bounded window from an unbounded one without reading prose.
196
- *
197
- * A recovery marker is written after the incident it cancels, so a marker can
198
- * never fall outside a window its incident is inside — the netting cannot be
199
- * 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.
200
179
  *
201
180
  * @param {Array<number|string>} storyIds The run's own Stories.
202
181
  * @param {object} [config]
203
- * @param {{ now?: number }} [clock] Injected epoch-ms seam so a test can pin
204
- * the window without touching the system clock.
182
+ * @param {{ now?: number }} [clock]
205
183
  * @returns {Promise<{
206
184
  * signals: Array<{ category: string, source: 'framework'|'consumer', storyId: number, ts: string|null, details: object }>,
207
185
  * window: { days: number, cutoff: string, excludedStale: number, excludedUnparseable: number },
@@ -212,7 +190,7 @@ export async function gatherRunFrictionSignals(
212
190
  config,
213
191
  { now = Date.now() } = {},
214
192
  ) {
215
- const days = resolveFrictionWindowDays(config);
193
+ const days = FRICTION_WINDOW_DAYS;
216
194
  const cutoffMs = now - days * MS_PER_DAY;
217
195
  const signals = [];
218
196
  const seen = new Set();
@@ -266,28 +244,8 @@ export async function gatherRunFrictionSignals(
266
244
  }
267
245
 
268
246
  /**
269
- * Render the empty-roll-up line.
270
- *
271
- * Story #4578 — an empty roll-up over a multi-Story run must NOT read as
272
- * success. The pre-#4578 text ("No friction signals — nothing to follow up")
273
- * was *truthful* about the stream and *false* about the run: a 7-Story
274
- * delivery containing a mid-run git outage, a parked worker, and a
275
- * four-round acceptance critic rendered byte-identically to a genuinely
276
- * clean run. An operator cannot tell "nothing went wrong" from "the
277
- * telemetry never fired", and the second is likeliest exactly when the run
278
- * went worst.
279
- *
280
- * So the line is a function of `storyCount`:
281
- * - `storyCount <= 1` → the honest, quiet reading is retained. A single
282
- * Story that emitted nothing plausibly *was* clean, and crying wolf on
283
- * every clean Story is how a warning channel gets tuned out.
284
- * - `storyCount > 1` → zero signals across N Stories is a **claim**, and
285
- * the surrounding text says so and names the two readings, rather than
286
- * asserting the flattering one.
287
- *
288
- * This mirrors the sibling precedent in `run-epilogue.js`'s
289
- * `renderDiffLines`, which refuses to let an unresolvable base diff render
290
- * 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.
291
249
  *
292
250
  * @param {number} storyCount
293
251
  * @returns {string[]}
@@ -308,11 +266,7 @@ function renderEmptyRollupLines(storyCount) {
308
266
  ];
309
267
  }
310
268
 
311
- /**
312
- * Skip reasons that are a deliberate outcome rather than a broken loop. A
313
- * roll-up whose every proposal was skipped for one of these filed nothing
314
- * *on purpose*; anything else is the loop failing quietly.
315
- */
269
+ /** Deliberate skips; any other skip reason is the loop failing quietly. */
316
270
  const BENIGN_SKIP_REASONS = new Set([
317
271
  'already-filed',
318
272
  'toggle-disabled',
@@ -322,8 +276,6 @@ const BENIGN_SKIP_REASONS = new Set([
322
276
  ]);
323
277
 
324
278
  /**
325
- * Summarize a category corpus for the "name what you saw" lines. Pure.
326
- *
327
279
  * @param {Array<{ category?: string }>} signals
328
280
  * @returns {Array<{ category: string, occurrences: number }>}
329
281
  */
@@ -342,26 +294,14 @@ export function summarizeSignalCategories(signals) {
342
294
  }
343
295
 
344
296
  /**
345
- * Classify what a roll-up's own numbers say about it — the reporting-layer
346
- * assertion Story #4828 adds. Pure, so the run epilogue's step result and the
347
- * rendered comment cannot disagree about whether a roll-up succeeded.
348
- *
349
- * Two suspect shapes, both of which previously rendered as success:
350
- *
351
- * - `zeroProposals` — signals were gathered and **nothing** came out, not
352
- * even a below-threshold row. That is the third instance of the failure
353
- * mode Story #4578 fixed for the zero-signal case and Story #4824 for the
354
- * all-discarded case: an all-empty routed result is silence, and a routing
355
- * regression is exactly what it looks like.
356
- * - `unfiledProposals` — proposals cleared the threshold and none were
357
- * filed for a reason that is not a deliberate one. This is what actually
358
- * happened in Story #4828: `gh issue create` rejected every call over an
359
- * absent label, the error landed in a bucket nobody rendered, and the
360
- * 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).
361
301
  *
362
302
  * @param {object} args
363
303
  * @param {number} args.signalCount
364
- * @param {number} args.proposalCount framework + consumer
304
+ * @param {number} args.proposalCount
365
305
  * @param {number} args.discardedCount
366
306
  * @param {number} args.filedCount
367
307
  * @param {string[]} [args.filingErrors]
@@ -396,8 +336,6 @@ export function assessRollupOutcome({
396
336
  }
397
337
 
398
338
  /**
399
- * Render the "N signals in, zero proposals out" warning (Story #4828).
400
- *
401
339
  * @param {number} signalCount
402
340
  * @param {Array<{ category: string, occurrences: number }>} categories
403
341
  * @returns {string[]}
@@ -418,9 +356,6 @@ function renderZeroProposalLines(signalCount, categories) {
418
356
  }
419
357
 
420
358
  /**
421
- * Render the "proposals cleared the threshold but none were filed" warning
422
- * (Story #4828).
423
- *
424
359
  * @param {number} proposalCount
425
360
  * @param {string[]} filingErrors
426
361
  * @param {string[]} blockingSkipReasons
@@ -445,18 +380,7 @@ function renderUnfiledProposalLines(
445
380
  }
446
381
 
447
382
  /**
448
- * Render one discarded (below-threshold) roll-up row (Story #4824).
449
- *
450
- * The pre-#4824 row was `` `category` ×N `` and nothing else. That is exactly
451
- * how a defect firing once per Story stayed invisible for eighteen
452
- * consecutive Stories: an operator reading "×1" cannot tell a one-off from a
453
- * systemic defect whose window was too narrow to see it recur. The row now
454
- * names the emitting tools, the bucket fingerprint, and the number of
455
- * distinct Stories it spans — the cross-run count the widened recurrence
456
- * window produces.
457
- *
458
- * Every added field is optional so a caller passing a hand-built proposals
459
- * object (or an older persisted one) still renders.
383
+ * Descriptive fields are optional so hand-built or older proposals render.
460
384
  *
461
385
  * @param {{ category: string, occurrences: number, tools?: string[], fingerprint?: string, storyCount?: number }} item
462
386
  * @returns {string}
@@ -477,10 +401,6 @@ function renderDiscardedItem(item) {
477
401
  }
478
402
 
479
403
  /**
480
- * Normalize the two loosely-typed inputs into the four buckets every section
481
- * renderer reads. Absorbs the optional-chain / nullish-coalesce cluster that
482
- * otherwise all lands on `buildFollowUpsCommentBody` (Story #4926).
483
- *
484
404
  * @param {object|null|undefined} proposals
485
405
  * @param {object|null|undefined} graduated
486
406
  * @returns {{ filed: object[], framework: object[], consumer: object[],
@@ -498,8 +418,6 @@ function normalizeRollupBuckets(proposals, graduated) {
498
418
  }
499
419
 
500
420
  /**
501
- * Render the "**Filed**" section, or nothing when no proposal was filed.
502
- *
503
421
  * @param {object[]} filed
504
422
  * @returns {string[]}
505
423
  */
@@ -516,8 +434,7 @@ function renderFiledSection(filed) {
516
434
  }
517
435
 
518
436
  /**
519
- * Render the "**Actionable (not auto-filed)**" fallback — the command stanzas
520
- * an operator runs by hand when auto-filing produced nothing.
437
+ * Hand-run command stanzas, shown only when auto-filing produced nothing.
521
438
  *
522
439
  * @param {object[]} actionable framework + consumer, in that order
523
440
  * @param {object[]} filed
@@ -535,8 +452,6 @@ function renderActionableSection(actionable, filed) {
535
452
  }
536
453
 
537
454
  /**
538
- * Render the "**Below threshold (not filed)**" section.
539
- *
540
455
  * @param {object[]} discarded
541
456
  * @returns {string[]}
542
457
  */
@@ -552,10 +467,6 @@ function renderDiscardedSection(discarded) {
552
467
  }
553
468
 
554
469
  /**
555
- * Render the all-empty branch. Story #4828 — "no proposals" has two readings,
556
- * and only one of them is a quiet run. Signals gathered but nothing routed is
557
- * the third instance of the silence Stories #4578 and #4824 each fixed once.
558
- *
559
470
  * @param {{ empty: boolean, outcome: {zeroProposals: boolean},
560
471
  * signalCount: number, categories: object[], storyCount: number }} args
561
472
  * @returns {string[]}
@@ -577,8 +488,7 @@ function renderEmptySection({
577
488
  }
578
489
 
579
490
  /**
580
- * Build the machine-readable twin of the rendered prose. Every suspect flag
581
- * 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.
582
492
  *
583
493
  * @param {object} args
584
494
  * @returns {object}
@@ -596,17 +506,10 @@ function buildRollupPayload({
596
506
  return {
597
507
  storyId,
598
508
  storyCount,
599
- // Story #4828 — the corpus the roll-up actually read. Without it a
600
- // reader cannot tell "0 proposals because nothing recurred" from
601
- // "0 proposals because routing broke".
602
509
  signalCount,
603
510
  categories,
604
511
  framework: framework.map((i) => i.category),
605
512
  consumer: consumer.map((i) => i.category),
606
- // Story #4824 — the machine-readable twin of the row above. A bare
607
- // category list could not distinguish a genuine one-off from a
608
- // recurrence the window was too narrow to see, so the count, the
609
- // cross-Story span, and the shape fingerprint ride along.
610
513
  discarded: discarded.map((i) => ({
611
514
  category: i.category,
612
515
  occurrences: i.occurrences,
@@ -614,12 +517,7 @@ function buildRollupPayload({
614
517
  fingerprint: i.fingerprint ?? null,
615
518
  })),
616
519
  filed: filed.map((i) => ({ category: i.category, url: i.url ?? null })),
617
- // Story #4578 — an empty roll-up over N>1 Stories is a claim worth
618
- // flagging, not a success. Machine-readable twin of the warning
619
- // prose so a caller need not regex the body.
620
520
  emptyRollupSuspect: storyCount > 1 && empty && signalCount === 0,
621
- // Story #4828 — the two remaining shapes that used to render as
622
- // success. Machine-readable twins of the warning prose above.
623
521
  zeroProposalSuspect: outcome.zeroProposals,
624
522
  unfiledProposalSuspect: outcome.unfiledProposals,
625
523
  filingErrors,
@@ -634,11 +532,8 @@ function buildRollupPayload({
634
532
  * storyCount?: number,
635
533
  * signalCount?: number,
636
534
  * categories?: Array<{ category: string, occurrences: number }>,
637
- * }} args - `storyCount` (default 1) is how many Stories the roll-up spans;
638
- * it decides whether an empty result reads as quiet or as a flagged claim.
639
- * `signalCount` / `categories` (Story #4828) are what the roll-up actually
640
- * gathered, so a zero-proposal or zero-filed outcome can name its own
641
- * 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.
642
537
  * @returns {string}
643
538
  */
644
539
  export function buildFollowUpsCommentBody({
@@ -709,18 +604,44 @@ export function buildFollowUpsCommentBody({
709
604
  }
710
605
 
711
606
  /**
712
- * Capture and persist Story follow-ups. Never throws — the land must not
713
- * fail because follow-up filing flaked.
714
- *
715
- * Story #4543 retired the `captureFollowUpsAfterConfirm` action-gate wrapper
716
- * (and its `withConfirmFollowUps` sibling) that used to front this function.
717
- * Re-deriving "did the merge land?" from a confirmation envelope's `action`
718
- * field was the coupling that made close-and-land — the DEFAULT path — skip
719
- * capture entirely: the gate only opened on the standalone CLI's `done`, and
720
- * a belated manual confirm could not backfill because the Story was already
721
- * `agent::done` (confirm returns `noop`, the gate never opens). The shared
722
- * land tail (`single-story-close/phases/post-land.js`) now calls this
723
- * directly, after the merge is already confirmed.
607
+ * @param {number} sid
608
+ * @param {Array<object>} signals
609
+ * @param {object} [config]
610
+ * @returns {object}
611
+ */
612
+ function composeStoryProposals(sid, signals, config) {
613
+ const repos = resolveFollowUpRepos(config);
614
+ return composeRoutedProposals({
615
+ anchorId: sid,
616
+ anchorKind: 'story',
617
+ frameworkRepo: repos.frameworkRepo,
618
+ consumerRepo: repos.consumerRepo,
619
+ signals,
620
+ unresolvedBlockedEvents: deriveUnresolvedBlockedEvents(signals),
621
+ });
622
+ }
623
+
624
+ /**
625
+ * @param {object} args
626
+ * @returns {Promise<object>}
627
+ */
628
+ function fileStoryProposals({ sid, proposals, provider, config, cwd }) {
629
+ const repos = resolveFollowUpRepos(config);
630
+ return graduateRetroProposals({
631
+ epicId: sid,
632
+ provider,
633
+ config,
634
+ currentRepo: repos.currentRepo,
635
+ frameworkRepo: repos.repos.framework,
636
+ platformRepo: repos.repos.platform,
637
+ routedProposals: proposals,
638
+ cwd,
639
+ });
640
+ }
641
+
642
+ /**
643
+ * Called by the land tail after the merge is confirmed. Never throws — the
644
+ * land must not fail because follow-up filing flaked.
724
645
  *
725
646
  * @param {object} args
726
647
  * @param {number} args.storyId
@@ -743,29 +664,12 @@ export async function captureStoryFollowUps({
743
664
  }
744
665
  try {
745
666
  const signals = await gatherStoryFrictionSignals(sid, config);
746
- const repos = resolveFollowUpRepos(config);
747
- const proposals = composeRoutedProposals({
748
- anchorId: sid,
749
- anchorKind: 'story',
750
- frameworkRepo: repos.frameworkRepo,
751
- consumerRepo: repos.consumerRepo,
752
- signals,
753
- // Derived, not hardcoded `[]` (Story #4649). This is the escape hatch
754
- // the retired story-scope threshold carve-out was standing in for: a
755
- // Story still parked at `agent::blocked` files at a single occurrence,
756
- // while one that blocked and self-resolved nets out entirely.
757
- unresolvedBlockedEvents: deriveUnresolvedBlockedEvents(signals),
758
- });
759
- const graduated = await graduateRetroProposals({
760
- epicId: sid,
667
+ const proposals = composeStoryProposals(sid, signals, config);
668
+ const graduated = await fileStoryProposals({
669
+ sid,
670
+ proposals,
761
671
  provider,
762
672
  config,
763
- currentRepo: repos.currentRepo,
764
- // The resolved bucket object, not a re-split of the slug: routing is
765
- // decided once in `github/framework-repo.js`.
766
- frameworkRepo: repos.repos.framework,
767
- platformRepo: repos.repos.platform,
768
- routedProposals: proposals,
769
673
  cwd,
770
674
  });
771
675
  const body = buildFollowUpsCommentBody({
@@ -775,30 +679,41 @@ export async function captureStoryFollowUps({
775
679
  signalCount: signals.length,
776
680
  categories: summarizeSignalCategories(signals),
777
681
  });
778
- await upsertStructuredComment(provider, sid, FOLLOW_UPS_COMMENT_TYPE, body);
779
- progress?.(
780
- 'FOLLOW-UPS',
781
- `Captured follow-ups for Story #${sid} (filed=${graduated.filed?.length ?? 0}).`,
782
- );
682
+ const filedCount = graduated.filed?.length ?? 0;
683
+ const published = await publishFollowUpsRollup({
684
+ anchorId: sid,
685
+ body,
686
+ filedCount,
687
+ provider,
688
+ config,
689
+ });
690
+ progress?.('FOLLOW-UPS', published.summary);
783
691
  return {
784
692
  ok: true,
785
693
  storyId: sid,
786
694
  proposals,
787
695
  graduated,
788
696
  signalCount: signals.length,
697
+ commentPosted: published.posted,
698
+ artifactPath: published.artifactPath,
789
699
  };
790
700
  } catch (err) {
791
- Logger.warn(
792
- `[story-follow-ups] capture failed for #${sid}: ${err?.message ?? err}`,
793
- );
794
- progress?.(
795
- 'FOLLOW-UPS',
796
- `⚠️ Follow-up capture failed (close continues): ${err?.message ?? err}`,
797
- );
798
- return {
799
- ok: false,
800
- reason: 'capture-failed',
801
- error: String(err?.message ?? err),
802
- };
701
+ return reportCaptureFailure(sid, err, progress);
803
702
  }
804
703
  }
704
+
705
+ /**
706
+ * @param {number} sid
707
+ * @param {unknown} err
708
+ * @param {((tag: string, msg: string) => void)} [progress]
709
+ * @returns {{ ok: false, reason: string, error: string }}
710
+ */
711
+ function reportCaptureFailure(sid, err, progress) {
712
+ const detail = String(err?.message ?? err);
713
+ Logger.warn(`[story-follow-ups] capture failed for #${sid}: ${detail}`);
714
+ progress?.(
715
+ 'FOLLOW-UPS',
716
+ `⚠️ Follow-up capture failed (close continues): ${detail}`,
717
+ );
718
+ return { ok: false, reason: 'capture-failed', error: detail };
719
+ }
@@ -0,0 +1,52 @@
1
+ /**
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).
5
+ *
6
+ * @module lib/orchestration/story-init-envelope
7
+ */
8
+
9
+ import { readFileSync } from 'node:fs';
10
+ import path from 'node:path';
11
+
12
+ import { orchestrationLogDir } from '../config/temp-paths.js';
13
+
14
+ /**
15
+ * @param {{
16
+ * storyId: number|string,
17
+ * config?: object,
18
+ * readFileFn?: typeof readFileSync,
19
+ * }} args
20
+ * @returns {object|null} the parsed init result, or `null`.
21
+ */
22
+ function readStoryInitEnvelope({ storyId, config, readFileFn = readFileSync }) {
23
+ const file = path.join(
24
+ orchestrationLogDir(config),
25
+ `story-init-result-${storyId}.log`,
26
+ );
27
+ try {
28
+ // Markers bracket the JSON: take the outermost brace span.
29
+ const fence = /\{[\s\S]*\}/.exec(readFileFn(file, 'utf8'));
30
+ const payload = fence ? JSON.parse(fence[0]) : null;
31
+ return payload && typeof payload === 'object' ? payload : null;
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+
37
+ /**
38
+ * @param {{
39
+ * storyId: number|string,
40
+ * config?: object,
41
+ * readEnvelopeFn?: typeof readStoryInitEnvelope,
42
+ * }} args
43
+ * @returns {Record<string, unknown>|null}
44
+ */
45
+ export function readRunScopedPin({
46
+ storyId,
47
+ config,
48
+ readEnvelopeFn = readStoryInitEnvelope,
49
+ }) {
50
+ const pin = readEnvelopeFn({ storyId, config })?.runScopedConfig;
51
+ return pin && typeof pin === 'object' ? pin : null;
52
+ }