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,60 +1,11 @@
1
1
  /**
2
- * file-assumptions.js — Phase 8 path-assumption validator.
3
- *
4
- * Story #2635 added the Tech Spec freshness check at Phase 7. This module
5
- * is the matching gate at Phase 8: every Story's `body.changes` /
6
- * `body.references` entry that declares an explicit `assumption` is
7
- * cross-checked against the actual state of `baseBranchRef`. Mismatches
8
- * are batched per-Story and surfaced through the same error envelope the
9
- * decompose loop already uses.
10
- *
11
- * Under the 2-tier hierarchy (Epic → Story; Epic #3078 / #3238)
12
- * the Story is the implementation unit — there is no `type::task` ticket
13
- * layer — so the gate scans `type === 'story'` tickets and reads the
14
- * `{ path, assumption }` entries inlined on each Story body.
15
- *
16
- * Rules (one finding per mismatched path). Story #5312 demoted every
17
- * mismatch but one to a **warning** the dry-run lists and the persist
18
- * proceeds past — `changes[]` is an advisory sketch the deliverer revises
19
- * against the real tree, so refusing a plan on it cost re-authoring rounds
20
- * for a footprint nobody was bound to:
21
- * - `creates` + path **exists** → warning (Story may clobber).
22
- * - `refactors-existing` (via `changes`) + path **absent and never
23
- * tracked** at `baseBranchRef` → auto-normalized to `creates` with a
24
- * logged warning (#4496 fix 5): a refactor declaration against a
25
- * path with no history is deterministically a create.
26
- * - `refactors-existing` (via `changes`) + path **absent but present in
27
- * that ref's history** → warning naming the removing commit and, when
28
- * git detects one, the rename target (Story #5265) — a plan authored
29
- * against a file the tree deleted is worth saying out loud.
30
- * - `exists` + path **absent** → warning (read dependency missing).
31
- * - `deletes` + path **absent** → **error** (nothing to delete —
32
- * the one declaration a deliverer cannot act on at all).
33
- *
34
- * Wave awareness (Story #3960): the base-branch-only rules above produce
35
- * false signals once an earlier Story in the same epic creates (or deletes)
36
- * a file before a later Story touches it. `validateStoryFileAssumptions`
37
- * therefore validates each Story against the **simulated post-predecessor
38
- * tree** — base-branch existence overlaid with the create/delete delta of
39
- * the Story's transitive `depends_on` predecessors (the same reachability
40
- * walk the conflict gate uses, imported from the shared
41
- * `story-reachability.js` leaf rather than re-derived). Two extra
42
- * wave-aware rules layer on top of the
43
- * base-branch rules:
44
- * - `creates` + path created by a **predecessor** → mismatch
45
- * (`expected: 'refactors-existing'`) telling the planner to declare
46
- * `refactors-existing` and naming the producing Story.
47
- * - `refactors-existing` + path absent from base but created by a
48
- * **predecessor** → validates clean (no false-positive base-branch
49
- * "absent" mismatch).
50
- * Concurrent same-path creates between Stories with no `depends_on` path are
51
- * the shared-editor conflict gate's domain — that finding's rendering is
52
- * cross-referenced (see `renderMismatch`), not duplicated here.
53
- *
54
- * String bullets: stories whose `body.changes` items are still bare
55
- * strings are hard errors — they are pushed to `errors[]` by the
56
- * validator's body-shape gate before this module runs. There is no
57
- * silent skip or deprecation nudge.
2
+ * file-assumptions.js — Phase 8 path-assumption validator: every Story's
3
+ * `{ path, assumption }` entry in `body.changes` / `body.references` is
4
+ * checked against `baseBranchRef`, overlaid with the create/delete delta of
5
+ * the Story's transitive `depends_on` predecessors (the simulated
6
+ * post-predecessor tree). `changes[]` is an advisory sketch, so every
7
+ * mismatch is a warning except `deletes` on an absent path (nothing to act
8
+ * on), which is an error.
58
9
  */
59
10
 
