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,27 +1,12 @@
1
1
  /**
2
- * plan-reachability.js — deterministic draft-ticket reachability check for
3
- * the persist surface (Epic #4474 PR6, design §4: the 8.4 reachability
4
- * critic demoted from a fresh-context sub-agent to a persist-side scan).
2
+ * plan-reachability.js — deterministic persist-side scan of draft tickets'
3
+ * route paths against the nav registry, run before any provider call so an
4
+ * orphaned surface is fixed by a free one-line amend.
5
5
  *
6
- * Route-glob scan of the paths a Story declares vs the
7
- * `planning.navigation.navRegistry` token list, run over the **draft**
8
- * ticket set inside `plan-persist.js` step 4.5, before any provider call,
9
- * so an orphaned surface is caught while a one-line targeted amend is
10
- * still free (nothing has been written to GitHub yet).
11
- *
12
- * Plan-level coverage semantics (the convergence contract): a route-adding
13
- * story that never references the nav registry produces orphan surfaces —
14
- * UNLESS every one of its route paths is also mentioned by some story in
15
- * the plan that DOES reference the registry (the "navigation owner"). That
16
- * is exactly what the documented recovery produces: the author appends the
17
- * single reachability Story (which cites the orphaned routes and the nav
18
- * registry) in one targeted amend, and the re-run persist passes.
19
- *
20
- * Silent no-op when `planning.navigation` is unconfigured (`routeGlobs`
21
- * empty) — reported as `status: 'skipped'` so the caller can append the
22
- * audit record to the plan-metrics ledger.
23
- *
24
- * Pure over its inputs (tickets + resolved config), no I/O.
6
+ * A route-adding Story that never cites the registry is an orphan unless
7
+ * every one of its route paths is mentioned by some registry-citing Story in
8
+ * the plan (the navigation owner). `skipped` when `routeGlobs` is empty.
9
+ * Pure, no I/O.
25
10
  */
26
11
 
