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