60
11
  import { gitSpawn } from '../git-utils.js';
@@ -64,12 +15,8 @@ import { computeStoryReachability } from './story-reachability.js';
64
15
  import { isObjectPathEntry } from './task-body-validator.js';
65
16
 
66
17
  /**
67
- * Default git probe — returns `true` when `path` exists at
68
- * `baseBranchRef`. Mirrors the existence check used by
69
- * {@link ./ticket-validator.js#validateAcFreshness} so both gates share
70
- * semantics. (Story #4811 deleted the third sharer, `spec-freshness.js`,
71
- * along with the codebase snapshot it grounded; this gate — Phase 8 — is
72
- * now the grounding gate and its behaviour is unchanged.)
18
+ * Existence probe at `baseBranchRef`; same semantics as
19
+ * `ticket-validator.js#validateAcFreshness`.
73
20
  *
74
21
  * @param {{ baseBranchRef: string, path: string, cwd?: string }} opts
75
22
  * @returns {boolean}
@@ -85,16 +32,9 @@ function defaultGitRunner({ baseBranchRef, path, cwd }) {
85
32
  }
86
33
 
87
34
  /**
88
- * Parse the `--name-status` line for the commit that last touched `path`
89
- * into the history verdict (Story #5265).
90
- *
91
- * `-M` reports a rename as `R<score>\t<old>\t<new>`. The scan is run over the
92
- * commit's **whole** rename diff rather than a pathspec-limited one on
93
- * purpose: rename detection pairs a delete with an add, and restricting the
94
- * pathspec to the source path filters the add out, so git falls back to
95
- * reporting a plain `D` and the target is lost. No matching `R` line means
96
- * the path was deleted outright — still a removal, just without a successor
97
- * to name.
35
+ * Find `path`'s rename target in a commit's `--name-status -M` output. The
36
+ * diff must be the whole commit, not pathspec-limited: limiting to the
37
+ * source path filters out the add half, so git reports a plain `D`.
98
38
  *
99
39
  * @param {string} stdout
100
40
  * @param {string} path
@@ -113,20 +53,10 @@ function parseRenameTarget(stdout, path) {
113
53
  }
114
54
 
115
55
  /**
116
- * Default git **history** probe: did `baseBranchRef` ever track `path`, and
117
- * if so, which commit stopped tracking it (Story #5265)?
118
- *
119
- * The existence probe above cannot tell a mechanical mislabel ("extend a file
120
- * I am actually creating") from a plan authored against stale documentation
121
- * ("extend a file deleted three weeks ago"). Both look identical at the tip —
122
- * the path is absent — and only history separates them. Injectable exactly
123
- * like {@link defaultGitRunner} so the discrimination is unit-testable with
124
- * no repository fixture.
125
- *
126
- * Fails **open**: an unreadable ref, a git that errors, or an empty history
127
- * all report `hadHistory: false`, which preserves the pre-#5265
128
- * auto-normalisation rather than manufacturing a hard error out of a probe
129
- * failure.
56
+ * History probe: did `baseBranchRef` ever track `path`, and which commit
57
+ * removed it? Separates a mislabelled create from a plan written against a
58
+ * deleted file. Fails open (`hadHistory: false`) so a probe failure never
59
+ * becomes an error.
130
60
  *
131
61
  * @param {{ baseBranchRef: string, path: string, cwd?: string }} opts
132
62
  * @returns {{ hadHistory: boolean, commit: string|null, renamedTo: string|null }}
@@ -152,15 +82,6 @@ function defaultHistoryRunner({ baseBranchRef, path, cwd }) {
152
82
  }
153
83
 
154
84
  /**
155
- * Pull every `(path, assumption, source)` triple from a Story body.
156
- * `source` is one of `'changes' | 'references'` so error messages can
157
- * point the operator at the right list.
158
- *
159
- * Returns an empty array when the body is absent, a plain string, or
160
- * carries no object-form entries — that's the legacy path. Callers use
161
- * the resulting array's emptiness to decide whether to emit a
162
- * deprecation warning for the Story.
163
- *
164
85
  * @param {object} story
165
86
  * @returns {Array<{ path: string, assumption: string, source: 'changes' | 'references' }>}
166
87
  */
