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,40 +1,7 @@
1
1
  /**
2
- * single-story-lease-guard.js — wire the assignee-as-lease primitive
3
- * (`ticket-lease.js`, Story #3480) into the standalone `/single-story-deliver`
4
- * path (Story #3483, Epic #3457).
5
- *
6
- * The standalone workflow has no Epic-scoped dispatch manifest to serialise
7
- * two operators driving the same Story, so a concurrent `single-story-init`
8
- * could happily clobber another operator's in-flight run. This guard closes
9
- * that gap by taking an exclusive, time-bounded lease on the Story ticket at
10
- * init and clearing it at close:
11
- *
12
- * - `acquireStoryLease` — claim the Story for the resolved operator. A live
13
- * **foreign** claim (the assignee is someone else and their heartbeat is
14
- * within the TTL) is fatal: the guard throws a message naming the current
15
- * owner so the operator knows who to coordinate with. Unclaimed,
16
- * self-held, and stale-foreign claims all proceed (the primitive reclaims
17
- * stale claims automatically).
18
- * - `releaseStoryLease` — clear the Story assignment on a clean close, but
19
- * only when the operator still holds it (the primitive no-ops a stale
20
- * release so a late close never yanks a claim back from whoever took
21
- * over).
22
- *
23
- * The guard is deliberately thin and provider-agnostic: it resolves the
24
- * operator handle from config and delegates assignee mutation to the pure
25
- * `ticket-lease.js` primitive.
26
- *
27
- * **Fail-closed (audit #3513, hard-wired by Story #5006).** The lease
28
- * primitive used to reclaim a foreign claim whose heartbeat was older than a
29
- * TTL — and with no heartbeat source, *every* foreign claim looked stale, so
30
- * the guard silently reclaimed any foreign assignee and was inert as a
31
- * concurrency guard. The guard worked around that by anchoring the heartbeat
32
- * to `now`; Story #5006 deleted the TTL outright, so the fail-closed
33
- * behaviour is now the primitive's own: a foreign assignee refuses the take
34
- * (naming the current owner) unless the operator passes `--steal` to forcibly
35
- * transfer it. A genuinely abandoned claim is cleared by hand (or `--steal`)
36
- * rather than raced into automatically. Unclaimed and self-held tickets still
37
- * proceed.
2
+ * Story lease for single-Story delivery: take the assignee lease at init,
3
+ * clear it at close, so two runs never drive one Story. Fail-closed — a
4
+ * foreign assignee refuses unless `--steal`.
38
5
  */
39
6
 
