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,18 +1,7 @@
1
1
  // .agents/scripts/lib/close-validation/projections/maintainability.js
2
2
  /**
3
- * maintainability.js — pre-merge MI ceiling projection helper.
4
- *
5
- * Extracted from close-validation.js (Story #1850) and refactored to use
6
- * the shared `validateProjectionInputs` predicate so the guard cascade
7
- * lives in exactly one place. Public contract is unchanged — the parent
8
- * `close-validation.js` re-exports this function and every existing call
9
- * site continues to import from there.
10
- *
11
- * The projection is advisory only: story-close logs it before the merge
12
- * runs so the operator sees, by name, the files that would breach their
13
- * per-file MI baseline post-merge and can ship a `baseline-refresh:`
14
- * commit atomically with the Story PR. The hard MI gate still runs at
15
- * pre-push time.
3
+ * Advisory pre-merge MI projection: names files that would breach their
4
+ * per-file baseline so a `baseline-refresh:` commit can ship with the PR.
16
5
  */
17
6
 
18
7
  import { getBaseline } from '../../baselines/maintainability-baseline-io.js';
@@ -22,16 +11,11 @@ import { gitSpawn as defaultGitSpawn } from '../../git-utils.js';
22
11
  import { calculateForSource } from '../../maintainability-engine.js';
23
12
  import { MISSING_ARG_REASONS, validateProjectionInputs } from './inputs.js';
24
13
 
25
- /**
26
- * Default tolerance shared with check-maintainability.js: small floating-
27
- * point variances must not register as a regression.
28
- */
14
+ /** Absorbs floating-point noise. */
29
15
  export const DEFAULT_MI_TOLERANCE = 0.001;
30
16
 
31
17
  /**
32
- * Map the predicate's fine-grained `missing-*` reason to the historical
33
- * `missing-args` skipped-reason so the public contract of
34
- * `projectMaintainabilityRegressions` is preserved byte-for-byte.
18
+ * Collapse `missing-*` to the public `missing-args` reason.
35
19
  *
36
20
  * @param {string} reason
37
21
  * @returns {string}
@@ -41,10 +25,8 @@ function normaliseSkipReason(reason) {
41
25
  }
42
26
 
43
27
  /**
44
- * Refresh `origin/<baseBranch>` so the diff range resolves even when the
45
- * close script hasn't reached its own pull/rebase step yet. Routed through
46
- * the shared `(cwd, ref, windowMs)` cache so a story-init fetch in the same
47
- * wave satisfies the projection without re-hitting origin.
28
+ * Close may not have base-synced yet; the fetch cache makes this free when
29
+ * story-init already fetched.
48
30
  *
49
31
  * @param {string} cwd
50
32
  * @param {string} baseBranch
@@ -65,10 +47,6 @@ function refreshEpicRef(cwd, baseBranch, git) {
65
47
  }
66
48
 
67
49
  /**
68
- * Run `git diff --name-only` against the epic-branch fork point and parse
69
- * the changed-files list. Normalises Windows-style backslash paths to
70
- * forward slashes so the baseline lookup is platform-agnostic.
71
- *
72
50
  * @param {{ cwd: string, baseBranch: string, storyBranch: string, git: { gitSpawn: typeof defaultGitSpawn } }} opts
73
51
  * @returns {{ ok: true, files: string[] } | { ok: false, detail: string }}
74
52
  */
@@ -86,10 +64,7 @@ function diffChangedFiles({ cwd, baseBranch, storyBranch, git }) {
86
64
  }
87
65
 
