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,66 +1,21 @@
1
1
  /**
2
- * bootstrap/workflow-audit — audit the GitHub Projects v2 built-in
3
- * workflows for the project board, classifying each enabled workflow
4
- * against an allowlist (Story #2845).
2
+ * Audit the board's Projects v2 built-in workflows. `ColumnSync` owns the
3
+ * Status column; built-ins that also write it land after the orchestrator
4
+ * and leave closed Stories stuck `In Progress`.
5
5
  *
6
- * Motivation:
7
- * The orchestrator's `ColumnSync` writes the Status column at every
8
- * `transitionTicketState` call and documents "I own Status" at
9
- * [`column-sync.js:21-27`]. GitHub Projects v2 ships several built-in
10
- * workflows that *also* write the Status column as side-effects of
11
- * issue / PR events. When both are enabled, the bot frequently gets
12
- * the last write on `agent::done` transitions (PR merged ~2 minutes
13
- * after the orchestrator's flip), leaving closed Stories stuck at
14
- * `In Progress` on the board even though the issue is closed and
15
- * labeled `agent::done`. Reproduced on Story #2813.
16
- *
17
- * Surface:
18
- * - {@link CONFLICTING_WORKFLOWS} / {@link COMPATIBLE_WORKFLOWS} —
19
- * frozen allowlists keyed by GitHub's built-in workflow `name`
20
- * field.
21
- * - {@link auditProjectWorkflows} — pure-ish (one GraphQL read) that
22
- * classifies the project's currently-enabled workflows and returns
23
- * a structured envelope.
24
- * - {@link reapConflictingWorkflows} — opt-in destructive helper
25
- * that issues `deleteProjectV2Workflow` for every entry in the
26
- * audit's `conflicting` set. Fails fast on the first mutation
27
- * error (no partial-reap state).
28
- *
29
- * GraphQL surface note:
30
- * `ProjectV2Workflow` exposes `enabled` as `NON_NULL` but **read-only**
31
- * — GraphQL ships no `updateProjectV2Workflow` mutation at the time
32
- * of this Story. The only programmatic action is
33
- * `deleteProjectV2Workflow`, which is irreversible from the API
34
- * (the operator must re-create deleted built-ins from the GitHub UI).
35
- * If GitHub later adds a toggle mutation, swap delete for toggle in
36
- * {@link reapConflictingWorkflows}.
6
+ * GraphQL exposes `enabled` read-only, so the only remedy is the irreversible
7
+ * `deleteProjectV2Workflow`; swap to a toggle if GitHub ever adds one.
37
8
  */
38
9
 
39
10
  import { resolveProjectMeta } from '../orchestration/project-meta-resolver.js';
40
11
 
41
- /**
42
- * Workflows that **must not** be enabled when the orchestrator owns
43
- * the Status column. Each entry writes Status as a side-effect of an
44
- * event the orchestrator already handles (close, PR merge, PR link),
45
- * and the bot's write typically arrives *after* the orchestrator's
46
- * — clobbering the intended terminal state.
47
- *
48
- * Names match GitHub's built-in `ProjectV2Workflow.name` literals.
49
- */
12
+ /** Built-ins whose Status writes clobber the orchestrator's; `ProjectV2Workflow.name` literals. */
50
13
  export const CONFLICTING_WORKFLOWS = Object.freeze([
51
14
  'Pull request merged',
52
15
  'Pull request linked to issue',
53
16
  ]);
54
17
 
