mandrel 2.60.0 → 2.61.0

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