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,23 +1,8 @@
1
1
  /**
2
- * init-tail.js — post-bootstrap onboarding tail for `mandrel init`.
3
- *
4
- * Called by `mandrel init` after `bootstrap.js` completes successfully on
5
- * the "configure now" path. Sequences the three phases that walk an operator
6
- * from a freshly bootstrapped project to a ready-to-plan workspace:
7
- *
8
- * Phase 1 — Offer to scaffold missing docsContextFiles (scaffold-docs.js).
9
- * Phase 2 — Run `mandrel doctor` as a readiness gate.
10
- * Phase 3 — Print the /mandrel-plan handoff next-step text.
11
- *
12
- * The whole tail is idempotent: re-running after an already-onboarded project
13
- * re-checks and re-offers scaffolding without duplicating stubs (the scaffolder
14
- * only writes genuinely absent files) and without modifying anything (doctor is
15
- * read-only).
16
- *
17
- * Injectable seams: `runDoctor`, `stdout`, `confirmScaffold`, and `isTTY`
18
- * allow the unit suite to drive every branch without real I/O.
19
- *
20
- * Story #4045 (refs #4045).
2
+ * init-tail.js — `mandrel init`'s post-bootstrap tail: offer to scaffold
3
+ * missing docsContextFiles, gate on `mandrel doctor`, then print the
4
+ * `/mandrel-plan` handoff. Idempotent: the scaffolder writes only absent
5
+ * files and doctor is read-only.
21
6
  */
22
7
 
23
8
  import { spawnSync as defaultSpawnSync } from 'node:child_process';
@@ -26,26 +11,14 @@ import readline from 'node:readline/promises';
26
11
 
27
12
  import { STUB_MARKER, scaffoldDocs } from './scaffold-docs.js';
28
13
 
29
- // ---------------------------------------------------------------------------
30
- // Phase text constants
31
- // ---------------------------------------------------------------------------
32
-
33
14
  /**
34
- * Text printed at the end of the init tail to hand the operator off to /mandrel-plan.
35
- *
36
15
  * @type {string}
37
16
  */
38
17
  export const PLAN_HANDOFF_TEXT =
39
18
  '\n✅ Mandrel is ready. Start your first project:\n\n' +
40
19
  ' /mandrel-plan --seed "<one-line description of what you want to build>"\n';
41
20
 
42
- // ---------------------------------------------------------------------------
43
- // Internal helpers
44
- // ---------------------------------------------------------------------------
45
-
46
21
  /**
47
- * Format a list of missing docs as a human-readable report (no prompt).
48
- *
49
22
  * @param {string[]} missing
50
23
  * @returns {string}
51
24
  */
