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,42 +1,8 @@
1
1
  /**
2
- * deliver-recover.js — probe a stranded Story and name its ONE next command
3
- * (Story #4543).
4
- *
5
- * Recovery here is a **read, not a repair**. Every input is already
6
- * probeable — labels and lease from the ticket, the branch locally and via
7
- * its tracking ref, the worktree path, the PR by head branch (with state,
8
- * merge, and checks probes) — so this module is probes, a decision table
9
- * over `label × PR × branch × worktree`, and one command with the evidence it
10
- * was derived from. It never mutates anything, and it never prints a menu of
11
- * options: a menu is what an operator already has, and it is the thing they
12
- * cannot act on.
13
- *
14
- * The strand shapes the table resolves, and why each is real:
15
- *
16
- * - `executing`, branch UNPUSHED, no PR → resume implementation. The work
17
- * never reached close. Since Story #5267 the worker pushes before its
18
- * creditable capture, so an unpushed branch means this and nothing else.
19
- * - `executing`, branch PUSHED, no PR → run close. The worker's hand-off
20
- * landed; only the close-and-land tail is owed, and re-initializing here
21
- * would re-open finished work.
22
- * - `closing` with a pending PR → resume the land. The overwhelmingly
23
- * common shape now that the merge wait is bounded: the wait returned
24
- * `pending` and something has to pick it back up.
25
- * - `closing` with a red PR → enter the fix loop. Waiting is pointless; no
26
- * budget turns a failed check green.
27
- * - `closing` with a MERGED PR → run confirm. **This is the strand a
28
- * `/mandrel-deliver` re-run refuses outright**, because `single-story-init.js`
29
- * hard-errors on an already-closed Story — so before this surface, the
30
- * merged-but-label-stale Story had no automated way back.
31
- * - `done` with a drifted board → run resync. The GitHub Projects bot won
32
- * the race.
33
- * - `blocked` → print the class-specific remediation the friction comment
34
- * already names, rather than inventing a second opinion about a
35
- * condition that was already classified.
36
- *
37
- * The command vocabulary is shared with the terminal envelope
38
- * (`story-deliver-terminal.js#NEXT_COMMANDS`), so recovery and normal
39
- * resumption speak one language instead of two dialects for one state.
2
+ * deliver-recover.js — probe a stranded Story and name its ONE next command.
3
+ * Read-only: probes, a decision table over label × PR × branch × worktree ×
4
+ * close artifacts, and one command plus its evidence — never a menu. The
5
+ * command vocabulary is `story-deliver-terminal.js#NEXT_COMMANDS`.
40
6
  */
41
7
 
42
8
  import nodeFs from 'node:fs';
@@ -47,26 +13,17 @@ import {
47
13
  } from '../config/temp-paths.js';
48
14
  import { gh as defaultGh } from '../gh-exec.js';
49
15
  import { gitSpawn as defaultGitSpawn, getStoryBranch } from '../git-utils.js';
50
- import { deriveChecksStatus } from './merge-poll.js';
16
+ import { deriveChecksStatus, isPrMerged } from './merge-poll.js';
51
17
  import { NEXT_COMMANDS } from './story-deliver-terminal.js';
52
18
  import { STATE_LABELS } from './ticketing.js';
53
19
 
54
20
  /**
55
- * How recently the gate log must have been appended for the close that writes
56
- * it to count as live (Story #4816).
57
- *
58
- * The window is generous on purpose. Gate output arrives in bursts — a single
59
- * `npm test` gate can run for a long stretch between lines — so a tight window
60
- * would read a slow-but-healthy close as dead and re-open the exact
61
- * misdiagnosis this exists to remove. Being wrong in the other direction is
62
- * cheap: the verdict for a live close is "re-run this read-only probe", which
63
- * costs nothing if the close has in fact already exited.
21
+ * Gate-log freshness window for a close to count as live. Generous because
22
+ * gate output is bursty; erring toward "live" only costs a re-probe.
64
23
  */
