mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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,19 +1,20 @@
1
1
  import { createGitInterface } from './git-utils.js';
2
2
 
3
3
  /**
4
- * Parse the stdout from `git diff --name-only` into a normalized file list.
5
- * Trims whitespace, drops blank lines, and converts backslash separators to
6
- * forward slashes so set-membership checks line up with the paths produced by
7
- * `scanAndScore` and `calculateAll` on Windows checkouts.
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`.
8
8
  *
9
- * Pure; no I/O.
10
- *
11
- * Module-private since Story #4944. It was exported for
12
- * `diff-scope-cli.js#resolveDiffScopeFiles`, which the duplication-CLI
13
- * migration deleted; the three remaining callers all live in this file, so
14
- * exporting it now would ship a seam only the tests reach. Its behaviour is
15
- * covered through `diffNameOnly`, which returns this function's output
16
- * verbatim.
9
+ * @param {{ crap: object, ref: string | null | undefined }} opts
10
+ * @returns {string}
11
+ */
12
+ export function resolveChangedFilesRef({ crap, ref }) {
13
+ return ref ?? crap?.incrementalCoverage?.baseRef ?? 'main';
14
+ }
15
+
16
+ /**
17
+ * Forward-slash separators so set membership matches scorer paths on Windows.
17
18
  *
18
19
  * @param {string | null | undefined} stdout
19
20
  * @returns {string[]}
@@ -28,30 +29,16 @@ function parseNameOnlyStdout(stdout) {
28
29
  }
29
30
 
30
31
  /**
31
- * Low-level helper: run `git diff --name-only <range>` and return the
32
- * forward-slash-normalised file list. Throws on non-zero git exit so callers
33
- * that must fail-closed can propagate the error; callers that prefer
34
- * best-effort behaviour wrap this in a try/catch.
35
- *
36
- * Accepts either a pre-built `range` string **or** `baseRef`+`headRef`
37
- * (assembled into `<baseRef>...<headRef>` when `threeDot` is true, or
38
- * `<baseRef>..<headRef>` otherwise). When both `range` and
39
- * `baseRef`/`headRef` are supplied, `range` takes precedence.
40
- *
41
- * The `gitSpawn` injection matches the signature used by `createGitInterface`:
42
- * `(cwd: string, ...gitArgs: string[]) => { status: number, stdout: string, stderr: string }`.
43
- * Production callers omit it (the default uses `createGitInterface({})`);
44
- * tests pass a stub.
32
+ * `git diff --name-only`; `range` wins over `baseRef`/`headRef`.
45
33
  *
46
34
  * @param {object} params
47
- * @param {string} [params.range] Pre-built range string (e.g. `"epic/3599...story-3636"`).
48
- * @param {string} [params.baseRef] Left-hand ref — used when `range` is absent.
49
- * @param {string} [params.headRef='HEAD'] Right-hand ref — used when `range` is absent.
50
- * @param {boolean} [params.threeDot=true] Use three-dot (`...`) merge-base semantics
51
- * 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.
52
39
  * @param {string} [params.cwd=process.cwd()]
53
40
  * @param {((cwd: string, ...args: string[]) => { status: number, stdout: string, stderr: string }) | null} [params.gitSpawn]
54
- * @returns {string[]} Forward-slash-normalised repo-relative paths.
41
+ * @returns {string[]}
55
42
  * @throws {Error} When git exits non-zero.
56
43
  */
