mandrel 2.60.0 → 2.62.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 (662) 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/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. 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,