65
24
  const CLOSE_IN_FLIGHT_WINDOW_MS = 120_000;
66
25
 
67
26
  /**
68
- * Probe the ticket: state labels, issue open/closed, and the lease holder.
69
- *
70
27
  * @returns {Promise<object>}
71
28
  */
72
29
  export async function probeTicket({ provider, storyId }) {
@@ -90,8 +47,7 @@ export async function probeTicket({ provider, storyId }) {
90
47
  }
91
48
 
92
49
  /**
93
- * Probe the Story branch locally and its remote tracking ref, plus the
94
- * worktree path. Pure git — no network.
50
+ * Local branch, remote tracking ref and worktree path. No network.
95
51
  *
96
52
  * @returns {object}
97
53
  */
@@ -128,9 +84,7 @@ export function probeBranch({ cwd, storyBranch, config, gitSpawnFn }) {
128
84
  }
129
85
 
130
86
  /**
131
- * Probe the PR for the Story branch. `--state all` is required: a merged PR
132
- * is no longer `open`, and the merged-but-label-stale strand is precisely
133
- * the one that matters most here.
87
+ * `--state all`: the merged-but-label-stale strand needs the merged PR.
134
88
  *
135
89
  * @returns {Promise<object|null>}
136
90
  */
@@ -155,20 +109,9 @@ export async function probePr({ storyBranch, gh = defaultGh }) {
155
109
  }
156
110
 
157
111
  /**
158
- * Probe the two on-disk artifacts a close leaves behind (Story #4816): the
159
- * persisted terminal envelope and the gate log.
160
- *
161
- * These exist because the label-and-PR probes above cannot see the difference
162
- * between an implementation that died and a close that is still running —
163
- * both read `agent::executing` with no PR for the whole gate chain. The
164
- * artifacts can: a persisted envelope means the close already reached a
165
- * verdict, and a recently-appended gate log means one is mid-chain right now.
166
- * Gate-log freshness is exactly the signal operators were already using by
167
- * hand to tell the two apart, which is the argument for reading it here
168
- * instead of expecting them to know.
169
- *
170
- * Never throws: an unreadable or absent artifact is a `null` reading, and the
171
- * table falls back to the label-only verdict it always had.
112
+ * Probe the close's persisted terminal envelope and gate log — the only
113
+ * evidence separating a dead implementation from a close mid-gate-chain
114
+ * (both read `executing` with no PR). Never throws; absent reads are `null`.
172
115
  *
173
116
  * @param {{
174
117
  * storyId: number,
@@ -216,9 +159,6 @@ export function probeCloseArtifacts({
216
159
  let envelopeMtimeMs = null;
217
160
  try {
218
161
  const parsed = JSON.parse(fsImpl.readFileSync(envelopePath, 'utf8'));
219
- // A parsed non-object (or an array) is not an envelope; treat it as
220
- // absent rather than handing the table something it cannot read fields
221
- // off of.
222
162
  if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
223
163
  envelope = parsed;
224
164
  envelopeMtimeMs = fsImpl.statSync(envelopePath).mtimeMs;
@@ -249,14 +189,8 @@ export function probeCloseArtifacts({
249
189
  }
250
190
 
251
191
  /**
252
- * Is a close running right now, outranking whatever a persisted envelope says?
253
- *
254
- * A persisted envelope is definitive about the close that wrote it — but a
255
- * Story can be closed more than once (a `pending` wait resumed, a red gate
256
- * fixed and re-run), and a *stale* envelope from the previous attempt must not
257
- * out-argue a gate log the current attempt is appending to as we read. So the
258
- * live signal wins whenever the gate log is both fresh and fresher than the
259
- * envelope.
192
+ * A fresh gate log newer than the envelope wins: a Story can be closed more
193
+ * than once, and a prior attempt's envelope must not mask a live one.
260
194
  *
261
195
  * @param {object} artifacts A {@link probeCloseArtifacts} reading.
262
196
  * @returns {boolean}
@@ -268,14 +202,9 @@ function closeLooksLive(artifacts) {
268
202
  }
269
203
 
270
204
  /**
271
- * The verdict for a Story whose close already finished but whose envelope
272
- * never reached the caller — the orphaned-turn shape (Story #4816).
273
- *
274
- * Nothing is re-derived here: the envelope on disk is the same
275
- * schema-validated object the close emitted, so its own `status` and
276
- * `nextCommand` are relayed rather than a second opinion invented from
277
- * labels. A `landed` envelope carries a null next command, and the honest
278
- * follow-up for a landed-but-mislabelled Story is the idempotent confirm.
205
+ * Close finished but its envelope never reached the caller. Relay the
206
+ * envelope's own `nextCommand`; a landed one names none, so fall back to the
207
+ * idempotent confirm.
279
208
  */
280
209
  function envelopeOnDiskVerdict({ storyId, artifacts, evidence }) {
281
210
  const { envelope, envelopePath } = artifacts;
@@ -294,13 +223,8 @@ function envelopeOnDiskVerdict({ storyId, artifacts, evidence }) {
294
223
  }
295
224
 
296
225
  /**
297
- * The verdict for a close that is running as we probe (Story #4816).
298
- *
299
- * The next command is this probe again. That is not a shrug: there is no
300
- * attach-to-a-running-close surface, the close needs nothing from anyone, and
301
- * every *other* command an operator might reach for here is actively harmful
302
- * — which is why the detail names the re-init hazard explicitly instead of
303
- * leaving it implied.
226
+ * A close is running: the only safe command is this probe again; every
227
+ * other one (notably re-init) would race it.
304
228
  */
305
229
  function closeInFlightVerdict({ storyId, artifacts, evidence }) {
306
230
  const seconds = Math.round((artifacts.gateLogAgeMs ?? 0) / 1000);
@@ -320,12 +244,7 @@ function closeInFlightVerdict({ storyId, artifacts, evidence }) {
320
244
  }
321
245
 
322
246
  /**
323
- * The `agent::executing` rows of the table (Story #4543; split on push state
324
- * by Story #5267).
325
- *
326
- * Lifted out of {@link decideRecovery} because this label alone fans out into
327
- * five distinct strands, and because the push-state split below only reads
328
- * correctly next to the artifact probes it is ordered after.
247
+ * The `agent::executing` rows; order matters (artifacts before push state).
329
248
  *
330
249
  * @param {{ storyId: number, branch: object, pr: object|null, closeArtifacts?: object, evidence: string[] }} args
331
250
  * @returns {{ shape: string, nextCommand: string|null, detail: string, evidence: string[] }}
@@ -342,12 +261,7 @@ function decideExecuting({ storyId, branch, pr, closeArtifacts, evidence }) {
342
261
  evidence,
343
262
  };
344
263
  }
345
- // Story #4816 — the close artifacts get the first word here, and ONLY
346
- // here. Every other row of this table describes a state whose evidence is
347
- // already unambiguous; `executing` + no PR is the one row that reads
348
- // identically for a dead implementation and for a close that is halfway
349
- // through its gate chain, and answering it from labels alone is what sent
350
- // operators to re-init on top of a live close.
264
+ // `executing` + no PR is ambiguous from labels alone; artifacts decide.
351
265
  if (closeLooksLive(closeArtifacts)) {
352
266
  return closeInFlightVerdict({
353
267
  storyId,
@@ -362,13 +276,8 @@ function decideExecuting({ storyId, branch, pr, closeArtifacts, evidence }) {
362
276
  evidence,
363
277
  });
364
278
  }
365
- // Story #5267 — push state is what separates the two remaining strands, and
366
- // it separates them cleanly now that the worker pushes BEFORE its creditable
367
- // capture. Before that ordering, a worker whose turn ended on the
368
- // backgrounded capture left an unpushed branch that was indistinguishable
369
- // from work that never got started; now an unpushed branch means exactly one
370
- // thing, and a pushed one means the hand-off happened and only close is
371
- // owed.
279
+ // The worker pushes before its creditable capture, so pushed means
280
+ // handed off (close owed) and unpushed means implementation unfinished.
372
281
  if (branch?.remote) {
373
282
  return {
374
283
  shape: 'executing-pushed-no-pr',
@@ -394,11 +303,7 @@ function decideExecuting({ storyId, branch, pr, closeArtifacts, evidence }) {
394
303
  }
395
304
 
396
305
  /**
397
- * The decision table. Pure: every input is an already-observed probe, so the
398
- * mapping is testable without git, GitHub, or a clock.
399
- *
400
- * Returns exactly one `{ shape, nextCommand, evidence[], detail }` — never a
401
- * list of candidates.
306
+ * The pure decision table: exactly one verdict, never a list.
402
307
  *
403
308
  * @param {{
404
309
  * storyId: number,
@@ -435,10 +340,9 @@ export function decideRecovery({
435
340
  ];
436
341
 
437
342
  const label = ticket?.stateLabel;
438
- const merged = pr?.state === 'MERGED' || Boolean(pr?.mergedAt);
343
+ const merged = isPrMerged(pr);
439
344
 
440
- // A merged PR outranks every label reading. The code is on the base
441
- // branch; whatever the label says, the only thing left is the flip + tail.
345
+ // A merged PR outranks every label: only the flip + tail remain.
442
346
  if (merged && label !== STATE_LABELS.DONE) {
443
347
  return {
444
348
  shape: 'merged-label-stale',
@@ -526,15 +430,8 @@ export function decideRecovery({
526
430
  }
527
431
 
528
432
  /**
529
- * The shapes a LIVE delivery process actively mutates while it runs. A probe
530
- * that lands mid-close can read `executing` + `pr=none` seconds before the
531
- * push and PR-open land, and confidently misdirect the operator to re-init a
532
- * Story whose close is about to open a PR (observed live on Story #4712: two
533
- * probes seconds apart flipped `executing-no-pr` → `executing-with-pr`).
534
- * These shapes therefore earn a stability re-probe before the verdict is
535
- * trusted; the remaining shapes (`merged-label-stale`, `blocked`,
536
- * `done-board-drift`, `ready`) describe settled states no live process is
537
- * racing to change.
433
+ * Shapes a live delivery may be mutating (e.g. a PR about to open), so they
434
+ * earn a stability re-probe; the other shapes are settled.
538
435
  */
539
436
  const TRANSIENT_SHAPES = new Set([
540
437
  'executing-no-pr',
@@ -543,27 +440,14 @@ const TRANSIENT_SHAPES = new Set([
543
440
  'closing-no-pr',
544
441
  'closing-pr-pending',
545
442
  'closing-pr-red',
546
- // Story #4816 — the definition of this shape is "a process is mutating this
547
- // Story right now", so it is the most transient row in the table: the second
548
- // probe often catches the push and PR landing and returns a settled verdict
549
- // instead.
550
443
  'close-in-flight',
551
444
  ]);
552
445
 
553
- /**
554
- * Default settle window between the two probes of the stability pass. Long
555
- * enough for an in-flight push / `gh pr create` / label flip to land (each is
556
- * a single network call), short enough that the read-only CLI stays
557
- * interactive.
558
- */
446
+ /** Settle window: enough for one push / PR open / label flip to land. */
559
447
  const STABILITY_DELAY_MS = 5000;
560
448
 
561
449
  /**
562
- * Build the verdict for a state observed mid-mutation: the two probe rounds
563
- * derived DIFFERENT shapes, so neither is safe to act on — acting on the
564
- * first misdirects (the #4712 shape), acting on the second may race the same
565
- * live process again. The one next command is the probe itself, re-run once
566
- * the live process settles.
450
+ * The two probes disagreed, so neither is safe to act on; re-probe later.
567
451
  *
568
452
  * @param {{ storyId: number, first: object, second: object, delayMs: number }} args
569
453
  * @returns {{ shape: string, nextCommand: string, detail: string, evidence: string[] }}
@@ -586,10 +470,7 @@ function buildInTransitionVerdict({ storyId, first, second, delayMs }) {
586
470
  };
587
471
  }
588
472
 
589
- /**
590
- * One full probe round: ticket + branch + PR → decision. Throws only when
591
- * the ticket itself is unreadable (the probe cannot run without it).
592
- */
473
+ /** Throws only when the ticket is unreadable. */
593
474
  async function probeAndDecide({
594
475
  storyId,
595
476
  storyBranch,
@@ -608,9 +489,6 @@ async function probeAndDecide({
608
489
  }
609
490
  const branch = probeBranch({ cwd, storyBranch, config, gitSpawnFn });
610
491
  const pr = await probePr({ storyBranch, gh });
611
- // Re-read on every round: the whole point of the stability pass is that a
612
- // second look can catch a close that has since flushed a gate line or
613
- // written its envelope.
614
492
  const closeArtifacts = probeCloseArtifacts({
615
493
  storyId,
616
494
  config,
@@ -627,14 +505,9 @@ async function probeAndDecide({
627
505
  }
628
506
 
629
507
  /**
630
- * Probe live state and resolve the single next command. Read-only.
631
- *
632
- * Transient shapes (`executing-*` / `closing-*`) get a **stability re-probe**
633
- * (same consecutive-evidence pattern the merge wait's fail-fast uses, Story
634
- * #4695): a second probe after a short settle window. Matching shapes return
635
- * the fresher verdict; diverging shapes return `in-transition` instead of a
636
- * confidently wrong command. Settled shapes skip the second round — their
637
- * state has no live process racing to change it.
508
+ * Probe live state and resolve the single next command. Transient shapes
509
+ * are re-probed after a settle window: a match returns the fresher verdict,
510
+ * a divergence returns `in-transition`.
638
511
  *
639
512
  * @param {object} args
640
513
  * @param {number} args.storyId
@@ -643,9 +516,7 @@ async function probeAndDecide({
643
516
  * @param {object} [args.config]
644
517
  * @param {object} [args.gh]
645
518
  * @param {Function} [args.gitSpawnFn]
646
- * @param {boolean} [args.reprobe=true] Disable to skip the stability pass
647
- * (single-probe legacy behavior — for scripted callers that own their own
648
- * settling).
519
+ * @param {boolean} [args.reprobe=true] Skip the stability pass when false.
649
520
  * @param {number} [args.stabilityDelayMs] Settle window between the probes.
650
521
  * @param {Function} [args.sleepFn] Test seam for the settle wait.
651
522
  * @param {typeof nodeFs} [args.fsImpl] Test seam for the close-artifact reads.
@@ -690,7 +561,6 @@ export async function recoverStory({
690
561
  const second = await probeAndDecide(probeArgs);
691
562
 
692
563
  if (second.decision.shape === first.decision.shape) {
693
- // Stable across the settle window — trust the fresher evidence.
694
564
  return {
695
565
  storyId,
696
566
  storyBranch,
@@ -715,9 +585,7 @@ export async function recoverStory({
715
585
  }
716
586
 
717
587
  /**
718
- * Render the operator-facing report: the shape, the one command, and the
719
- * evidence it was derived from — so the operator can check the reasoning
720
- * rather than trust it.
588
+ * Render the report with its evidence so the reasoning can be checked.
721
589
  *
722
590
  * @param {object} recovery
723
591
  * @returns {string}
@@ -1,39 +1,15 @@
1
1
  import { assignLayers, detectCycle } from '../Graph.js';
2
2
 
3
3
  /**
4
- * Compute story-level execution waves from cross-story task dependencies AND
5
- * explicit story-to-story `blocked by` declarations within the same Epic.
6
- *
7
- * Sources of story dependencies:
8
- * 1. **Implicit (cross-story tasks)**: Task T in Story A depends on Task T'
9
- * in Story B → Story A depends on Story B. Under the 2-tier hierarchy
10
- * (Epic → Story) Stories carry no child Tasks, so this source
11
- * is empty in practice; it is retained for callers that adapt a
12
- * task-bearing shape into `storyGroups`.
13
- * 2. **Explicit (story body)**: Story A body contains `blocked by #B` →
14
- * Story A depends on Story B.
15
- *
16
- * After merging both sources, runs `assignLayers` to produce wave indices.
17
- *
18
- * > **Focus-overlap engine removed (Story #3906).** A third source — a
19
- * > focus-area overlap engine that rolled task-level `focusAreas` / `scope`
20
- * > up to the Story level and serialized "overlapping" Stories — was deleted
21
- * > because Task deletion in the 2-tier migration left every Story's task
22
- * > list empty, so the rollup produced empty focus bags and the engine added
23
- * > **zero** edges on every real plan. It advertised file-contention
24
- * > serialization it never delivered. Cross-Story prerequisites are carried
25
- * > by explicit `blocked by` declarations (source 2 above).
4
+ * Story-level waves from cross-story task dependencies (empty in practice —
5
+ * Stories carry no Tasks — kept for task-bearing adapters) plus explicit
6
+ * `blocked by` edges. Throws on a cycle.
26
7
  *
27
8
  * @param {Map<number, {storyId: number|string, tasks: object[]}>} storyGroups
28
- * Map of storyId → { storyId, tasks: [{ id, dependsOn }] }
29
- * @param {Map<number|string, number[]>} [explicitDeps]
30
- * Optional map of storyId → [blockerStoryId, ...] parsed from story ticket
31
- * `blocked by` references. Only includes references to *other stories within
32
- * the same Epic*.
9
+ * @param {Map<number|string, number[]>} [explicitDeps] storyId → blocker ids.
33
10
  * @returns {Map<number|string, number>} Map of storyId → wave index.
34
11
  */
35
12
  export function computeStoryWaves(storyGroups, explicitDeps) {
36
- // Build a reverse lookup: taskId → storyId
37
13
  const taskToStory = new Map();
38
14
  for (const [storyId, group] of storyGroups.entries()) {
39
15
  for (const task of group.tasks) {
@@ -41,8 +17,6 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
41
17
  }
42
18
  }
43
19
 
44
- // Build story-level adjacency: storyA depends on storyB if any task in
45
- // storyA has a dependency on a task in storyB.
46
20
  const storyAdjacency = new Map();
47
21
  for (const storyId of storyGroups.keys()) {
48
22
  storyAdjacency.set(storyId, []);
@@ -59,8 +33,6 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
59
33
  }
60
34
  }
61
35
 
62
- // Merge explicit story-to-story dependencies (from `blocked by` on the
63
- // story ticket body itself).
64
36
  if (explicitDeps) {
65
37
  const explicit = explicitDeps.get(storyId) ?? [];
66
38
  for (const depStoryId of explicit) {
@@ -73,8 +45,6 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
73
45
  storyAdjacency.set(storyId, [...depStories]);
74
46
  }
75
47
 
76
- // Detect cycles in the dependency-derived graph. A cycle is a planning
77
- // error.
78
48
  const cycle = detectCycle(storyAdjacency);
79
49
  if (cycle) {
80
50
  throw new Error(
@@ -83,6 +53,5 @@ export function computeStoryWaves(storyGroups, explicitDeps) {
83
53
  );
84
54
  }
85
55
 
86
- // Assign layers (waves) to stories
87
56
  return assignLayers(storyAdjacency);
88
57
  }
@@ -1,28 +1,11 @@
1
1
  /**
2
- * dependency-candidates.js — open Stories a newly planned Story may need to
3
- * wait for.
4
- *
5
- * Story #5155. `depends_on[]` has always ordered *siblings within one plan*.
6
- * Nothing surfaced the other ordering that actually bites: a Story authored
7
- * today that edits a file an already-open Story from an earlier plan is going
8
- * to rewrite. Delivered concurrently, the second lands on a base the first
9
- * just changed — and the planner had no way to see it coming, because the
10
- * duplicate search asks "is this the same Story?" (title/body similarity),
11
- * never "does this Story touch what I am about to touch?".
12
- *
13
- * Overlap here is therefore computed on **declared footprints**, not prose:
14
- * the seed's `predictedPaths` against each open Story's parsed `changes[]`,
15
- * via the same `storyFootprint` the wave runner uses to withhold colliding
16
- * Stories at dispatch. That is deliberate — the planner sees the collision the
17
- * runtime would later enforce, one layer earlier and while it is still cheap
18
- * to order around.
19
- *
20
- * The result is **advisory**: an overlap is a prompt to consider an edge, not
21
- * proof one is needed. Two Stories can touch a shared barrel file with no real
22
- * ordering between them; only the operator knows.
2
+ * dependency-candidates.js — open Stories from earlier plans whose declared
3
+ * footprint overlaps a new seed's predicted paths, via the same
4
+ * `storyFootprint` the wave runner uses to withhold collisions — so the
5
+ * planner sees the collision the runtime would enforce. Advisory: an overlap
6
+ * suggests an edge, it does not prove one.
23
7
  *
24
8
  * @module lib/orchestration/dependency-candidates
25
- * @see Story #5155
26
9
  */
27
10
 
28
11
  import { Logger } from '../Logger.js';
@@ -31,8 +14,6 @@ import { parse as parseStoryBody } from '../story-body/story-body.js';
31
14
  import { storyFootprint } from '../wave-runner/footprint.js';
32
15
 
33
16
  /**
34
- * Build an issue URL for a Story the provider returned without one.
35
- *
36
17
  * @param {number} id
37
18
  * @param {{ owner?: string, repo?: string }} [opts]
38
19
  * @returns {string}
@@ -43,12 +24,7 @@ function buildStoryUrl(id, { owner, repo } = {}) {
43
24
  }
44
25
 
45
26
  /**
46
- * Read one open Story's declared footprint.
47
- *
48
- * Total by construction: an unparseable body yields an empty footprint, which
49
- * intersects with nothing and drops the Story from the candidate list. A
50
- * hand-written Story with no `## Changes` section is exactly that case, and it
51
- * is the right outcome — there is no declared footprint to collide with.
27
+ * Declared footprint; empty (never a candidate) when unparseable.
52
28
  *
53
29
  * @param {object} issue
54
30
  * @returns {Set<string>}
@@ -64,13 +40,8 @@ function footprintOf(issue) {
64
40
  }
65
41
 
66
42
  /**
67
- * Find open Stories whose declared footprint intersects the seed's predicted
68
- * paths.
69
- *
70
- * Returns `[]` **without contacting the provider** when the seed named no
71
- * paths: with nothing to intersect, every candidate would score empty, and the
72
- * round-trip would buy nothing. That short-circuit is load-bearing for the
73
- * common one-line seed, which mentions no file at all.
43
+ * Returns `[]` without contacting the provider when the seed names no paths
44
+ * (the common case).
74
45
  *
75
46
  * @param {{
76
47
  * predictedPaths: string[],
@@ -113,10 +84,7 @@ export async function findDependencyCandidates({
113
84
 
114
85
  const out = [];
115
86
  for (const issue of Array.isArray(issues) ? issues : []) {
116
- // The declared ticket shape: `id` is the issue number. Reading it through
117
- // the old `number`-then-`id` fallback was the bug in waiting — on this
118
- // shape the fallback never fires, and on a raw REST payload it silently
119
- // produced database ids for every candidate the planner offered.
87
+ // Declared ticket shape: `id` is the issue number.
120
88
  const id = Number(issue?.id);
121
89
  if (!Number.isInteger(id) || id <= 0 || excluded.has(id)) continue;
122
90