mandrel 2.59.0 → 2.61.0

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