55
- /**
56
- * Workflows that are safe to leave on. Either they don't touch the
57
- * Status column, or they touch it in a way the orchestrator's writes
58
- * agree with (`Item closed` sets Status to `Done`, which matches
59
- * `agent::done`).
60
- *
61
- * Surfaced informationally in the audit envelope so operators can see
62
- * what was inspected without re-querying.
63
- */
18
+ /** Built-ins that leave Status alone or agree with the orchestrator. */
64
19
  export const COMPATIBLE_WORKFLOWS = Object.freeze([
65
20
  'Item closed',
66
21
  'Item added to project',
@@ -91,10 +46,6 @@ const DELETE_WORKFLOW_MUTATION = `
91
46
  }`;
92
47
 
93
48
  /**
94
- * Classify a single workflow row against the allowlists.
95
- *
96
- * Pure helper — exported for test pinning.
97
- *
98
49
  * @param {{ name: string, enabled: boolean }} workflow
99
50
  * @returns {'conflicting'|'compatible'|'unknown'|'disabled-conflicting'|'disabled-other'}
100
51
  */
@@ -111,10 +62,6 @@ export function classifyWorkflow(workflow) {
111
62
  }
112
63
 
113
64
  /**
114
- * Query the project's built-in workflows and classify each one. Returns
115
- * a structured envelope the bootstrap step can render and the reap
116
- * helper can act on.
117
- *
118
65
  * @param {{
119
66
  * provider: { graphql: Function },
120
67
  * projectId: string,
@@ -163,15 +110,8 @@ export async function auditProjectWorkflows(args) {
163
110
  }
164
111
 
165
112
  /**
166
- * Delete every workflow in the audit's `conflicting` set. Fails fast on
167
- * the first mutation error — leaves the remaining workflows untouched
168
- * rather than producing a partially-reaped board, because the operator
169
- * cannot easily tell which workflows were deleted versus which were
170
- * preserved when looking at the post-failure board state.
171
- *
172
- * Returns the per-workflow outcome so callers can log a deterministic
173
- * summary even on partial success (the failure path will throw, but the
174
- * happy path returns the full ordered list for printing).
113
+ * Delete every conflicting workflow; fails fast, naming what was already
114
+ * deleted, since the board alone cannot tell the operator.
175
115
  *
176
116
  * @param {{
177
117
  * provider: { graphql: Function },
@@ -209,18 +149,8 @@ export async function reapConflictingWorkflows(args) {
209
149
  }
210
150
 
211
151
  /**
212
- * Resolve a Project v2 node id from a project number. Used by the
213
- * bootstrap CLI to convert the resolver's `projectNumber` into the node
214
- * id required by {@link auditProjectWorkflows}.
215
- *
216
- * Walks the shared owner-type ladder — `organization(login:$owner)` →
217
- * `user(login:$owner)` → `viewer` — via {@link resolveProjectMeta}, so an
218
- * **org-owned** board resolves here the same way it does for `ColumnSync`
219
- * (Story #4237). The owner login is read from `provider.projectOwner`
220
- * (explicit board owner) and falls back to `provider.owner` (the repo
221
- * owner) so org boards resolve even when no separate `projectOwner` is
222
- * configured. Returns `null` when no owner scope can see the project
223
- * (e.g. missing scope) so the caller can degrade gracefully.
152
+ * Walks the shared org → user → viewer ladder so org-owned boards resolve as
153
+ * they do for `ColumnSync`. `null` when no owner scope sees the project.
224
154
  *
225
155
  * @param {{
226
156
  * provider: { graphql: Function, owner?: string|null, projectOwner?: string|null },
@@ -254,9 +184,6 @@ export async function resolveProjectIdByNumber(args) {
254
184
  }
255
185
 
256
186
  /**
257
- * Render a human-readable summary line for the audit. Pure — exported
258
- * so the bootstrap CLI and tests share the same formatting.
259
- *
260
187
  * @param {Awaited<ReturnType<typeof auditProjectWorkflows>>} audit
261
188
  * @returns {string}
262
189
  */
@@ -1,27 +1,8 @@
1
1
  /**
2
- * branch-name-guard.js — Canonical branch-name safety assertion.
3
- *
4
- * Single source of truth for "is this string safe to forward to a `git`
5
- * subprocess as a branch name?". Consolidates the duplicated assertion
6
- * logic that previously lived in `git-branch-lifecycle.js` and
7
- * `git-branch-cleanup.js`, so the two sites cannot drift apart.
8
- *
9
- * The default check is the **union** of every assertion either previous
10
- * site performed:
11
- * - reject `null` / `undefined` / non-string values
12
- * - reject empty string
13
- * - reject any character outside `[a-zA-Z0-9._\-/]` (catches whitespace,
14
- * shell metacharacters, glob characters, etc.)
15
- * - reject leading `-` (would otherwise be parsed as a CLI flag by git,
16
- * even though the regex character class allows hyphens elsewhere)
17
- *
18
- * Callers performing destructive operations (`branch -D`, `push --delete`)
19
- * can opt into the protected-branch deny list by passing `{ protected: true }`,
20
- * which additionally rejects `main`, `master`, `HEAD`, and any name
21
- * starting with `refs/`.
22
- *
23
- * All exports are pure: they read no config, spawn no subprocesses, and
24
- * make no network calls.
2
+ * The one check that a string is safe to pass to `git` as a branch name:
3
+ * a non-empty string of `[a-zA-Z0-9._\-/]` with no leading `-` (git would
4
+ * read it as a flag). Destructive callers pass `{ protected: true }` to also
5
+ * reject `main`, `master`, `HEAD` and `refs/*`. Pure.
25
6
  */
26
7
 
27
8
  import { isSafeBranchComponent } from './dependency-parser.js';
@@ -1,27 +1,10 @@
1
1
  import { createGitInterface } from './git-utils.js';
2
2
 
3
3
  /**
4
- * Resolve the ONE git ref a step of the pre-push chain computes its
5
- * changed-file set against — the whole rule, stated once (Story #5365).
6
- *
7
- * **A ref the caller named wins; `crap.incrementalCoverage.baseRef` is the
8
- * default for a caller that named none, and `main` the default for neither.**
9
- * `.husky/pre-push` captures coverage at `--ref origin/main` and then previews
10
- * CRAP at `--changed-since origin/main`, and the preview only reads its own
11
- * tree when the artifact under it was captured over the same change set.
12
- * Letting the configured value outrank the named ref meant a consumer that set
13
- * `baseRef` captured one scope while the preview scored another — precisely
14
- * the stale-artifact read the capture-before-preview ordering (Story #5356)
15
- * closed. This repository sets no `baseRef`, so that divergence was invisible
16
- * locally and only a consumer who configured one would have paid for it.
17
- *
18
- * Callers that name no ref — the close-validation gate, whose argv carries no
19
- * `--ref` — still get the configured value, so the key keeps the meaning it
20
- * was added with.
21
- *
22
- * Every step that derives that change set calls this: both `coverage-capture`
23
- * paths and the preview's CRAP baseline join. A new consumer routes through it
24
- * rather than reading `baseRef` itself.
4
+ * The single rule for the ref a pre-push step diffs against: a named ref
5
+ * wins, then `crap.incrementalCoverage.baseRef`, then `main`. The named ref
6
+ * must win so coverage capture and the CRAP preview score the same change
7
+ * set. Every consumer routes through here rather than reading `baseRef`.
25
8
  *
26
9
  * @param {{ crap: object, ref: string | null | undefined }} opts
27
10
  * @returns {string}
@@ -31,19 +14,7 @@ export function resolveChangedFilesRef({ crap, ref }) {
31
14
  }
32
15
 
33
16
  /**
34
- * Parse the stdout from `git diff --name-only` into a normalized file list.
35
- * Trims whitespace, drops blank lines, and converts backslash separators to
36
- * forward slashes so set-membership checks line up with the paths produced by
37
- * `scanAndScore` and `calculateAll` on Windows checkouts.
38
- *
39
- * Pure; no I/O.
40
- *
41
- * Module-private since Story #4944. It was exported for
42
- * `diff-scope-cli.js#resolveDiffScopeFiles`, which the duplication-CLI
43
- * migration deleted; the three remaining callers all live in this file, so
44
- * exporting it now would ship a seam only the tests reach. Its behaviour is
45
- * covered through `diffNameOnly`, which returns this function's output
46
- * verbatim.
17
+ * Forward-slash separators so set membership matches scorer paths on Windows.
47
18
  *
48
19
  * @param {string | null | undefined} stdout
49
20
  * @returns {string[]}
@@ -58,30 +29,16 @@ function parseNameOnlyStdout(stdout) {
58
29
  }
59
30
 
60
31
  /**
61
- * Low-level helper: run `git diff --name-only <range>` and return the
62
- * forward-slash-normalised file list. Throws on non-zero git exit so callers
63
- * that must fail-closed can propagate the error; callers that prefer
64
- * best-effort behaviour wrap this in a try/catch.
65
- *
66
- * Accepts either a pre-built `range` string **or** `baseRef`+`headRef`
67
- * (assembled into `<baseRef>...<headRef>` when `threeDot` is true, or
68
- * `<baseRef>..<headRef>` otherwise). When both `range` and
69
- * `baseRef`/`headRef` are supplied, `range` takes precedence.
70
- *
71
- * The `gitSpawn` injection matches the signature used by `createGitInterface`:
72
- * `(cwd: string, ...gitArgs: string[]) => { status: number, stdout: string, stderr: string }`.
73
- * Production callers omit it (the default uses `createGitInterface({})`);
74
- * tests pass a stub.
32
+ * `git diff --name-only`; `range` wins over `baseRef`/`headRef`.
75
33
  *
76
34
  * @param {object} params
77
- * @param {string} [params.range] Pre-built range string (e.g. `"epic/3599...story-3636"`).
78
- * @param {string} [params.baseRef] Left-hand ref — used when `range` is absent.
79
- * @param {string} [params.headRef='HEAD'] Right-hand ref — used when `range` is absent.
80
- * @param {boolean} [params.threeDot=true] Use three-dot (`...`) merge-base semantics
81
- * when `range` is absent. Set to `false` for a two-dot direct diff.
35
+ * @param {string} [params.range]
36
+ * @param {string} [params.baseRef]
37
+ * @param {string} [params.headRef='HEAD']
38
+ * @param {boolean} [params.threeDot=true] Merge-base (`...`) semantics.
82
39
  * @param {string} [params.cwd=process.cwd()]
83
40
  * @param {((cwd: string, ...args: string[]) => { status: number, stdout: string, stderr: string }) | null} [params.gitSpawn]
84
- * @returns {string[]} Forward-slash-normalised repo-relative paths.
41
+ * @returns {string[]}
85
42
  * @throws {Error} When git exits non-zero.
86
43
  */
87
44
  export function diffNameOnly({
@@ -106,35 +63,16 @@ export function diffNameOnly({
106
63
  }
107
64
 
108
65
  /**
109
- * Resolve the list of files changed since `ref` relative to the current HEAD.
110
- *
111
- * Used by `check-crap.js` and `check-maintainability.js` to implement the
112
- * `--changed-since <ref>` diff-scoped mode — the quality gates limit both
113
- * scoring and comparison to this file set so the pre-push / PR CI feedback
114
- * loop stays fast on large consumer repos.
115
- *
116
- * Semantics:
117
- * - Runs `git diff --name-only <ref>...HEAD` so the comparison is against
118
- * the merge-base (three-dot range). This matches how GitHub computes the
119
- * "files changed" view for a PR and deliberately excludes anything that
120
- * was merged into the base branch after the PR branched off.
121
- * - Returns relative paths with forward-slash separators so set-membership
122
- * checks line up with the normalized paths produced by `scanAndScore` and
123
- * `calculateAll` on Windows checkouts.
124
- * - A non-zero git exit is surfaced as a thrown Error — `--changed-since`
125
- * must **never** silently degrade to "no regressions found"; that is the
126
- * entire reason the CLIs fail closed on a bad ref.
66
+ * Files changed on `ref...HEAD` (merge-base, like a PR's "files changed").
67
+ * Throws on a bad ref: `--changed-since` must never degrade to "no
68
+ * regressions found".
127
69
  *
128
70
  * @param {object} [params]
129
- * @param {string} [params.ref='main'] The ref to diff against.
130
- * @param {string} [params.cwd=process.cwd()] Repo working directory.
131
- * @param {ReturnType<typeof createGitInterface>} [params.git] Injected git
132
- * interface — production callers omit this; tests pass a mock.
133
- * @returns {string[]} Relative, forward-slash-normalized file paths. Order is
134
- * whatever `git diff --name-only` produces (stable per invocation).
135
- * @throws {Error} When git exits non-zero (unresolvable ref, corrupt repo,
136
- * etc.). The error message names the ref so the operator can react without
137
- * re-reading the CLI flags.
71
+ * @param {string} [params.ref='main']
72
+ * @param {string} [params.cwd=process.cwd()]
73
+ * @param {ReturnType<typeof createGitInterface>} [params.git]
74
+ * @returns {string[]}
75
+ * @throws {Error} When git exits non-zero.
138
76
  */
139
77
  export function getChangedFiles({
140
78
  ref = 'main',
@@ -152,43 +90,17 @@ export function getChangedFiles({
152
90
  return parseNameOnlyStdout(res.stdout);
153
91
  }
154
92
 
155
- /**
156
- * A full-length hex object id, as `git rev-parse` prints it. Used to reject
157
- * anything that is not a resolved commit — a stubbed git interface in a test
158
- * answers every `gitSpawn` with the same canned stdout, and a file list must
159
- * never be mistaken for a merge head.
160
- */
93
+ /** A full object id; rejects canned stub output posing as a merge head. */
161
94
  const OBJECT_ID_RE = /^[0-9a-f]{40}(?:[0-9a-f]{24})?$/;
162
95
 
163
96
  /**
164
- * Resolve the commit an in-progress merge is merging **in**, or `null` when no
165
- * merge is in progress.
166
- *
167
- * Story #5131. `git diff --cached` with no commit argument diffs the index
168
- * against `HEAD`, and during a merge `HEAD` is still the pre-merge tip — so a
169
- * base-sync merge commit (`git merge --no-edit origin/<base>`, which
170
- * `single-story-close`'s base-sync phase tells the operator to run by hand)
171
- * put every file the base branch had landed into the staged scope. The
172
- * pre-commit MI/CRAP gate then blocked the resolution commit for deltas
173
- * belonging to already-landed, already-gated work, with no remedy: the preview
174
- * is a delta against the baseline, not a baseline comparison, so no baseline
175
- * refresh could silence it.
176
- *
177
- * Two details are load-bearing:
97
+ * The commit an in-progress merge is merging in, or `null`. During a merge
98
+ * `HEAD` is the pre-merge tip, so a plain `--cached` diff would pull the base
99
+ * branch's landed work into the staged scope.
178
100
  *
179
- * - **Ask git, never the filesystem.** `.git` is a *file*, not a directory,
180
- * in the linked worktrees this repo delivers from, so an
181
- * `existsSync('.git/MERGE_HEAD')` probe would be silently inert exactly
182
- * where deliveries happen. `rev-parse --verify` resolves the ref through
183
- * git's own worktree-aware lookup.
184
- * - **`--verify` fails closed on an octopus merge.** It refuses a
185
- * `MERGE_HEAD` naming more than one head, which lands here as `null` — the
186
- * pre-#5131 behaviour. Narrowing the scope wrongly would hide a real
187
- * regression; widening it only restores the status quo.
188
- *
189
- * Never throws: a merge is either detectable or it is not, and an
190
- * undetectable one must degrade to the plain cached diff rather than fail the
191
- * gate.
101
+ * Ask git, never the filesystem: in a linked worktree `.git` is a file. An
102
+ * octopus `MERGE_HEAD` fails `--verify` and yields `null` (wider scope is
103
+ * safe; wrongly narrower would hide a regression). Never throws.
192
104
  *
193
105
  * @param {object} [params]
194
106
  * @param {string} [params.cwd=process.cwd()]
@@ -209,10 +121,6 @@ export function resolveMergeHead({ cwd = process.cwd(), git } = {}) {
209
121
  }
210
122
 
211
123
  /**
212
- * Read the index file list against an explicit base, shared by
213
- * `getStagedFiles` and `resolvePreviewScope` so the merge head is resolved
214
- * once per scope resolution rather than once per caller.
215
- *
216
124
  * @param {object} params
217
125
  * @param {string} params.cwd
218
126
  * @param {ReturnType<typeof createGitInterface>} params.git
@@ -231,21 +139,9 @@ function stagedFilesAgainst({ cwd, git, mergeHead }) {
231
139
  }
232
140
 
233
141
  /**
234
- * Resolve paths in the index (staged for commit). Used by `quality-preview
235
- * --staged` so pre-commit gates score only the commit payload, not unstaged
236
- * working-tree edits.
237
- *
238
- * Semantics:
239
- * - Runs `git diff --name-only --cached`, which diffs the index against
240
- * `HEAD`.
241
- * - **During a merge**, diffs the index against `MERGE_HEAD` instead
242
- * (Story #5131), so the scope is the merging branch's own contribution
243
- * plus its conflict resolutions — not the base branch's incoming work.
244
- * `git merge-base HEAD MERGE_HEAD` would *not* do: diffing the index
245
- * against the fork point re-admits everything the base branch landed since
246
- * it, which is the whole defect.
247
- * - Returns forward-slash-normalized repo-relative paths.
248
- * - Non-zero git exit throws — staged mode must not silently widen scope.
142
+ * Staged paths. During a merge the index is diffed against `MERGE_HEAD`, not
143
+ * the merge-base (which would re-admit everything the base landed since the
144
+ * fork). Throws on git failure rather than widen scope.
249
145
  *
250
146
  * @param {object} [params]
251
147
  * @param {string} [params.cwd=process.cwd()]
@@ -262,16 +158,8 @@ export function getStagedFiles({ cwd = process.cwd(), git } = {}) {
262
158
  }
263
159
 
264
160
  /**
265
- * Resolve the file set for quality-preview runners.
266
- *
267
- * When `staged` is true, only index paths are returned and `changedSinceRef`
268
- * is ignored. Otherwise a `changedSinceRef` limits to that three-dot diff;
269
- * when both are absent the caller runs in full-repo mode (`scopeSet: null`).
270
- *
271
- * In `staged` scope, `diffRef` carries the in-progress merge head when there
272
- * is one (Story #5131) and `null` otherwise, so a caller can tell the operator
273
- * *why* the scope narrowed. `scope` stays `'staged'` either way — the merge is
274
- * a property of the base the index is read against, not a different mode.
161
+ * `staged` wins over `changedSinceRef`; neither means full scope. In staged
162
+ * scope `diffRef` is the merge head, if any.
275
163
  *
276
164
  * @param {object} [params]
277
165
  * @param {boolean} [params.staged=false]
@@ -1,32 +1,12 @@
1
1
  /**
2
- * core-bare-clean — refuse-and-print blocker check.
3
- *
4
- * Asserts that `git config core.bare` on the main checkout is NOT set
5
- * to `true`. This guards the old failure mode where an `npm test` path
6
- * mis-set `core.bare=true` on the main checkout, after which
7
- * `single-story-close.js`'s post-rebase `git checkout` aborted with
8
- * `fatal: this operation must be run in a work tree`. `cleanGitEnv`
9
- * already lands the live fix; this check is the regression guard.
10
- *
11
- * Severity is `blocker` because single-story-close cannot recover on its own
12
- * — the operator must run `git config --unset core.bare` (or rely on
13
- * `cleanGitEnv` to do it before the rebase). The check is
14
- * refuse-and-print: the `fixCommand` is the literal unset, and the
15
- * operator runs it deliberately. We do not auto-fix because mutating
16
- * the parent repo's git config from a check is exactly the
17
- * "no commits to integration branches" cousin of the autoCorrect
18
- * disallowed list — config writes outside the local worktree boundary.
19
- *
20
- * Detection reads `state.git.coreBare`, the string returned by
21
- * `git config --get core.bare` (or `null` when unset). The check fires
22
- * when the string is the literal `'true'`.
2
+ * Blocks on `core.bare=true` in the main checkout, which aborts close's
3
+ * post-rebase checkout (`cleanGitEnv` is the live fix; this is the regression
4
+ * guard). Refuse-and-print: a check must not write config outside its worktree.
23
5
  */
24
6
  export default {
25
7
  id: 'core-bare-clean',
26
8
  severity: 'blocker',
27
- // 'npm-test' keeps the test-wrapper preflight's refusal claim true: a
28
- // poisoned shared config is caught before a suite (or N concurrent
29
- // /mandrel-deliver workers) inherits it, not only at close/retro time (#4580).
9
+ // 'npm-test' catches a poisoned shared config before a suite inherits it.
30
10
  scope: ['story-close', 'retro', 'npm-test'],
31
11
  autoCorrect: 'refuse-and-print',
32
12
  detect(state) {
@@ -1,49 +1,8 @@
1
1
  /**
2
- * checks/index.js — Discovery-based registry + runner for self-healing checks.
3
- *
4
- * This module is the single entry point for every consumer surface that
5
- * runs checks (preflight guards at `single-story-close.js` and
6
- * `mandrel-update-preflight.js`, the
7
- * `npm test` wrapper, the `diagnose.js` CLI viewer, and the retro hook in
8
- * `retro-runner.js`). Each surface calls `runChecks({ scope, autoFix, state })`
9
- * with its own scope and gets back `{ findings, fixed }`.
10
- *
11
- * Registry shape (each sibling module exports):
12
- *
13
- * {
14
- * id: string,
15
- * severity: 'blocker' | 'warning' | 'info',
16
- * scope: string[], // may include 'retro'
17
- * autoCorrect: 'auto' | 'refuse-and-print',
18
- * detect(state): Promise<Finding | null>,
19
- * fix?(state): Promise<{ ok: boolean, message: string }>,
20
- * }
21
- *
22
- * Invariants enforced here (defense-in-depth — see README for the full
23
- * contract):
24
- *
25
- * 1. `scope === 'retro'` is read-only. `runChecks({ scope: 'retro',
26
- * autoFix: true })` throws `'retro scope is read-only: autoFix must
27
- * be false'` before any check runs. The retro-runner relies on this
28
- * to keep retro stateless even if a future call site flips the flag.
29
- *
30
- * 2. `autoCorrect: 'refuse-and-print'` is hard-refusal. The runner will
31
- * NEVER invoke a check's `fix()` unless `autoCorrect === 'auto'`,
32
- * even if the check author later adds a `fix` body. This is what
33
- * makes new fix implementations harmless until their author also
34
- * opts in.
35
- *
36
- * 3. Phase split: `detect()` invocations fan out concurrently via
37
- * `Promise.all` (Story #2463 — preflight subprocess batching), while
38
- * `fix()` invocations remain strictly serial. `detect()` is
39
- * read-only against the frozen `assembleState` object, so concurrent
40
- * reads cannot race it; `fix()` may mutate the worktree, so its
41
- * ordering is preserved by walking the registry-ordered findings
42
- * array sequentially.
43
- *
44
- * Discovery happens once per process via `loadRegistry()`. The result is
45
- * cached; `clearRegistryCache()` is exported for tests that want to
46
- * exercise a different fixture directory.
2
+ * Discovery-based registry and runner for self-healing checks; every surface
3
+ * calls `runChecks({ scope, autoFix, state })`. Invariants: `retro` scope is
4
+ * read-only; `fix()` runs only when `autoCorrect === 'auto'`; `detect()` fans
5
+ * out concurrently, `fix()` stays serial.
47
6
  */
48
7
 
49
8
  import { readdirSync, statSync } from 'node:fs';
@@ -85,40 +44,24 @@ const __filename = fileURLToPath(import.meta.url);
85
44
  const __dirname = path.dirname(__filename);
86
45
 
87
46
  /**
88
- * Module-local registry cache. Keyed by the absolute directory it was
89
- * loaded from so tests with fixture directories don't poison the cache
90
- * for the real `lib/checks/` directory.
47
+ * Keyed by absolute directory so fixture registries never poison the real one.
91
48
  *
92
49
  * @type {Map<string, Check[]>}
93
50
  */
94
51
  const registryCache = new Map();
95
52
 
96
- /**
97
- * Module names that are part of the runner infrastructure, not checks.
98
- * `loadRegistry()` filters these out of the readdir scan.
99
- *
100
- * @type {Set<string>}
101
- */
53
+ /** @type {Set<string>} */
102
54
  const NON_CHECK_FILES = new Set(['index.js', 'state.js']);
103
55
 
104
- /**
105
- * Clear the registry cache. Tests call this between cases that load from
106
- * a fixture directory so a fresh registry is observed.
107
- */
108
56
  export function clearRegistryCache() {
109
57
  registryCache.clear();
110
58
  }
111
59
 
112
60
  /**
113
- * Load all check modules in a directory. Defaults to the directory this
114
- * module lives in (`lib/checks/`). Synchronously enumerates `.js` files,
115
- * filters out the runner infrastructure (`index.js`, `state.js`), and
116
- * dynamically imports each remaining file. Each module must default-export
117
- * a check object (see contract above).
61
+ * Import every check module in `dir`; each must default-export a {@link Check}.
118
62
  *
119
63
  * @param {object} [opts]
120
- * @param {string} [opts.dir] Override directory — used by tests to load
121
- * from a fixture directory.
64
+ * @param {string} [opts.dir]
122
65
  * @returns {Promise<Check[]>}
123
66
  */
124
67
  export async function loadRegistry({ dir = __dirname } = {}) {
@@ -130,10 +73,7 @@ export async function loadRegistry({ dir = __dirname } = {}) {
130
73
  try {
131
74
  entries = readdirSync(absDir);
132
75
  } catch {
133
- // No directory → empty registry. The runner is still callable; it just
134
- // returns `{ findings: [], fixed: [] }` for every scope. This is the
135
- // shape the diagnose viewer expects when invoked on a fresh checkout
136
- // before any check modules have been authored.
76
+ // No directory → empty registry, not an error.
137
77
  registryCache.set(absDir, []);
138
78
  return [];
139
79
  }
@@ -162,9 +102,6 @@ export async function loadRegistry({ dir = __dirname } = {}) {
162
102
  }
163
103
 
164
104
  /**
165
- * Look up a single check by id from the default registry. Returns
166
- * `undefined` if no check has that id.
167
- *
168
105
  * @param {string} id
169
106
  * @param {object} [opts]
170
107
  * @param {string} [opts.dir]
@@ -176,19 +113,12 @@ export async function getCheck(id, opts) {
176
113
  }
177
114
 
178
115
  /**
179
- * Run all checks matching `scope` against `state`. The retro-readonly and
180
- * refuse-and-print invariants are enforced here, not in the check
181
- * modules — see the JSDoc on the file for the rationale.
182
- *
183
116
  * @param {object} opts
184
- * @param {string} [opts.scope] Surface scope, e.g. 'story-close',
185
- * 'story-close', 'npm-test', 'retro', 'diagnose'. When omitted, every check runs.
186
- * @param {boolean} [opts.autoFix=false] Invoke `fix()` for checks with
187
- * `autoCorrect: 'auto'`. Forbidden when `scope === 'retro'`.
188
- * @param {object} opts.state Probed state from `assembleState()`.
189
- * @param {object} [opts.registry] Pre-loaded registry — bypasses
190
- * `loadRegistry()`. Used by tests with fixture checks.
191
- * @param {string} [opts.dir] Fixture directory for `loadRegistry`.
117
+ * @param {string} [opts.scope] Omitted runs every check.
118
+ * @param {boolean} [opts.autoFix=false] Forbidden when `scope === 'retro'`.
119
+ * @param {object} opts.state From `assembleState()`.
120
+ * @param {object} [opts.registry] Pre-loaded registry.
121
+ * @param {string} [opts.dir]
192
122
  * @returns {Promise<{ findings: Finding[], fixed: Array<Finding & { fixResult: FixResult }> }>}
193
123
  */
194
124
  export async function runChecks({
@@ -206,12 +136,8 @@ export async function runChecks({
206
136
  ? checks.filter((c) => Array.isArray(c.scope) && c.scope.includes(scope))
207
137
  : checks;
208
138
 
209
- // Phase 1 (read-only fan-out, Story #2463): run every `detect()` in
210
- // parallel via Promise.all. `state` is the frozen object returned by
211
- // `assembleState()`, so concurrent reads are race-free. Promise.all
212
- // preserves input order in its resolved array, so the
213
- // findings-by-registry-order contract that downstream consumers rely on
214
- // is upheld even though the detects themselves overlap in flight.
139
+ // `state` is frozen, so concurrent detects are race-free; Promise.all keeps
140
+ // registry order.
215
141
  const detected = await Promise.all(
216
142
  filtered.map((check) => Promise.resolve(check.detect(state))),
217
143
  );
@@ -221,16 +147,12 @@ export async function runChecks({
221
147
  /** @type {Array<Finding & { fixResult: FixResult }>} */
222
148
  const fixed = [];
223
149
 
224
- // Phase 2 (mutation-bearing serial pass): walk the registry-ordered
225
- // detection results and apply fix() one at a time. fix() may mutate the
226
- // worktree (delete branches, rewrite refs), so running it concurrently
227
- // would race those mutations and scramble logs.
150
+ // fix() mutates the worktree, so it runs serially.
228
151
  for (let i = 0; i < filtered.length; i += 1) {
229
152
  const check = filtered[i];
230
153
  const finding = detected[i];
231
154
  if (!finding) continue;
232
- // Invariant #2: refuse-and-print is hard-refusal — never invoke fix(),
233
- // regardless of whether the author defined one. The flag is the gate.
155
+ // refuse-and-print never runs fix(), even if one is defined.
234
156
  if (
235
157
  autoFix &&
236
158
  check.autoCorrect === 'auto' &&
@@ -241,8 +163,6 @@ export async function runChecks({
241
163
  fixed.push({ ...finding, fixResult: result });
242
164
  continue;
243
165
  }
244
- // fix() ran and failed → surface the finding as unfixed so the
245
- // operator sees both the original problem AND the failure detail.
246
166
  findings.push({
247
167
  ...finding,
248
168
  detail: [
@@ -260,9 +180,6 @@ export async function runChecks({
260
180
  }
261
181
 
262
182
  /**
263
- * Shape-validate a check module. Used by `loadRegistry()` to fail fast on
264
- * malformed modules rather than crashing later inside `runChecks()`.
265
- *
266
183
  * @param {unknown} candidate
267
184
  * @returns {candidate is Check}
268
185
  */