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,47 +1,7 @@
1
1
  /**
2
- * temp-retention.js — allowlisted auto-purge of spent temp artifacts (Story #4794).
3
- *
4
- * The workspace temp tree grew without bound: every landed Story left its
5
- * close-gate transcript (~1.4MB each), its terse-result detail dumps, and its
6
- * validation-evidence envelope behind forever, because no code path had ever
7
- * removed them. This module is the single engine that reclaims them.
8
- *
9
- * ## Allowlist, never a blocklist
10
- *
11
- * The safety property that matters is not "delete the right things" but
12
- * "never delete the wrong thing". So classification is positive: an artifact
13
- * is a purge candidate only when a declared class claims it. Everything else —
14
- * an operator's scratch directory, a hand-parked file, a family a future
15
- * Story adds without teaching this module about it — is **unrecognized**, is
16
- * never touched, and is reported with its byte size so a human decides. A
17
- * blocklist would have the opposite failure mode: anything the framework
18
- * forgot to exclude gets deleted.
19
- *
20
- * ## Two eligibility signals, deliberately different in strength
21
- *
22
- * - **Story-keyed.** An artifact whose name carries a Story id is purged when
23
- * that Story's merge has been *confirmed* by the caller — the post-land tail
24
- * or a boot sweep that read live state. This is the primary path and the one
25
- * the operator asked for: spent the moment the work lands.
26
- * - **Age-floored.** Artifacts no Story id can be recovered from (audit
27
- * reports, abandoned `plan-<slug>/` dirs) fall back to a `staleDays` floor.
28
- * Only the sweep opts into this; the per-Story purge never does, so a
29
- * post-land tail can never reap a sibling's in-flight artifact.
30
- *
31
- * ## Keep-class
32
- *
33
- * `signals.ndjson` is the artifact whose value *starts* when the run ends —
34
- * `acceptance-eval` and the loop-health check both read it
35
- * long after the Story merged. It is excluded twice over: it is not in the
36
- * evidence basename allowlist, and {@link KEEP_BASENAMES} is re-checked at
37
- * the deletion site. Defence in depth is warranted for the one file whose
38
- * loss is silent and unrecoverable.
39
- *
40
- * ## Best-effort, never load-bearing
41
- *
42
- * Every entry point resolves rather than throws. This is hygiene: a purge
43
- * that fails must never fail a land, a boot, or a persist that already did
44
- * its real work. Failures are collected into `errors[]` and reported.
2
+ * Allowlisted auto-purge of spent temp artifacts: only a declared class's
3
+ * entries are candidates; the rest are reported, never touched. Never throws
4
+ * — a failed purge must not fail a land, boot, or persist.
45
5
  */
46
6
 
47
7
  import fsPromises from 'node:fs/promises';
