mandrel 2.60.0 → 2.62.0

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