27
12
  import {
@@ -30,37 +15,28 @@ import {
30
15
  resolveNavConfig,
31
16
  } from './plan-navigation.js';
32
17
 
33
- /**
34
- * Fallback tokens when `navRegistry` is unconfigured but `routeGlobs` is.
35
- */
18
+ /** Used when `navRegistry` is unconfigured but `routeGlobs` is. */
36
19
  const FALLBACK_REGISTRY_TOKENS = ['nav registry', 'navigation'];
37
20
 
38
21
  /**
39
22
  * @typedef {Object} ReachabilityOrphan
40
23
  * @property {string} story The offending draft story's slug (or title).
41
- * @property {string[]} paths The route-matching paths with no navigation
42
- * owner anywhere in the plan.
24
+ * @property {string[]} paths Route paths with no navigation owner.
43
25
  */
44
26
 
45
27
  /**
46
28
  * @typedef {Object} DraftReachabilityResult
47
29
  * @property {'skipped'|'ok'|'orphans'} status
48
30
  * @property {string[]} reasons
49
- * @property {ReachabilityOrphan[]} orphans Empty unless `status` is
50
- * `'orphans'`.
31
+ * @property {ReachabilityOrphan[]} orphans
51
32
  * @property {number} scanned Draft stories scanned (0 when skipped).
52
33
  */
53
34
 
54
35
  /**
55
- * Evaluate draft-ticket reachability against the configured navigation
56
- * surface.
57
- *
58
36
  * @param {object} input
59
37
  * @param {Array<{ slug?: string, title?: string, body?: string }>} input.tickets
60
- * The draft ticket set the persist is about to create (fan-out: the
61
- * authored `tickets.json`; amend: the merged set).
62
- * @param {object} [input.config] Resolved `.agentrc.json` (threads
63
- * `planning.navigation`).
38
+ * The draft ticket set about to be created.
39
+ * @param {object} [input.config] Resolved `.agentrc.json`.
64
40
  * @returns {DraftReachabilityResult}
65
41
  */
66
42
  export function evaluateDraftReachability({ tickets, config }) {
@@ -82,7 +58,6 @@ export function evaluateDraftReachability({ tickets, config }) {
82
58
  ? navRegistry.map((t) => t.toLowerCase())
83
59
  : FALLBACK_REGISTRY_TOKENS;
84
60
 
85
- // Pass 1: per-story scan — declared paths, route matches, registry refs.
86
61
  const scannedStories = stories.map((story) => {
87
62
  const body = typeof story?.body === 'string' ? story.body : '';
88
63
  const paths = extractStoryPaths(body);
@@ -92,8 +67,7 @@ export function evaluateDraftReachability({ tickets, config }) {
92
67
  return { story, paths, routePaths, referencesRegistry };
93
68
  });
94
69
 
95
- // Pass 2: navigation owners — every path mentioned by a
96
- // registry-referencing story is covered plan-wide.
70
+ // Every path a registry-citing Story mentions is covered plan-wide.
97
71
  const coveredPaths = new Set();
98
72
  for (const s of scannedStories) {
99
73
  if (!s.referencesRegistry) continue;
@@ -135,9 +109,6 @@ export function evaluateDraftReachability({ tickets, config }) {
135
109
  }
136
110
 
137
111
  /**
138
- * Render the named soft-failure message the persist CLI prints — the
139
- * orphan-surface list plus the one-targeted-amend recovery contract.
140
- *
141
112
  * @param {DraftReachabilityResult} result A `status: 'orphans'` result.
142
113
  * @returns {string}
143
114
  */
@@ -1,47 +1,18 @@
1
1
  /**
2
- * plan-run-labels/reap.js — the cohort label's end of life (Story #5189).
3
- *
4
- * `plan-persist` mints one `plan-run::<id>` label per run so the Stories one
5
- * plan authored stay filterable in the GitHub UI. That is load-bearing while
6
- * any Story in the cohort is open, and inert the moment they are all closed —
7
- * but nothing expressed the second half, so the vocabulary grew one label per
8
- * persist forever. A consumer repository measured 235 `plan-run::` labels out
9
- * of 313 total; past that a paged label listing stops seeing the labels that
10
- * sort after the pile, and every list-then-create caller starts failing.
11
- *
12
- * This module is the **one decision engine** behind both surfaces that act on
13
- * that end of life: the per-Story close tail (automatic, incremental) and
14
- * `prune-plan-run-labels.js` (manual, whole-repository). Keeping the decision
15
- * here rather than in either caller is what stops the two from disagreeing
16
- * about when a label is spent.
17
- *
18
- * **The decision.** A cohort label is reapable only when it carries at least
19
- * one issue and every issue carrying it is closed. The "at least one" clause
20
- * is the subtle half: a label carrying *zero* issues is indistinguishable from
21
- * one an in-flight persist has just minted before creating its Stories, and
22
- * deleting it would break that run. So a zero-issue label is reported under an
23
- * `unreferenced` reason and reaped only under an explicit opt-in — a default
24
- * sweep is safe to run concurrently with a persist.
25
- *
26
- * **Never load-bearing.** Both surfaces treat a reap failure as a warning.
27
- * Label hygiene is a chore; nothing downstream reads the cohort label as an
28
- * input (see `PLAN_RUN_LABEL_PREFIX`'s own docblock), so a failed delete costs
29
- * a stale label and nothing else.
2
+ * plan-run-labels/reap.js — the one decision engine for reaping spent
3
+ * `plan-run::<id>` cohort labels, shared by the close tail and the manual
4
+ * sweep so the two cannot disagree. A reap failure is only ever a warning.
30
5
  *
31
6
  * @module lib/orchestration/plan-run-labels/reap
32
- * @see Story #5189
33
7
  */
34
8
 
35
9
  import { PLAN_RUN_LABEL_PREFIX } from '../plan-persist/story-ops.js';
36
10
 
37
11
  /**
38
- * Why a cohort label was — or was not — judged reapable. One reason per
39
- * label, so a `--json` report is auditable without re-deriving anything.
40
- *
41
12
  * - `all-closed` — carries issues, every one closed. Reapable.
42
- * - `open-stories` — at least one issue still open. Not reapable, ever.
43
- * - `unreferenced` — carries no issues at all. Reapable only under the
44
- * explicit opt-in, because an in-flight persist looks exactly like this.
13
+ * - `open-stories` — at least one issue still open. Never reapable.
14
+ * - `unreferenced` — carries no issues. Reapable only under explicit opt-in,
15
+ * because an in-flight persist's freshly minted label looks exactly like this.
45
16
  */
46
17
  export const REAP_REASONS = Object.freeze({
47
18
  ALL_CLOSED: 'all-closed',
@@ -50,12 +21,6 @@ export const REAP_REASONS = Object.freeze({
50
21
  });
51
22
 
52
23
  /**
53
- * Is `name` a plan-run cohort label?
54
- *
55
- * The prefix is imported from `plan-persist/story-ops.js` rather than
56
- * re-declared: minting and reaping must not be able to drift onto two
57
- * different strings, which is exactly the failure a copied literal invites.
58
- *
59
24
  * @param {unknown} name
60
25
  * @returns {boolean}
61
26
  */
@@ -64,10 +29,7 @@ function isPlanRunLabel(name) {
64
29
  }
65
30
 
66
31
  /**
67
- * Project an arbitrary label collection onto the sorted, de-duplicated set of
68
- * cohort label names. Accepts either bare strings (a ticket's `labels[]`) or
69
- * `{ name }` rows (the label listing port), so both callers hand this whatever
70
- * their own read returned.
32
+ * Sorted, de-duplicated cohort label names from strings or `{ name }` rows.
71
33
  *
72
34
  * @param {Array<string|{ name?: string }>} [names]
73
35
  * @returns {string[]}
@@ -82,13 +44,8 @@ function selectCohortLabels(names) {
82
44
  }
83
45
 
84
46
  /**
85
- * Decide one cohort label.
86
- *
87
- * Reads through `listIssuesByLabel({ state: 'all' })` — the paginating read
88
- * port — so the verdict is never a function of how many issues fit on one API
89
- * page. `state` is compared case-insensitively against `closed` and anything
90
- * else counts as open: an unknown state must never be read as "safe to
91
- * delete".
47
+ * Decide one label via the paginating read port. Any state other than
48
+ * `closed` counts as open: an unknown state is never "safe to delete".
92
49
  *
93
50
  * @param {{ provider: object, label: string, includeUnreferenced?: boolean }} args
94
51
  * @returns {Promise<{
@@ -142,12 +99,7 @@ async function decideCohortLabel({
142
99
  }
143
100
 
144
101
  /**
145
- * Decide a set of cohort labels.
146
- *
147
- * Sequential on purpose. The whole-repository sweep can face hundreds of
148
- * labels, and a fan-out over a shared REST budget buys wall-clock at the cost
149
- * of the one property an operator auditing a pile actually needs: a
150
- * deterministic, label-ordered report.
102
+ * Sequential on purpose, for a deterministic label-ordered report.
151
103
  *
152
104
  * @param {{
153
105
  * provider: object,
@@ -171,13 +123,8 @@ async function evaluateCohortLabels({
171
123
  }
172
124
 
173
125
  /**
174
- * Decide, then (unless `check`) delete.
175
- *
176
- * A delete that throws is recorded in `failed[]` and warned about rather than
177
- * propagated: one unreachable label must not abandon the rest of a sweep, and
178
- * on the close path it must not touch the land. A delete the provider reports
179
- * as a no-op (`deleted: false` — the label was already gone) is still a
180
- * success; that is what makes a re-run idempotent.
126
+ * Decide, then (unless `check`) delete. A throwing delete is recorded in
127
+ * `failed[]`, never propagated; an already-gone label counts as success.
181
128
  *
182
129
  * @param {{
183
130
  * provider: object,
@@ -225,18 +172,8 @@ async function reapCohortLabels({
225
172
  }
226
173
 
227
174
  /**
228
- * The automatic surface's entry point: reap the cohort labels carried by the
229
- * Story that just closed.
230
- *
231
- * The Story's own label set comes from `getTicket` (labels are immutable for
232
- * this purpose, so a cached snapshot is fine); every *state* judgment comes
233
- * from the fresh `listIssuesByLabel` read inside {@link decideCohortLabel}, so
234
- * a primed ticket cache cannot make a still-open sibling look closed.
235
- *
236
- * A Story whose own issue has not yet registered as closed — the merge webhook
237
- * that fires `Closes #<id>` is not instantaneous — simply reports
238
- * `open-stories` and is left alone. Deferring is the safe direction, and the
239
- * manual sweep is the backstop that collects whatever a race leaves behind.
175
+ * Every state judgment is a fresh read; a Story not yet registered closed is
176
+ * deferred to the manual sweep.
240
177
  *
241
178
  * @param {{
242
179
  * storyId: number,
@@ -275,11 +212,7 @@ export async function reapPlanRunLabelsForStory({
275
212
  }
276
213
 
277
214
  /**
278
- * The manual surface's entry point: sweep every cohort label in the repository.
279
- *
280
- * Reads the whole label vocabulary through the paginating listing port and
281
- * projects it onto the cohort axis here, so the sweep is bounded by what the
282
- * repository actually holds rather than by an API page size.
215
+ * Sweep every cohort label in the repository.
283
216
  *
284
217
  * @param {{
285
218
  * provider: object,
@@ -309,15 +242,7 @@ export async function sweepCohortLabels({
309
242
  return { totalLabels: rows.length, evaluated: labels.length, ...outcome };
310
243
  }
311
244
 
312
- /**
313
- * Test-only surface. The five helpers below compose the two exported entry
314
- * points (`reapPlanRunLabelsForStory`, `sweepCohortLabels`) and have no
315
- * production consumer outside this module, so exporting each one individually
316
- * would advertise five API surfaces nothing imports — and `dead-exports
317
- * --production` correctly reports each as dead. They are still worth unit
318
- * testing per arm, which is what this barrel is for; it follows the same
319
- * `__testing` idiom `git-probes.js` and `source-classifier.js` use.
320
- */
245
+ /** Test-only barrel, so `dead-exports --production` sees no unused exports. */
321
246
  export const __testing = {
322
247
  isPlanRunLabel,
323
248
  selectCohortLabels,
@@ -1,33 +1,11 @@
1
1
  /**
2
- * plan-runner/worktree-sweep.js
2
+ * plan-runner/worktree-sweep.js — plan-boot sweep that force-removes
3
+ * `.worktrees/story-<id>/` entries whose Story is closed or `agent::done`,
4
+ * after draining the pending-cleanup manifest.
3
5
  *
4
- * Reap-sweep run at plan boot (via `drainPendingCleanupAtBoot` in
5
- * `lib/orchestration/epic-plan-spec/phases/drain.js`, wired into
6
- * `plan-persist.js`). Iterates the `.worktrees/story-<id>/`
7
- * entries registered with git, looks up each parent Story, and force-removes
8
- * any whose Story is already closed or labeled `agent::done`.
9
- *
10
- * The `--force` flag is intentional. By the time a Story is `agent::done`
11
- * its branch has already been merged into the Epic branch (via
12
- * `single-story-close.js`), so any residue left in the worktree — dirty
13
- * build artifacts, an interrupted rebase, a stray Windows lock — is noise.
14
- * The safety rails in `WorktreeManager.reap` exist for the _active_ close
15
- * path; at plan time we already know the Story is done and want the
16
- * directory gone no matter what.
17
- *
18
- * Public API:
19
- * - `sweepStaleStoryWorktrees({ provider, repoRoot, git?, logger?, fsRm?, worktreeRoot? })`
20
- *
21
- * Also drains any `.worktrees/.pending-cleanup.json` manifest left behind
22
- * by Stage 1 (`removeWorktreeWithRecovery` → fs-rm-retry exhaustion, see
23
- * `../worktree/lifecycle/pending-cleanup.js`). Entries whose Stage 1 retry now
24
- * succeeds are removed from the manifest; entries reaching
25
- * MAX_SWEEP_ATTEMPTS emit an `OPERATOR ACTION REQUIRED: persistent-lock`.
26
- *
27
- * Returns `{
28
- * reaped, skipped,
29
- * drainedPending, persistentPending, stillPending
30
- * }`.
6
+ * `--force` is deliberate: a done Story's branch is already merged, so any
7
+ * residue (dirty artifacts, an interrupted rebase, a Windows lock) is noise;
8
+ * the `WorktreeManager.reap` safety rails are for the active close path.
31
9
  */
32
10
 
33
11
  import path from 'node:path';
@@ -56,20 +34,13 @@ function storyIdFromPath(wtPath) {
56
34
  }
57
35
 
58
36
  /**
59
- * Scan registered worktrees and force-remove any whose parent Story is
60
- * done (closed or `agent::done`). Never touches worktrees whose Story is
61
- * still open — those are live or in-flight.
62
- *
63
- * Provider reads are fanned out at concurrency 8 via `concurrentMap`; the
64
- * subsequent `git worktree remove` calls stay sequential because they
65
- * mutate `.git/worktrees/`.
37
+ * Never touches a worktree whose Story is still open.
66
38
  *
67
39
  * @param {object} opts
68
- * @param {object} opts.provider ITicketingProvider-compatible; only
69
- * `getTicket(id)` is required.
40
+ * @param {object} opts.provider Only `getTicket(id)` is required.
70
41
  * @param {string} opts.repoRoot Absolute path to the main checkout.
71
- * @param {object} [opts.git] `{ gitSpawn }` injection for tests.
72
- * @param {object} [opts.logger] `{ info, warn, error }`.
42
+ * @param {object} [opts.git]
43
+ * @param {object} [opts.logger]
73
44
  * @returns {Promise<{
74
45
  * reaped: Array<{ storyId: number, path: string }>,
75
46
  * skipped: Array<{ storyId: number|null, path: string, reason: string }>,
@@ -95,11 +66,8 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
95
66
  const resolvedWorktreeRoot =
96
67
  worktreeRoot ?? path.join(repoRoot, '.worktrees');
97
68
 
98
- // Stage 2 + Stage 3: drain pending-cleanup manifest before touching the
99
- // live worktree list. Retrying the Stage 1 sequence here picks up entries
100
- // whose Windows file locks have since released; entries still stuck get
101
- // their handle-holders enumerated and terminated (Windows only) so the
102
- // ledger self-heals across sprints instead of accumulating.
69
+ // Drain the pending-cleanup manifest first so entries whose Windows locks
70
+ // have released self-heal instead of accumulating.
103
71
  const drainResult = await forceDrainPendingCleanup({
104
72
  repoRoot,
105
73
  worktreeRoot: resolvedWorktreeRoot,
@@ -121,10 +89,8 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
121
89
 
122
90
  const entries = parseWorktreePorcelain(listRes.stdout || '');
123
91
 
124
- // Phase 1 — fan out provider reads. Each mapper call captures its own
125
- // error so a single transient provider hiccup doesn't trip
126
- // concurrentMap's first-rejection-wins policy and abort the whole sweep;
127
- // we want the original per-entry skip/continue semantics preserved.
92
+ // Each mapper captures its own error so one provider hiccup cannot abort
93
+ // the sweep via concurrentMap's first-rejection-wins policy.
128
94
  const reads = await concurrentMap(
129
95
  entries,
130
96
  async (entry) => {
@@ -142,10 +108,8 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
142
108
  { concurrency: TICKET_READ_CONCURRENCY },
143
109
  );
144
110
 
145
- // Phase 2 — sequential `git worktree remove`. These mutate
146
- // .git/worktrees/ and the per-worktree admin dir; serializing avoids
147
- // racing git's own locking on Windows where a half-removed entry can
148
- // leave a partial admin dir that the next remove then trips over.
111
+ // Removes stay sequential: they mutate .git/worktrees/, and racing git's
112
+ // locking on Windows can leave a partial admin dir the next remove trips on.
149
113
  for (const r of reads) {
150
114
  if (r.kind === 'no-path' || r.kind === 'non-story') continue;
151
115
  if (r.kind === 'provider-error') {
@@ -198,8 +162,6 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
198
162
  );
199
163
  }
200
164
 
201
- // Drop any lingering worktree registrations. Cheap; safe to run whether
202
- // or not we actually removed anything.
203
165
  git.gitSpawn(repoRoot, 'worktree', 'prune');
204
166
 
205
167
  return {
@@ -1,30 +1,9 @@
1
1
  /**
2
- * plan-text-hygiene.js — the advisory draft-Story lints: `open-question`
3
- * over body prose (Story #4599; narrowed to one lint by Story #5312) and
4
- * `pinned-identifier` over `acceptance[]` (Story #5323).
5
- *
6
- * A Story is executed by a non-interactive sub-agent, so an operator-directed
7
- * open question persisted into its body ("Flag if…", "TBD", "confirm with the
8
- * operator", a trailing `?`) can never be answered where it is read. This
9
- * module makes that class checkable at the one point a re-author loop exists —
10
- * the persist dry-run, which lists every match as a **warning** and proceeds.
11
- *
12
- * Story #5312 deleted the sibling `dangling-citation` and `slicing-mass`
13
- * lints with the critic gate that surfaced them: both scored prose shape the
14
- * authoring model already judges, and neither ever changed a persisted body.
15
- *
16
- * `pinned-identifier` is the one lint that scores the **binding** half of the
17
- * ticket; its classifier lives in
18
- * [`pinned-identifier-lint.js`](pinned-identifier-lint.js), which shares no
19
- * vocabulary with the prose heuristic here.
20
- *
21
- * Advisory by contract: findings are deterministic text for the dry-run's
22
- * warning list. They never gate persist and spawn nothing.
23
- *
24
- * Pure, synchronous, no I/O. Operates on the draft `stories.json` array,
25
- * reusing `parse()` from `lib/story-body/story-body.js` for section access.
26
- * An unparseable draft body is skipped, not failed — hygiene is advisory
27
- * and the persist validators own structural rejection.
2
+ * plan-text-hygiene.js — advisory draft-Story lints for the persist dry-run:
3
+ * `open-question` over body prose (a non-interactive sub-agent can never
4
+ * answer "TBD" or "confirm with the operator") and `pinned-identifier` over
5
+ * `acceptance[]`. Findings are warnings only; an unparseable body is skipped,
6
+ * since structural rejection belongs to the persist validators. Pure, no I/O.
28
7
  *
29
8
  * @module lib/orchestration/plan-text-hygiene
30
9
  */
@@ -32,14 +11,8 @@
32
11
  import { parse } from '../story-body/story-body.js';
33
12
  import { findPinnedIdentifiers } from './pinned-identifier-lint.js';
34
13
 
35
- /** Truncation length for the `evidence` excerpt on each finding. */
36
14
  const EVIDENCE_MAX_CHARS = 160;
37
15
 
38
- /**
39
- * Operator-directed open-question phrasings. Each match is an instruction
40
- * or question aimed at a human, which a non-interactive delivery sub-agent
41
- * can never answer.
42
- */
43
16
  const OPEN_QUESTION_MARKERS = [
44
17
  /\bflag if\b/i,
45
18
  /\bTBD\b/,
@@ -55,16 +28,13 @@ const OPEN_QUESTION_MARKERS = [
55
28
  */
56
29
 
57
30
  /**
58
- * Private-use sentinel standing in for one extracted inline code span. It
59
- * carries no question marker and no sentence boundary, so it is inert for
60
- * the heuristic while keeping the sentence split where the span sat.
31
+ * Private-use stand-in for an inline code span: inert to the heuristic but
32
+ * keeps the sentence split where the span sat.
61
33
  */
62
34
  const CODE_SLOT = '\uE000';
63
35
 
64
36
  /**
65
- * Replace fenced code blocks with a space and each inline code span with a
66
- * positional slot, so code content (shell snippets, grep patterns, JSON)
67
- * never trips a prose heuristic.
37
+ * Remove code so shell snippets or patterns never trip a prose heuristic.
68
38
  *
69
39
  * @param {string} text
70
40
  * @returns {string}
@@ -74,8 +44,7 @@ function stripCodeSpans(text) {
74
44
  }
75
45
 
76
46
  /**
77
- * Split prose into sentence-ish units with code content removed. Newlines
78
- * are boundaries too, so a bullet list yields one unit per bullet.
47
+ * Newlines are boundaries too: one unit per bullet.
79
48
  *
80
49
  * @param {string} text
81
50
  * @returns {string[]}
@@ -88,8 +57,6 @@ function splitSentences(text) {
88
57
  }
89
58
 
90
59
  /**
91
- * Truncate an excerpt for the finding's `evidence` field.
92
- *
93
60
  * @param {string} text
94
61
  * @returns {string}
95
62
  */
@@ -101,9 +68,6 @@ function excerpt(text) {
101
68
  }
102
69
 
103
70
  /**
104
- * open-question: operator-directed phrasing (or a trailing `?`) in prose a
105
- * non-interactive sub-agent executes.
106
- *
107
71
  * @param {string} prose - Raw Goal/Spec prose.
108
72
  * @param {string} slug
109
73
  * @returns {TextHygieneFinding[]}
@@ -130,12 +94,8 @@ function findOpenQuestions(prose, slug) {
130
94
  }
131
95
 
132
96
  /**
133
- * Evaluate the advisory lints over a draft Story array.
134
- *
135
97
  * @param {{ draftStories?: Array<object>|null }} args - The draft
136
- * `stories.json` array (raw Story objects with top-level `slug` /
137
- * `body`). Null/absent evaluates to zero findings (the single-delivery
138
- * shape authors no draft tickets).
98
+ * `stories.json` array; null/absent yields no findings.
139
99
  * @returns {{ findings: TextHygieneFinding[] }}
140
100
  */
141
101
  export function evaluateTextHygiene({ draftStories = null } = {}) {
@@ -147,8 +107,6 @@ export function evaluateTextHygiene({ draftStories = null } = {}) {
147
107
  try {
148
108
  body = parse(story?.body).body;
149
109
  } catch {
150
- // Advisory lint: an unparseable body is the persist validators'
151
- // rejection to make, not this evaluator's.
152
110
  continue;
153
111
  }
154
112
  const goal = typeof body.goal === 'string' ? body.goal : '';