mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,49 +1,15 @@
1
1
  /**
2
- * run-scoped-config.js — pin the config values a delivery run was seeded
3
- * from, and fail closed when the file they came from changed underneath it.
4
- *
5
- * The problem this exists for: `single-story-init.js` resolves config and
6
- * seeds `story-<id>` from `project.baseBranch`; `single-story-close` used to
7
- * re-resolve the SAME key and run close-validation, format-autofix, the gate
8
- * baseline and base-sync against its own second answer. Nothing pinned the
9
- * first value and nothing checked the two agreed — and the window between
10
- * them is however long implementation takes. A concurrent session editing
11
- * `.agentrc.json` / `.agentrc.local.json` mid-run therefore base-synced a
12
- * Story against a base it was never seeded from, which surfaced only as an
13
- * ordinary content conflict with nothing pointing at config.
14
- *
15
- * The base a Story was seeded from is a property of **that run**, not of
16
- * whatever the config file says later. So init pins it and close reads the
17
- * pin back.
18
- *
19
- * ## Where the pin lives
20
- *
21
- * The `story-init` structured comment, not a temp log: the post-land tail
22
- * purges the temp tree, while the ticket comment survives every close re-run
23
- * and every recovery path. `single-story-init.js` already upserts that
24
- * comment; `pinRunScopedConfig` supplies the block it records, and
25
- * `resolveRunScopedConfig` reads it back through the existing
26
- * `findStructuredComment` seam.
27
- *
28
- * ## Adding another run-scoped key
29
- *
30
- * Add one row to `RUN_SCOPED_CONFIG_KEYS`. Both halves — the pin init writes
31
- * and the comparison close makes — enumerate that registry, so a new key
32
- * needs no second mechanism, no reader change and no writer change. Only
33
- * `baseBranch` is enforced today because only its corruption is destructive
34
- * (a wrong base merged into the Story branch permanently contaminates the
35
- * branch and its PR diff); ceremony profile, quality floors and the
36
- * concurrency cap are deliberately NOT pinned here.
2
+ * Pin the config a delivery run was seeded from (in the init envelope) and
3
+ * fail closed at close when the config changed underneath it — a concurrent
4
+ * edit would otherwise base-sync the Story onto a base it was never seeded
5
+ * from. A missing pin degrades to current config with a loud warning.
37
6
  */
38
7
 
39
- import { parseFencedJsonComment } from './structured-comment-parser.js';
40
- import { findStructuredComment } from './ticketing.js';
8
+ import { readRunScopedPin } from './story-init-envelope.js';
41
9
 
42
10
  /**
43
- * The run-scoped config registry. One row per key whose value belongs to the
44
- * run that seeded the Story rather than to the current contents of the config
45
- * file. `read` resolves the key from a resolved config (including its
46
- * default); `label` is the dotted config path the operator has to go fix.
11
+ * Keys whose value belongs to the seeding run. Only `baseBranch`: a wrong base
12
+ * permanently contaminates the branch. Init and close both walk this registry.
47
13
  *
48
14
  * @type {Record<string, { read: (config: object) => unknown, label: string }>}
49
15
  */
@@ -55,14 +21,8 @@ const RUN_SCOPED_CONFIG_KEYS = {
55
21
  };
56
22
 
57
23
  /**
58
- * Snapshot the run-scoped config values from a resolved config. This is the
59
- * write half of the pin: `single-story-init.js` records the returned object
60
- * in the `story-init` receipt so close can compare against it later.
61
- *
62
- * @param {object} config Resolved config (`resolveConfig` output).
63
- * @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys] Registry override — the
64
- * default is the module registry; supplying one is how a caller (or a test)
65
- * exercises the registry-driven property without a second mechanism.
24
+ * @param {object} config Resolved config.
25
+ * @param {typeof RUN_SCOPED_CONFIG_KEYS} [keys]
66
26
  * @returns {Record<string, unknown>} the pinned values, keyed by config key.
67
27
  */
68
28
  export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
@@ -74,71 +34,39 @@ export function pinRunScopedConfig(config, keys = RUN_SCOPED_CONFIG_KEYS) {
74
34
  }
75
35
 