@@ -168,17 +89,12 @@ export function collectStoryAssumptionEntries(story) {
168
89
  const out = [];
169
90
  const body = story?.body;
170
91
 
171
- // Story #3302: when the body is a markdown string (canonical serialized
172
- // form emitted by `serialize()` from story-body.js), parse it first to
173
- // extract the structured changes[] / references[] arrays. Without this,
174
- // every story with a string body would be treated as the legacy case
175
- // (no object-form entries) and the assumption gate would silently no-op.
92
+ // A serialized markdown body must be parsed, or the gate silently no-ops.
176
93
  let structuredBody;
177
94
  if (typeof body === 'string' && body.trim().length > 0) {
178
95
  try {
179
96
  structuredBody = parseStoryBody(body).body;
180
97
  } catch {
181
- // Unparseable body — treat as legacy (no assumptions to check).
182
98
  return out;
183
99
  }
184
100
  } else if (body !== null && typeof body === 'object') {
@@ -213,11 +129,6 @@ export function collectStoryAssumptionEntries(story) {
213
129
  }
214
130
 
215
131
  /**
216
- * Predicate: does the story have any string-form `body.changes` bullets
217
- * left over after a partial migration? Used to decide whether to emit a
218
- * per-story deprecation warning even when at least one object entry is
219
- * present.
220
- *
221
132
  * @param {object} story
222
133
  * @returns {boolean}
223
134
  */
@@ -229,21 +140,10 @@ export function hasLegacyChangeBullets(story) {
229
140
  }
230
141
 
231
142
  /**
232
- * Render a single mismatch into a stable error string. Kept pure so
233
- * tests can pin the exact message shape downstream tooling parses.
234
- *
235
- * The `expected` discriminator selects the message shape:
236
- * - `'present'` — base-branch read/refactor/delete target absent.
237
- * - `'absent'` — base-branch `creates` target already exists.
238
- * - `'refactors-existing'` — wave-aware: a transitive predecessor already
239
- * creates this path, so the dependent Story should declare
240
- * `refactors-existing` (Story #3960). Names the producing Story.
241
- * - `'predecessor-conflict'` — wave-aware: a concurrent Story (no
242
- * `depends_on` ordering) also creates this path. Cross-references the
243
- * shared-editor conflict finding rather than re-deriving its prose.
244
- * - `'present-was-removed'` — the base branch **once tracked** this path
245
- * and no longer does (Story #5265). Names the removing commit, and the
246
- * rename target when git detected one.
143
+ * Render a mismatch as a stable string (downstream tooling parses it),
144
+ * selected by `expected`: `present`, `absent`, `refactors-existing`
145
+ * (predecessor creates it), `predecessor-conflict` (unordered co-creator),
146
+ * `present-was-removed` (base branch removed it).
247
147
  *
248
148
  * @param {{ slug: string, source: string, path: string, assumption: string, expected: string, producerSlug?: string, removedInCommit?: string, renamedTo?: string|null }} mismatch
249
149
  * @returns {string}
@@ -281,16 +181,9 @@ function renderMismatch({
281
181
  }
282
182
 
283
183
  /**
284
- * Render the stale-documentation refusal (Story #5265).
285
- *
286
- * The auto-normalisation this replaces is right for a path that never
287
- * existed and wrong for one the base branch used to track: "extend
288
- * `<deleted file>`" is not a mechanical mislabel a rewrite can fix — it is a
289
- * plan authored against documentation the tree has outgrown, and rewriting it
290
- * to `creates` would resurrect a file somebody deliberately removed and
291
- * propagate the stale premise into acceptance criteria nothing can satisfy.
292
- * The removing commit is named because it is the shortest route to *what
293
- * replaced it*.
184
+ * A refactor of a path the base branch once tracked is a plan written
185
+ * against stale docs; normalizing it to `creates` would resurrect a
186
+ * deliberately removed file. The removing commit points at its replacement.
294
187
  *
295
188
  * @param {{ slug: string, source: string, path: string, assumption: string, removedInCommit?: string, renamedTo?: string|null }} mismatch
296
189
  * @returns {string}
@@ -310,10 +203,6 @@ function renderRemovedPathMismatch({
310
203
  }
311
204
 
312
205
  /**
313
- * Render an auto-normalization (#4496 fix 5) into a stable warning string.
314
- * Kept pure and exported through the report so callers log a
315
- * self-explanatory line rather than re-deriving the rationale.
316
- *
317
206
  * @param {{ slug: string, source: string, path: string, assumption: string }} normalization
318
207
  * @returns {string}
319
208
  */
@@ -322,13 +211,8 @@ function renderNormalization({ slug, source, path, assumption }) {
322
211
  }
323
212
 
324
213
  /**
325
- * Index, across every Story, which Stories declare a `creates` (and which
326
- * declare a `deletes`) for each `changes`-sourced path. The maps drive the
327
- * wave-aware simulated-tree overlay: a path created by a transitive
328
- * predecessor is treated as present, a path deleted by one as absent.
329
- *
330
- * Only `changes`-sourced entries count — `references` describe read
331
- * dependencies, never writes, so they cannot mutate the simulated tree.
214
+ * Index which Stories `creates` / `deletes` each path. Only `changes`
215
+ * entries count; `references` are reads and never mutate the tree.
332
216
  *
333
217
  * @param {object[]} stories
334
218
  * @returns {{ creators: Map<string, string[]>, deleters: Map<string, string[]> }}
@@ -361,10 +245,6 @@ function indexPathMutations(stories) {
361
245
  }
362
246
 
363
247
  /**
364
- * Resolve the first transitive predecessor of `story` that mutates `path`
365
- * in the requested way (`creators` or `deleters` index). Returns the
366
- * producing Story's slug, or `null` when no predecessor mutates the path.
367
- *
368
248
  * @param {Map<string, string[]>} index
369
249
  * @param {string} path
370
250
  * @param {Set<string>} predecessors Transitive `depends_on` slug set.
@@ -380,38 +260,16 @@ function predecessorMutator(index, path, predecessors) {
380
260
  }
381
261
 
382
262
  /**
383
- * Validate every Story's declared file assumptions against the simulated
384
- * post-predecessor tree: the actual state of `baseBranchRef` overlaid with
385
- * the create/delete delta of the Story's transitive `depends_on`
386
- * predecessors (Story #3960). Returns an envelope:
387
- *
388
- * {
389
- * errors: string[] // a `deletes` naming an absent path, or a
390
- * // legacy string-bullet body — the refusals
391
- * warnings: string[] // every other mismatch (Story #5312) +
392
- * // auto-normalization notices (#4496 fix 5)
393
- * mismatches: object[] // structured payload for downstream tooling
394
- * normalizations: object[] // `refactors-existing`→`creates`
395
- * // auto-normalizations on base-untracked paths
396
- * }
397
- *
398
- * Under the 2-tier hierarchy the Story is the implementation unit, so the
399
- * gate scans `type === 'story'` tickets and reads the inline
400
- * `{ path, assumption }` entries on each Story body.
401
- *
402
- * The function never throws on a probe failure — the runner is expected
403
- * to return `false` for any unreadable git ref, which surfaces the path
404
- * as a mismatch (for `refactors-existing` / `exists` / `deletes`) or as
405
- * fresh (for `creates`). This matches the non-blocking, advisory shape
406
- * of the Phase 7 freshness check.
263
+ * Validate every Story's file assumptions against the simulated
264
+ * post-predecessor tree. `errors` holds refusals (`deletes` on an absent
265
+ * path, legacy string bullets); `warnings` every other mismatch plus
266
+ * normalization notices. Never throws on a probe failure.
407
267
  *
408
268
  * @param {object} opts
409
269
  * @param {object[]} opts.tickets
410
270
  * @param {string} opts.baseBranchRef
411
271
  * @param {Function} [opts.gitRunner] Existence probe at `baseBranchRef`.
412
- * @param {Function} [opts.historyRunner] History probe (Story #5265),
413
- * injectable exactly like `gitRunner`; returns
414
- * `{ hadHistory, commit, renamedTo }`.
272
+ * @param {Function} [opts.historyRunner] Returns `{ hadHistory, commit, renamedTo }`.
415
273
  * @param {string} [opts.cwd]
416
274
  * @returns {{ errors: string[], warnings: string[], mismatches: Array, normalizations: Array }}
417
275
  */
@@ -444,10 +302,6 @@ export function validateStoryFileAssumptions(opts) {
444
302
  cache: historyCache,
445
303
  });
446
304
 
447
- // Wave-aware setup (Story #3960): transitive predecessor sets over the
448
- // story-level `depends_on` graph, plus per-path create/delete indices so
449
- // each Story is validated against the simulated post-predecessor tree
450
- // rather than the base branch alone.
451
305
  const reach = computeStoryReachability(stories);
452
306
  const { creators, deleters } = indexPathMutations(stories);
453
307
 
@@ -488,9 +342,7 @@ export function validateStoryFileAssumptions(opts) {
488
342
  path,
489
343
  predecessors,
490
344
  );
491
- // Simulated post-predecessor existence: base state, then a
492
- // predecessor `creates` makes the path present, a predecessor
493
- // `deletes` (with no predecessor create) makes it absent.
345
+ // A predecessor create wins over a predecessor delete.
494
346
  let simulatedExists = baseExists;
495
347
  if (predecessorCreator) simulatedExists = true;
496
348
  else if (predecessorDeleter) simulatedExists = false;
@@ -504,9 +356,6 @@ export function validateStoryFileAssumptions(opts) {
504
356
  predecessorCreator,
505
357
  });
