mandrel 2.60.0 → 2.61.0

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