mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -2,36 +2,10 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * diagnose-friction.js — v5 Diagnostic Interceptor & Friction Signal Detector
6
- *
7
- * Wraps a shell command with telemetry capture. On failure:
8
- * 1. Prints static diagnostic suggestions to stdout.
9
- * 2. Appends a structured `friction` record to the per-Story
10
- * `signals.ndjson` stream via `signals-writer.appendSignal` (when
11
- * both `--story` and `--epic` can be resolved).
12
- *
13
- * In v5 (Epic #1030), friction is a **local NDJSON signal**, not a GitHub
14
- * comment. The detector posts no comments; the analyzer reads the NDJSON
15
- * stream out-of-band. See Tech Spec #1032 §observability.
16
- *
17
- * Usage:
18
- * node diagnose-friction.js [--story <STORY_ID>] \
19
- * [--epic <EPIC_ID>] --cmd <cmd> <args...>
20
- *
21
- * `--cmd` consumes the remaining argv as separate words and spawns them with
22
- * no shell. Quoting the whole command as one string is a usage error, not
23
- * friction — it is refused loudly and writes no ledger row.
24
- *
25
- * Story/Epic resolution order:
26
- * 1. CLI flags (--story, --epic).
27
- * 2. Environment vars (STORY_ID, EPIC_ID / SPRINT_ID).
28
- *
29
- * If neither story nor epic can be resolved, the script still prints
30
- * diagnostic suggestions but skips the signal write (a missing signal is
31
- * preferable to a halted runner — see signals-writer best-effort contract).
32
- *
33
- * @see docs/v5-implementation-plan.md Sprint 3E
34
- * @see .agents/scripts/lib/observability/signals-writer.js
5
+ * Diagnostic interceptor: runs a command (argv words, no shell) and on
6
+ * failure prints remediation and appends a local `friction` NDJSON signal —
7
+ * never a ticket comment. With no resolvable Story the write is skipped: a
8
+ * missing signal beats a halted runner.
35
9
  */
36
10
  import { spawnSync } from 'node:child_process';
37
11
  import crypto from 'node:crypto';
@@ -41,10 +15,6 @@ import { getLimits, resolveConfig } from './lib/config-resolver.js';
41
15
  import { Logger } from './lib/Logger.js';
42
16
  import { appendSignal } from './lib/observability/signals-writer.js';
43
17
 
44
- // ---------------------------------------------------------------------------
45
- // Helpers
46
- // ---------------------------------------------------------------------------
47
-
48
18
  function parseArguments(args) {
49
19
  let storyId = null;
50
20
  let epicId = null;
@@ -63,10 +33,7 @@ function parseArguments(args) {
63
33
  }
64
34
 
65
35
  /**
66
- * Ordered classification rules. The first rule whose `markers` are found
67
- * (any-match) wins. Table-driven so adding a new pattern doesn't grow the
68
- * cyclomatic complexity of `classifyFrictionCategory`.
69
- *
36
+ * First rule with any matching marker wins.
70
37
  * @type {ReadonlyArray<{markers: string[], category: string, remediation: string}>}
71
38
  */
72
39
  const FRICTION_RULES = [
@@ -104,51 +71,28 @@ function classifyFrictionCategory(errorOutput) {
104
71
  }
105
72
 
106
73
  /**
107
- * `spawnSync`'s own `timeout` option kills the child with `SIGTERM`, so a
108
- * SIGTERM observed here almost always means the interceptor's configured
109
- * `executionTimeoutMs` bound fired. Any other signal — a `SIGKILL` from the
110
- * OOM killer, an operator `kill -9` — originated outside this process.
111
- *
74
+ * `spawnSync`'s timeout kills with SIGTERM; any other signal came from outside.
112
75
  * @type {string}
113
76
  */
114
77
  const INTERCEPTOR_TIMEOUT_SIGNAL = 'SIGTERM';
115
78
 
116
79
  /**
117
- * A `maxBuffer` overflow presents identically to a timeout — `status: null`,
118
- * `signal: 'SIGTERM'` — because Node kills the child the same way. The only
119
- * discriminator is `result.error.code`, so a SIGTERM carrying this code is a
120
- * buffer overflow and must never be reported as a timeout (Story #4915).
121
- *
80
+ * A maxBuffer overflow is also a SIGTERM; only this error code tells it
81
+ * apart from a timeout.
122
82
  * @type {string}
123
83
  */
124
84
  const OVERFLOW_ERROR_CODE = 'ENOBUFS';
125
85
 
126
- /** Shell convention for "the process died by signal N": exit `128 + N`. */
127
86
  const SIGNAL_EXIT_BASE = 128;
128
87
 
129
88
  /**
130
- * Describe a child that never exited normally — `status === null`, Node's
131
- * documented representation of "did not exit normally". The raw status must
132
- * never reach `process.exit`, because `process.exit(null)` exits **0**: the
133
- * interceptor would report success for a command it just watched get killed
134
- * (Story #4851).
135
- *
136
- * Which signal fired is the diagnostic value: SIGTERM points at one of the
137
- * interceptor's own bounds, anything else at the host. A SIGTERM splits again
138
- * on `error.code`: `ENOBUFS` means the output blew past `executionMaxBuffer`,
139
- * anything else means `executionTimeoutMs` fired. Recording that plus the
140
- * bound itself is what makes the row actionable to a consumer who cannot edit
141
- * the materialized framework tree.
142
- *
143
- * Deliberately module-local and pure — exporting it for tests would fail the
144
- * `--production` dead-exports ratchet, and folding it into `main` would spend
145
- * the file's per-file maintainability-delta headroom. The CLI contract is the
146
- * seam the unit tests drive.
147
- *
89
+ * For a `null` status, which must never reach `process.exit` (null exits 0).
90
+ * SIGTERM + ENOBUFS = buffer overflow, SIGTERM otherwise = timeout, any other
91
+ * signal = the host. Kept module-local: exporting it for tests would trip the
92
+ * `--production` dead-exports gate.
148
93
  * @param {{signal: (string|null), error?: {message?: string, code?: string}}}
149
- * result A `spawnSync` result whose `status` is `null`.
150
- * @param {{executionTimeoutMs: number, executionMaxBuffer: number}} bounds The
151
- * resolved interceptor bounds — the timeout in ms, the buffer in bytes.
94
+ * result
95
+ * @param {{executionTimeoutMs: number, executionMaxBuffer: number}} bounds
152
96
  * @returns {{category: string, remediation: string, details: object,
153
97
  * preview: string, exitCode: number}}
154
98
  */
@@ -244,14 +188,10 @@ function buildFrictionSignal({
244
188
  ts: new Date().toISOString(),
245
189
  epicId: epicId ?? null,
246
190
  storyId: storyId ?? null,
247
- // 2-tier hierarchy (Epic #3163): no Task tier, so friction signals
248
- // carry no Task id. The field is retained for schema compatibility
249
- // and always null.
191
+ // No Task tier; kept for schema compatibility.
250
192
  taskId: null,
251
193
  category,
252
- // `emitter.command` is what `classifySignalSource` step 1 scans, so the
253
- // command-scan stays authoritative for `source`: a consumer command killed
254
- // by its own host remains consumer-actionable (Story #4851).
194
+ // `classifySignalSource` scans `emitter.command` first to attribute source.
255
195
  emitter: {
256
196
  tool: 'diagnose-friction.js',
257
197
  command: commandStr,
@@ -260,10 +200,6 @@ function buildFrictionSignal({
260
200
  };
261
201
  }
262
202
 
263
- // ---------------------------------------------------------------------------
264
- // Main Execution
265
- // ---------------------------------------------------------------------------
266
-
267
203
  export async function main(args = process.argv.slice(2)) {
268
204
  const { storyId, epicId, cmdArgs } = parseArguments(args);
269
205
 
@@ -273,16 +209,9 @@ export async function main(args = process.argv.slice(2)) {
273
209
  );
274
210
  }
275
211
 
276
- // Story #4915 — the interceptor spawns `cmdArgs[0]` directly, with no shell.
277
- // A single argument containing whitespace therefore names an executable that
278
- // cannot exist, and the resulting ENOENT is a usage error in the
279
- // interceptor's OWN invocation, not friction in the wrapped command. It must
280
- // be reported as one and MUST NOT reach the ledger — otherwise the real
281
- // friction is discarded and the roll-up eventually auto-files a framework-gap
282
- // ticket about the framework's own instrumentation being misused. The
283
- // discriminator is this argv shape, never the ENOENT result: a correctly
284
- // split command whose binary is genuinely absent yields the identical
285
- // `spawnSync` result and stays real friction.
212
+ // No shell, so one whitespace-bearing arg is a usage error that must not
213
+ // reach the ledger. Discriminate on argv shape, not ENOENT: a genuinely
214
+ // absent binary yields the same spawn result and is real friction.
286
215
  if (cmdArgs.length === 1 && /\s/.test(cmdArgs[0])) {
287
216
  throw new Error(
288
217
  `Usage: --cmd takes the command as separate argv words, not one quoted string. Received a single quoted argument: "${cmdArgs[0]}". Drop the quotes so each word is its own argv entry — \`--cmd ${cmdArgs[0]}\`. No friction signal was recorded.`,
@@ -290,13 +219,9 @@ export async function main(args = process.argv.slice(2)) {
290
219
  }
291
220
 
292
221
  const config = resolveConfig();
293
- const limits = getLimits(config);
294
- const executionTimeoutMs = limits.executionTimeoutMs;
295
- // The interceptor's bound is deliberately *below* the framework-wide
296
- // `MAX_BUFFER_BYTES` ceiling: it is a reported policy bound whose value the
297
- // emitted friction row carries (`details.executionMaxBuffer`), not an
298
- // overflow guard. Story #5009 moved its definition to the shared
299
- // child-process surface so it is no longer a hand-copied literal here.
222
+ const { executionTimeoutMs } = getLimits();
223
+ // Deliberately below `MAX_BUFFER_BYTES`: a reported policy bound, not an
224
+ // overflow guard.
300
225
  const executionMaxBuffer = INTERCEPTOR_MAX_BUFFER_BYTES;
301
226
 
302
227
  const commandStr = cmdArgs.join(' ');
@@ -313,8 +238,6 @@ export async function main(args = process.argv.slice(2)) {
313
238
  if (result.stderr) process.stderr.write(result.stderr);
314
239
 
315
240
  if (result.status !== 0) {
316
- // A `null` status means the child never exited normally; the cause lives in
317
- // `result.signal`, not in the status.
318
241
  const abnormal =
319
242
  result.status === null
320
243
  ? describeAbnormalExit(result, {
@@ -322,9 +245,6 @@ export async function main(args = process.argv.slice(2)) {
322
245
  executionMaxBuffer,
323
246
  })
324
247
  : null;
325
- // With both streams empty an abnormal termination names its signal; the
326
- // `Unknown exit code` fallback is therefore reachable only with a real
327
- // numeric status, never as `Unknown exit code null`.
328
248
  const noOutputFallback = abnormal
329
249
  ? abnormal.preview
330
250
  : `Unknown exit code ${result.status}`;
@@ -340,9 +260,7 @@ export async function main(args = process.argv.slice(2)) {
340
260
  'Command failed. Appending friction signal to NDJSON stream...',
341
261
  );
342
262
 
343
- // An abnormal termination classifies itself: the marker scan reads output
344
- // the kill may have truncated (or never produced), so it cannot name the
345
- // signal.
263
+ // A killed command's output may be truncated, so it classifies itself.
346
264
  const classified = classifyFrictionCategory(errorOutput);
347
265
  const category = abnormal?.category ?? classified.category;
348
266
  const remediation = abnormal?.remediation ?? classified.remediation;
@@ -359,11 +277,7 @@ export async function main(args = process.argv.slice(2)) {
359
277
  terminationDetails: abnormal?.details ?? null,
360
278
  });
361
279
 
362
- // Story #2874 — accept story-only context (no parent Epic). When
363
- // only the story is resolved, write to the standalone signals
364
- // stream at `<tempRoot>/standalone/stories/story-<sid>/signals.ndjson`
365
- // by passing `epicId: null` through to the writer. The only case
366
- // we still skip is fully-no-context (story unresolved).
280
+ // A null epicId routes to the standalone Story stream.
367
281
  if (resolvedStoryId != null) {
368
282
  try {
369
283
  const ok = await appendSignal({
@@ -394,18 +308,12 @@ export async function main(args = process.argv.slice(2)) {
394
308
  Logger.error(remediation);
395
309
  Logger.error('----------------------------------------\n');
396
310
 
397
- // Never `process.exit(result.status)` on a null status — that exits 0 and
398
- // reports success for a killed command.
399
311
  process.exit(abnormal?.exitCode ?? result.status);
400
312
  } else {
401
313
  process.exit(0);
402
314
  }
403
315
  }
404
316
 
405
- // ---------------------------------------------------------------------------
406
- // Call main if run directly
407
- // ---------------------------------------------------------------------------
408
-
409
317
  import { runAsCli } from './lib/cli-utils.js';
410
318
 
411
319
  runAsCli(import.meta.url, main, {
@@ -57,7 +57,7 @@ const escalateFrom = (value) => value !== false && value !== 'false';
57
57
  * without a real worktree ledger or a real process kill.
58
58
  *
59
59
  * Every seam on the optional final `deps` parameter defaults to the real
60
- * implementation (`.agents/rules/test-seams.md` rules 1-2, 4), so `main` and
60
+ * implementation (`docs/contributing/test-seams.md` rules 1-2, 4), so `main` and
61
61
  * every production caller are unchanged.
62
62
  *
63
63
  * @param {string[]} [argv]
@@ -1,34 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * evidence-gate.js — evidence-aware wrapper around a single shell gate.
5
- *
6
- * Tech Spec #819 §"Evidence record (Story 7)" — `/mandrel-deliver` Phase 3
7
- * (close-validation) runs `npm run lint` and `npm test` against the Epic
8
- * branch before opening the PR.
9
- * If the same gate has already passed against the current `git rev-parse
10
- * HEAD` (recorded earlier in the local hot path), this wrapper logs a skip
11
- * and exits 0 instead of re-spawning the runner. On run, a successful
12
- * gate is recorded so the next invocation can skip in turn.
13
- *
14
- * Usage:
15
- * node .agents/scripts/evidence-gate.js \
16
- * --standalone --scope-id <storyId> --gate <name> \
17
- * [--worktree <path>] [--no-evidence] -- <cmd> [args...]
18
- *
19
- * Examples:
20
- * node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate lint \
21
- * --worktree .worktrees/story-4250 -- npm run lint
22
- * node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate test \
23
- * --worktree .worktrees/story-4250 -- npm test
24
- *
25
- * `--standalone` (Story #4250) is required: the evidence file is anchored on
26
- * the Story id at
27
- * `<tempRoot>/standalone/stories/story-<sid>/validation-evidence.json` — the
28
- * same keyspace the standalone close consults, so the acceptance-self-eval
29
- * critic's verify[] runs (lint / typecheck) are shared with the close.
30
- * v2.0.0 removed the Epic tier along with the `--epic-id` Epic-keyed
31
- * keyspace.
4
+ * Runs one gate, skipping it when evidence shows the same gate already
5
+ * passed for the current HEAD and tree, and recording a pass for the next
6
+ * caller. `--standalone` is required: it keys evidence by Story id, the same
7
+ * keyspace close consults, so worker-side verify[] runs credit the close.
32
8
  */
33
9
 
34
10
  import { spawnSync } from 'node:child_process';
@@ -44,12 +20,6 @@ import {
44
20
  treeFingerprint,
45
21
  } from './lib/validation-evidence.js';
46
22
 
47
- /**
48
- * Split argv at the first `--` and return both halves. The wrapper consumes
49
- * everything before `--`; the runner receives everything after.
50
- *
51
- * Exported for testing.
52
- */
53
23
  export function splitOnDashDash(argv) {
54
24
  const idx = argv.indexOf('--');
55
25
  if (idx === -1) return { wrapperArgs: argv, runnerArgs: [] };
@@ -59,11 +29,6 @@ export function splitOnDashDash(argv) {
59
29
  };
60
30
  }
61
31
 
62
- /**
63
- * Parse the wrapper-side argv (before `--`).
64
- *
65
- * Exported for testing.
66
- */
67
32
  export function parseWrapperArgs(argv) {
68
33
  const { values } = parseArgs({
69
34
  args: argv,
@@ -96,16 +61,9 @@ function resolveHeadShaDefault(cwd, gitSpawnFn) {
96
61
  }
97
62
 
98
63
  /**
99
- * The pair of keys an evidence record is written and read under: the commit
100
- * this gate ran at, and the content identity of the tree it ran against
101
- * (Story #5278).
102
- *
103
- * Both are read from the **spawn** cwd — the Story worktree when one is
104
- * supplied — so the keys describe the tree the gate actually saw. The tree
105
- * fingerprint is what keeps this gate credited across close's own base-sync
106
- * fast-forward, which moves HEAD between the deposit and the gates that would
107
- * spend it; see `validation-evidence.js#treeFingerprint`.
108
- *
64
+ * Read from the spawn cwd so the keys describe the tree the gate saw. The
65
+ * tree fingerprint keeps credit across close's base-sync fast-forward, which
66
+ * moves HEAD between deposit and spend.
109
67
  * @param {{ spawnCwd: string, gitSpawnFn: Function, useEvidence: boolean }} args
110
68
  * @returns {{ headSha: string|null, inputFingerprint: string|null }}
111
69
  */
@@ -118,34 +76,21 @@ function resolveEvidenceKeys({ spawnCwd, gitSpawnFn, useEvidence }) {
118
76
  }
119
77
 
120
78
  /**
121
- * Runner-shaped entry-point: takes the parsed wrapper args + runner args and
122
- * executes the gate. Pure-ish (modulo IO) — all side-effects are routed via
123
- * the injection hooks so tests can stub `gitSpawn`, `spawnSync`, and the
124
- * evidence store without touching disk or spawning processes.
125
- *
126
- * Exported for tests + the CLI `main()`.
127
- *
128
79
  * @param {object} params
129
- * @param {number} params.scopeId — Story ID (positive integer).
130
- * @param {boolean} [params.standalone] — Required. Routes to the
131
- * storyId-anchored standalone keyspace (Story #4250).
132
- * @param {string} params.gate — Logical gate name (`lint`, `typecheck`, …).
133
- * @param {boolean} params.useEvidence — When false, force the runner.
134
- * @param {string} params.cwd — Evidence cwd (locates the temp
135
- * tree). The runner is spawned in `worktreePath` when set, else `cwd`.
136
- * @param {string|null} [params.worktreePath] — Spawn cwd override (Story #1120).
137
- * When set, the runner runs in the Story worktree and the HEAD-SHA used as
138
- * the evidence cache key is read from the worktree, not from `cwd`.
139
- * @param {string[]} params.runnerArgs — `[cmd, ...args]` from after `--`.
140
- * @param {object} [deps] — Optional injection hooks (tests).
141
- * @param {Function} [deps.gitSpawnFn] — Stub for `gitSpawn`.
142
- * @param {Function} [deps.spawnFn] — Stub for `spawnSync`.
143
- * @param {Function} [deps.shouldSkipFn] — Stub for `shouldSkip`.
144
- * @param {Function} [deps.recordPassFn] — Stub for `recordPass`.
145
- * @param {object} [deps.logger] — Logger-shaped object (info/error/warn/fatal).
146
- * @returns {{ status: number, skipped: boolean }} Outcome summary. `status`
147
- * is the runner's exit code (0 = pass), `skipped` is true when evidence
148
- * short-circuited the runner.
80
+ * @param {number} params.scopeId
81
+ * @param {boolean} [params.standalone]
82
+ * @param {string} params.gate
83
+ * @param {boolean} params.useEvidence
84
+ * @param {string} params.cwd — evidence cwd (locates the temp tree)
85
+ * @param {string|null} [params.worktreePath] — spawn cwd and HEAD source
86
+ * @param {string[]} params.runnerArgs
87
+ * @param {object} [deps]
88
+ * @param {Function} [deps.gitSpawnFn]
89
+ * @param {Function} [deps.spawnFn]
90
+ * @param {Function} [deps.shouldSkipFn]
91
+ * @param {Function} [deps.recordPassFn]
92
+ * @param {object} [deps.logger]
93
+ * @returns {{ status: number, skipped: boolean }}
149
94
  */
150
95
  export async function runEvidenceGate(params, deps = {}) {
151
96
  const {
@@ -165,9 +110,6 @@ export async function runEvidenceGate(params, deps = {}) {
165
110
  runnerArgs,
166
111
  } = params ?? {};
167
112
 
168
- // `--standalone` (Story #4250) routes the evidence file to the
169
- // storyId-anchored keyspace so the acceptance-self-eval critic can record
170
- // verify[] evidence into the same keyspace the standalone close consults.
171
113
  if (
172
114
  !scopeId ||
173
115
  !standalone ||
@@ -180,14 +122,10 @@ export async function runEvidenceGate(params, deps = {}) {
180
122
  );
181
123
  return { status: 1, skipped: false };
182
124
  }
183
- // Evidence-store opts shared by shouldSkip + recordPass below.
184
125
  const evidenceStoreOpts = { cwd, standalone };
185
126
 
186
- // Spawn cwd is the worktree when supplied — every gate command sees the
187
- // Story branch's tree, not the main checkout. Evidence cwd stays anchored
188
- // to the main checkout so the temp tree resolves under the main
189
- // `.git/`. The HEAD-SHA used as the cache key is read from the spawn cwd
190
- // (the worktree), so cache entries key against the Story branch's HEAD.
127
+ // The gate runs in the worktree; evidence stays anchored to the main
128
+ // checkout so the temp tree resolves under the main `.git/`.
191
129
  const spawnCwd = worktreePath ?? cwd;
192
130
  const [cmd, ...cmdArgs] = runnerArgs;
193
131
  const configHash = hashCommandConfig({ cmd, args: cmdArgs, cwd: spawnCwd });
@@ -1,18 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * file-ci-gap.js — the CI-remediation Option-2 filing command.
4
- *
5
- * `rules/ci-remediation.md` sends three verdicts here — `pre-existing`,
6
- * `capacity`, `unreproducible-tier` — each meaning "this red check is real,
7
- * and fixing it is not this delivery's job". The rule used to say "file a
8
- * `meta::framework-gap` issue" and stop, leaving the agent to hand-run
9
- * `gh issue create` wherever it was standing. This is the mechanism behind
10
- * that sentence: evidence from the CI digest, ownership routing, fingerprint
11
- * dedup, the `friction` comment, and the `agent::blocked` flip in one call.
12
- *
13
- * It files an **intake** issue, never a Story: `/mandrel-plan <id>` graduates
14
- * it on the next planning pass. Delivery never blocks on planning — see
15
- * `lib/orchestration/ci-gap-intake.js` for why that split is load-bearing.
3
+ * CI-remediation Option-2 filing: for a red check that is real but not this
4
+ * delivery's to fix, files (or updates, by fingerprint) an intake issue in
5
+ * the owning repo, comments `friction` on the Story, and optionally blocks it.
6
+ * It files intake, never a Story, so delivery never blocks on planning.
16
7
  */
17
8
 
18
9
  import { parseArgs } from 'node:util';
@@ -35,7 +26,11 @@ import {
35
26
  INTAKE_VERDICTS,
36
27
  REFUSED_VERDICT,
37
28
  } from './lib/orchestration/ci-gap-intake.js';
38
- import { readCiDigest } from './lib/orchestration/ci-rerun-guard.js';
29
+ import {
30
+ RERUN_ALLOWANCE_VERDICTS,
31
+ readCiDigest,
32
+ recordRerunAllowance,
33
+ } from './lib/orchestration/ci-rerun-guard.js';
39
34
  import {
40
35
  STATE_LABELS,
41
36
  transitionTicketState,
@@ -55,7 +50,7 @@ const USAGE = {
55
50
  ],
56
51
  [
57
52
  '--verdict <verdict>',
58
- `One of ${INTAKE_VERDICTS.join(' | ')}. "${REFUSED_VERDICT}" is refused: it routes to Option 1, fix at source.`,
53
+ `One of ${INTAKE_VERDICTS.join(' | ')}. "${REFUSED_VERDICT}" is refused: it routes to Option 1, fix at source. ${RERUN_ALLOWANCE_VERDICTS.join(' / ')} also record the one-rerun allowance on the CI digest.`,
59
54
  ],
60
55
  [
61
56
  '--owner <bucket>',
@@ -80,15 +75,9 @@ const USAGE = {
80
75
  };
81
76
 
82
77
  /**
83
- * Wire the live GitHub ports the intake filer writes through.
84
- *
85
- * `gh` is the transport rather than the provider facade because a filing can
86
- * target a repository other than the configured one, and `gh issue create
87
- * --repo` is the surface that already does that (the graduators file
88
- * cross-repo the same way).
89
- *
78
+ * `gh` rather than the provider facade: a filing may target another repo.
90
79
  * @param {object} opts
91
- * @returns {object} ports for `fileCiGapIntake`
80
+ * @returns {object}
92
81
  */
93
82
  function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
94
83
  const labelCache = new Map();
@@ -100,9 +89,7 @@ function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
100
89
  repo: searchRepo.repo,
101
90
  }),
102
91
  createIssue: async ({ owner, repo, title, body, labels }) => {
103
- // `gh issue create --label <absent>` fails outright, so a brand-new
104
- // routing label (meta::platform-gap, friction::unreproducible-tier)
105
- // has to exist before the create — not after it errors.
92
+ // `gh issue create` fails outright on an absent label; ensure first.
106
93
  const ensured = await ensureIssueLabels({
107
94
  owner,
108
95
  repo,
@@ -132,13 +119,15 @@ function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
132
119
  }
133
120
 
134
121
  /**
135
- * Render the `friction` comment the Story carries so the blocker is legible
136
- * on the ticket itself, not only in the intake issue.
137
- *
138
122
  * @param {object} opts
139
123
  * @returns {string}
140
124
  */
141
- export function renderFrictionComment({ verdict, result, digest }) {
125
+ export function renderFrictionComment({
126
+ verdict,
127
+ result,
128
+ digest,
129
+ rerunAllowance = null,
130
+ }) {
142
131
  const target = result.issue?.url ?? result.issue?.number ?? '(not filed)';
143
132
  const lines = [
144
133
  `### CI gap filed — verdict \`${verdict}\``,
@@ -158,23 +147,28 @@ export function renderFrictionComment({ verdict, result, digest }) {
158
147
  `- **Routing:** deferred from \`${result.routing.deferredFrom}\` (${result.routing.deferralReason}) — filed locally instead.`,
159
148
  );
160
149
  }
161
- lines.push(
162
- '',
163
- 'This verdict does **not** license a re-run of the failed job. Graduate the',
164
- 'intake issue with `/mandrel-plan <issue number>` to turn it into a Story.',
165
- );
150
+ lines.push('', renderRerunLine(rerunAllowance), GRADUATE_LINE);
166
151
  return lines.join('\n');
167
152
  }
168
153
 
154
+ const GRADUATE_LINE =
155
+ 'Graduate the intake issue with `/mandrel-plan <issue number>` to turn it into a Story.';
156
+
157
+ /**
158
+ * @param {{ headSha: string } | null} rerunAllowance
159
+ * @returns {string}
160
+ */
161
+ function renderRerunLine(rerunAllowance) {
162
+ return rerunAllowance
163
+ ? 'This verdict is environmental and proven, so **one** rerun of the failed ' +
164
+ `job is now admitted on head \`${rerunAllowance.headSha}\` — and one only. ` +
165
+ 'A second red after it is real and routes to Option 1.'
166
+ : 'This verdict does **not** license a re-run of the failed job.';
167
+ }
168
+
169
169
  /**
170
- * File the CI-gap intake issue for one Story, post the `friction` comment,
171
- * and optionally flip the Story to `agent::blocked`.
172
- *
173
- * Every port is injectable so the unit tests exercise the whole command with
174
- * no network and no live tracker.
175
- *
176
170
  * @param {object} opts
177
- * @returns {Promise<object>} the intake result, plus what the command did.
171
+ * @returns {Promise<object>}
178
172
  */
179
173
  export async function runFileCiGap({
180
174
  storyId,
@@ -198,7 +192,10 @@ export async function runFileCiGap({
198
192
  throw new Error('--story <id> is required (a positive issue number).');
199
193
  }
200
194
  const resolved = config ?? resolveConfig();
201
- const ciDigest = digest ?? readCiDigest({ storyId: sid, tempRoot, cwd });
195
+ // Must resolve exactly as `pr-watch-with-update.js` does when writing it.
196
+ const digestRoot = tempRoot ?? resolved?.project?.paths?.tempRoot ?? 'temp';
197
+ const ciDigest =
198
+ digest ?? readCiDigest({ storyId: sid, tempRoot: digestRoot, cwd });
202
199
  if (!ciDigest) {
203
200
  throw new Error(
204
201
  `no CI digest for Story #${sid}. The digest is written by \`pr-watch-with-update.js --story ${sid}\` on the first red; without it there is no run link or failure signature to file.`,
@@ -237,9 +234,24 @@ export async function runFileCiGap({
237
234
  now,
238
235
  });
239
236
 
237
+ // A proven-environmental verdict earns one same-SHA rerun; never on dry run.
238
+ const rerunAllowance = dryRun
239
+ ? null
240
+ : recordRerunAllowance({
241
+ storyId: sid,
242
+ verdict,
243
+ tempRoot: digestRoot,
244
+ cwd,
245
+ });
246
+
240
247
  const actions = { commented: false, blocked: false };
241
248
  if (!dryRun && ticketing) {
242
- const body = renderFrictionComment({ verdict, result, digest: ciDigest });
249
+ const body = renderFrictionComment({
250
+ verdict,
251
+ result,
252
+ digest: ciDigest,
253
+ rerunAllowance,
254
+ });
243
255
  try {
244
256
  await upsertStructuredComment(ticketing, sid, 'friction', body);
245
257
  actions.commented = true;
@@ -258,12 +270,10 @@ export async function runFileCiGap({
258
270
  }
259
271
  }
260
272
 
261
- return { storyId: sid, verdict, ...result, actions };
273
+ return { storyId: sid, verdict, ...result, actions, rerunAllowance };
262
274
  }
263
275
 
264
276
  /**
265
- * CLI entrypoint.
266
- *
267
277
  * @returns {Promise<void>}
268
278
  */
269
279
  async function main() {
@@ -290,8 +300,6 @@ async function main() {
290
300
  block: values.block,
291
301
  });
292
302
 
293
- // Single-line JSON per the script-output contract — an orchestrator parses
294
- // this, and a pretty dump is noise in a delivery transcript.
295
303
  process.stdout.write(`${JSON.stringify(result)}\n`);
296
304
  for (const err of result.errors) {
297
305
  Logger.error(`[file-ci-gap] ${err}`);