506
358
  if (mismatch !== null) {
507
- // Auto-normalization (#4496 fix 5): a deterministic
508
- // `refactors-existing`→`creates` rewrite is a warning, never a
509
- // rejection — genuine mismatches keep flowing to `errors`.
510
359
  const { kind, finding } = classifyMismatch(mismatch, probeHistory);
511
360
  if (kind === 'normalization') {
512
361
  normalizations.push(finding);
@@ -517,13 +366,8 @@ export function validateStoryFileAssumptions(opts) {
517
366
  routeMismatch(finding, { errors, warnings });
518
367
  continue;
519
368
  }
520
- // Wave-aware concurrent-create check (Story #3960): two Stories with
521
- // no `depends_on` ordering both declaring `creates` on the same path.
522
- // The shared-editor conflict gate owns the canonical resolution; this
523
- // gate surfaces the same signal in the assumption channel and
524
- // cross-references that finding rather than re-deriving its prose.
525
- // Only reached when `checkAssumption` returned clean — a base-branch
526
- // clobber or a predecessor-create already produced a richer mismatch.
369
+ // Unordered co-creators: the shared-editor conflict gate owns the
370
+ // resolution; this only cross-references it.
527
371
  if (assumption === 'creates') {
528
372
  const concurrent = concurrentCoCreator({
529
373
  creators,
@@ -551,9 +395,7 @@ export function validateStoryFileAssumptions(opts) {
551
395
  }
552
396
 
553
397
  /**
554
- * Route one confirmed mismatch to the channel it belongs on (Story #5312):
555
- * a `deletes` on an absent path is the one declaration nothing can act on and
556
- * stays an error; every other mismatch is advisory and lands on `warnings`.
398
+ * Only a `deletes` on an absent path is an error; the rest are warnings.
557
399
  *
558
400
  * @param {object} finding
559
401
  * @param {{ errors: string[], warnings: string[] }} channels
@@ -565,14 +407,8 @@ function routeMismatch(finding, { errors, warnings }) {
565
407
  }
566
408
 
567
409
  /**
568
- * Route one mismatch to the errors channel or the normalization channel
569
- * (Story #5265).
570
- *
571
- * `checkAssumption` marks a `changes`-sourced `refactors-existing` on an
572
- * absent path with `normalizedTo: 'creates'` — the #4496 rescue. Whether that
573
- * rescue actually applies is a *history* question the pure rules table cannot
574
- * answer, so it is resolved here: no history keeps the rescue, history ending
575
- * in a removal converts it into a refusal that names the commit.
410
+ * Decide whether a `normalizedTo: 'creates'` mismatch keeps its rescue: no
411
+ * history keeps it; history ending in a removal becomes a refusal.
576
412
  *
577
413
  * @param {object} mismatch
578
414
  * @param {(path: string) => ({ commit: string|null, renamedTo: string|null }|null)} probeHistory
@@ -600,14 +436,8 @@ function classifyMismatch(mismatch, probeHistory) {
600
436
  }
601
437
 
602
438
  /**
603
- * Memoized history probe: `{ commit, renamedTo }` when `baseBranchRef` once
604
- * tracked `path` and no longer does, `null` when it never did (Story #5265).
605
- *
606
- * One cache per validation run, keyed on the path, because a plan commonly
607
- * declares the same path across several Stories and the probe costs two git
608
- * processes. A runner that throws is absorbed as "no history": the whole
609
- * point of the discrimination is to *add* a refusal for a provable stale
610
- * declaration, never to convert a probe failure into one.
439
+ * Memoized per run (the probe costs two git processes). A throwing runner
440
+ * means "no history" — a probe failure must never manufacture a refusal.
611
441
  *
612
442
  * @param {{ historyRunner: Function, baseBranchRef: string, path: string, cwd?: string, cache: Map<string, object|null> }} args
613
443
  * @returns {{ commit: string|null, renamedTo: string|null }|null}
@@ -631,12 +461,8 @@ function probeRemoval({ historyRunner, baseBranchRef, path, cwd, cache }) {
631
461
  }
632
462
 
633
463
  /**
634
- * Find the first *concurrent* co-creator of `path` for the Story `slug`:
635
- * another Story that declares `creates` on the same path with no
636
- * `depends_on` ordering in either direction. Returns that Story's slug, or
637
- * `null` when every co-creator is ordered relative to `slug` (predecessor
638
- * or successor) — those are handled by the predecessor-create rule, not the
639
- * concurrent-conflict rule.
464
+ * First other Story creating `path` with no `depends_on` ordering either
465
+ * way; ordered co-creators fall to the predecessor-create rule.
640
466
  *
641
467
  * @param {{ creators: Map<string, string[]>, path: string, slug: string, reach: Map<string, Set<string>> }} args
642
468
  * @returns {string|null}
@@ -648,7 +474,6 @@ function concurrentCoCreator({ creators, path, slug, reach }) {
648
474
  for (const other of slugs) {
649
475
  if (other === slug) continue;
650
476
  const otherPredecessors = reach.get(other) ?? new Set();
651
- // Ordered in either direction → not concurrent.
652
477
  if (myPredecessors.has(other)) continue;
653
478
  if (otherPredecessors.has(slug)) continue;
654
479
  return other;
@@ -657,18 +482,6 @@ function concurrentCoCreator({ creators, path, slug, reach }) {
657
482
  }
658
483
 
659
484
  /**
660
- * Apply one assumption rule against the simulated post-predecessor tree and
661
- * return a structured mismatch or `null` when the declared assumption
662
- * matches. Extracted from `validateStoryFileAssumptions` so the rules table
663
- * sits in one place that's trivially unit-testable.
664
- *
665
- * `baseExists` is the path's existence on the base branch; `simulatedExists`
666
- * is `baseExists` overlaid with the create/delete delta of the Story's
667
- * transitive predecessors. `predecessorCreator` (when non-null) is the slug
668
- * of the predecessor Story that creates the path — used to distinguish a
669
- * wave-aware `creates`-on-a-will-exist-path mismatch from the base-branch
670
- * "already exists" mismatch, and to name the producing Story in the nudge.
671
- *
672
485
  * @param {{ slug: string, source: string, path: string, assumption: string, baseExists: boolean, simulatedExists: boolean, predecessorCreator: string|null }} args
673
486
  * @returns {object|null}
674
487
  */
@@ -683,8 +496,6 @@ function checkAssumption({
683
496
  }) {
684
497
  switch (assumption) {
685
498
  case 'creates':
686
- // Base-branch clobber — the path already exists before any Story
687
- // runs. Unchanged from the base-branch-only rule.
688
499
  if (baseExists) {
689
500
  return {
690
501
  slug,
@@ -695,9 +506,6 @@ function checkAssumption({
695
506
  actual: 'present',
696
507
  };
697
508
  }
698
- // Wave-aware (Story #3960): a transitive predecessor already creates
699
- // this path, so it exists in the simulated tree. Nudge the planner to
700
- // declare `refactors-existing` and name the producing Story.
701
509
  if (predecessorCreator) {
702
510
  return {
703
511
  slug,
@@ -711,18 +519,10 @@ function checkAssumption({
711
519
  }
712
520
  return null;
713
521
  case 'refactors-existing':
714
- // Validate against the simulated tree: a predecessor `creates` makes
715
- // an otherwise-absent base path present, so `refactors-existing`
716
- // against it is no longer a false-positive mismatch (Story #3960).
717
522
  if (!simulatedExists) {
718
- // Auto-normalization (#4496 fix 5): a `changes`-sourced refactor
719
- // declaration on a path untracked at the base branch (and not
720
- // produced by any predecessor) is deterministically a create —
721
- // downgrade to a normalization warning instead of rejecting. Two
722
- // genuine mismatches stay hard errors: a `references`-sourced entry
723
- // (a read dependency this Story does not author cannot be "created"
724
- // here), and a base-TRACKED path a predecessor deletes (the absence
725
- // is a plan-shape conflict, not an untracked-path misdeclaration).
523
+ // A `changes` refactor of a base-untracked path is deterministically
524
+ // a create. A `references` entry (not authored here) or a tracked
525
+ // path a predecessor deletes stays a genuine mismatch.
726
526
  if (source === 'changes' && !baseExists) {
727
527
  return {
728
528
  slug,
@@ -746,8 +546,6 @@ function checkAssumption({
746
546
  return null;
747
547
  case 'exists':
748
548
  case 'deletes':
749
- // Same simulated-tree overlay as above (Story #3960); an absent path
750
- // remains a genuine mismatch for both assumptions.
751
549
  if (!simulatedExists) {
752
550
  return {
753
551
  slug,
@@ -760,9 +558,7 @@ function checkAssumption({
760
558
  }
761
559
  return null;
762
560
  default:
763
- // Unknown assumption values were already rejected by the body
764
- // schema validator — defensive default so future enum additions
765
- // surface as test failures rather than silent passes.
561
+ // Schema already rejects unknown values; fail loud on new enum members.
766
562
  return {
767
563
  slug,
768
564
  source,
@@ -774,8 +570,4 @@ function checkAssumption({
774
570
  }
775
571
  }
776
572
 
777
- /**
778
- * Re-export the canonical assumption enum so callers can reach for the
779
- * list without depending on task-body-validator's internals.
780
- */
781
573
  export { FILE_ASSUMPTION_VALUES };
@@ -1,12 +1,5 @@
1
1
  /**
2
- * branches-detect.js — the branch-reap phase's detection signals beyond
3
- * the PR probe, and the whole remote-only walk (Stories #4395, #5188).
4
- *
5
- * Split out of `branches.js` for the same reason `branches-reap.js` was:
6
- * each phase file stays small enough to read in one pass. `branches.js`
7
- * keeps the two walks' orchestration (`planCleanup`) and the reap
8
- * (`executeCleanup`); this module owns what a branch with no reapable PR
9
- * verdict is measured against.
2
+ * Branch-reap detection signals beyond the PR probe, and the remote-only walk.
10
3
  *
11
4
  * @module lib/orchestration/git-cleanup/phases/branches-detect
12
5
  */
@@ -25,21 +18,10 @@ export function skipEntryFromVerdict(branch, verdict) {
25
18
  }
26
19
 
27
20
  /**
28
- * Story #4395 — the third detection signal, shared by the local and
29
- * remote-only walks (Story #5188). Reached only when the branch has no
30
- * reapable PR verdict and is not an ancestor of `<base>` (or
31
- * `origin/<base>`). Probes content-equivalence via `git merge-tree
32
- * --write-tree` and, when the probe is conclusive and the merge is a
33
- * no-op, classifies the branch as `content-merged` instead of falling
34
- * through to the `not-merged` skip.
35
- *
36
- * `rev` is the revision handed to git, `branch` the short name every
37
- * output reports. They differ on the remote-only path, where names are
38
- * enumerated with the `<remote>/` prefix stripped: handing `git
39
- * merge-tree` the bare short name resolves to no ref, so the probe would
40
- * report `{ supported: false }` for every candidate and degrade the whole
41
- * signal to silence. Defaulting `rev` to `branch` keeps the local walk
42
- * unchanged.
21
+ * Last-resort signal: `content-merged` when merging the branch into base is a
22
+ * no-op, else a `not-merged` skip. `rev` is what git sees; on the remote-only
23
+ * walk it must be `<remote>/<branch>`, since the bare short name resolves to
24
+ * no ref and would silence the signal.
43
25
  */
44
26
  export function evaluateContentEquivalence({
45
27
  branch,
@@ -66,22 +48,9 @@ export function evaluateContentEquivalence({
66
48
  }
67
49
 
68
50
  /**
69
- * Story #5188 — the remote-only walk's no-PR cascade, the mirror of the
70
- * local walk's: ancestry against the base first, then content-equivalence,
71
- * else a `not-merged` skip. Reaching this at all is the fix — the walk
72
- * used to return early on a `no-pr` verdict, recording the branch in
73
- * neither `candidates[]` nor `skipped[]`, so a provably-merged orphan ref
74
- * was absent from the rendered log and the `--json` envelope alike.
75
- *
76
- * `mergedRemote` is the `-r` ancestry set ({@link listRemoteMergedBranches}):
77
- * the local `git branch --merged` listing that feeds the local cascade
78
- * enumerates local heads only and can never contain a remote branch name.
79
- * Both signals read the local object database, so the sweep stays offline.
80
- *
81
- * A hit carries a `detectedBy` distinct from the PR-detected
82
- * `'remote-only'` — `'remote-git-merged'` for ancestry, and the existing
83
- * `'content-merged'` for the weaker content signal, so every consumer that
84
- * already treats that value as report-only keeps doing so here.
51
+ * Remote-only no-PR cascade: ancestry via the `-r` merged set (the local
52
+ * listing never contains remote names), then content-equivalence, else skip.
53
+ * Offline: both read the local object database.
85
54
  */
86
55
  function evaluateRemoteOnlyNoPr({
87
56
  branch,
@@ -106,13 +75,7 @@ function evaluateRemoteOnlyNoPr({
106
75
  });
107
76
  }
108
77
 
109
- /**
110
- * Story #5188 — resolve one remote-only branch's PR verdict into either a
111
- * detection provenance or a skip. Split out of the walk so the loop reads
112
- * as enumerate → resolve → record and every arm of the cascade is visibly
113
- * total: each branch that passes the protected and filter checks leaves
114
- * this function as exactly one of `{ detectedBy, prInfo }` or `{ skip }`.
115
- */
78
+ /** Total: always exactly one of `{ detectedBy, prInfo }` or `{ skip }`. */
116
79
  function resolveRemoteOnlyBranch({ verdict, branch, rev, noPrArgs }) {
117
80
  if (verdict.kind === 'skip') {
118
81
  return { skip: skipEntryFromVerdict(branch, verdict) };