88
66
  /**
89
- * Score a single changed file and return a regression record when the
90
- * projected MI breaches `baselineScore - tolerance`. Returns `null` when
91
- * the file is non-JS, absent from baseline, deleted on the story branch,
92
- * or within tolerance.
67
+ * `null` when deleted on the story branch or within tolerance.
93
68
  *
94
69
  * @param {{
95
70
  * cwd: string,
@@ -124,8 +99,6 @@ function scoreFile({
124
99
  }
125
100
 
126
101
  /**
127
- * Walk the changed-files list and collect regression records.
128
- *
129
102
  * @param {{
130
103
  * cwd: string,
131
104
  * storyBranch: string,
@@ -166,27 +139,9 @@ function collectRegressions({
166
139
  }
167
140
 
168
141
  /**
169
- * Project the post-merge maintainability scores for every file changed on
170
- * the Story branch relative to the Epic branch, and return the subset whose
171
- * projected score breaches the per-file baseline ceiling.
172
- *
173
- * Advisory only — the result is rendered as a log line by story-close
174
- * before the merge runs. The hard MI gate still runs at pre-push time via
175
- * the husky hook. The point of this projection is to surface the breach
176
- * **before** the merge so the operator can ship a `baseline-refresh:`
177
- * commit atomically with the Story PR rather than as a follow-on after the
178
- * push.
179
- *
180
- * The "post-merge body" of each file is approximated by the file content
181
- * at the tip of the Story branch — a `--no-ff` merge into the Epic branch
182
- * does not modify file contents, so this is exact when the merge applies
183
- * cleanly and a close-enough projection when it auto-resolves minor
184
- * conflicts.
185
- *
186
- * The helper never throws and never has side effects beyond running `git`
187
- * subcommands via the injected interface. Any failure path resolves to
188
- * `{ ok: true, regressions: [], skipped: '<reason>' }` so the caller
189
- * treats the advisory as best-effort.
142
+ * Scores each changed file's content at the Story branch tip (exact for a
143
+ * clean merge). Never throws; failures resolve to
144
+ * `{ ok: true, regressions: [], skipped }`.
190
145
  *
191
146
  * @param {{
192
147
  * cwd: string,
@@ -261,9 +216,7 @@ export function projectMaintainabilityRegressions({
261
216
  }
262
217
 
263
218
  /**
264
- * Render the pre-merge MI advisory as a human-readable multi-line log
265
- * block. Returns `null` when there are no regressions to surface so
266
- * callers can `if` past the log call without a string-empty check.
219
+ * `null` when there is nothing to surface.
267
220
  *
268
221
  * @param {ReturnType<typeof projectMaintainabilityRegressions>} result
269
222
  * @returns {string | null}
@@ -1,13 +1,10 @@
1
1
  /**
2
- * close-validation/runner.js — The `runCloseValidation` orchestrator.
3
- *
4
- * Runs typecheck, lint, test, format check, and maintainability/coverage/
5
- * CRAP regression checks before the story merge so drift is caught in the
6
- * worktree rather than at pre-push time on the Epic branch. All gates
7
- * inherit stdio so the operator sees the raw output; the returned summary
8
- * surfaces actionable hints on failure.
2
+ * Runs the close gates (typecheck, lint, test, format, baselines) in the
3
+ * Story worktree before merge; the summary carries failure hints.
9
4
  */
10
5
 
6
+ import { getQuality } from '../config/quality.js';
7
+ import { FULL_SUITE_LOCK_EXPIRY_ENV } from '../full-suite-lock.js';
11
8
  import { gitSpawn } from '../git-utils.js';