76
36
  /**
77
- * Read the pinned block out of the run's `story-init` receipt.
78
- *
79
- * Three distinct non-success states, all reported rather than collapsed —
80
- * the whole point of this module is that a fallback is never silent:
81
- * - `absent`: no `story-init` comment on the ticket. Real and expected —
82
- * the upsert is best-effort (init logs and continues on failure), and a
83
- * recovery path may close a Story whose init predates this receipt.
84
- * - `unreadable`: the comment exists but carries no parseable JSON payload.
85
- * - `provider-error`: the comment read itself failed.
37
+ * A row with no pinned value is `unpinned` (an older receipt), not a conflict.
86
38
  *
87
39
  * @param {{
88
- * provider: object,
89
- * storyId: number,
90
- * findCommentFn?: typeof findStructuredComment,
40
+ * pinned: Record<string, unknown>,
41
+ * current: Record<string, unknown>,
42
+ * keys: typeof RUN_SCOPED_CONFIG_KEYS,
91
43
  * }} args
92
- * @returns {Promise<{ status: string, values: Record<string, unknown>|null, detail: string|null }>}
44
+ * @returns {{
45
+ * values: Record<string, unknown>,
46
+ * conflicts: Array<{ label: string, pinned: unknown, current: unknown }>,
47
+ * unpinned: string[],
48
+ * }}
93
49
  */
