mandrel 2.60.0 → 2.61.0

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