57
44
  export function diffNameOnly({
@@ -76,35 +63,16 @@ export function diffNameOnly({
76
63
  }
77
64
 
78
65
  /**
79
- * Resolve the list of files changed since `ref` relative to the current HEAD.
80
- *
81
- * Used by `check-crap.js` and `check-maintainability.js` to implement the
82
- * `--changed-since <ref>` diff-scoped mode — the quality gates limit both
83
- * scoring and comparison to this file set so the pre-push / PR CI feedback
84
- * loop stays fast on large consumer repos.
85
- *
86
- * Semantics:
87
- * - Runs `git diff --name-only <ref>...HEAD` so the comparison is against
88
- * the merge-base (three-dot range). This matches how GitHub computes the
89
- * "files changed" view for a PR and deliberately excludes anything that
90
- * was merged into the base branch after the PR branched off.
91
- * - Returns relative paths with forward-slash separators so set-membership
92
- * checks line up with the normalized paths produced by `scanAndScore` and
93
- * `calculateAll` on Windows checkouts.
94
- * - A non-zero git exit is surfaced as a thrown Error — `--changed-since`
95
- * must **never** silently degrade to "no regressions found"; that is the
96
- * 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".
97
69
  *
98
70
  * @param {object} [params]
99
- * @param {string} [params.ref='main'] The ref to diff against.
100
- * @param {string} [params.cwd=process.cwd()] Repo working directory.
101
- * @param {ReturnType<typeof createGitInterface>} [params.git] Injected git
102
- * interface — production callers omit this; tests pass a mock.
103
- * @returns {string[]} Relative, forward-slash-normalized file paths. Order is
104
- * whatever `git diff --name-only` produces (stable per invocation).
105
- * @throws {Error} When git exits non-zero (unresolvable ref, corrupt repo,
106
- * etc.). The error message names the ref so the operator can react without
107
- * 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.
108
76
  */
109
77
  export function getChangedFiles({
110
78
  ref = 'main',
@@ -122,43 +90,17 @@ export function getChangedFiles({
122
90
  return parseNameOnlyStdout(res.stdout);
123
91
  }
124
92
 
125
- /**
126
- * A full-length hex object id, as `git rev-parse` prints it. Used to reject
127
- * anything that is not a resolved commit — a stubbed git interface in a test
128
- * answers every `gitSpawn` with the same canned stdout, and a file list must
129
- * never be mistaken for a merge head.
130
- */
93
+ /** A full object id; rejects canned stub output posing as a merge head. */
131
94
  const OBJECT_ID_RE = /^[0-9a-f]{40}(?:[0-9a-f]{24})?$/;
132
95
 
133
96
  /**
134
- * Resolve the commit an in-progress merge is merging **in**, or `null` when no
135
- * merge is in progress.
136
- *
137
- * Story #5131. `git diff --cached` with no commit argument diffs the index
138
- * against `HEAD`, and during a merge `HEAD` is still the pre-merge tip — so a
139
- * base-sync merge commit (`git merge --no-edit origin/<base>`, which
140
- * `single-story-close`'s base-sync phase tells the operator to run by hand)
141
- * put every file the base branch had landed into the staged scope. The
142
- * pre-commit MI/CRAP gate then blocked the resolution commit for deltas
143
- * belonging to already-landed, already-gated work, with no remedy: the preview
144
- * is a delta against the baseline, not a baseline comparison, so no baseline
145
- * refresh could silence it.
146
- *
147
- * 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.
148
100
  *
149
- * - **Ask git, never the filesystem.** `.git` is a *file*, not a directory,
150
- * in the linked worktrees this repo delivers from, so an
151
- * `existsSync('.git/MERGE_HEAD')` probe would be silently inert exactly
152
- * where deliveries happen. `rev-parse --verify` resolves the ref through
153
- * git's own worktree-aware lookup.
154
- * - **`--verify` fails closed on an octopus merge.** It refuses a
155
- * `MERGE_HEAD` naming more than one head, which lands here as `null` — the
156
- * pre-#5131 behaviour. Narrowing the scope wrongly would hide a real
157
- * regression; widening it only restores the status quo.
158
- *
159
- * Never throws: a merge is either detectable or it is not, and an
160
- * undetectable one must degrade to the plain cached diff rather than fail the
161
- * 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.
162
104
  *
163
105
  * @param {object} [params]
164
106
  * @param {string} [params.cwd=process.cwd()]
@@ -179,10 +121,6 @@ export function resolveMergeHead({ cwd = process.cwd(), git } = {}) {
179
121
  }
180
122
 
181
123
  /**
182
- * Read the index file list against an explicit base, shared by
183
- * `getStagedFiles` and `resolvePreviewScope` so the merge head is resolved
184
- * once per scope resolution rather than once per caller.
185
- *
186
124
  * @param {object} params
187
125
  * @param {string} params.cwd
188
126
  * @param {ReturnType<typeof createGitInterface>} params.git
@@ -201,21 +139,9 @@ function stagedFilesAgainst({ cwd, git, mergeHead }) {
201
139
  }
202
140
 
203
141
  /**
204
- * Resolve paths in the index (staged for commit). Used by `quality-preview
205
- * --staged` so pre-commit gates score only the commit payload, not unstaged
206
- * working-tree edits.
207
- *
208
- * Semantics:
209
- * - Runs `git diff --name-only --cached`, which diffs the index against
210
- * `HEAD`.
211
- * - **During a merge**, diffs the index against `MERGE_HEAD` instead
212
- * (Story #5131), so the scope is the merging branch's own contribution
213
- * plus its conflict resolutions — not the base branch's incoming work.
214
- * `git merge-base HEAD MERGE_HEAD` would *not* do: diffing the index
215
- * against the fork point re-admits everything the base branch landed since
216
- * it, which is the whole defect.
217
- * - Returns forward-slash-normalized repo-relative paths.
218
- * - 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.
219
145
  *
220
146
  * @param {object} [params]
221
147
  * @param {string} [params.cwd=process.cwd()]
@@ -232,16 +158,8 @@ export function getStagedFiles({ cwd = process.cwd(), git } = {}) {
232
158
  }
233
159
 
234
160
  /**
235
- * Resolve the file set for quality-preview runners.
236
- *
237
- * When `staged` is true, only index paths are returned and `changedSinceRef`
238
- * is ignored. Otherwise a `changedSinceRef` limits to that three-dot diff;
239
- * when both are absent the caller runs in full-repo mode (`scopeSet: null`).
240
- *
241
- * In `staged` scope, `diffRef` carries the in-progress merge head when there
242
- * is one (Story #5131) and `null` otherwise, so a caller can tell the operator
243
- * *why* the scope narrowed. `scope` stays `'staged'` either way — the merge is
244
- * 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.
245
163
  *
246
164
  * @param {object} [params]
247
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
  */