12
9
  import {
13
10
  recordPass as defaultRecordPass,
@@ -27,10 +24,7 @@ import { defaultGetHeadSha } from './projections/head-sha.js';
27
24
  /** @typedef {import('./gates.js').Gate} Gate */
28
25
 
29
26
  function applyChangedFileScope({ gate, spawnCwd, log }) {
30
- // Story #5278 — a skip the gate list already decided (the coverage-capture
31
- // gate whose incremental skip is known to fire). Honoured before anything
32
- // else so the gate is recorded as `skipped` with its real reason rather
33
- // than spawned to discover the same thing minutes later.
27
+ // A skip decided when the gate list was built wins over everything.
34
28
  if (gate.skip) {
35
29
  log(`[close-validation] ⏭ ${gate.name} skipped (${gate.skip.reason})`);
36
30
  return {
@@ -48,11 +42,7 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
48
42
  cwd: spawnCwd,
49
43
  baseRef: gate.changedFileScope.baseRef,
50
44
  });
51
- // Filter to the formatter-eligible subset before deciding to skip. A
52
- // non-empty diff that contains zero formatter-eligible files (e.g. a
53
- // docs-only Story) must take the skip path, not invoke biome with only
54
- // ineligible paths — biome reports "No files were processed" and exits 1
55
- // in that case (Story #3410).
45
+ // Biome exits 1 ("No files were processed") on only-ineligible paths.
56
46
  const eligibleFiles = changedFiles.filter(isFormatterEligible);
57
47
  if (eligibleFiles.length === 0) {
58
48
  log(
@@ -67,12 +57,8 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
67
57
  log(
68
58
  `[close-validation] ↳ ${gate.name} scoped to ${eligibleFiles.length} formatter-eligible changed file(s) from ${gate.changedFileScope.baseRef}...HEAD`,
69
59
  );
70
- // The extension filter cannot see biome's own config-ignore axis
71
- // (`files.includes` allowlist / `files.ignore` / `overrides`). When every
72
- // eligible-by-extension path is also config-ignored, the scoped biome
73
- // invocation exits 1 with "No files were processed" — a false negative for
74
- // the gate (Story #4292). Flag the scoped run so the runner downgrades that
75
- // specific exit to a clean skip instead of a formatting failure.
60
+ // The extension filter cannot see biome's config ignores; if every path is
61
+ // config-ignored biome exits 1 "No files were processed" — downgrade that.
76
62
  return {
77
63
  gate,
78
64
  cmd: gate.cmd,
@@ -83,38 +69,12 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
83
69
  }
84
70
 
85
71
  /**
86
- * Run every gate sequentially. Stops collecting after the first failure but
87
- * still returns a summary so the caller decides how to surface the result.
88
- *
89
- * Worktree locality (Story #1120): when `worktreePath` is supplied, every
90
- * gate runner is spawned with `cwd: worktreePath` so the gate sees the
91
- * Story branch's post-rebase tree. Evidence reads/writes still key against
92
- * `cwd` (the main checkout) because the temp tree lives under the main
93
- * `.git/`. Failure messages name the worktree path.
94
- *
95
- * Evidence-aware: when `storyId` is provided alongside `standalone: true`,
96
- * and `useEvidence !== false`, each gate consults
97
- * `validation-evidence.shouldSkip()` against current HEAD + the gate's
98
- * command-config hash. A matching record skips the gate; a successful run
99
- * is recorded so the next caller in the local hot path can skip in turn.
100
- *
101
- * Standalone keyspace (Story #4250): `standalone: true` routes the evidence
102
- * file to the storyId-anchored
103
- * `<tempRoot>/standalone/stories/story-<id>/validation-evidence.json`
104
- * keyspace. v2.0.0 removed the Epic tier and its Epic-keyed keyspace.
105
- *
106
- * `onGateStart` is invoked immediately before each gate's runner spawn, so a
107
- * caller can record per-gate wall-clock telemetry. Errors thrown from the
108
- * hook propagate.
109
- *
110
- * Projection advisories (Story #4776): when `baseBranch` and `storyBranch`
111
- * are both supplied and every gate passed, the maintainability and CRAP
112
- * pre-merge projections run through `projections/advisories.js` and log
113
- * their advisories to the same `log` sink the gates use. They are advisory
114
- * by construction — the returned `ok` is decided entirely by the gates, so
115
- * a projected breach never fails a close. They are skipped after a gate
116
- * failure, where the operator needs the failing gate's evidence, not a
117
- * baseline-refresh nudge.
72
+ * Independent gates run in parallel (first failure aborts the rest), then
73
+ * serial gates in order, stopping at the first failure. Gates spawn in
74
+ * `worktreePath`; evidence is keyed to `cwd` (main checkout). With
75
+ * `storyId` + `standalone`, a matching evidence record skips a gate and a
76
+ * pass is recorded. Projection advisories run only after every gate passes
77
+ * and never affect `ok`. `onGateStart` errors propagate.
118
78
  *
119
79
  * @param {{
120
80
  * cwd: string,
@@ -135,7 +95,9 @@ function applyChangedFileScope({ gate, spawnCwd, log }) {
135
95
  * getTreeFingerprint?: (cwd: string) => string|null,
136
96
  * recordPass?: typeof defaultRecordPass,
137
97
  * shouldSkip?: typeof defaultShouldSkip,
138
- * }} opts
98
+ * deferOnLockExpiry?: boolean,
99
+ * }} opts `deferOnLockExpiry`: an expired full-suite lock wait spawns
100
+ * nothing (here or in any gate child) and reports `LOCK_WAIT_EXPIRED_EXIT_CODE`.
139
101
  * @returns {{ ok: boolean, failed: Array<{ gate: Gate, status: number, cwd: string }>, skipped: Array<{ gate: Gate, reason: string }> }}
140
102
  */
141
103
  export async function runCloseValidation({
@@ -158,32 +120,20 @@ export async function runCloseValidation({
158
120
  defaultTreeFingerprint(resolvedCwd, gitSpawn),
159
121
  recordPass = defaultRecordPass,
160
122
  shouldSkip = defaultShouldSkip,
123
+ deferOnLockExpiry = false,
161
124
  } = {}) {
162
125
  const failed = [];
126
+ const lockOpts = fullSuiteLockOptions({ config, deferOnLockExpiry });
163
127
  const skipped = [];
164
- // Evidence is active when a Story id is present AND there is a keyspace to
165
- // anchor on (`standalone: true` — Story #4250's storyId-anchored
166
- // keyspace, now the only one).
167
128
  const evidenceActive = useEvidence && storyId != null && standalone;
168
129
  const evidenceStoreOpts = { cwd, standalone };
169
- // Evidence keys against the main checkout's HEAD because the evidence
170
- // file lives under the main `.git/`. Gate spawn, in contrast,
171
- // runs in the worktree when one is supplied — that's the whole point of
172
- // Story #1120.
173
130
  const spawnCwd = worktreePath ?? cwd;
174
131
  const headSha = evidenceActive ? getHeadSha(spawnCwd) : null;
175
- // Story #5278 — one tree fingerprint for the whole run, not one per gate.
176
- // Every gate here reads the same working tree, so an identical tree means
177
- // identical inputs for all of them; a per-gate scope would be narrower but
178
- // would have to model each gate's read set, and being wrong about that
179
- // grants a skip the gate did not earn. A gate that carries its own
132
+ // One whole-tree fingerprint for every gate: a per-gate read set that is
133
+ // modelled wrong would grant a skip the gate did not earn. A gate's own
180
134
  // `inputFingerprint` still wins.
181
135
  const treeSha = evidenceActive ? getTreeFingerprint(spawnCwd) : null;
182
136
 
183
- // Helper closures so the parallel and serial passes share evidence
184
- // bookkeeping bit-for-bit.
185
-
186
- /** Returns a `{ skip: true }` verdict when evidence makes the gate redundant. */
187
137
  const evidenceVerdict = (gate, configHash) => {
188
138
  if (!(evidenceActive && headSha)) return { skip: false };
189
139
  const verdict = shouldSkip(
@@ -230,13 +180,7 @@ export async function runCloseValidation({
230
180
  };
231
181
 
232
182
  /**
233
- * Run a single gate. When `gate.run` is a function the gate executes
234
- * **in process** (Story #1973 / Task #1984 — per-kind baseline gates
235
- * removed their `child_process.spawn(node check-<kind>.js)` arm and
236
- * call `compare(head, base)` directly). The `run` callable receives
237
- * the same `(cmd, args, opts)` argv shape as `runner` so it slots into
238
- * the existing contract without churn at the runner boundary.
239
- * Otherwise the supplied `runner` is used (default: spawn).
183
+ * A `gate.run` function executes in process with the `runner` signature.
240
184
  *
241
185
  * @returns {Promise<{ status: number }>}
242
186
  */
@@ -251,13 +195,9 @@ export async function runCloseValidation({
251
195
  gateName: gate.name,
252
196
  log,
253
197
  signal,
254
- ...(gate.env ? { env: gate.env } : {}),
255
- // Story #5278 — only the full-suite gate can end up *waiting* on the
256
- // host lock, and only it is expensive enough for the wait to change the
257
- // answer: whoever we queued behind may have deposited this gate's
258
- // evidence while we sat there. Re-asking the same question the runner
259
- // asked before the wait is the whole mechanism; a `{ status: 0 }`
260
- // stands in for the spawn.
198
+ ...lockOpts.forGate(gate),
199
+ // Whoever held the full-suite lock may have deposited this gate's
200
+ // evidence meanwhile; re-check after the wait instead of spawning.
261
201
  ...(gate.fullSuiteLock && configHash
262
202
  ? {
263
203
  skipIfSatisfied: () =>
@@ -266,10 +206,7 @@ export async function runCloseValidation({
266
206
  : undefined,
267
207
  }
268
208
  : {}),
269
- // Story #5173 — forwarded unconditionally (never a conditional spread
270
- // like the two below): `defaultGateRunner` already treats a falsy value
271
- // as "no lock", so a branch here would only add a decision point to the
272
- // hottest function in this file.
209
+ // Unconditional: the runner treats falsy as "no lock".
273
210
  fullSuiteLock: gate.fullSuiteLock,
274
211
  ...(gate.tolerateNoFilesProcessed
275
212
  ? { tolerateNoFilesProcessed: true }
@@ -280,11 +217,8 @@ export async function runCloseValidation({
280
217
 
281
218
  const { independent, serial } = partitionGates(gates);
282
219
 
283
- // ── Phase 1: independent gates in parallel ──────────────────────────
284
- // First non-zero exit pins `firstFailure` and aborts every in-flight
285
- // sibling via SIGTERM. Other gates' results are still awaited (so we
286
- // never leak children) but their non-zero status is intentionally
287
- // dropped: only one error surfaces.
220
+ // Phase 1. The first failure aborts siblings; they are still awaited (no
221
+ // leaked children) but only one error surfaces.
288
222
  const ac = new AbortController();
289
223
  let firstIndepFailure = null;
290
224
 
@@ -363,7 +297,6 @@ export async function runCloseValidation({
363
297
  return { ok: false, failed, skipped };
364
298
  }
365
299
 
366
- // ── Phase 2: serial gates in declared order ─────────────────────────
367
300
  await runSerialGates(serial, {
368
301
  spawnCwd,
369
302
  log,
@@ -376,10 +309,6 @@ export async function runCloseValidation({
376
309
  dispatchGate,
377
310
  });
378
311
 
379
- // ── Phase 3: advisory projections ───────────────────────────────────
380
- // Story #4776 — the projection layer's live call site. Deliberately
381
- // outside the `ok` computation: a projected breach informs, it never
382
- // fails a close.
383
312
  if (failed.length === 0) {
384
313
  await runAdvisoryProjections({
385
314
  runProjections,
@@ -395,13 +324,31 @@ export async function runCloseValidation({
395
324
  }
396
325
 
397
326
  /**
398
- * Phase 2 helper — run the serial gates in declared order, stopping at the
399
- * first failure. Extracted from `runCloseValidation` (Story #4926); the
400
- * evidence bookkeeping stays bit-identical to the parallel pass because both
401
- * call the same injected `evidenceVerdict` / `recordIfActive` closures.
327
+ * The `fullSuiteLock` gate shares coverage capture's timeout so a hung suite
328
+ * fails instead of holding the host lock. Under `deferOnLockExpiry` every
329
+ * gate child inherits the defer opt-in via env.
402
330
  *
403
- * Mutates the caller's `failed` / `skipped` accumulators — the same arrays
404
- * Phase 1 already wrote into, so the returned verdict stays one list.
331
+ * @param {{ config: object|null, deferOnLockExpiry: boolean }} args
332
+ * @returns {{ forGate: (gate: object) => object }}
333
+ */
334
+ function fullSuiteLockOptions({ config, deferOnLockExpiry }) {
335
+ const timeoutMs = getQuality(config).coverage?.timeoutMs;
336
+ const deferEnv = deferOnLockExpiry
337
+ ? { [FULL_SUITE_LOCK_EXPIRY_ENV]: 'defer' }
338
+ : null;
339
+ return {
340
+ forGate(gate) {
341
+ const env = deferEnv ? { ...gate.env, ...deferEnv } : gate.env;
342
+ return {
343
+ ...(env ? { env } : {}),
344
+ ...(gate.fullSuiteLock ? { timeoutMs, deferOnLockExpiry } : {}),
345
+ };
346
+ },
347
+ };
348
+ }
349
+
350
+ /**
351
+ * Mutates the caller's `failed` / `skipped` accumulators.
405
352
  *
406
353
  * @param {Array<object>} serial
407
354
  * @param {object} deps
@@ -484,11 +431,7 @@ async function runSerialGates(
484
431
  }
485
432
 
486
433
  /**
487
- * Phase 3 helper — run the advisory projections, absorbing every failure.
488
- *
489
- * No-ops without a branch pair to diff (resume / legacy callers), and can
490
- * never influence the close verdict: the caller has already decided `ok`
491
- * before this runs, and a throw here is logged, not propagated.
434
+ * No-op without a branch pair; a throw is logged, never propagated.
492
435
  *
493
436
  * @param {{
494
437
  * runProjections: typeof defaultRunProjections,
@@ -1,24 +1,8 @@
1
- // .agents/scripts/lib/command-header.js
2
- /**
3
- * Pure helper for projecting workflow `.md` files into slash commands:
4
- * injects the AUTO-GENERATED provenance header without disturbing YAML
5
- * frontmatter placement.
6
- *
7
- * Kept as its own module (rather than inline in `sync-claude-commands.js`,
8
- * which runs its sync at import time via top-level await) so it can be unit
9
- * tested directly.
10
- */
1
+ /** Helpers for projecting workflow `.md` files into slash commands. */
11
2
 
12
3
  /**
13
- * Inject `header` into a workflow's `content`. When the source begins with a
14
- * YAML frontmatter block, the header is inserted **after** the closing `---`
15
- * so the frontmatter stays on line 1; sources without frontmatter keep the
16
- * header prepended verbatim.
17
- *
18
- * Claude Code only parses a command's frontmatter (its `description`) when the
19
- * `---` block is the very first thing in the file. Prepending the HTML comment
20
- * above it made `claude plugin validate` report "No frontmatter block found"
21
- * for every command and silently dropped all descriptions.
4
+ * Insert `header` after any YAML frontmatter: Claude Code only parses
5
+ * frontmatter that starts on line 1.
22
6
  *
23
7
  * @param {string} content - Raw workflow `.md` content.
24
8
  * @param {string} header - Provenance header to inject (typically ends `\n\n`).
@@ -33,15 +17,9 @@ export function applyHeader(content, header) {
33
17
  }
34
18
 
35
19
  /**
36
- * True when a workflow opts out of slash-command projection via a
37
- * `command: false` key in its YAML frontmatter (#4482). Used for dual-use
38
- * lens files (e.g. `audit-security.md`) that stay in
39
- * the payload as `/mandrel-deliver` audit-suite prompts but must NOT surface as
40
- * standalone slash commands because the host ships a native equivalent.
41
- *
42
- * Both `sync-claude-commands.js` (projection + orphan-reap) and the
43
- * `commands-in-sync` doctor check (parity expectation) consult this flag so
44
- * an excluded workflow never reads as "not synced".
20
+ * `command: false` in frontmatter opts a workflow out of slash-command
21
+ * projection (e.g. a lens the host ships natively). The sync and the doctor
22
+ * parity check both honour it.
45
23
  *
46
24
  * @param {string} content - Raw workflow `.md` content.
47
25
  * @returns {boolean}
@@ -1,39 +1,17 @@
1
1
  /**
2
- * Acceptance self-eval accessor (Story #3819, Story #5313).
3
- *
4
- * Resolves `.agentrc.json → delivery.acceptanceEval` into the canonical
5
- * shape the per-Story acceptance self-eval loop consumes. The loop scores
6
- * the caller-injected change set against each inline `acceptance[]` item,
7
- * redrafts the unmet items, and re-evaluates — capped at `maxRounds`
8
- * redraft rounds, then escalates to `agent::blocked` when criteria remain
9
- * unmet.
10
- *
11
- * Story #5313 dropped the hard ceiling (`ACCEPTANCE_EVAL_MAX_ROUNDS_CEILING`)
12
- * and the floor-of-one clamp: `maxRounds` is any non-negative integer, and
13
- * `0` means the verdict is scored **once** with no redraft round. The
14
- * scoring pass itself is always on — there is intentionally no `enabled`
15
- * flag (hard cutover per `rules/git-conventions.md`); only the redraft
16
- * budget is tunable.
2
+ * `delivery.acceptanceEval`: redraft rounds before `agent::blocked`. `0`
3
+ * scores once with no redraft; the scoring pass itself cannot be disabled.
17
4
  */
18
5
 
19
6
  /**
20
- * Default redraft-round budget applied when `.agentrc.json` omits
21
- * `delivery.acceptanceEval.maxRounds`. Frozen so downstream callers cannot
22
- * mutate the resolver's defaults across processes.
23
- *
24
- * Keep in lockstep with the schema mirror in
25
- * `agentrc.schema.json → $defs.acceptanceEval` and the AJV schema in
26
- * `config-settings-schema-delivery.js → ACCEPTANCE_EVAL_SCHEMA`.
7
+ * Keep in lockstep with `agentrc.schema.json` and
8
+ * `config-settings-schema-delivery.js#ACCEPTANCE_EVAL_SCHEMA`.
27
9
  */
28
10
  export const ACCEPTANCE_EVAL_DEFAULTS = Object.freeze({
29
11
  maxRounds: 2,
30
12
  });
31
13
 
32
14
  /**
33
- * Normalize a candidate round count: a non-negative integer is taken as-is
34
- * (including `0`); anything else — negative, non-integer, non-finite,
35
- * missing — falls back to the documented default.
36
- *
37
15
  * @param {unknown} value
38
16
  * @param {number} fallback
39
17
  * @returns {number}
@@ -45,10 +23,6 @@ function normalizeRounds(value, fallback) {
45
23
  }
46
24
 
47
25
  /**
48
- * Read the merged acceptance-eval block. Returns the canonical shape:
49
- *
50
- * { maxRounds: number } // non-negative integer; 0 = scored once
51
- *
52
26
  * @param {object | null | undefined} config
53
27
  * @returns {{ maxRounds: number }}
54
28
  */
@@ -1,15 +1,9 @@
1
1
  /**
2
- * `delivery.quality.baselines` accessor (Epic #1720 Story #1737 — per-gate
3
- * baselines). Every gate now carries its own `baselinePath` under
4
- * `delivery.quality.gates.<tier>.baselinePath`. This module preserves the
5
- * historical `{ lint, crap, maintainability }` envelope so existing call
6
- * sites that read `getBaselines(config).lint.path` keep working.
7
- * `refreshCommand` is no longer carried per-baseline — it stays in the
8
- * envelope as `null` for shape stability.
2
+ * Flat `{ crap, maintainability }` view over each gate's `baselinePath`;
3
+ * `refreshCommand` is always `null`, kept for shape stability.
9
4
  */
10
5
 
11
6
  export const BASELINES_DEFAULTS = Object.freeze({
12
- lint: Object.freeze({ path: 'baselines/lint.json', refreshCommand: null }),
13
7
  crap: Object.freeze({ path: 'baselines/crap.json', refreshCommand: null }),
14
8
  maintainability: Object.freeze({
15
9
  path: 'baselines/maintainability.json',
@@ -18,12 +12,8 @@ export const BASELINES_DEFAULTS = Object.freeze({
18
12
  });
19
13
 
20
14
  /**
21
- * Read the per-gate baseline paths and surface them under the historical
22
- * flat envelope. Accepts the full resolved config — the canonical
23
- * `delivery.quality.gates` path is the single supported shape.
24
- *
25
15
  * @param {object | null | undefined} config
26
- * @returns {{ lint: { path: string, refreshCommand: null }, crap: { path: string, refreshCommand: null }, maintainability: { path: string, refreshCommand: null } }}
16
+ * @returns {{ crap: { path: string, refreshCommand: null }, maintainability: { path: string, refreshCommand: null } }}
27
17
  */
28
18
  export function getBaselines(config) {
29
19
  const gates = config?.delivery?.quality?.gates ?? {};
@@ -33,7 +23,6 @@ export function getBaselines(config) {
33
23
  return { path, refreshCommand: null };
34
24
  };
35
25
  return {
36
- lint: merge('lint'),
37
26
  crap: merge('crap'),
38
27
  maintainability: merge('maintainability'),
39
28
  };
@@ -1,27 +1,9 @@
1
1
  /**
2
- * `delivery.ci` accessor + framework defaults — Story #4356 (Epic #4355).
3
- *
4
- * Surviving knobs: `watch` tunes the merge/CI watch poll loop; `autoMerge`
5
- * (default `"trust-ci"`) selects the merge posture — `"trust-ci"` merges once
6
- * required checks pass, `"strict"` additionally requires a clean review gate.
7
- *
8
- * Story #5096 added `blockOnAdvisoryFailure` (default `true`) and
9
- * `advisoryAllowlist` (default `[]`). GitHub native auto-merge waits on
10
- * REQUIRED contexts only, so a red ADVISORY gate would otherwise be merged
11
- * straight past; these knobs own mandrel's side of that decision. Set
12
- * `blockOnAdvisoryFailure: false` to restore the pre-#5096 behaviour verbatim,
13
- * or list a job name in `advisoryAllowlist` to exempt just that one.
14
- *
15
- * Story #5266 added `rerunAdvisory`, **default `0`**. It is the number of
16
- * times close may re-run a failed advisory workflow run before blocking on it.
17
- * Zero is the deliberate default and not a placeholder: a rerun spends the
18
- * consumer's CI minutes and mutates GitHub state, and close must never do
19
- * either unasked. Raise it (or pass `--rerun-advisory <n>`) on a repository
20
- * whose advisory scans time out transiently.
21
- *
22
- * Retired (no production readers on v2 Story-only delivery): `earlyPr`
23
- * (Epic early-PR warmup) and `requireChecks` (AutomergePredicate escape hatch
24
- * whose listener was never landed).
2
+ * `delivery.ci`. `autoMerge: 'strict'` also requires a clean review gate.
3
+ * Native auto-merge waits on required checks only, so
4
+ * `blockOnAdvisoryFailure` stops a red advisory gate being merged past
5
+ * (`advisoryAllowlist` exempts named jobs). `rerunAdvisory` defaults to 0
6
+ * deliberately: a rerun spends CI minutes and mutates GitHub state.
25
7
  */
26
8
 
27
9
  export const CI_DELIVERY_DEFAULTS = Object.freeze({
@@ -31,29 +13,19 @@ export const CI_DELIVERY_DEFAULTS = Object.freeze({
31
13
  rerunAdvisory: 0,
32
14
  });
33
15
 
34
- /**
35
- * Per-knob validators for the scalar `delivery.ci` settings. A value that
36
- * fails its own test is not an instruction to guess — it degrades to the
37
- * framework default beside it in {@link CI_DELIVERY_DEFAULTS}, which is why
38
- * the two objects are keyed alike and read as a pair.
39
- */
16
+ /** An invalid value degrades to the same-keyed default. */
40
17
  const CI_KNOB_VALIDATORS = Object.freeze({
41
18
  autoMerge: (value) => value === 'trust-ci' || value === 'strict',
42
19
  blockOnAdvisoryFailure: (value) => typeof value === 'boolean',
43
- // Story #5266 — a negative or non-integer allowance spends nothing.
44
20
  rerunAdvisory: (value) => Number.isInteger(value) && value >= 0,
45
21
  });
46
22
 
47
23
  /**
48
- * Read the merged `delivery.ci` block, applying framework defaults for any
49
- * field the operator omitted. Accepts the full resolved config, the bare
50
- * delivery bag, or the bare ci bag. The `watch` sub-block is passed through
51
- * as-is (undefined when unset) so consumers apply their own poll-loop
52
- * defaults; only the scalar knobs carry framework defaults here.
24
+ * Accepts the full config, the `delivery` bag, or the `ci` bag.
53
25
  *
54
26
  * @param {object | null | undefined} config
55
27
  * @returns {{ autoMerge: 'trust-ci' | 'strict', blockOnAdvisoryFailure: boolean,
56
- * advisoryAllowlist: string[], rerunAdvisory: number, watch: object | undefined }}
28
+ * advisoryAllowlist: string[], rerunAdvisory: number }}
57
29
  */
58
30
  export function getCiDelivery(config) {
59
31
  const ci = config?.delivery?.ci ?? config?.ci ?? config ?? {};
@@ -68,7 +40,5 @@ export function getCiDelivery(config) {
68
40
  (entry) => typeof entry === 'string' && entry,
69
41
  )
70
42
  : [...CI_DELIVERY_DEFAULTS.advisoryAllowlist],
71
- watch:
72
- ci.watch && typeof ci.watch === 'object' ? { ...ci.watch } : undefined,
73
43
  };
74
44
  }
@@ -1,10 +1,3 @@
1
- /**
2
- * `project.commands` accessor (Epic #1720 Story #1739 — top-level reshape).
3
- *
4
- * The command keys are `test`, `typecheck`, `lint`, `formatCheck`,
5
- * `formatWrite`.
6
- */
7
-
8
1
  export const COMMANDS_DEFAULTS = Object.freeze({
9
2
  test: 'npm test',
10
3
  typecheck: null,
@@ -14,19 +7,12 @@ export const COMMANDS_DEFAULTS = Object.freeze({
14
7
  });
15
8
 
16
9
  /**
17
- * Read the grouped `project.commands` block, applying framework defaults
18
- * for any field the operator omitted. Accepts the full resolved config or
19
- * a bare `{ project }` bag.
20
- *
21
10
  * @param {object | null | undefined} config
22
11
  * @returns {{ test: string, typecheck: string|null, lint: string|null, formatCheck: string, formatWrite: string }}
23
12
  */
24
13
  export function getCommands(config) {
25
14
  const commands = config?.project?.commands ?? {};
26
- // `??` is uniform across every key: the two nullable ones (`typecheck`,
27
- // `lint`) default to `null` themselves, so coalescing an explicit `null`
28
- // onto the default returns that same `null` — the per-key `=== undefined`
29
- // ladder this replaces drew a distinction that had no observable effect.
15
+ // `??` is safe for the nullable keys: their default is `null` too.
30
16
  return Object.fromEntries(
31
17
  Object.keys(COMMANDS_DEFAULTS).map((key) => [
32
18
  key,