94
- async function readRunScopedConfigReceipt({
95
- provider,
96
- storyId,
97
- findCommentFn = findStructuredComment,
98
- }) {
99
- let comment;
100
- try {
101
- comment = await findCommentFn(provider, Number(storyId), 'story-init');
102
- } catch (err) {
103
- return {
104
- status: 'provider-error',
105
- values: null,
106
- detail: `story-init comment could not be read (${err?.message ?? err})`,
107
- };
108
- }
109
- if (!comment) {
110
- return {
111
- status: 'absent',
112
- values: null,
113
- detail: 'no story-init comment on the ticket',
114
- };
115
- }
116
- const payload = parseFencedJsonComment(comment);
117
- if (!payload || typeof payload !== 'object') {
118
- return {
119
- status: 'unreadable',
120
- values: null,
121
- detail: 'story-init comment carries no parseable JSON payload',
122
- };
50
+ function comparePinToCurrent({ pinned: pin, current, keys }) {
51
+ const values = {};
52
+ const conflicts = [];
53
+ const unpinned = [];
54
+ for (const [key, spec] of Object.entries(keys)) {
55
+ const pinned = pin?.[key];
56
+ if (pinned === undefined || pinned === null) {
57
+ unpinned.push(spec.label);
58
+ values[key] = current[key];
59
+ continue;
60
+ }
61
+ values[key] = pinned;
62
+ if (pinned !== current[key]) {
63
+ conflicts.push({ label: spec.label, pinned, current: current[key] });
64
+ }
123
65
  }
124
- // Receipts written before the `runScopedConfig` block existed carry the
125
- // pinned values as top-level payload fields (`baseBranch` has been recorded
126
- // there since Story #831). Reading the payload itself as the fallback block
127
- // is what lets a Story initialized by an older init still close against its
128
- // own pinned base instead of degrading to the fallback warning.
129
- const block =
130
- payload.runScopedConfig && typeof payload.runScopedConfig === 'object'
131
- ? payload.runScopedConfig
132
- : payload;
133
- return { status: 'found', values: block, detail: null };
66
+ return { values, conflicts, unpinned };
134
67
  }
135
68
 
136
69
  /**
137
- * Build the refusal message for a mid-run config change. Names BOTH values
138
- * for every conflicting key — the pinned one and the one config resolves to
139
- * now — because "which base was this branch actually seeded from" is the
140
- * question the operator could not previously answer.
141
- *
142
70
  * @param {{ storyId: number, conflicts: Array<{ label: string, pinned: unknown, current: unknown }> }} args
143
71
  * @returns {string}
144
72
  */
@@ -159,21 +87,14 @@ function formatRunScopedConflict({ storyId, conflicts }) {
159
87
  }
160
88
 
161
89
  /**
162
- * Resolve the run-scoped config for a close, preferring the run's pin over a
163
- * fresh resolution of the config file.
164
- *
165
- * Throws on disagreement — fail closed, before any gate, format-autofix or
166
- * base-sync has run, with both values named. Never silently prefers either
167
- * side: preferring the pin would base-sync correctly but hide a config change
168
- * the operator needs to know about, and preferring current config is the bug
169
- * this module exists to close.
90
+ * Throws on disagreement, before any gate or base-sync runs — silently
91
+ * preferring either side would hide the config change.
170
92
  *
171
93
  * @param {{
172
- * provider: object,
173
94
  * storyId: number,
174
95
  * config: object,
175
96
  * keys?: typeof RUN_SCOPED_CONFIG_KEYS,
176
- * findCommentFn?: typeof findStructuredComment,
97
+ * readPinFn?: typeof readRunScopedPin,
177
98
  * progress?: (tag: string, msg: string) => void,
178
99
  * }} args
179
100
  * @returns {Promise<{
@@ -181,57 +102,39 @@ function formatRunScopedConflict({ storyId, conflicts }) {
181
102
  * confirmed: boolean,
182
103
  * receiptStatus: string,
183
104
  * warning: string|null,
184
- * }>} `confirmed` is true only when every key came from the receipt and
185
- * agreed with current config — i.e. when downstream remediation may safely
186
- * assume the pinned value is the one in play.
105
+ * }>} `confirmed` only when every key was pinned and agreed.
187
106
  */
188
107
  export async function resolveRunScopedConfig({
189
- provider,
190
108
  storyId,
191
109
  config,
192
110
  keys = RUN_SCOPED_CONFIG_KEYS,
193
- findCommentFn,
111
+ readPinFn = readRunScopedPin,
194
112
  progress,
195
113
  }) {
196
114
  const current = pinRunScopedConfig(config, keys);
197
- const receipt = await readRunScopedConfigReceipt({
198
- provider,
199
- storyId,
200
- findCommentFn,
201
- });
115
+ const receipt = readPinFn({ storyId: Number(storyId), config });
202
116
 
203
- if (receipt.status !== 'found') {
204
- // A missing receipt is a real state, not an error — but the fallback is
205
- // announced, because a silent one reintroduces exactly the bug above.
117
+ if (!receipt) {
118
+ // Not an error, but never a silent fallback.
206
119
  const warning =
207
- `Run-scoped config could not be read from the run's init receipt ` +
208
- `(${receipt.detail}); falling back to the currently-resolved config ` +
209
- `(${describeValues(current, keys)}). This close cannot confirm the Story ` +
210
- 'was seeded from these values.';
120
+ `Run-scoped config could not be read from the run's init envelope ` +
121
+ `(no runScopedConfig pin for Story #${storyId}); falling back to the ` +
122
+ `currently-resolved config (${describeValues(current, keys)}). This close ` +
123
+ 'cannot confirm the Story was seeded from these values.';
211
124
  progress?.('PIN', `⚠️ ${warning}`);
212
125
  return {
213
126
  values: current,
214
127
  confirmed: false,
215
- receiptStatus: receipt.status,
128
+ receiptStatus: 'absent',
216
129
  warning,
217
130
  };
218
131
  }
219
132
 
220
- const values = {};
221
- const conflicts = [];
222
- const unpinned = [];
223
- for (const [key, spec] of Object.entries(keys)) {
224
- const pinned = receipt.values?.[key];
225
- if (pinned === undefined || pinned === null) {
226
- unpinned.push(spec.label);
227
- values[key] = current[key];
228
- continue;
229
- }
230
- values[key] = pinned;
231
- if (pinned !== current[key]) {
232
- conflicts.push({ label: spec.label, pinned, current: current[key] });
233
- }
234
- }
133
+ const { values, conflicts, unpinned } = comparePinToCurrent({
134
+ pinned: receipt,
135
+ current,
136
+ keys,
137
+ });
235
138
 
236
139
  if (conflicts.length > 0) {
237
140
  throw new Error(formatRunScopedConflict({ storyId, conflicts }));
@@ -245,26 +148,19 @@ export async function resolveRunScopedConfig({
245
148
  return {
246
149
  values,
247
150
  confirmed: false,
248
- receiptStatus: receipt.status,
151
+ receiptStatus: 'found',
249
152
  warning,
250
153
  };
251
154
  }
252
155
 
253
156
  progress?.(
254
157
  'PIN',
255
- `📌 Run-scoped config pinned by the story-init receipt (${describeValues(values, keys)}).`,
158
+ `📌 Run-scoped config pinned by the init envelope (${describeValues(values, keys)}).`,
256
159
  );
257
- return {
258
- values,
259
- confirmed: true,
260
- receiptStatus: receipt.status,
261
- warning: null,
262
- };
160
+ return { values, confirmed: true, receiptStatus: 'found', warning: null };
263
161
  }
264
162
 
265
163
  /**
266
- * Render `label=value` pairs for the operator-facing lines above.
267
- *
268
164
  * @param {Record<string, unknown>} values
269
165
  * @param {typeof RUN_SCOPED_CONFIG_KEYS} keys
270
166
  * @returns {string}
@@ -1,45 +1,18 @@
1
1
  /**
2
- * close-note.js — the human-readable `note` on close's result record
3
- * (Story #5266).
2
+ * close-note.js — the human-readable `note` on close's result record.
4
3
  *
5
- * ## Why this is its own module
6
- *
7
- * The note used to branch on `waitedForMerge` — whether close *waited* — and
8
- * not on `merged`. A bounded wait that expired with the PR still open
9
- * therefore wrote "Close-and-land: PR merge confirmed … the issue closed"
10
- * into `story-close-result-<id>.log` **beside `merged: false`**, while the
11
- * schema-validated terminal envelope correctly reported
12
- * `status: pending, phase: confirm-merge`. That log is what close's summary
13
- * line points the operator at, so the contradiction is what gets read first:
14
- * a merge that never happened, reported as confirmed.
15
- *
16
- * The invariant this module exists to hold:
17
- *
18
- * > **No note may assert a state the same object denies.**
19
- *
20
- * Every branch below is therefore derived from the result's OWN
21
- * `merged` / `directMerged` / `autoMergeEnabled` / `landCompleted` fields —
22
- * the ones the note ships next to — so no input can produce a note that
23
- * contradicts them. Story #5279 added the fourth, because `merged: true`
24
- * used to imply the flip, the issue close and the post-land tail: a direct
25
- * squash-merge under `--no-wait-merge`, and a merge whose `agent::done` write
26
- * failed, now reach it with none of the three, and reusing the confirmed
27
- * wording for them would reintroduce the defect above one field over. The
28
- * unmerged branches deliberately claim nothing about the Story's label state
29
- * either: close's ending may be `pending` OR `blocked` with the same
30
- * `merged: false`, and the terminal envelope is the authority on which. They
31
- * also avoid the merge-completion vocabulary entirely — no `agent::done`, no
32
- * "the merge confirms" — so that a reader skimming for those words cannot
33
- * take a next-step instruction for a report of what happened.
4
+ * Invariant: no note may assert a state the same object denies, so every
5
+ * branch derives from the result's own fields. A merge is not a completed
6
+ * land (`landCompleted`), and the unmerged branches claim nothing about label
7
+ * state and avoid merge-completion vocabulary — the terminal envelope is the
8
+ * authority on pending vs blocked.
34
9
  */
35
10
 
36
11
  /**
37
- * The one line the note is not allowed to get wrong.
38
- *
39
12
  * @param {{ merged?: boolean, directMerged?: boolean,
40
13
  * autoMergeEnabled?: boolean, landCompleted?: boolean }} result
41
14
  * `landCompleted` — did THIS run flip `agent::done`, close the issue and
42
- * run the post-land tail? Defaults to `merged`, the pre-#5279 equivalence.
15
+ * run the post-land tail? Defaults to `merged`.
43
16
  * @returns {string}
44
17
  */
45
18
  export function deriveCloseNote({
@@ -1,17 +1,7 @@
1
1
  /**
2
- * single-story-close/failed-terminal.js — the `failed` terminal a close
3
- * emits when a phase crashes, and the gate reconstruction it carries.
4
- *
5
- * Split out of `single-story-close.js` so the CLI entry stays an entry: it
6
- * parses args, dispatches the runner, and maps a terminal onto an exit code.
7
- * The reasoning about which gates had run by the time a phase died belongs
8
- * with the envelope it feeds, not in the file that owns process lifetime.
9
- *
10
- * The runner deliberately throws rather than returning a failure (a red gate
11
- * must not look like a return value), so without this the most common
12
- * non-happy ending — a failing close-validation gate — would emit **no
13
- * envelope at all**, exiting 1 with only a stderr line while the workflow
14
- * docs promise the agent a `failed` envelope naming the phase.
2
+ * single-story-close/failed-terminal.js — the `failed` envelope a close
3
+ * emits when a phase throws, so a crashed close still reports which phase
4
+ * died and which gates had run.
15
5
  */
16
6
 
17
7
  import { Logger } from '../../Logger.js';
@@ -21,16 +11,12 @@ import {
21
11
  } from '../story-deliver-terminal.js';
22
12
 
23
13
  /**
24
- * The close pipeline's phase order, as `setPhase` walks it. Only used to
25
- * decide whether a gate had already run when a later phase died.
14
+ * The phase order `setPhase` walks; it MUST track `runPrePushPhases`, since
15
+ * it decides which gates had cleared when a later phase died.
26
16
  */
27
17
  const PHASE_ORDER = Object.freeze([
28
18
  'init',
29
19
  'wrong-tree-guard',
30
- // Story #5172 — base-sync now precedes close-validation, so the tree the
31
- // gates validate is the tree the push sends. The order here is not
32
- // decoration: it is how a failed terminal decides which gates had already
33
- // cleared, so it MUST track `runPrePushPhases`.
34
20
  'base-sync',
35
21
  'close-validation',
36
22
  'push',
@@ -42,7 +28,6 @@ const PHASE_ORDER = Object.freeze([
42
28
  'done',
43
29
  ]);
44
30
 
45
- /** Each reported gate and the pipeline phase that decides it. */
46
31
  const GATE_PHASES = Object.freeze([
47
32
  ['validation', 'close-validation'],
48
33
  ['baseSync', 'base-sync'],
@@ -50,18 +35,9 @@ const GATE_PHASES = Object.freeze([
50
35
  ]);
51
36
 
52
37
  /**
53
- * The names the unified baselines gate can register under, mirrored from
54
- * `BASELINES_GATE_NAMES` in `lib/close-validation/gates.js` (Story #5172) —
55
- * all three, matching the projection the SUCCESS path applies in
56
- * `runner.js#baselinesEnvelopeGates`, so the two endings of one run cannot
57
- * key the same gate differently.
58
- *
59
- * Deliberately a local copy rather than an import: several close suites
60
- * replace that module wholesale via `t.mock.module`, and a named import here
61
- * would fail to link against a mock that does not re-export the constant —
62
- * turning an unrelated test's mock into a load error on the CLI's own entry
63
- * path. `tests/close-validation-gates-enum.test.js` pins the two lists
64
- * against each other so the copy cannot drift.
38
+ * Mirrors `BASELINES_GATE_NAMES` in `lib/close-validation/gates.js`. A local
39
+ * copy, not an import, because close suites mock that module wholesale and a
40
+ * named import would fail to link; a test pins the two lists equal.
65
41
  */
66
42
  const BASELINES_ENTRY_NAMES = Object.freeze([
67
43
  'check-baselines',
@@ -70,21 +46,8 @@ const BASELINES_ENTRY_NAMES = Object.freeze([
70
46
  ]);
71
47
 
72
48
  /**
73
- * Project the baselines entries out of the per-gate outcomes THIS run
74
- * observed (Story #5279).
75
- *
76
- * This used to RECONSTRUCT them: it inferred, from the phase the run died in
77
- * plus the name of the failing gate, what the two split entries "must have"
78
- * done — and it did so over a hardcoded pair, so every failed close reported
79
- * both split names whether or not the run had ever registered them. A repo
80
- * whose config resolves to the unsplit `check-baselines`, or to only one half
81
- * of the pair, got envelope keys for gates that did not exist; a run that
82
- * died at `init` got them too, reported as `skipped`, which reads as "the
83
- * gate was turned off" rather than "there was no such gate".
84
- *
85
- * Reporting instead of reconstructing removes the whole class: an outcome
86
- * appears only for a gate the run actually observed, and the runner tags
87
- * exactly that set onto the error (`err.closeGates`).
49
+ * Baselines outcomes the run actually observed (`err.closeGates`) — reported,
50
+ * never reconstructed, so a gate the run never registered cannot appear.
88
51
  *
89
52
  * @param {Record<string, string>|null|undefined} observedGates
90
53
  * @returns {Record<string, 'passed'|'failed'|'skipped'>}
@@ -98,30 +61,12 @@ function baselinesGatesObserved(observedGates) {
98
61
  }
99
62
 
100
63
  /**
101
- * Report every gate's outcome for a run that died at `phase`.
102
- *
103
- * The schema's contract: "A gate the run skipped … reports `skipped` rather
104
- * than being omitted, so a missing gate is never mistaken for a passing one."
105
- * The previous shape named only the gate that died and omitted the rest
106
- * entirely — exactly the ambiguity the contract forbids.
107
- *
108
- * Reconstructed from the phase order, which is sound because the pipeline is
109
- * strictly sequential: reaching phase N means every gate before it completed.
110
- * A gate whose phase the run never reached is `skipped`; one the operator
111
- * turned off via `--skip-validation` / `--skip-sync` is `skipped` too (it did
112
- * not pass — it never ran).
113
- *
114
- * Story #5172 — the reported set also carries the baselines entries under
115
- * their own names, so a failed close says WHICH half of the baselines gate
116
- * breached instead of a single generic verdict. Story #5279 — those names
117
- * are REPORTED from `observedGates`, never reconstructed, so only a gate the
118
- * run registered can appear.
64
+ * Every gate's outcome, never omitted (a missing gate would read as passing);
65
+ * an unreached or operator-skipped gate is `skipped`.
119
66
  *
120
67
  * @param {string} phase The phase the run died in.
121
68
  * @param {{ skipValidation?: boolean, skipSync?: boolean,
122
69
  * observedGates?: Record<string, string>|null }} args
123
- * Parsed CLI args, plus the per-gate outcomes the runner tagged onto the
124
- * error.
125
70
  * @returns {Record<string, 'passed'|'failed'|'skipped'>}
126
71
  */
127
72
  export function gatesForFailedPhase(phase, args = {}) {
@@ -138,31 +83,13 @@ export function gatesForFailedPhase(phase, args = {}) {
138
83
  }
139
84
 
140
85
  /**
141
- * Build the `failed` terminal for a phase that crashed. Every close
142
- * invocation emits exactly one envelope; this is the path that keeps that
143
- * true when a phase dies.
144
- *
145
- * `err.closePhase` is tagged by the runner's phase tracker.
146
- *
147
- * **Never throws.** This runs on the path that already has one failure in
148
- * hand, so a second failure here must not REPLACE the first: an
149
- * envelope-build error surfacing as the run's cause sends the operator to
150
- * diagnose the wrong thing entirely — a close whose PR had already merged
151
- * once reported a schema `ENOENT` as its fatal error, because the worktree
152
- * holding the script had been reaped mid-run. On failure this returns null
153
- * and the caller rethrows the original.
154
- *
155
- * `err.closeGates` — tagged by the runner — carries the per-gate outcomes the
156
- * run observed, which is what lets the reported gates name the baselines
157
- * entries that actually ran (Story #5172 / #5279) instead of a hardcoded pair.
86
+ * Never throws: a build failure here must not replace the original error as
87
+ * the run's reported cause, so it returns null and the caller rethrows.
88
+ * `err.closePhase` and `err.closeGates` are tagged by the runner.
158
89
  *
159
90
  * @param {unknown} err
160
91
  * @param {{ storyId?: string|number, skipValidation?: boolean, skipSync?: boolean }} args
161
- * Parsed CLI args — the story id the envelope reports on, plus the skip
162
- * flags `gatesForFailedPhase` needs.
163
- * @returns {object|null} A validated envelope, or null when even the story id
164
- * is unknown (a usage error — there is nothing to report an envelope about)
165
- * or the envelope itself could not be assembled.
92
+ * @returns {object|null} null when the story id is unknown or assembly failed.
166
93
  */
167
94
  export function failedTerminalFor(err, args = {}) {
168
95
  const phase = err?.closePhase ?? 'init';