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