@@ -55,9 +15,8 @@ import {
55
15
  import { Logger } from './Logger.js';
56
16
 
57
17
  /**
58
- * Shipped defaults for `delivery.tempRetention`. `enabled` defaults to `true`:
59
- * the operator asked for auto-purge to be the behaviour, with the knob there
60
- * to turn it off rather than to turn it on.
18
+ * Defaults for `delivery.tempRetention`; purge is on unless turned off.
19
+ * `staleDays` is not configurable — only switches that turn a deletion off are.
61
20
  */
62
21
  export const TEMP_RETENTION_DEFAULTS = Object.freeze({
63
22
  enabled: true,
@@ -70,50 +29,36 @@ export const TEMP_RETENTION_DEFAULTS = Object.freeze({
70
29
  }),
71
30
  });
72
31
 
73
- /** Every declared purge class, in classification order. */
74
32
  export const PURGE_CLASS_NAMES = Object.freeze(
75
33
  Object.keys(TEMP_RETENTION_DEFAULTS.classes),
76
34
  );
77
35
 
78
36
  /**
79
- * Basenames no path may ever delete, re-checked at the deletion site even
80
- * though classification already excludes them. See the module header.
37
+ * Never deleted, re-checked at the deletion site: `signals.ndjson` is read
38
+ * long after merge and its loss is silent and unrecoverable.
81
39
  */
82
40
  export const KEEP_BASENAMES = Object.freeze(['signals.ndjson']);
83
41
 
84
- /**
85
- * The per-Story artifact basenames `validationEvidence` claims. An explicit
86
- * allowlist rather than a "delete everything but signals" rule: a file this
87
- * module has not been taught about is kept, not guessed at.
88
- */
42
+ /** Explicit allowlist: an untaught file in a Story dir is kept. */
89
43
  const STORY_EVIDENCE_BASENAMES = Object.freeze([
90
44
  'validation-evidence.json',
91
45
  'lifecycle.ndjson',
92
46
  'manifest.md',
93
47
  ]);
94
48
 
95
- /**
96
- * Top-level temp entries that belong to the framework but are never purge
97
- * candidates: `qa/` holds resumable operator-owned session ledgers, `cache/`
98
- * has its own invalidation, and `*.lock` files are live coordination state.
99
- */
49
+ /** Framework-owned, never purged (`*.lock` files are also skipped). */
100
50
  const RESERVED_TOP_LEVEL = Object.freeze(['qa', 'cache']);
101
51
 
102
52
  const MS_PER_DAY = 24 * 60 * 60 * 1000;
103
53
 
104
- /** `story-4794` → `4794`. */
105
54
  const STORY_DIR_PATTERN = /^story-(\d+)$/;
106
- /** `close-gates-4794`, `sync-result-story-4794` → `4794`. */
107
55
  const TRAILING_ID_PATTERN = /-(\d+)$/;
108
- /** `audit-story-4794-audit-clean-code.md` → `4794`. */
109
56
  const AUDIT_STORY_PATTERN = /^audit-story-(\d+)-/;
110
- /** `run-1030` — a per-run temp tree holding `stories/story-<id>/` children. */
57
+ /** Per-run temp tree holding `stories/story-<id>/` children. */
111
58
  const RUN_DIR_PATTERN = /^run-\d+$/;
112
59
 
113
60
  /**
114
- * Resolve the effective retention policy, filling every field from
115
- * {@link TEMP_RETENTION_DEFAULTS}. An unset block yields the defaults, so a
116
- * consumer that never heard of this feature gets the purge.
61
+ * Effective retention policy, defaults filled in.
117
62
  *
118
63
  * @param {object} [config] Resolved config bag.
119
64
  * @returns {{ enabled: boolean, staleDays: number, classes: Record<string, boolean> }}
@@ -127,15 +72,13 @@ export function resolveTempRetention(config) {
127
72
  }
128
73
  return {
129
74
  enabled: raw.enabled ?? TEMP_RETENTION_DEFAULTS.enabled,
130
- staleDays: raw.staleDays ?? TEMP_RETENTION_DEFAULTS.staleDays,
75
+ staleDays: TEMP_RETENTION_DEFAULTS.staleDays,
131
76
  classes,
132
77
  };
133
78
  }
134
79
 
135
80
  /**
136
- * `readdir` that yields `[]` for a directory that does not exist or cannot be
137
- * read. Every scan below walks optional trees, so an absent one is the normal
138
- * case, not an error.
81
+ * `readdir` yielding `[]` for an absent or unreadable directory.
139
82
  *
140
83
  * @param {typeof fsPromises} fsp
141
84
  * @param {string} dir
@@ -150,8 +93,7 @@ async function safeReaddir(fsp, dir) {
150
93
  }
151
94
 
152
95
  /**
153
- * Total bytes under a path — the file's own size, or the recursive sum for a
154
- * directory. Reporting-only: a vanished child is skipped rather than fatal.
96
+ * Recursive byte total; a vanished child is skipped.
155
97
  *
156
98
  * @param {typeof fsPromises} fsp
157
99
  * @param {string} target
@@ -180,10 +122,8 @@ async function sizeOf(fsp, target) {
180
122
  }
181
123
 
182
124
  /**
183
- * Build one classified entry. `mtimeMs` is the entry's **own** mtime, not the
184
- * newest mtime beneath it — that is the semantics the shipped stale-plan-dir
185
- * reap has always used, and widening it here would silently change when an
186
- * abandoned directory becomes eligible.
125
+ * One classified entry. `mtimeMs` is the entry's own mtime, not the newest
126
+ * beneath it; widening it would change when an abandoned dir becomes eligible.
187
127
  *
188
128
  * @param {typeof fsPromises} fsp
189
129
  * @param {string} target
@@ -209,19 +149,12 @@ async function makeEntry(fsp, target, className, storyId, keep = false) {
209
149
  };
210
150
  }
211
151
 
212
- /**
213
- * Extensions this class owns inside `orchestration/`. Story #4816 added
214
- * `.json`: the persisted terminal envelope lands beside the gate log, and a
215
- * `.log`-only scan would have left one immortal file per delivered Story in a
216
- * directory the purge otherwise keeps clean.
217
- */
152
+ /** `.json` covers the persisted terminal envelope beside each gate log. */
218
153
  const ORCHESTRATION_EXTENSIONS = Object.freeze(['.log', '.json']);
219
154
 
220
155
  /**
221
- * Recover the Story id a run-artifact basename carries. Every writer that
222
- * lands in `orchestration/` ends its name with the scope: `close-gates-4794.log`
223
- * from the gate sink, `sync-result-story-4794.log` from the terse-result dump,
224
- * `story-deliver-terminal-4794.json` from the terminal-envelope persist.
156
+ * Story id from an `orchestration/` basename; every writer there ends the
157
+ * name with `-<id>`.
225
158
  *
226
159
  * @param {string} name
227
160
  * @returns {number|null}
@@ -231,12 +164,7 @@ function storyIdFromLogName(name) {
231
164
  return match ? Number(match[1]) : null;
232
165
  }
233
166
 
234
- /**
235
- * `<tempRoot>/orchestration/*.{log,json}` — close gate transcripts,
236
- * terse-result detail dumps, and persisted terminal envelopes. An artifact
237
- * whose name carries no id (there are none today, but the class owns the
238
- * directory) is age-floored rather than dropped from the class.
239
- */
167
+ /** `<tempRoot>/orchestration/*.{log,json}`; an id-less name is age-floored. */
240
168
  async function scanOrchestrationLogs(tempRoot, fsp) {
241
169
  const dir = path.join(tempRoot, ORCHESTRATION_DIRNAME);
242
170
  const entries = [];
@@ -258,10 +186,7 @@ async function scanOrchestrationLogs(tempRoot, fsp) {
258
186
  return entries;
259
187
  }
260
188
 
261
- /**
262
- * Every directory that holds `story-<id>/` children: the standalone tree and
263
- * each per-run tree.
264
- */
189
+ /** Directories holding `story-<id>/` children: standalone and per-run. */
265
190
  async function storyParentDirs(tempRoot, fsp) {
266
191
  const parents = [path.join(tempRoot, 'standalone', 'stories')];
267
192
  for (const dirent of await safeReaddir(fsp, tempRoot)) {
@@ -273,11 +198,8 @@ async function storyParentDirs(tempRoot, fsp) {
273
198
  }
274
199
 
275
200
  /**
276
- * `<…>/stories/story-<id>/*` — the per-Story delivery artifacts.
277
- *
278
- * Every file in the directory is emitted, but only the declared evidence
279
- * basenames are purge candidates; `signals.ndjson` and anything unrecognized
280
- * are emitted with `keep: true` so the envelope can show what survived.
201
+ * `<…>/stories/story-<id>/*`; non-allowlisted files are emitted `keep: true`
202
+ * so the envelope shows what survived.
281
203
  */
282
204
  async function scanValidationEvidence(tempRoot, fsp) {
283
205
  const entries = [];
@@ -302,10 +224,7 @@ async function scanValidationEvidence(tempRoot, fsp) {
302
224
  return entries;
303
225
  }
304
226
 
305
- /**
306
- * `<tempRoot>/audits/*` — audit reports. `audit-story-<id>-<lens>.md` is
307
- * Story-keyed; the roster-level reports and profiling output are age-floored.
308
- */
227
+ /** `<tempRoot>/audits/*`; `audit-story-<id>-*` is Story-keyed, rest age-floored. */
309
228
  async function scanAuditResults(tempRoot, fsp) {
310
229
  const dir = path.join(tempRoot, 'audits');
311
230
  const entries = [];
@@ -322,10 +241,7 @@ async function scanAuditResults(tempRoot, fsp) {
322
241
  return entries;
323
242
  }
324
243
 
325
- /**
326
- * `<tempRoot>/plan-<slug>/` — plan authoring dirs. Never Story-keyed: the
327
- * directory predates the Stories it creates, so age is the only safe signal.
328
- */
244
+ /** `<tempRoot>/plan-<slug>/`: predates its Stories, so age is the only signal. */
329
245
  async function scanPlanDirs(tempRoot, fsp) {
330
246
  const entries = [];
331
247
  for (const dirent of await safeReaddir(fsp, tempRoot)) {
@@ -341,7 +257,6 @@ async function scanPlanDirs(tempRoot, fsp) {
341
257
  return entries;
342
258
  }
343
259
 
344
- /** Class name → scanner. Iteration order matches {@link PURGE_CLASS_NAMES}. */
345
260
  const SCANNERS = Object.freeze({
346
261
  orchestrationLogs: scanOrchestrationLogs,
347
262
  validationEvidence: scanValidationEvidence,
@@ -350,9 +265,8 @@ const SCANNERS = Object.freeze({
350
265
  });
351
266
 
352
267
  /**
353
- * Does a top-level temp entry belong to a declared class? Kept in lockstep
354
- * with the scanners above: an entry no class walks must show up as
355
- * unrecognized, never be silently ignored.
268
+ * Keep in lockstep with the scanners: an entry no class walks must surface
269
+ * as unrecognized.
356
270
  *
357
271
  * @param {string} name
358
272
  * @returns {boolean}
@@ -368,9 +282,7 @@ function isClassOwnedTopLevel(name) {
368
282
  }
369
283
 
370
284
  /**
371
- * Top-level entries that no class claims and that are not framework-reserved.
372
- * Reported with byte sizes, never deleted — this is what makes a 49MB scratch
373
- * directory visible to the operator instead of invisible to the tooling.
285
+ * Unclaimed, non-reserved top-level entries: reported with sizes, never deleted.
374
286
  *
375
287
  * @param {string} tempRoot
376
288
  * @param {typeof fsPromises} fsp
@@ -389,8 +301,7 @@ async function collectUnrecognized(tempRoot, fsp) {
389
301
  }
390
302
 
391
303
  /**
392
- * Classify a whole temp tree without deleting anything. Exported so a caller
393
- * (or a test) can see exactly what the purge would consider.
304
+ * Classify a temp tree without deleting anything.
394
305
  *
395
306
  * @param {{ config?: object, tempRoot?: string, fsp?: typeof fsPromises }} [args]
396
307
  * @returns {Promise<{ tempRoot: string, entries: object[], unrecognized: Array<{ path: string, bytes: number }> }>}
@@ -413,8 +324,6 @@ export async function collectTempEntries({
413
324
  }
414
325
 
415
326
  /**
416
- * Is this entry eligible for deletion under the current policy and signals?
417
- *
418
327
  * @param {object} entry
419
328
  * @param {object} ctx
420
329
  * @returns {boolean}
@@ -430,23 +339,20 @@ function isPurgeable(entry, ctx) {
430
339
  }
431
340
 
432
341
  /**
433
- * The purge core. Deliberately **module-private**: the two exported entry
434
- * points below are the whole public surface, and each encodes a policy
435
- * decision (Story-keyed vs. age-floored) that a caller reaching this directly
436
- * could get wrong. Exporting it would also be a dead export — nothing outside
437
- * this file has a reason to call it.
342
+ * Purge core; module-private because each exported entry point encodes the
343
+ * Story-keyed vs. age-floored policy a direct caller could get wrong.
438
344
  *
439
345
  * @param {object} [args]
440
- * @param {object} [args.config] Resolved config bag.
346
+ * @param {object} [args.config]
441
347
  * @param {number[]} [args.storyIds] Stories whose merge the caller CONFIRMED.
442
348
  * @param {boolean} [args.sweepStale] Opt into the age floor for un-keyed entries.
443
- * @param {string[]|null} [args.only] Restrict to these class names.
444
- * @param {string[]} [args.excludePaths] Absolute paths to leave alone.
445
- * @param {number} [args.now] Clock seam.
446
- * @param {string} [args.tempRoot] Temp root override (tests).
447
- * @param {typeof fsPromises} [args.fsp] Filesystem seam.
448
- * @param {{ info: Function }} [args.logger] Logger seam.
449
- * @param {string} [args.label] Prefix for the single summary line.
349
+ * @param {string[]|null} [args.only]
350
+ * @param {string[]} [args.excludePaths]
351
+ * @param {number} [args.now]
352
+ * @param {string} [args.tempRoot]
353
+ * @param {typeof fsPromises} [args.fsp]
354
+ * @param {{ info: Function }} [args.logger]
355
+ * @param {string} [args.label]
450
356
  * @returns {Promise<object>} Result envelope; never throws.
451
357
  */
452
358
  async function purgeTempArtifacts({
@@ -501,7 +407,6 @@ async function purgeTempArtifacts({
501
407
  result.purged.push({ path: entry.path, bytes: entry.bytes });
502
408
  result.bytesReclaimed += entry.bytes;
503
409
  } catch (err) {
504
- // A racing writer or a permission error: leave it for the next run.
505
410
  result.errors.push(`${entry.path}: ${String(err?.message ?? err)}`);
506
411
  }
507
412
  }
@@ -516,8 +421,6 @@ async function purgeTempArtifacts({
516
421
  }
517
422
 
518
423
  /**
519
- * Human-readable byte count for the one summary line.
520
- *
521
424
  * @param {number} bytes
522
425
  * @returns {string}
523
426
  */
@@ -534,9 +437,7 @@ export function formatBytes(bytes) {
534
437
  }
535
438
 
536
439
  /**
537
- * Purge one merged Story's spent artifacts. Called from the post-land tail,
538
- * where "merged" is already confirmed — so this never applies the age floor
539
- * and can never touch a sibling Story's in-flight artifacts.
440
+ * Purge one confirmed-merged Story's artifacts; never applies the age floor.
540
441
  *
541
442
  * @param {{ storyId: number, config?: object, now?: number, tempRoot?: string,
542
443
  * fsp?: typeof fsPromises, logger?: object }} args
@@ -552,10 +453,8 @@ export async function purgeStoryTempArtifacts({ storyId, config, ...rest }) {
552
453
  }
553
454
 
554
455
  /**
555
- * Catch-up sweep: purge the artifacts of every Story the caller confirmed
556
- * merged, plus every age-floored entry past `staleDays`. This is the path
557
- * that reclaims a backlog — Stories merged in an earlier run, merged through
558
- * the GitHub UI, or delivered before this feature existed.
456
+ * Catch-up sweep: confirmed-merged Stories plus age-floored entries past
457
+ * `staleDays`.
559
458
  *
560
459
  * @param {{ config?: object, mergedStoryIds?: number[], now?: number,
561
460
  * tempRoot?: string, fsp?: typeof fsPromises, logger?: object,
@@ -5,43 +5,13 @@ import {
5
5
  import { BODY_FORMAT_LINTS } from '../story-body/body-format-lints.js';
6
6
 
7
7
  /**
8
- * The story-author system prompt (Story #5312 — rendered from the draft's
9
- * Story count).
10
- *
11
- * **Single source of the prompt body (Story #4162).** This module is the sole
12
- * carrier of the story-author system prompt, delivered to the host LLM in the
13
- * `systemPrompts.story` field of the `/mandrel-plan` context envelope (via
14
- * `lib/orchestration/plan-context.js#buildSystemPrompts`), so no second
15
- * verbatim copy can drift.
16
- *
17
- * Two layers, composed by {@link renderStoryAuthorPrompt}:
18
- *
19
- * - **The N=1 core** ({@link renderStoryAuthorCore}) — what every draft
20
- * needs: the body schema, the contract-level Spec rule, the deterministic
21
- * body-format lints, and acceptance defined as outcomes a PR reviewer can
22
- * confirm from the diff and the verify output. It carries no delivery
23
- * schedule, no per-file behavior paragraphs, no reviewability budget and
24
- * no verify-tier suffix — every one of those either scored a shape the
25
- * authoring model already judges or prescribed a proxy that became the
26
- * goal.
27
- * - **The N>1 rules** ({@link renderStorySplitRules}) — the schedule rules
28
- * that only mean anything once a draft has siblings: every Story must
29
- * earn its slot in the wave schedule, and no same-wave pair may collide
30
- * on a declared path (Story #5332 replaced the acceptance partition with
31
- * the dispatcher's own collision predicate, armed as a refusal).
32
- * - **The tickets-mode rules** ({@link ticketsModePromptField}, Story
33
- * #5323) — what to re-derive rather than carry when the seed is an
34
- * existing ticket whose body is already in Story shape.
35
- *
36
- * The envelope carries the core as `systemPrompts.story`, the split rules as
37
- * `systemPrompts.storySplitRules` and the tickets rules as
38
- * `systemPrompts.storyTicketsRules`; a planner reads the second only when the
39
- * default-single split policy clears, and the third only in tickets mode.
8
+ * The sole source of the story-author system prompt, shipped in the
9
+ * `/mandrel-plan` envelope as `systemPrompts.story` (the N=1 core),
10
+ * `storySplitRules` (read only at N>1) and `storyTicketsRules` (tickets mode
11
+ * only).
40
12
  */
41
13
 
42
14
  /**
43
- * The N=1 core of the story-author prompt.
44
- *
45
15
  * @returns {string}
46
16
  */
47
17
  export function renderStoryAuthorCore() {
@@ -55,11 +25,8 @@ export function renderStoryAuthorCore() {
55
25
  advisoryCaveat,
56
26
  newFileContract,
57
27
  } = AUTHORING_ALTITUDE_GUIDANCE;
58
- // The deterministic body-format lints (structured `## Changes` bullet shape,
59
- // non-empty sections) rendered example-first from their single source
60
- // (`lib/story-body/body-format-lints.js`) so an authored draft is lint-clean
61
- // by construction rather than discovered as a persist dry-run failure and
62
- // re-authored at resident-context prices (Story #4684).
28
+ // Rendered example-first so a draft is lint-clean by construction rather
29
+ // than re-authored after a persist dry-run failure.
63
30
  const bodyFormatLintChecklist = BODY_FORMAT_LINTS.map(
64
31
  (lint) =>
65
32
  `- **${lint.id}** — ${lint.summary} Example: \`${lint.goodExample}\``,
@@ -117,7 +84,8 @@ The **persisted** \`body\` renders these markdown sections (in order) — you au
117
84
  <optional technical approach at contract level — do NOT restate Goal / Acceptance / Verify>
118
85
 
119
86
  ## Changes
120
- - {"path": "<file path>", "assumption": "creates" | "refactors-existing" | "deletes"}
87
+ - <file path>
88
+ - {"path": "<file path>", "assumption": "deletes"}
121
89
  - ...
122
90
 
123
91
  ## Acceptance <-- synthesized by persist from acceptance[]; do not author
@@ -137,9 +105,9 @@ The **persisted** \`body\` renders these markdown sections (in order) — you au
137
105
  - **goal** (in body string): One sentence stating WHY this Story exists.
138
106
  - **spec** (optional, in body string as \`## Spec\`): The technical approach at the altitude the SPEC PROSE CONTRACT below fixes — contract and invariants, never implementation narration. Write as much as the work needs and no more; persist keeps Specs inline at any length and never writes them under \`docs/\`.
139
107
  - **slicing** (optional): Ordered intra-session checkpoints for one Story, one line each. A checkpoint is a **stage of the work** — a commit boundary the deliverer passes through inside one session, stated as the step it performs. An acceptance item is a **state of the codebase** a PR reviewer confirms once the Story has landed. The same Story therefore carries both: the checkpoints say in what order it is built, \`acceptance[]\` says what must then be true. Never a fan-out table, never a second acceptance list, and never sibling tickets — a broad sweep with many stages is still one Story, sliced here.
140
- - **changes** (in body string): Each entry is an object \`{ path, assumption }\` where \`assumption\` is one of \`creates | refactors-existing | deletes\`. **Name the files the deliverer authors, and omit generated artifacts** — quality baselines, generated test indexes, migration journals, lockfiles and the like are regenerated by the work itself, the refresh is a close-gate concern, and declaring one needlessly reserves a footprint that serializes sibling Stories at dispatch. Acceptable path shapes include explicit files (\`src/components/Foo.tsx\`), glob patterns (\`tests/e2e/*.spec.ts\`, \`**/*.astro\`), and module identifiers that resolve to files. Use \`refactors-existing\` for in-place edits to a file already on \`main\`; \`creates\` for net-new files; \`deletes\` for removals. Persist probes every path against the base branch and repairs a plain-string bullet or a trailing parenthetical into the object form for you; a \`creates\` on an existing path or a \`refactors-existing\` on an absent one is a dry-run warning, and only a \`deletes\` naming an absent path is refused.
108
+ - **changes** (in body string): Each entry is a **bare path string** — the default form; persist derives its assumption by probing the base branch and reports the derivation. Use the object form \`{ path, assumption }\` (\`assumption\` one of \`creates | refactors-existing | deletes\`) only to pin one yourself, and always for a \`deletes\`, which a bare path can never express. **Name the files the deliverer authors, and omit generated artifacts** — quality baselines, generated test indexes, migration journals, lockfiles and the like are regenerated by the work itself, the refresh is a close-gate concern, and declaring one needlessly reserves a footprint that serializes sibling Stories at dispatch. Acceptable path shapes include explicit files (\`src/components/Foo.tsx\`), glob patterns (\`tests/e2e/*.spec.ts\`, \`**/*.astro\`), and module identifiers that resolve to files. Pin \`refactors-existing\` for an in-place edit, \`creates\` for a net-new file, \`deletes\` for a removal, whenever the probe would get it wrong. Persist probes every path against the base branch and derives the assumption for you, so a \`creates\` on an existing path or a \`refactors-existing\` on an absent one is a dry-run warning; only a \`deletes\` naming an absent path is refused.
141
109
  - **acceptance** (top-level array on the ticket object): Each item is an **outcome a PR reviewer can confirm from the diff and the verify output** — what is true of the codebase once the Story lands, stated at the altitude of the capability (a command that now exits 0 against a named input, a behavior a named test now asserts, a config that now fails validation on a retired key, a document that now records a decision). State as many outcomes as the capability has and no more — the list has no target, floor or ceiling, and a long one is never a reason to split the Story. Push grep-shaped probes, file-exists checks and exit-code tests down into \`verify[]\`; never pin an internal helper name or a private file path into an acceptance item the advisory \`changes[]\` is free to reshape. UNACCEPTABLE: "verify by reading the diff", "looks good", "matches the spec".
142
- - **verify** (top-level array on the ticket object): The **mechanical checks** — exact commands or test paths the deliverer runs and the acceptance critic consumes as evidence: \`node --test tests/x.test.js\`, \`npm run lint\`, \`npm run validate\`, a scoped grep. Every acceptance item should be confirmable from at least one verify entry's output plus the diff. Stories with zero verify entries fail validation.
110
+ - **verify** (top-level array on the ticket object): The **mechanical checks** — exact commands or test paths the deliverer runs and the acceptance critic consumes as evidence: \`node --test tests/x.test.js\`, \`npm run lint\`, \`npm run validate\`, a scoped grep. Every acceptance item should be confirmable from at least one verify entry's output plus the diff. A Story with no verify entry is warned about, not rejected — but the critic then has nothing to read as evidence, so author the commands.
143
111
  - **Bodies record decisions, never questions to the operator.** Never persist an open question ("Flag if…", "TBD", "confirm with the operator") into a Story body — the executing sub-agent is non-interactive and cannot answer it, and the dry-run warns on every one it finds. Triage each unknown by who can resolve it: an AFK-shaped unknown (a fact in docs, a third-party API surface, observable repo behavior) MUST be resolved by your own research before authoring — never restated as an assumption; only a HITL-shaped unknown (a genuine product or architecture call the operator owns) may be restated as a declarative Key Assumption the agent can act on, stating the default chosen (a decision-made-by-default).
144
112
  - **non_goals** (OPTIONAL, in body string as the \`## Non-Goals\` section): A short list of capabilities or changes this Story explicitly does NOT deliver — an advisory negative-scope bound that fences the executing agent away from adjacent work. It is **advisory and NON-GATING**: the validator does not require, count, or reject on it, and an absent or empty section renders nothing. Use the EXACT single-word hyphenated heading spelling \`## Non-Goals\` (a space-separated heading like \`## Out of Scope\` is NOT recognized by the parser and will be dropped). Reach for it when a Story's negative boundary is non-obvious from its \`acceptance[]\` alone; omit it otherwise.
145
113
 
@@ -180,19 +148,10 @@ ${envelopeFloor}
180
148
  - **A remediation sweep over one subsystem is one Story.** A batch of findings in the same subsystem shares one reason to exist — the subsystem is wrong — so it arrives as one Story whose \`## Slicing\` checkpoints carry the stages, not as one Story per finding.
181
149
  - ${singleConsumerRule}
182
150
 
183
- #### UI / TESTID INVARIANCE (per CLAUDE.md safety rule):
184
-
185
- Every \`changes[]\` entry is a \`{ path, assumption }\` object — a prose bullet there is rejected by the parser, so the testid contract is carried where prose belongs:
151
+ #### UI AND COPY WORK — where the contract is written down:
186
152
 
187
- - Stories that touch UI (\`*.tsx\`, \`*.astro\`, \`*.svelte\`, \`*.vue\`, components folders) MUST carry the testid contract as a top-level \`acceptance[]\` item, one of:
188
- - \`"data-testid invariance: <list of testids that MUST be preserved>"\`, or
189
- - \`"data-testid changes: <old> -> <new>, with the matching tests/e2e/*.spec.ts selector updated"\` — paired with that \`tests/e2e/*.spec.ts\` file in \`changes[]\`, in the same Story or a depends_on Story.
190
- - State the preserved-testid set in \`## Non-Goals\` prose as well when the Story deliberately renames nothing.
191
- - Renaming a testid without the matching e2e edit is FORBIDDEN.
192
-
193
- #### BRAND / COPY / STYLE WORK:
194
-
195
- - Stories that touch user-visible copy, brand assets, or visual style MUST cite the relevant section of \`docs/style-guide.md\` in \`acceptance\` (e.g. \`"acceptance": ["Hero copy matches docs/style-guide.md §3 (voice & tone)"]\`). If \`docs/style-guide.md\` does not exist or has no relevant section, state that explicitly: \`"acceptance": ["docs/style-guide.md absent — copy reviewed against the inline brand brief in the plan seed"]\`. Silence on style sourcing is a smell.
153
+ - A Story touching UI (\`*.tsx\`, \`*.astro\`, \`*.svelte\`, \`*.vue\`, a components folder) states the \`data-testid\` contract in \`acceptance[]\` per the testid contract in \`.agents/skills/stack/qa/playwright/SKILL.md\`.
154
+ - A Story touching user-visible copy, brand assets or visual style cites the relevant section of \`docs/style-guide.md\` in \`acceptance[]\` when that file exists.
196
155
 
197
156
  CRITICAL: Dependencies should follow execution blockers. There is no parent ticket — never emit a 'parent_slug' field.
198
157
  IMPORTANT DEPENDENCY RULE: Story-to-Story dependencies are expressed via \`depends_on\` (one Story depends_on another Story's slug). Use this to express execution ordering across the plan.
@@ -200,10 +159,6 @@ IMPORTANT DEPENDENCY RULE: Story-to-Story dependencies are expressed via \`depen
200
159
  }
201
160
 
202
161
  /**
203
- * The rules that only apply once a draft has more than one Story: the
204
- * delivery-schedule simulation that makes each Story earn its slot, and the
205
- * same-wave collision refusal persist enforces at N>1.
206
- *
207
162
  * @returns {string}
208
163
  */
209
164
  export function renderStorySplitRules() {
@@ -229,16 +184,9 @@ Each Story carries its **own** \`## Spec\`; a shared \`techspec.md\` cannot be f
229
184
  }
230
185
 
231
186
  /**
232
- * The rules that only apply when the seed is an existing ticket (Story
233
- * #5323).
234
- *
235
- * A `--tickets` seed arrives already in Story shape — rendered `AC-<n>:`
236
- * checkboxes, a `## Verify` list, a `## Changes` footprint — and an author
237
- * reading it as a template carries that shape forward instead of re-deriving
238
- * it. The observed failure (swarm-os #2707 / #2708, planned from #2542 under
239
- * mandrel 2.57.0) was a Story whose acceptance list was the source's, handles
240
- * and all, and whose verify entries carried a tier suffix retired two
241
- * releases earlier. The source ticket is **evidence**, not a draft.
187
+ * A `--tickets` seed already arrives in Story shape, and an author reading it
188
+ * as a template carries stale handles and retired suffixes forward; the
189
+ * source is evidence, not a draft.
242
190
  *
243
191
  * @returns {string}
244
192
  */
@@ -255,10 +203,6 @@ You are planning from one or more existing tickets. Read them for **what the wor
255
203
  }
256
204
 
257
205
  /**
258
- * Render the story-author prompt for a draft of `storyCount` Stories: the
259
- * N=1 core, plus the schedule and partition rules when the draft has
260
- * siblings.
261
- *
262
206
  * @param {{ storyCount?: number }} [args]
263
207
  * @returns {string}
264
208
  */
@@ -268,14 +212,8 @@ export function renderStoryAuthorPrompt({ storyCount = 1 } = {}) {
268
212
  }
269
213
 
270
214
  /**
271
- * The mode-conditional slice of `systemPrompts`.
272
- *
273
- * `storyTicketsRules` only means anything when the seed is an existing
274
- * ticket, and an envelope carrying it in every mode teaches the author to
275
- * look for a source ticket a `--seed` run does not have. Returning a
276
- * spreadable object rather than a nullable string keeps the decision here,
277
- * beside the prompt it selects, instead of as a branch in the envelope
278
- * builder.
215
+ * Spreadable into `systemPrompts`: present only in tickets mode, since
216
+ * elsewhere it would send the author looking for a source ticket.
279
217
  *
280
218
  * @param {string|undefined} mode The plan-context mode.
281
219
  * @returns {{ storyTicketsRules?: string }}
@@ -5,49 +5,20 @@ import path from 'node:path';
5
5
  import { TEST_TEMP_ROOT_ENV } from './config/temp-paths.js';
6
6
  import { reapOnExit } from './test-temp.js';
7
7
 
8
- /**
9
- * Per-process memo for the created scratch dir, so repeated calls in one
10
- * runner process (e.g. building env bags for several chunks) share a single
11
- * scratch tree instead of minting one dir per call.
12
- */
8
+ /** Per-process memo: one scratch tree per runner process. */
13
9
  let _createdScratchDir = null;
14
10
 
15
- /**
16
- * Test-only: clear the per-process scratch memo so a suite can exercise the
17
- * creation branch repeatedly in one process.
18
- */
11
+ /** Test-only: clear the scratch memo. */
19
12
  export function _clearTestScratchTempRootCache() {
20
13
  _createdScratchDir = null;
21
14
  }
22
15
 
23
16
  /**
24
- * Ensure an absolute per-process scratch tempRoot is available for the test
25
- * run and return it (Story #4696).
26
- *
27
- * If `baseEnv` already carries an absolute `MANDREL_TEST_TEMP_ROOT` (the
28
- * common case for a child process that inherits the parent runner's env),
29
- * that value is reused verbatim so every chunk / worker of a single suite
30
- * run shares one scratch dir. Otherwise a fresh `os.tmpdir()` directory is
31
- * created once per process (memoized). Every stream writer that resolves a
32
- * relative tempRoot then lands under this dir instead of the repo's real
33
- * `temp/` telemetry tree — the regression that let 99% of friction records
34
- * be test-fixture pollution.
35
- *
36
- * Reaping (Story #4808): the minting process registers removal of the
37
- * scratch dir at exit. This branch is creator-only by construction — a
38
- * process that inherited an absolute root returns above without ever
39
- * touching the memo, so a child can never delete its parent's scratch
40
- * while the parent is still writing to it. Left unreaped, this seam was
41
- * the single largest contributor to the OS-temp-root leak (870 surviving
42
- * `mandrel-test-temp-` roots on one host), because it mints one per
43
- * `run-tests.js` invocation.
44
- *
45
- * Directly unit-tested via the injectable `mkdtemp` seam in
46
- * `tests/lib/test-env.test.js` (Story #4711).
17
+ * Per-process scratch tempRoot keeping tests out of real `temp/` telemetry.
18
+ * An inherited absolute root is reused; only the minting process reaps it.
47
19
  *
48
20
  * @param {NodeJS.ProcessEnv} [baseEnv=process.env]
49
21
  * @param {{ mkdtemp?: typeof mkdtempSync, onExit?: (fn: () => void) => void }} [deps]
50
- * Injectable for tests.
51
22
  * @returns {string} absolute scratch tempRoot
52
23
  */
53
24
  export function ensureTestScratchTempRoot(
@@ -70,39 +41,15 @@ export function ensureTestScratchTempRoot(
70
41
  }
71
42
 
72
43
  /**
73
- * Build a webhook-safe child-process environment for test runners.
74
- *
75
- * Operators keep a real `NOTIFICATION_WEBHOOK_URL` in `.env` for development
76
- * (the production `notify()` path reads it via `process.env` after
77
- * `resolveConfig()` calls `loadEnv()`). Without scrubbing, any test that
78
- * transitively reaches `notify()` POSTs to the live endpoint.
79
- *
80
- * This helper produces the env bag that test child processes inherit:
44
+ * Env bag for test child processes:
81
45
  *
82
- * - `NOTIFICATION_WEBHOOK_URL` is deleted unless the operator opted in
83
- * via `MANDREL_ALLOW_TEST_WEBHOOKS=1` (e.g., a contract test
84
- * deliberately exercising a sandbox endpoint). With the URL scrubbed,
85
- * `resolveWebhookUrl()` returns nothing and `notify()` never POSTs.
86
- * - `NODE_ENV=test` is set for the rest of the suite's environment
87
- * expectations. (It no longer gates `notify()`'s webhook delivery —
88
- * the NODE_ENV band-aid was removed in Story #3342. Tests that need to
89
- * exercise the webhook POST inject `opts.fetchImpl` instead, so the
90
- * request never reaches the real network even if a URL resolves.)
91
- * - Every `GIT_*` variable is dropped. When the suite runs inside a git
92
- * hook (husky pre-push via the coverage-capture path), the parent git
93
- * invocation exports `GIT_DIR` — from a linked worktree, the absolute
94
- * `<main>/.git/worktrees/<name>` path. A test fixture's `git init`
95
- * under that env re-initializes the shared gitdir and writes
96
- * `core.bare=true` into the MAIN checkout's `.git/config`, breaking
97
- * every worktree at once (#4580). Production git call sites are
98
- * covered by `cleanGitEnv` in `git-utils.js`; this is the same scrub
99
- * for test child processes, which may spawn git directly. Tests that
100
- * need a `GIT_*` variable set it explicitly on their own spawn.
101
- * - `MANDREL_TEST_TEMP_ROOT` is set to an absolute per-process scratch
102
- * dir (Story #4696). Any test that reaches a stream writer without
103
- * injecting its own absolute tempRoot lands under scratch instead of
104
- * the repo's real `temp/` telemetry tree, so the suite can no longer
105
- * append fixture records to friction / lifecycle / trace streams.
46
+ * - `NOTIFICATION_WEBHOOK_URL` is deleted (unless
47
+ * `MANDREL_ALLOW_TEST_WEBHOOKS=1`) so no test POSTs to a live endpoint;
48
+ * - `NODE_ENV` defaults to `test`;
49
+ * - every `GIT_*` is dropped: inside a git hook `GIT_DIR` points at the
50
+ * shared gitdir, and a fixture's `git init` there writes `core.bare=true`
51
+ * into the main checkout, breaking every worktree;
52
+ * - `MANDREL_TEST_TEMP_ROOT` points at the per-process scratch root.
106
53
  *
107
54
  * @param {NodeJS.ProcessEnv} baseEnv
108
55
  * @returns {NodeJS.ProcessEnv}