40
7
  import {
@@ -44,21 +11,11 @@ import {
44
11
  import { releaseLease } from './ticket-lease.js';
45
12
 
46
13
  /**
47
- * Resolve the operator handle used as the lease owner from resolved config.
48
- * Routes through the shared lease-guard kernel
49
- * (`lease-guard-shared.resolveOperatorFromCandidates`) so a leading `@` is
50
- * stripped (the assignees API expects bare logins, not `@`-prefixed mentions)
51
- * and the self-held-claim comparison matches. The standalone surface's
52
- * missing-handle policy is `'throw'` (intentional divergence from the plan
53
- * path's `'null'`): init has no best-effort leg that can degrade, so an
54
- * unowned lease must refuse immediately.
14
+ * Missing-handle policy is `'throw'`: init has no best-effort leg to degrade.
55
15
  *
56
- * @param {object} config Resolved `.agentrc.json` config.
16
+ * @param {object} config
57
17
  * @returns {string} Bare operator handle.
58
- * @throws {Error} When no `github.operatorHandle` resolves — unset, or still the
59
- * shipped `@[USERNAME]` placeholder (both normalise to `null`). Without an
60
- * operator identity the lease has no owner to record, so the standalone
61
- * path cannot safely serialise concurrent runs.
18
+ * @throws {Error} When `github.operatorHandle` is unset or the placeholder.
62
19
  */
63
20
  export function resolveOperator(config) {
64
21
  return resolveOperatorFromCandidates({
@@ -74,19 +31,12 @@ export function resolveOperator(config) {
74
31
  }
75
32
 
76
33
  /**
77
- * Acquire (or re-affirm) the Story lease for the standalone path.
78
- *
79
- * **Fail-closed:** a foreign assignee refuses the take — the guard throws
80
- * naming the current owner so the operator can coordinate. Pass
81
- * `steal: true` (`--steal`) to forcibly transfer it. Unclaimed and self-held
82
- * tickets proceed without a write.
83
- *
84
34
  * @param {object} opts
85
- * @param {object} opts.provider Ticketing provider (getTicket/updateTicket).
86
- * @param {number} opts.storyId Story ticket to claim.
87
- * @param {object} opts.config Resolved config (operator handle).
88
- * @param {string} [opts.operator] Override the resolved operator (tests).
89
- * @param {boolean} [opts.steal=false] Forcibly transfer a foreign claim.
35
+ * @param {object} opts.provider
36
+ * @param {number} opts.storyId
37
+ * @param {object} opts.config
38
+ * @param {string} [opts.operator] Test override.
39
+ * @param {boolean} [opts.steal=false]
90
40
  * @returns {Promise<{ acquired: boolean, owner: string, previousOwner: string|null, reason: string }>}
91
41
  * @throws {Error} When a foreign claim refuses the acquire (no `steal`).
92
42
  */
@@ -113,15 +63,11 @@ export async function acquireStoryLease({
113
63
  }
114
64
 
115
65
  /**
116
- * Release the Story lease on a clean close. No-ops (via the primitive) when
117
- * the operator no longer holds the claim, so a late close never steals a
118
- * claim back from whoever legitimately took over.
119
- *
120
66
  * @param {object} opts
121
- * @param {object} opts.provider Ticketing provider.
122
- * @param {number} opts.storyId Story ticket to release.
123
- * @param {object} opts.config Resolved config (operator handle).
124
- * @param {string} [opts.operator] Override the resolved operator (tests).
67
+ * @param {object} opts.provider
68
+ * @param {number} opts.storyId
69
+ * @param {object} opts.config
70
+ * @param {string} [opts.operator] Test override.
125
71
  * @returns {Promise<{ released: boolean, owner: string|null, reason: string }>}
126
72
  */
127
73
  export async function releaseStoryLease({
@@ -1,11 +1,6 @@
1
1
  /**
2
- * lib/orchestration/story-body-gate.js — the Story-body parse gate
3
- * (Story #4541), extracted from `ticket-validator.js`: the one place a
4
- * serialized Story body is parsed with parse failures translated into the
5
- * validator's operator-legible `ValidationError` shape. Both the gate that
6
- * refuses a plan up front (`assertStoryBodiesParse`) and the per-call
7
- * translating parser (`parseStoryBodyOrThrow`) the downstream validators
8
- * lean on live here.
2
+ * The one place a Story body is parsed with failures translated into a
3
+ * `ValidationError` naming the section and entry.
9
4
  */
10
5
 
11
6
  import { ValidationError } from '../errors/index.js';
@@ -15,16 +10,6 @@ import {
15
10
  } from '../story-body/story-body.js';
16
11
 
17
12
  /**
18
- * Parse a Story's serialized markdown body, translating a
19
- * `StoryBodyParseError` into a `ValidationError` that names the offending
20
- * **section** and **entry** (Story #4541).
21
- *
22
- * `StoryBodyParseError` already carries `field` (the section the parser was
23
- * reading) and `raw` (the entry text that failed); this lifts both into an
24
- * operator-legible message and a structured `violation` payload so an
25
- * authoring loop can point at the exact bullet instead of re-deriving it
26
- * from a downstream freshness miss.
27
- *
28
13
  * @param {object} story Story whose `body` is a non-empty markdown string.
29
14
  * @returns {object} The structured body.
30
15
  * @throws {ValidationError} `code: 'story-body-unparseable'`.
@@ -53,14 +38,10 @@ export function parseStoryBodyOrThrow(story) {
53
38
  }
54
39
 
55
40
  /**
56
- * Refuse the plan when any Story's serialized body cannot be parsed, before
57
- * either git-probe gate runs (Story #4541). Ordering matters: the freshness
58
- * gate consults `body.changes` for its net-new whitelist, so an unparseable
59
- * body used to reach the operator as a freshness miss naming declared paths.
41
+ * Must run before the git-probe gates, whose whitelist is the parsed body.
60
42
  *
61
43
  * @param {{ tickets: object[] }} opts
62
- * @throws {ValidationError} `code: 'story-body-unparseable'` on the first
63
- * offending Story.
44
+ * @throws {ValidationError} On the first offending Story.
64
45
  */
65
46
  export function assertStoryBodiesParse({ tickets }) {
66
47
  for (const story of (tickets ?? []).filter((t) => t.type === 'story')) {
@@ -1,50 +1,17 @@
1
1
  /**
2
2
  * baseline-upward-writeback.js — persist improved maintainability rows on the
3
- * branch that earned them (Story #5224).
3
+ * branch that earned them, as one `baseline-refresh:` commit ahead of the
4
+ * close gates. The diff-scoped ratchet only reds on regressions, so nothing
5
+ * else writes an improvement back.
4
6
  *
5
- * The diff-scoped baseline ratchet only ever reds on a REGRESSION. A branch
6
- * that *improves* a file it touched is therefore waved through with its
7
- * committed row left describing the worse, older tree — and nothing on the
8
- * per-PR path ever writes it back. The only thing that notices is the nightly
9
- * full-scope re-score (`check-baseline-drift.js`), which had filed the same
10
- * one-command chore seven times before this module existed.
11
- *
12
- * The classifier already does the hard half: `kinds/kind-factory.js#classify`
13
- * partitions every compared row into `regressions` / `improvements` /
14
- * `unchanged` / `additions`, and the enforcement path forwards `improvements`
15
- * all the way to the report. Nothing persisted it. This module is that
16
- * missing half — run from the close's `close-validation` phase, ahead of the
17
- * gate chain, so the refreshed row lands in the branch's own PR.
18
- *
19
- * Shape borrowed from {@link ../story-close/format-autofix.js#runScopedFormatAutofix}:
20
- * scope to the branch's changed-file set, fold the writes into one dedicated
21
- * commit ahead of the gates, log the paths touched, and inject every
22
- * git / baseline / scoring collaborator so the unit tests never spawn git
23
- * (`.agents/rules/test-seams.md`).
24
- *
25
- * Four constraints bind the design, and every one of them is a "must not":
26
- *
27
- * 1. **Only `improvements` are written.** A regression must still fail the
28
- * gate exactly as it does today. A write-back that could launder one
29
- * makes the baseline actively worse than leaving it stale, so a regressed
30
- * row is never in the written set — it is not filtered out downstream, it
31
- * never enters.
32
- * 2. **`maintainability` only.** CRAP's drift identity is
33
- * `path::method@startLine`, which re-keys whenever anything above a
34
- * method moves, so the same treatment there is churn rather than signal.
35
- * That is exactly why the nightly watches maintainability alone.
36
- * 3. **Changed files only — never a full-scope regeneration.** A full-scope
37
- * write at land time would absorb unrelated drift from other branches
38
- * into whichever PR happened to land next, and would fight the
39
- * row-identity merge driver that exists to keep concurrent refreshes
40
- * apart (Story #5215).
41
- * 4. **Idempotent and silent.** No empty commit; a second close over the
42
- * same tree finds nothing left to improve and commits nothing.
43
- *
44
- * The authored commit carries the `baseline-refresh:` marker
45
- * `phases/refresh-ack.js` recognises, so the refreshed rows are vouched for
46
- * rather than read as fresh drift, and its subject is conventional so
47
- * commitlint accepts it.
7
+ * Invariants:
8
+ * 1. Only classifier `improvements` are written — a regression never enters
9
+ * the written set, so it still fails the gate.
10
+ * 2. Maintainability only: CRAP rows re-key on `method@startLine` when code
11
+ * above moves, so write-back there is churn.
12
+ * 3. Changed files only — a full-scope write would absorb other branches'
13
+ * drift into whichever PR lands next.
14
+ * 4. Idempotent: no empty commit.
48
15
  */
49
16
 
50
17
  import path from 'node:path';
@@ -72,25 +39,16 @@ import {
72
39
 
73
40
  const TAG = '[baseline-writeback]';
74
41
 
75
- /** The one kind this module touches. See constraint 2 in the preamble. */
76
42
  const KIND = 'maintainability';
77
43
 
78
- /**
79
- * Absolute drift tolerance when the gate configures none. Mirrors
80
- * `drift-detector.js`'s `KIND_SPECS.maintainability.defaultTolerance`, so the
81
- * per-PR write-back and the nightly full-scope check agree on what counts as
82
- * movement rather than float noise.
83
- */
44
+ /** Matches the drift detector's maintainability default tolerance. */
84
45
  const DEFAULT_TOLERANCE = 0.5;
85
46
 
86
- /** Files the maintainability scorer can measure at all. */
87
47
  const SCORABLE = /\.(?:m?[jt]sx?)$/i;
88
48
 
89
49
  /**
90
- * Reasons reported before the step scored anything, so `ran: false` means
91
- * exactly "a guard stopped this before any work happened" rather than the
92
- * softer "nothing came of it". `no-scored-rows`, `no-improvements` and
93
- * `unchanged` are deliberately absent: those are outcomes of a run.
50
+ * Skips that fire before any scoring, so `ran: false` means exactly "a guard
51
+ * stopped this"; outcome reasons are deliberately absent.
94
52
  */
95
53
  const GUARD_REASONS = new Set([
96
54
  'gate-disabled',
@@ -102,10 +60,7 @@ const GUARD_REASONS = new Set([
102
60
  ]);
103
61
 
104
62
  /**
105
- * Resolve the gate's absolute tolerance. Anything below it is float noise the
106
- * ratchet already refuses to red on, so writing it back would be churn — and
107
- * churn on a file every concurrent branch also touches is the one cost this
108
- * step must not add.
63
+ * Deltas under the tolerance are float noise; writing them is churn.
109
64
  *
110
65
  * @param {object|undefined} gate resolved `delivery.quality.gates.maintainability`
111
66
  * @returns {number}
@@ -120,17 +75,9 @@ function resolveTolerance(gate) {
120
75
  }
121
76
 
122
77
  /**
123
- * Read the maintainability gate block as DECLARED — `quality.gates[kind]`, not
124
- * the sibling `quality[kind]` projection. The two differ in exactly the two
125
- * fields this module reads: the projection drops `enabled` entirely and
126
- * flattens `tolerance` to a bare number, so reading it would silently make the
127
- * gate un-disablable and every configured tolerance unreadable. `evaluate.js`
128
- * receives this same declared block as its `gateBlock`, which is what keeps
129
- * the write-back's notion of "moved" identical to the gate's.
130
- *
131
- * Tolerates a resolver that throws (a malformed config under a tmp cwd). An
132
- * unresolvable config reads as "framework defaults", which enable the gate —
133
- * the same reading `projections/advisories.js#isEnabled` applies.
78
+ * Read the DECLARED `quality.gates[kind]` block, not the `quality[kind]`
79
+ * projection, which drops `enabled` and flattens `tolerance`. A resolver that
80
+ * throws reads as framework defaults (gate enabled).
134
81
  *
135
82
  * @param {object|undefined} config
136
83
  * @returns {object|undefined}
@@ -144,10 +91,8 @@ function resolveGate(config) {
144
91
  }
145
92
 
146
93
  /**
147
- * Normalise scorer output into the on-disk row shape so scored rows and
148
- * committed rows are directly comparable. `projectRow` is the same projection
149
- * the writer applies, which is what makes the two sides comparable at all.
150
- * A row the writer itself would refuse is dropped rather than compared.
94
+ * Project scorer output through the writer's own `projectRow` so scored and
95
+ * committed rows are comparable; unprojectable rows are dropped.
151
96
  *
152
97
  * @param {Array<object>} rows
153
98
  * @returns {Array<{ path: string, mi: number }>}
@@ -166,24 +111,10 @@ function projectRows(rows) {
166
111
  }
167
112
 
168
113
  /**
169
- * Select the rows this branch has genuinely improved.
170
- *
171
- * The base side is deliberately narrowed to the rows the head side actually
172
- * scored. `compare()` classifies a base row with no head row through the
173
- * kind's `removedRowPolicy`, which for maintainability pushes an
174
- * **improvement** ("the file is gone, so its debt is gone too"). That policy
175
- * is correct for a full-scope compare and catastrophic for a scoped one: every
176
- * untouched file in the repo would arrive here as an improvement and be
177
- * rewritten from a score nobody computed. Narrowing the base to the scored
178
- * keys means every comparison has both sides, so the removed-row arm cannot
179
- * fire at all — and the `head === null` guard below makes that structural
180
- * rather than incidental.
181
- *
182
- * `additions` — a scored file with no committed row — is likewise excluded:
183
- * constraint 1 admits only what the classifier calls an improvement, and a new
184
- * file's row is the ordinary refresh path's business, not this step's.
185
- *
186
- * Pure.
114
+ * The base side is narrowed to scored paths: maintainability's
115
+ * `removedRowPolicy` counts a missing head row as an improvement, which in a
116
+ * scoped compare would rewrite every untouched file. `additions` are excluded
117
+ * too. Pure.
187
118
  *
188
119
  * @param {{ scoredRows: Array<object>, baselineRows: Array<object>, tolerance: number }} opts
189
120
  * @returns {Array<{ path: string, mi: number }>} the head rows to persist
@@ -211,10 +142,8 @@ function selectImprovedRows({ scoredRows, baselineRows, tolerance }) {
211
142
  }
212
143
 
213
144
  /**
214
- * Render the commit body: one line per rewritten row, before → after. The body
215
- * is the durable record of what the step touched — the `Logger` line scrolls
216
- * out of a close transcript, this does not — and `check-baseline-drift.js`'s
217
- * remedy text asks a `baseline-refresh:` commit to carry a non-empty body.
145
+ * One before → after line per row: the durable record of what was touched
146
+ * (a `baseline-refresh:` commit must carry a non-empty body).
218
147
  *
219
148
  * @param {Array<{ path: string, mi: number }>} improved
220
149
  * @param {Array<object>} baselineRows
@@ -238,11 +167,9 @@ function buildCommitBody(improved, baselineRows) {
238
167
  }
239
168
 
240
169
  /**
241
- * Build the commit subject. Conventional (`chore(baselines): …`) so commitlint
242
- * accepts it, carrying the `baseline-refresh:` marker as a plain substring so
243
- * `refresh-ack.js#resolveRefreshTrigger` recognises it, and fixed-length in
244
- * everything but the Story id so it cannot drift past commitlint's 100-char
245
- * subject cap.
170
+ * Conventional for commitlint, carrying the `baseline-refresh:` marker that
171
+ * `refresh-ack.js` recognises, and fixed-length apart from the id so it stays
172
+ * under the 100-char cap.
246
173
  *
247
174
  * @param {number|string} storyId
248
175
  * @returns {string}
@@ -252,14 +179,8 @@ function buildCommitSubject(storyId) {
252
179
  }
253
180
 
254
181
  /**
255
- * Stage the single baseline file and commit it. Hooks must run; never pass
256
- * `--no-verify` (project policy).
257
- *
258
- * On a commit failure the written file is restored, because everything
259
- * downstream — base-sync, the push, the gate chain's own reads — assumes the
260
- * close left the worktree clean. A half-applied write-back that survives as an
261
- * uncommitted edit would silently change what the gates score without ever
262
- * reaching the PR.
182
+ * Stage and commit the baseline file with hooks enabled. On a rejected commit
183
+ * the file is reset to HEAD so the close leaves a clean tree.
263
184
  *
264
185
  * @param {{ cwd: string, git: Function, relPath: string, subject: string, body: string }} opts
265
186
  * @returns {{ sha: string }}
@@ -272,13 +193,8 @@ function commitBaseline({ cwd, git, relPath, subject, body }) {
272
193
  stdio: ['ignore', 'pipe', 'pipe'],
273
194
  });
274
195
  } catch (err) {
275
- // `git checkout -- <path>` restores the WORKTREE from the index — and the
276
- // index is exactly what the `git add` above just overwrote, so on a
277
- // rejected commit it restored the file to the value it was meant to be
278
- // rolled back FROM. The rollback was a no-op that looked like one, and the
279
- // rewritten row survived as a staged edit into whatever the gates scored
280
- // next. `restore --staged --worktree` resets both to HEAD, which is what
281
- // "leave the tree as the close found it" actually means.
196
+ // `checkout --` would restore from the index `git add` just overwrote —
197
+ // a silent no-op. Reset both index and worktree to HEAD.
282
198
  git(['restore', '--staged', '--worktree', '--', relPath], {
283
199
  cwd,
284
200
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -294,22 +210,11 @@ function commitBaseline({ cwd, git, relPath, subject, body }) {
294
210
  }
295
211
 
296
212
  /**
297
- * Everything that must hold before the step is allowed to score anything.
298
- * Returns a skip reason, or `null` to proceed.
299
- *
300
- * The branch assertion runs here — before the write, not before the commit —
301
- * so a mis-wired `worktreePath` can never leave a modified baseline in a tree
302
- * whose history we then refuse to touch.
303
- *
304
- * The dirty-tree guard is the same refusal `runScopedFormatAutofix` makes and
305
- * for the same reason, sharpened to one path: this step's only write target is
306
- * the baseline file, and it commits that file by name. An uncommitted edit
307
- * sitting on it — a hand-run `maintainability:reanchor`, a half-resolved merge,
308
- * an operator mid-edit — would be swept into a `baseline-refresh:` commit
309
- * authored by close and attributed to rows this branch improved. That commit is
310
- * the one `refresh-ack.js` VOUCHES for, so an absorbed edit is not merely
311
- * unrelated: it arrives pre-acknowledged, which is the precise laundering this
312
- * whole Story exists to close.
213
+ * Guards that must hold before scoring; returns a skip reason or `null`.
214
+ * The branch check runs before any write. The dirty-tree check refuses an
215
+ * uncommitted edit on the baseline file, which would otherwise be swept into
216
+ * a `baseline-refresh:` commit that `refresh-ack.js` vouches for — i.e.
217
+ * laundered.
313
218
  *
314
219
  * @param {{ gate: object|undefined, workTree: string, storyBranch: string, git: Function, changed: string[], relPath: string }} ctx
315
220
  * @returns {string|null}
@@ -324,11 +229,7 @@ function precheck({ gate, workTree, storyBranch, git, changed, relPath }) {
324
229
  }
325
230
 
326
231
  /**
327
- * Is the baseline file already modified in the worktree or the index?
328
- *
329
- * Fails CLOSED on an unreadable status: a step that cannot tell whether it is
330
- * about to absorb someone else's edit must not proceed, and skipping costs
331
- * only a stale upward row that the nightly full-scope re-score still catches.
232
+ * Fails CLOSED on unreadable status; skipping only costs a stale upward row.
332
233
  *
333
234
  * @param {{ workTree: string, git: Function, relPath: string }} ctx
334
235
  * @returns {boolean}
@@ -342,16 +243,8 @@ function isDirty({ workTree, git, relPath }) {
342
243
  }
343
244
 
344
245
  /**
345
- * The ref the branch's changed-file set is measured against.
346
- *
347
- * `origin/<baseBranch>` when the remote-tracking ref exists, the local branch
348
- * otherwise. A local `main` in a long-lived checkout — and in every Story
349
- * worktree, which is seeded once and never pulled again — drifts behind the
350
- * remote, and a stale base widens the three-dot range to include commits that
351
- * landed on the base after the branch forked. Every file in that widening is
352
- * then scored and written back by whichever Story happens to close next, which
353
- * is precisely the "absorb unrelated drift into the next PR" failure
354
- * constraint 3 in the preamble forbids.
246
+ * Prefer `origin/<base>`: a stale local base (worktrees never pull it) widens
247
+ * the three-dot range to files landed after the fork, violating invariant 3.
355
248
  *
356
249
  * @param {{ workTree: string, git: Function, baseBranch: string }} ctx
357
250
  * @returns {string}
@@ -373,14 +266,9 @@ function resolveScopeBase({ workTree, git, baseBranch }) {
373
266
  }
374
267
 
375
268
  /**
376
- * Persist improved maintainability rows for the files this branch changed, and
377
- * fold them into one `baseline-refresh:` commit on the Story branch.
378
- *
379
- * Every no-op is reported by name rather than silently: `gate-disabled`,
380
- * `no-changed-files`, `wrong-branch`, `dirty-tree`, `no-baseline`,
381
- * `no-scored-rows`, `no-improvements`, `unchanged`. The caller logs the reason and proceeds —
382
- * this step is never allowed to fail a close, because `check-baselines` is
383
- * still the gate and this is only the refresh half of the loop.
269
+ * Persist improved rows for the branch's changed files as one commit. Every
270
+ * no-op returns a named `reason`; this step never fails a close —
271
+ * `check-baselines` remains the gate.
384
272
  *
385
273
  * @param {{
386
274
  * cwd: string,
@@ -425,12 +313,8 @@ export async function runBaselineUpwardWriteback({
425
313
  throw new Error('runBaselineUpwardWriteback: storyBranch is required');
426
314
 
427
315
  const workTree = worktreePath || cwd;
428
- // The two format-autofix helpers below take git as `(args, opts) => stdout`;
429
- // `git-utils.gitSync` is `(cwd, ...args) => trimmed stdout` and throws on a
430
- // non-zero exit. Adapt rather than reach for `node:child_process` directly —
431
- // the shared surface owns the stdout ceiling, `shell: false` and error
432
- // normalisation, and `tests/enforcement/child-process-imports.test.js`
433
- // enforces that.
316
+ // Adapt `gitSync(cwd, ...args)` to the `(args, opts)` shape format-autofix
317
+ // expects; direct `node:child_process` use is forbidden by an enforcement test.
434
318
  const git = (args, opts = {}) => gitSync(opts.cwd ?? workTree, ...args);
435
319
  const gate = resolveGate(config);
436
320
 
@@ -487,11 +371,9 @@ export async function runBaselineUpwardWriteback({
487
371
  }
488
372
 
489
373
  /**
490
- * Write the selected rows through the one sanctioned write funnel and commit
491
- * them. The already-computed rows are handed to `refreshBaseline` as its
492
- * scorer so the files are scored exactly once — the service still owns path
493
- * canonicalization, `mergeRows` (which preserves every out-of-scope row
494
- * byte-for-byte), rollup, envelope stamping and the atomic write.
374
+ * Write through `refreshBaseline` (which owns canonicalization, out-of-scope
375
+ * row preservation and the atomic write), passing the computed rows as its
376
+ * scorer so files are scored once, then commit.
495
377
  *
496
378
  * @returns {Promise<{ ran: boolean, committed: boolean, sha?: string, improvedPaths?: string[], reason?: string }>}
497
379
  */
@@ -514,9 +396,6 @@ async function persist({
514
396
  scopeFiles: improvedPaths,
515
397
  scorer: () => improved,
516
398
  });
517
- // The writer short-circuits on structural equality, so `wrote: false` means
518
- // the committed rows already carried these values — nothing to commit, and
519
- // nothing worth a log line above debug.
520
399
  if (!wrote) return skip(logger, 'unchanged');
521
400
 
522
401
  const { sha } = commitBaseline({
@@ -535,9 +414,6 @@ async function persist({
535
414
  }
536
415
 
537
416
  /**
538
- * Report a no-op by name. Every skip is `info`-level: none of them is a
539
- * problem, and the close transcript already carries one line per phase.
540
- *
541
417
  * @param {object} logger
542
418
  * @param {string} reason
543
419
  */
@@ -546,11 +422,7 @@ function skip(logger, reason) {
546
422
  return { ran: !GUARD_REASONS.has(reason), committed: false, reason };
547
423
  }
548
424
 
549
- /**
550
- * Default committed-row loader — the schema-validating reader, so a baseline
551
- * this module would refuse to compare against is reported as `no-baseline`
552
- * rather than half-read.
553
- */
425
+ /** Schema-validating read; an unreadable baseline reports `no-baseline`. */
554
426
  function defaultLoadBaselineRows({ cwd }) {
555
427
  try {
556
428
  return loadBaselineEnvelope(KIND, { cwd })?.rows ?? null;
@@ -559,7 +431,6 @@ function defaultLoadBaselineRows({ cwd }) {
559
431
  }
560
432
  }
561
433
 
562
- /** Default on-disk location of the maintainability baseline. */
563
434
  function defaultResolveWritePath({ cwd }) {
564
435
  return baselineReaderInternals.resolveBaselinePath(KIND, { cwd });
565
436
  }
@@ -1,35 +1,15 @@
1
1
  /**
2
- * context-budget-writeback.js — lock a context-budget gain in on the branch
3
- * that earned it (Story #5313).
2
+ * context-budget-writeback.js — when the tree measures under its recorded
3
+ * context-budget totals, write the lower totals back as one
4
+ * `baseline-refresh:` commit on the Story branch, so a stale total can't
5
+ * silently absorb the next growth.
4
6
  *
5
- * `check-context-budget.js` used to fail a gated documentation tier that came
6
- * in **under** its recorded total (Story #4872), so a Story that trimmed prose
7
- * paid for the trim twice: once in the edit and once in the red gate whose
8
- * only remedy was a hand-run `--update`. Story #5313 reverses that rule —
9
- * shrinkage exits 0 and is reported — and this module answers the concern
10
- * the rule existed for: a stale recorded total silently absorbs the next
11
- * growth. When the tree the close is scoring measures under its recorded
12
- * totals, the lower totals are written back into
13
- * `baselines/context-budget.json` and folded into one `baseline-refresh:`
14
- * commit on the Story branch, so the gain lands in the branch's own PR.
7
+ * Runs at the pre-gate seam, not post-land: the only sanctioned landing is
8
+ * branch → PR → `main`, so a post-land write would commit to the base branch.
15
9
  *
16
- * ## Where it runs, and why not post-land
17
- *
18
- * The Story names the post-land tail. This step runs from the close's
19
- * **pre-gate write-back seam** (`phases/pre-gate-steps.js`, beside the
20
- * maintainability write-back of Story #5224) instead: the only sanctioned
21
- * landing is the Story branch → PR → `main`, so a post-land write would have
22
- * to commit straight to the base branch. Writing on the branch ahead of the
23
- * gates keeps the row inside the PR the gates score and lets
24
- * `refresh-ack.js` vouch for it through the same `baseline-refresh:` marker.
25
- *
26
- * Constraints, each a "must not":
27
- *
28
- * 1. **Only a downward move is written.** Growth past tolerance and an
29
- * unbacked recorded row must still fail `check-context-budget.js` exactly
30
- * as before; when either is present this step skips and the gate speaks.
31
- * 2. **Idempotent and silent.** No shrink, no write, no commit.
32
- * 3. **Never fails the close.** Every failure is a named skip.
10
+ * Only a downward move is written — any growth or unbacked row skips and
11
+ * leaves `check-context-budget.js` to fail. Idempotent; every failure is a
12
+ * named skip, never a failed close.
33
13
  */
34
14
 
35
15
  import fs from 'node:fs';
@@ -47,12 +27,10 @@ import { Logger as DefaultLogger } from '../../Logger.js';
47
27
 
48
28
  const TAG = '[context-budget-writeback]';
49
29
 
50
- /** Repo-relative location of the committed budget. */
51
30
  const BASELINE_REL_PATH = 'baselines/context-budget.json';
52
31
 
53
32
  /**
54
- * Build the commit subject — conventional, carrying the `baseline-refresh:`
55
- * marker `refresh-ack.js` recognises, fixed-length but for the Story id.
33
+ * Carries the `baseline-refresh:` marker `refresh-ack.js` recognises.
56
34
  *
57
35
  * @param {number|string} storyId
58
36
  * @returns {string}
@@ -62,8 +40,6 @@ function buildCommitSubject(storyId) {
62
40
  }
63
41
 
64
42
  /**
65
- * One line per tier that moved down, before → after.
66
- *
67
43
  * @param {Array<{ tier: string, current: number, baseline: number }>} shrunk
68
44
  * @returns {string}
69
45
  */
@@ -78,8 +54,6 @@ function buildCommitBody(shrunk) {
78
54
  }
79
55
 
80
56
  /**
81
- * Report a no-op by name.
82
- *
83
57
  * @param {object} logger
84
58
  * @param {string} reason
85
59
  */
@@ -89,7 +63,7 @@ function skip(logger, reason) {
89
63
  }
90
64
 
91
65
  /**
92
- * Everything that must hold before a write. Returns a skip reason or `null`.
66
+ * Returns a skip reason or `null`.
93
67
  *
94
68
  * @param {{ workTree: string, storyBranch: string, git: Function, relPath: string }} ctx
95
69
  * @returns {string|null}
@@ -140,10 +114,6 @@ function commitBaseline({ workTree, git, relPath, envelope, storyId, shrunk }) {
140
114
  }
141
115
 
142
116
  /**
143
- * Write the lower context-budget totals back on the Story branch.
144
- *
145
- * Total: a throw anywhere is a named skip, never a failed close.
146
- *
147
117
  * @param {{
148
118
  * cwd: string,
149
119
  * worktreePath?: string|null,