@@ -63,23 +36,9 @@ function formatMissingList(missing) {
63
36
  const SCAFFOLD_PROMPT = '\nCreate placeholders? [y/N]: ';
64
37
 
65
38
  /**
66
- * Async y/N read from stdin via `node:readline` (mirrors the prompt mechanism
67
- * in `bootstrap.js`). Returns on Enter and never blocks waiting for EOF the way
68
- * `fs.readFileSync(0)` did — that EOF-blocking read hung `mandrel init` on an
69
- * interactive TTY. No is the default (`[y/N]`): only an explicit `y`/`yes`
70
- * resolves to `true` (create the placeholders). A bare Enter or any other input
71
- * declines, matching the same default-off policy as `--with-issue-forms`. A
72
- * read error resolves to `false` so a genuine I/O failure never writes
73
- * unattended. The prompt text is written by the caller via `stdout`, so the
74
- * question string passed here is empty.
75
- *
76
- * `terminal: false` is **load-bearing**: with terminal mode on (the default
77
- * when stdout is a TTY) readline emits cursor-control escapes
78
- * (`\x1b[1G\x1b[0J`) that erase the `Create placeholders? [y/N]:` prompt already
79
- * written via the caller's `stdout`, leaving the operator staring at a blank,
80
- * dead-looking line. Disabling terminal mode preserves the pre-written prompt
81
- * and reads the line via the TTY's cooked-mode echo. `createInterface` is
82
- * injectable so a test can assert this option is set (regression guard).
39
+ * y/N (default No; a read error declines). Readline, because a blocking
40
+ * `fs.readFileSync(0)` hangs on a TTY. `terminal: false` is load-bearing:
41
+ * terminal mode's cursor escapes erase the caller's pre-written prompt.
83
42
  *
84
43
  * @param {{ createInterface?: typeof readline.createInterface }} [opts]
85
44
  * @returns {Promise<boolean>}
@@ -102,24 +61,13 @@ export async function readConfirm({
102
61
  }
103
62
  }
104
63
 
105
- // ---------------------------------------------------------------------------
106
- // Public API
107
- // ---------------------------------------------------------------------------
108
-
109
64
  /**
110
- * Run the post-bootstrap init tail.
111
- *
112
65
  * @param {object} [opts]
113
- * @param {string} [opts.root] - Project root (defaults to `process.cwd()`).
114
- * @param {(msg: string) => void} [opts.stdout] - Output sink (defaults to
115
- * `process.stdout.write` bound to `process.stdout`).
116
- * @param {() => boolean} [opts.confirmScaffold] - Read the operator's y/N
117
- * answer for the scaffold offer. Returns `true` to scaffold. In non-TTY
118
- * contexts defaults to `false` (no write without operator confirmation).
66
+ * @param {string} [opts.root]
67
+ * @param {(msg: string) => void} [opts.stdout]
68
+ * @param {() => boolean} [opts.confirmScaffold]
119
69
  * @param {(extraArgs?: string[]) => { status: number|null }} [opts.runDoctor]
120
- * - Run `mandrel doctor`; injectable for tests.
121
- * @param {boolean} [opts.isTTY] - Whether stdin is a TTY (defaults to
122
- * `Boolean(process.stdin.isTTY)`).
70
+ * @param {boolean} [opts.isTTY]
123
71
  * @returns {Promise<{
124
72
  * scaffoldResult: object,
125
73
  * doctorStatus: number,
@@ -136,14 +84,11 @@ export async function runInitTail({
136
84
  const projectRoot = root ?? process.cwd();
137
85
  const tty = isTTY ?? Boolean(process.stdin.isTTY);
138
86
 
139
- // When confirmScaffold is explicitly injected (e.g. from tests), always use
140
- // it. When using the default, auto-decline on non-TTY so the scaffolder
141
- // never writes unattended.
87
+ // An injected confirm is always consulted; the default auto-declines off a
88
+ // TTY so the scaffolder never writes unattended.
142
89
  const usingDefaultConfirm = confirmScaffold == null;
143
90
  const confirmFn = confirmScaffold ?? readConfirm;
144
91
 
145
- // Default doctor runner — spawns `mandrel doctor` via the locally installed
146
- // bin; inherits stdio so the report streams to the terminal.
147
92
  const mandrelBin = path.join(
148
93
  projectRoot,
149
94
  'node_modules',
@@ -159,7 +104,6 @@ export async function runInitTail({
159
104
 
160
105
  const doctorFn = runDoctor ?? defaultRunDoctor;
161
106
 
162
- // --- Phase 1: Offer to scaffold missing docsContextFiles -----------------
163
107
  const preview = scaffoldDocs({ root: projectRoot, write: false });
164
108
  let scaffoldResult = preview;
165
109
 
@@ -167,9 +111,6 @@ export async function runInitTail({
167
111
  stdout('\n[Final Checks] All docsContextFiles are present.\n');
168
112
  } else {
169
113
  stdout(formatMissingList(preview.missing));
170
- // On non-TTY without an injected confirm, auto-decline so the scaffolder
171
- // never writes unattended. On TTY (or with an injected confirm seam), show
172
- // the prompt and consult the confirm function.
173
114
  const canPrompt = tty || !usingDefaultConfirm;
174
115
  if (canPrompt) stdout(SCAFFOLD_PROMPT);
175
116
  const accepted = canPrompt ? await confirmFn() : false;
@@ -187,7 +128,6 @@ export async function runInitTail({
187
128
  }
188
129
  }
189
130
 
190
- // --- Phase 2: Readiness gate (mandrel doctor) ----------------------------
191
131
  stdout('\n[Final Checks] Final installation summary via mandrel doctor…\n');
192
132
  const doctorResult = doctorFn();
193
133
  const doctorStatus = doctorResult?.status ?? 1;
@@ -200,7 +140,6 @@ export async function runInitTail({
200
140
  return { scaffoldResult, doctorStatus, ok: false };
201
141
  }
202
142
 
203
- // --- Phase 3: Handoff to /mandrel-plan -------------------------------------------
204
143
  stdout(PLAN_HANDOFF_TEXT);
205
144
  return { scaffoldResult, doctorStatus, ok: true };
206
145
  }
@@ -1,15 +1,8 @@
1
1
  /**
2
- * Guided-onboard doc scaffolder (Epic #3438 Story #3519).
3
- *
4
- * Detects which of the project's configured `project.docsContextFiles` are
5
- * absent under the resolved docs root, and — on acceptance — scaffolds a stub
6
- * for each missing file. Stubs are seeded from a dedicated template under
7
- * `.agents/templates/docs/<name>` when one ships; otherwise a generic
8
- * placeholder stub is written so the mandatory-read never resolves to a
9
- * missing file.
10
- *
11
- * The detection pass is side-effect free: callers can preview the missing set
12
- * (`scaffoldDocs({ write: false })`) before deciding whether to scaffold.
2
+ * Guided-onboard doc scaffolder: find the configured
3
+ * `project.docsContextFiles` missing under the docs root and, when `write`,
4
+ * stub each one (from `.agents/templates/docs/<name>` when shipped, else a
5
+ * generic placeholder). `write: false` is a side-effect-free preview.
13
6
  *
14
7
  * @module lib/onboard/scaffold-docs
15
8
  */
@@ -25,18 +18,14 @@ const AGENT_ROOT = path.resolve(__dirname, '../../..');
25
18
  const DOCS_TEMPLATE_DIR = path.join(AGENT_ROOT, 'templates', 'docs');
26
19
 
27
20
  /**
28
- * Deterministic marker written into every scaffolded stub. The `/mandrel-plan`
29
- * first-run preflight (and any tooling that wants to detect unedited stubs)
30
- * keys off this exact string — do not change it without a hard cutover.
21
+ * Marker in every stub; the `/mandrel-plan` first-run preflight detects
22
+ * unedited stubs by this exact string — changing it is a hard cutover.
31
23
  *
32
24
  * @type {string}
33
25
  */
34
26
  export const STUB_MARKER = '<!-- MANDREL:STUB -->';
35
27
 
36
28
  /**
37
- * Build the generic placeholder stub for a docsContextFile that has no
38
- * dedicated template. Derives a human-readable title from the filename.
39
- *
40
29
  * @param {string} fileName - e.g. `data-dictionary.md`
41
30
  * @returns {string}
42
31
  */
@@ -57,11 +46,6 @@ function genericStub(fileName) {
57
46
  }
58
47
 
59
48
  /**
60
- * Read the dedicated template body for a docsContextFile, or fall back to the
61
- * generic stub when no template ships for that name. Either path prepends the
62
- * {@link STUB_MARKER} so the `/mandrel-plan` first-run preflight can detect un-edited
63
- * stubs regardless of whether a dedicated template was used.
64
- *
65
49
  * @param {string} fileName
66
50
  * @param {import('node:fs')} fsImpl
67
51
  * @returns {string}
@@ -70,25 +54,19 @@ function stubContentFor(fileName, fsImpl) {
70
54
  const templatePath = path.join(DOCS_TEMPLATE_DIR, fileName);
71
55
  if (fsImpl.existsSync(templatePath)) {
72
56
  const body = fsImpl.readFileSync(templatePath, 'utf8');
73
- // Prepend the marker only when absent (idempotent; the template files
74
- // themselves are kept marker-free so they read cleanly as documentation).
57
+ // Templates stay marker-free so they read cleanly as documentation.
75
58
  return body.startsWith(STUB_MARKER) ? body : `${STUB_MARKER}\n${body}`;
76
59
  }
77
60
  return genericStub(fileName);
78
61
  }
79
62
 
80
63
  /**
81
- * Detect missing docsContextFiles and, on acceptance, scaffold stubs.
82
- *
83
64
  * @param {object} [opts]
84
65
  * @param {string} [opts.root] - Project root to resolve config + docs root
85
- * against. Defaults to the resolver's `PROJECT_ROOT`.
86
- * @param {string[]} [opts.docsContextFiles] - Override the configured list
87
- * (primarily for tests). Falls back to `project.docsContextFiles`.
88
- * @param {string} [opts.docsRoot] - Override the resolved docs-root directory
89
- * name (relative to `root`). Falls back to `project.paths.docsRoot`.
90
- * @param {boolean} [opts.write=true] - When `false`, only detect (no files are
91
- * created). When `true` (acceptance), scaffold each missing file.
66
+ * against.
67
+ * @param {string[]} [opts.docsContextFiles] - Override the configured list.
68
+ * @param {string} [opts.docsRoot] - Override the docs-root directory name.
69
+ * @param {boolean} [opts.write=true] - `false` only detects.
92
70
  * @param {import('node:fs')} [opts.fs] - Injectable fs implementation.
93
71
  * @returns {{
94
72
  * docsRoot: string,
@@ -126,7 +104,6 @@ export function scaffoldDocs(opts = {}) {
126
104
  fsImpl.mkdirSync(docsRootAbs, { recursive: true });
127
105
  for (const fileName of missing) {
128
106
  const target = path.join(docsRootAbs, fileName);
129
- // Guard against nested paths whose parent dir is absent.
130
107
  fsImpl.mkdirSync(path.dirname(target), { recursive: true });
131
108
  fsImpl.writeFileSync(target, stubContentFor(fileName, fsImpl), 'utf8');
132
109
  created.push(fileName);
@@ -1,57 +1,8 @@
1
1
  /**
2
- * Acceptance self-eval decision core (Story #3819).
3
- *
4
- * Pure reducer that turns one round's critic verdict plus the resolved
5
- * round cap into the loop's next action. The CLI wrapper
6
- * (`acceptance-eval.js`) owns the file reads, schema validation, signal
7
- * emission, and ticket transitions; this module owns the *decision* so it
8
- * can be unit-tested in isolation.
9
- *
10
- * ## Round derivation (Story #4019)
11
- *
12
- * The round number is **derived from the signals ledger**, not from the
13
- * critic's self-reported `verdict.round`: every prior round appended one
14
- * `acceptance-eval` signal to the Story's `signals.ndjson`, so the
15
- * current round is `count(prior signals) + 1`. This survives a subagent
16
- * restart (the ledger is on disk) and removes the critic's scratch value
17
- * from the cap enforcement path — a critic that always reports `round: 1`
18
- * can no longer defeat the bounded-loop guarantee.
19
- *
20
- * ## Reading a verdict is not a round (Story #4874)
21
- *
22
- * Counting signals made *observation* costly: re-running the gate over an
23
- * already-scored verdict — a resumed sub-agent re-reading its own verdict,
24
- * an operator re-checking why the loop said `redraft` — appended another
25
- * signal and advanced the derived round, so a `redraft` could escalate to
26
- * `block` with no work in between. Every appended signal therefore carries
27
- * a `details.verdictFingerprint` content-addressing the verdict it scored,
28
- * and {@link resolveAcceptanceEvalRound} replays the round already recorded
29
- * for that fingerprint instead of minting a new one. A replay is observably
30
- * free: the round does not advance and no signal is appended. New work
31
- * produces different verdict content, hence a new fingerprint, hence a
32
- * genuine round.
33
- *
34
- * ## The three terminal actions
35
- *
36
- * - `proceed` — every criterion is `met`. The Story may flip to
37
- * `closing`.
38
- * - `redraft` — at least one criterion is `partial`/`unmet` AND the
39
- * current round is below the cap. The agent reworks the
40
- * flagged criteria and re-runs the eval pass.
41
- * - `block` — at least one criterion is `partial`/`unmet` AND the
42
- * current round has reached (or somehow exceeded) the cap.
43
- * The Story escalates to `agent::blocked`; it never
44
- * silently proceeds to close.
45
- *
46
- * ## The cap
47
- *
48
- * `maxRounds` arrives normalized by `lib/config/acceptance-eval.js` as a
49
- * non-negative integer (Story #5313: `0` means "score once, no redraft").
50
- * This reducer maps that onto an effective cap of scored rounds: a cap of
51
- * `0`, a negative value or a non-integer is coerced to 1, so there is no
52
- * input — config or verdict — that yields an unbounded `redraft` chain.
53
- * When `round >= effectiveCap` and criteria remain unmet, the only
54
- * possible action is `block`.
2
+ * Acceptance-eval decision core: verdict + cap → `proceed`, `redraft`, or
3
+ * `block` (unmet at cap; never a silent close). The round comes from the
4
+ * signals ledger, never the critic's own `round`, so a critic cannot defeat
5
+ * the cap; re-scoring an identical verdict replays its round.
55
6
  */
56
7
 
57
8
  import { createHash } from 'node:crypto';
@@ -59,21 +10,13 @@ import { readFileSync } from 'node:fs';
59
10
 
60
11
  import { runArtifactPath, signalsFile } from '../config/temp-paths.js';
61
12
 
62
- /** Epic-level signals stream basename (mirrors signals-writer). */
63
13
  const EPIC_SIGNALS_BASENAME = 'signals.ndjson';
64
14
 
65
- /**
66
- * Verdicts that clear a criterion. Anything else (`partial`, `unmet`, or
67
- * an unrecognised value) is treated as not-yet-met and triggers rework.
68
- *
69
- * @type {ReadonlySet<string>}
70
- */
15
+ /** @type {ReadonlySet<string>} */
71
16
  const MET_VERDICTS = Object.freeze(new Set(['met']));
72
17
 
73
18
  /**
74
- * Coerce a candidate cap to a positive integer ≥ 1. This is the
75
- * last-line guard against an open loop: any degraded cap falls back to a
76
- * single round rather than an unbounded one.
19
+ * Integer ≥ 1 — the last guard against an unbounded redraft loop.
77
20
  *
78
21
  * @param {unknown} value
79
22
  * @returns {number}
@@ -86,10 +29,6 @@ function effectiveCap(value) {
86
29
  }
87
30
 
88
31
  /**
89
- * Partition a verdict's criteria into met and not-met buckets, preserving
90
- * order and capturing the evidence for the not-met items (used to compose
91
- * the blocker comment and the per-criterion signal).
92
- *
93
32
  * @param {Array<{ index?: number, criterion?: string, verdict?: string, evidence?: string }>} criteria
94
33
  * @returns {{
95
34
  * metCount: number,
@@ -117,19 +56,10 @@ function partitionCriteria(criteria) {
117
56
  }
118
57
 
119
58
  /**
120
- * Decide the next loop action from a single round's verdict.
121
- *
122
59
  * @param {object} args
123
- * @param {{ criteria?: Array<object> }} args.verdict
124
- * A verdict already validated against the acceptance-eval-verdict schema.
125
- * Its `round` field, when present, is ignored — the round is supplied by
126
- * the caller (derived from the signals ledger; Story #4019).
60
+ * @param {{ criteria?: Array<object> }} args.verdict Its own `round` is ignored.
127
61
  * @param {number} args.maxRounds
128
- * The resolved (already-clamped) redraft ceiling from
129
- * `getAcceptanceEval(config).maxRounds`.
130
- * @param {number} [args.round]
131
- * The current round number, derived via `resolveAcceptanceEvalRound`.
132
- * Defaults to 1 when absent or invalid.
62
+ * @param {number} [args.round] From `resolveAcceptanceEvalRound`.
133
63
  * @returns {{
134
64
  * decision: 'proceed' | 'redraft' | 'block',
135
65
  * round: number,
@@ -169,18 +99,14 @@ export function decideAcceptanceEval({ verdict, maxRounds, round: roundIn }) {
169
99
  }
170
100
 
171
101
  /**
172
- * Build the per-criterion acceptance-eval signal payload for the retro /
173
- * feedback substrate. Carries which acceptance items needed rework and the
174
- * round count so `/mandrel-plan` Phase 0 feedback fetch and the retro can
175
- * surface acceptance churn. PII-free by construction — it carries only
176
- * acceptance-item indices, verdicts, and the terminal decision.
102
+ * PII-free by construction: indices, verdicts and the decision only.
177
103
  *
178
104
  * @param {object} args
179
105
  * @param {number} args.storyId
180
106
  * @param {number | null} args.epicId
181
107
  * @param {ReturnType<typeof decideAcceptanceEval>} args.outcome
182
108
  * @param {string} [args.phase]
183
- * @returns {object} The signal record (sans `ts`, which the caller stamps).
109
+ * @returns {object} The record without `ts` (the caller stamps it).
184
110
  */
185
111
  export function buildAcceptanceEvalSignal({
186
112
  storyId,
@@ -194,18 +120,12 @@ export function buildAcceptanceEvalSignal({
194
120
  kind: 'acceptance-eval',
195
121
  epicId: epicId ?? null,
196
122
  storyId: storyId ?? null,
197
- // Epic #4475 (M4-B): single-delivery acceptance critics score an AC
198
- // *cluster*, not a Story. `clusterId` scopes the per-cluster round count
199
- // on the epic-level signals stream; omitted (null) for the per-Story path.
200
123
  ...(typeof clusterId === 'string' && clusterId.length > 0
201
124
  ? { clusterId }
202
125
  : {}),
203
126
  phase,
204
127
  emitter: { tool: 'acceptance-eval.js' },
205
128
  details: {
206
- // Content address of the verdict this signal scored. The replay guard
207
- // in `resolveAcceptanceEvalRound` matches on it, so a re-read of an
208
- // already-scored verdict reuses its round instead of minting one.
209
129
  ...(typeof verdictFingerprint === 'string' &&
210
130
  verdictFingerprint.length > 0
211
131
  ? { verdictFingerprint }
@@ -225,27 +145,19 @@ export function buildAcceptanceEvalSignal({
225
145
  }
226
146
 
227
147
  /**
228
- * Read the `acceptance-eval` records already appended to the Story's (or AC
229
- * cluster's) `signals.ndjson`, in append order — the prior rounds
230
- * {@link resolveAcceptanceEvalRound} counts from (Story #4019).
231
- *
232
- * The read is restart-safe: the ledger lives on disk, so a subagent that
233
- * dies mid-loop and restarts still observes every prior round. A missing or
234
- * unreadable ledger degrades to "no prior rounds" and malformed lines are
235
- * skipped — observability corruption never wedges the gate.
148
+ * Prior rounds' records, oldest first. A missing ledger or malformed line
149
+ * never wedges the gate. `clusterId` counts per AC cluster on the epic-level
150
+ * stream.
236
151
  *
237
152
  * @param {object} args
238
- * @param {number|null} args.epicId Parent Epic ID, or `null` for a
239
- * standalone Story (routes to `<tempRoot>/standalone/stories/...`).
153
+ * @param {number|null} args.epicId
240
154
  * @param {number} args.storyId
241
- * @param {string|null} [args.clusterId] AC-cluster id (Epic #4475 M4-B).
242
- * @param {object} [args.config] Resolved config (tempRoot resolution).
243
- * @param {(p: string) => string} [args.readFile] Injectable reader (tests).
155
+ * @param {string|null} [args.clusterId]
156
+ * @param {object} [args.config]
157
+ * @param {(p: string) => string} [args.readFile]
244
158
  * @param {(eid: number|null, sid: number, config?: object) => string} [args.signalsPathResolver]
245
- * Injectable path resolver (tests). Defaults to `signalsFile`.
246
159
  * @param {(eid: number, config?: object) => string} [args.epicSignalsPathResolver]
247
- * Injectable epic-stream path resolver (tests).
248
- * @returns {object[]} The matching records, oldest first.
160
+ * @returns {object[]}
249
161
  */
250
162
  function readPriorAcceptanceEvalRecords({
251
163
  epicId,
@@ -257,10 +169,6 @@ function readPriorAcceptanceEvalRecords({
257
169
  epicSignalsPathResolver = (eid, cfg) =>
258
170
  runArtifactPath(eid, EPIC_SIGNALS_BASENAME, cfg),
259
171
  }) {
260
- // Epic #4475 (M4-B): single-delivery critics score AC clusters, not
261
- // Stories. When `clusterId` is supplied the round is counted per cluster
262
- // off the epic-level signals stream; otherwise the per-Story path
263
- // (unchanged) counts by `storyId` off the Story's stream.
264
172
  const clusterMode =
265
173
  typeof clusterId === 'string' &&
266
174
  clusterId.length > 0 &&
@@ -272,7 +180,6 @@ function readPriorAcceptanceEvalRecords({
272
180
  ? readFile(epicSignalsPathResolver(epicId, config))
273
181
  : readFile(signalsPathResolver(epicId ?? null, storyId, config));
274
182
  } catch (_err) {
275
- // No ledger yet → no prior rounds.
276
183
  return [];
277
184
  }
278
185
 
@@ -284,7 +191,7 @@ function readPriorAcceptanceEvalRecords({
284
191
  try {
285
192
  record = JSON.parse(trimmed);
286
193
  } catch (_err) {
287
- continue; // Malformed line — skip, never throw.
194
+ continue;
288
195
  }
289
196
  if (!record || typeof record !== 'object') continue;
290
197
  if (record.kind !== 'acceptance-eval') continue;
@@ -299,19 +206,11 @@ function readPriorAcceptanceEvalRecords({
299
206
  }
300
207
 
301
208
  /**
302
- * Content-address a verdict so re-scoring the same verdict is recognisable
303
- * as a re-read rather than a new round (Story #4874).
304
- *
305
- * The fingerprint covers exactly what the decision depends on — the ordered
306
- * per-criterion `index` / `criterion` / `verdict` / `evidence` tuples — and
307
- * deliberately nothing else: the verdict's self-reported `round`, its
308
- * timestamp, and any authoring scratch must not make an unchanged
309
- * evaluation look like a new one. Conversely, real rework changes at least
310
- * one criterion's verdict or its evidence, so a genuine re-evaluation
311
- * always fingerprints differently.
209
+ * Hashes only what the decision depends on, so an unchanged evaluation
210
+ * fingerprints the same and real rework does not.
312
211
  *
313
212
  * @param {{ criteria?: Array<object> }} verdict
314
- * @returns {string} 16 hex chars of a SHA-256 over the canonical form.
213
+ * @returns {string}
315
214
  */
316
215
  export function computeVerdictFingerprint(verdict) {
317
216
  const criteria = Array.isArray(verdict?.criteria) ? verdict.criteria : [];
@@ -328,23 +227,10 @@ export function computeVerdictFingerprint(verdict) {
328
227
  }
329
228
 
330
229
  /**
331
- * Resolve the round a verdict should be scored under, distinguishing a
332
- * genuine evaluation from a re-read of an already-scored verdict
333
- * (Story #4874). A genuine round is `prior-signal count + 1`, so the first
334
- * run reports round 1 and each completed round advances it by one.
335
- *
336
- * When the ledger already carries an `acceptance-eval` signal whose
337
- * `details.verdictFingerprint` matches, this invocation is a **replay**: it
338
- * reports that signal's round and tells the caller not to append a second
339
- * one, so reading is observably free and cannot escalate a `redraft` into a
340
- * `block`. Otherwise it is a genuine round and the counter advances exactly
341
- * as the pre-#4874 count-based derivation always did.
342
- *
343
- * Signals written before this field existed carry no fingerprint; they can
344
- * never match, so legacy ledgers keep their count-based behaviour.
230
+ * A matching recorded fingerprint is a replay of that round (the caller must
231
+ * not append); otherwise `prior count + 1`.
345
232
  *
346
- * @param {object} args — {@link readPriorAcceptanceEvalRecords}'s arguments
347
- * plus:
233
+ * @param {object} args — {@link readPriorAcceptanceEvalRecords}'s args, plus:
348
234
  * @param {string} args.verdictFingerprint
349
235
  * @returns {{ round: number, replay: boolean }}
350
236
  */
@@ -1,56 +1,17 @@
1
1
  /**
2
- * auto-merge-cwd.js — resolve a worktree-collision-safe cwd for arming
3
- * GitHub native auto-merge (Story #4282).
4
- *
5
- * Root cause this module exists to defeat:
6
- * Arming auto-merge runs, in effect,
7
- * `gh pr merge <pr> --auto --squash --delete-branch`. The
8
- * `--delete-branch` flag makes `gh` shell out to local `git` to leave
9
- * and delete the PR head branch — including a `git checkout <base>` to
10
- * switch the working tree off the head branch. When the arm runs from a
11
- * per-Story worktree cwd (checked out on the head branch `story-<id>`)
12
- * while the base branch (`main`) is already occupied by the primary
13
- * worktree, `gh`'s internal `git checkout <base>` collides:
14
- *
15
- * fatal: '<base>' is already used by worktree at '<primary>'
16
- *
17
- * The arm fails (non-fatally), defeating the unattended auto-merge
18
- * contract — the operator must re-run the merge manually from a clean cwd.
19
- *
20
- * Fix (advisory direction #1 from the Story — "ensure the cwd is already
21
- * on the base branch so gh's `git checkout <base>` is a no-op"):
22
- * Re-point the arm at the **primary worktree root** — the working tree
23
- * that holds the base branch — discovered via `git worktree list
24
- * --porcelain`. From the primary worktree, `gh`'s `--delete-branch`
25
- * cleanup never has to `git checkout <base>` (it is already there), so
26
- * the collision cannot occur. `--delete-branch` is preserved verbatim,
27
- * so the PR head branch is still removed on merge with no dependency on
28
- * the consumer's repo-level "auto-delete head branches" toggle.
29
- *
30
- * Non-fatal by construction: any failure to resolve the primary worktree
31
- * (not a git repo, `git` missing, single-worktree layout, parse failure)
32
- * degrades to returning the original `cwd` unchanged. Worst case is the
33
- * pre-fix behaviour; this helper never throws and never blocks arming.
2
+ * auto-merge-cwd.js — pick a cwd for arming auto-merge that cannot hit the
3
+ * worktree collision. `gh pr merge --delete-branch` runs `git checkout <base>`;
4
+ * from a Story worktree that fails because the primary worktree already holds
5
+ * the base branch. Arming from the primary worktree makes that checkout a
6
+ * no-op while keeping `--delete-branch`. Any resolution failure returns the
7
+ * original `cwd`; never throws.
34
8
  */
35
9
 
36
10
  import { gitSpawn as defaultGitSpawn } from '../git-utils.js';
37
11
 
38
12
  /**
39
- * Parse `git worktree list --porcelain` output into structured records.
40
- *
41
- * The porcelain format emits one stanza per worktree, blank-line
42
- * separated, e.g.:
43
- *
44
- * worktree /abs/path/to/primary
45
- * HEAD <sha>
46
- * branch refs/heads/main
47
- *
48
- * worktree /abs/path/to/.worktrees/story-4282
49
- * HEAD <sha>
50
- * branch refs/heads/story-4282
51
- *
52
- * A linked worktree with a detached HEAD emits `detached` instead of a
53
- * `branch` line. Pure — exported for tests.
13
+ * Parse `git worktree list --porcelain` stanzas; a detached worktree has
14
+ * `branch: null`.
54
15
  *
55
16
  * @param {string} stdout
56
17
  * @returns {Array<{ path: string, branch: string|null }>}
@@ -70,21 +31,14 @@ export function parseWorktreeList(stdout) {
70
31
  .trim()
71
32
  .replace(/^refs\/heads\//, '');
72
33
  }
73
- // `HEAD <sha>`, `detached`, `bare`, `locked`, `prunable` lines carry
74
- // no field we need; ignored.
75
34
  }
76
35
  if (current) records.push(current);
77
36
  return records;
78
37
  }
79
38
 
80
39
  /**
81
- * Pick the primary worktree from a parsed worktree list. The primary
82
- * worktree is the first stanza `git worktree list` emits — it is the
83
- * original (non-linked) working tree and, during delivery, the one that
84
- * holds the base branch. Returns its absolute path, or `null` when the
85
- * list is empty / unparseable.
86
- *
87
- * Pure — exported for tests.
40
+ * The first stanza is the primary (non-linked) worktree, which holds the base
41
+ * branch during delivery.
88
42
  *
89
43
  * @param {Array<{ path: string, branch: string|null }>} records
90
44
  * @returns {string|null}
@@ -98,14 +52,7 @@ export function pickPrimaryWorktreePath(records) {
98
52
  }
99
53
 
100
54
  /**
101
- * Resolve a worktree-collision-safe cwd for arming auto-merge.
102
- *
103
- * Returns the primary worktree root (which holds the base branch) when it
104
- * can be discovered AND it differs from `cwd`; otherwise returns `cwd`
105
- * unchanged. Never throws.
106
- *
107
- * @param {string} cwd — the cwd the caller would otherwise arm from
108
- * (often a per-Story worktree on the head branch).
55
+ * @param {string} cwd — the cwd the caller would otherwise arm from.
109
56
  * @param {{ gitSpawn?: typeof import('../git-utils.js').gitSpawn }} [deps]
110
57
  * @returns {string} a cwd safe to run `gh pr merge --delete-branch` from.
111
58
  */
@@ -121,8 +68,6 @@ export function resolveAutoMergeArmCwd(
121
68
  if (!primary) return cwd;
122
69
  return primary;
123
70
  } catch {
124
- // Any unexpected failure (git missing, non-repo cwd, etc.) degrades
125
- // to the original cwd — arming stays best-effort.
126
71
  return cwd;
127
72
  }
128
73
  }