mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,54 +1,11 @@
1
1
  /**
2
- * `temp/run-<id>/` path-resolution helper (Epic #1030 Story #1039).
2
+ * Single source of truth for every path under `project.paths.tempRoot`:
3
+ * `run-<eid>/…` and `run-<eid>/stories/story-<sid>/…`, with standalone
4
+ * Stories under `standalone/stories/story-<sid>/`.
3
5
  *
4
- * Single source of truth for every artifact path that lives under
5
- * `project.paths.tempRoot`. Every script that previously hand-rolled
6
- * a flat `temp/<artifact>-run-<id>.<ext>` path migrates to call one of
7
- * these helpers. The Tech Spec (#1032) names this module as the cutover
8
- * grep target — `temp/.*-epic-` should be empty across `.agents/scripts`
9
- * once the migration Stories land.
10
- *
11
- * Layout:
12
- * temp/run-<eid>/
13
- * ├─ techspec.md
14
- * ├─ manifest.md (dispatch manifest)
15
- * ├─ retro.md (mirror of GitHub retro at Epic close)
16
- * ├─ lifecycle.ndjson (lifecycle ledger)
17
- * ├─ checkpoints/... (pre-v2 epic-runner state store; retained layout)
18
- * ├─ <name> (runArtifactPath escape hatch)
19
- * └─ stories/
20
- * └─ story-<sid>/
21
- * ├─ manifest.md (story dispatch manifest)
22
- * ├─ signals.ndjson (append-only signals writer)
23
- * └─ <name> (storyArtifactPath escape hatch)
24
- *
25
- * Standalone Stories (no parent Epic) follow the same shape under
26
- * `<tempRoot>/standalone/stories/story-<sid>/`. The `stories/` segment
27
- * was introduced by Story #2940 to visually separate per-Epic artifacts
28
- * from per-Story siblings.
29
- *
30
- * tempRoot resolution: the helper accepts an optional `config` argument
31
- * (the full resolved config or a partial bag with `project.paths.tempRoot`);
32
- * when omitted it lazy-loads via `resolveConfig()` so
33
- * call sites already inside the resolver can pass their own bag and avoid the
34
- * round-trip. The missing-tempRoot fallback resolves to `'temp'` — the
35
- * framework default shipped in `.agents/docs/agentrc-reference.json`. Note that the
36
- * AJV schema marks `tempRoot` as required for any loaded `.agentrc.json`, so
37
- * the fallback only matters in zero-config callers (tests, ad-hoc scripts).
38
- *
39
- * Main-checkout anchoring (Story #3900): the Epic/Story directory helpers
40
- * resolve a *relative* `tempRoot` against the **main checkout root** (the
41
- * parent of `git rev-parse --git-common-dir`) rather than `process.cwd()`.
42
- * Without this, a story child that `cd`s into `.worktrees/story-<id>/` before
43
- * emitting a lifecycle record would append it to
44
- * `<worktree>/temp/run-N/lifecycle.ndjson`, while the `/mandrel-deliver` host
45
- * (running from the main checkout) reads the main-checkout copy — so the
46
- * host never sees the child's records (the audit-#3513 bug class; its
47
- * original `story.heartbeat` instance is gone with that emitter, but the
48
- * divergence applies to every ledger writer). Anchoring the
49
- * ledger to the git common dir makes the worktree child writer and the
50
- * main-checkout host reader converge on a single file regardless of cwd. An
51
- * absolute `tempRoot` is honoured verbatim; only relative roots are anchored.
6
+ * A relative tempRoot is anchored to the main checkout root (parent of
7
+ * `git rev-parse --git-common-dir`), not cwd, so a writer inside a Story
8
+ * worktree and the host reading from the main checkout converge on one file.
52
9
  */
53
10
 
54
11
  import { execFileSync } from 'node:child_process';
@@ -58,35 +15,20 @@ import path from 'node:path';
58
15
 
59
16
  import { reapOnExit } from '../test-temp.js';
60
17
 
61
- /**
62
- * Cache the resolved main-checkout root per spawn cwd so the
63
- * `git rev-parse` shell-out runs at most once per distinct working
64
- * directory in a process. The cache key is the `cwd` the resolution ran
65
- * against (defaulting to `process.cwd()`); a `null` value records a prior
66
- * miss so we don't re-spawn git on a non-repo path.
67
- */
18
+ /** Keyed by cwd; a cached `null` records a non-repo miss. */
68
19
  const _mainCheckoutRootCache = new Map();
69
20
 
70
21
  /**
71
- * Resolve the **main checkout root** for a given working directory by
72
- * shelling out to `git rev-parse --git-common-dir` and taking its parent.
73
- *
74
- * In a linked worktree (`git worktree add`), `--git-common-dir` returns the
75
- * *parent* repo's `.git/` (the shared object store), so its parent directory
76
- * is the main checkout root — exactly the anchor we want for cwd-independent
77
- * lifecycle ledger paths. In the main checkout itself it returns `.git`, so
78
- * the parent is the main checkout root too. The two cases converge.
79
- *
80
- * Returns `null` when the path is not a git repository or git is
81
- * unavailable, so callers fall back to the relative (cwd-anchored) path.
22
+ * Parent of `--git-common-dir`, which is the main checkout root from both the
23
+ * main checkout and any linked worktree. `null` outside a repo.
82
24
  *
83
25
  * @param {string} [cwd=process.cwd()]
84
- * @param {{ exec?: typeof execFileSync }} [deps] Injectable for tests.
26
+ * @param {{ exec?: typeof execFileSync }} [deps]
85
27
  * @returns {string|null}
86
28
  */
87
29
  export function mainCheckoutRoot(cwd = process.cwd(), deps = {}) {
88
30
  const exec = deps.exec ?? execFileSync;
89
- // Only memoize the real (non-injected) resolver so tests stay deterministic.
31
+ // Only the real resolver is memoized.
90
32
  const memoize = !deps.exec;
91
33
  if (memoize && _mainCheckoutRootCache.has(cwd)) {
92
34
  return _mainCheckoutRootCache.get(cwd);
@@ -103,43 +45,26 @@ export function mainCheckoutRoot(cwd = process.cwd(), deps = {}) {
103
45
  resolved = path.dirname(commonDir);
104
46
  }
105
47
  } catch {
106
- // Not a git repo, or git unavailable — fall back to the relative path.
107
48
  resolved = null;
108
49
  }
109
50
  if (memoize) _mainCheckoutRootCache.set(cwd, resolved);
110
51
  return resolved;
111
52
  }
112
53
 
113
- /**
114
- * Test-only: clear the main-checkout-root memoization cache so a suite can
115
- * exercise multiple repo roots in one process without cross-test bleed.
116
- */
54
+ /** Test-only. */
117
55
  export function _clearMainCheckoutRootCache() {
118
56
  _mainCheckoutRootCache.clear();
119
57
  }
120
58
 
121
59
  /**
122
- * Environment variable naming an absolute per-process scratch tempRoot that
123
- * every stream writer must land in during a test run (Story #4696).
124
- *
125
- * The shared test bootstrap (`lib/test-env.js`) sets this to a fresh
126
- * `os.tmpdir()` directory before spawning the test runner, so any test that
127
- * reaches a writer (`signals-writer`, `appendLedgerEvent`, etc.)
128
- * *without* explicitly injecting an absolute tempRoot still resolves under
129
- * scratch instead of the repo's real `temp/` tree. This is the single
130
- * injection seam: because every path helper funnels a relative root through
131
- * `anchorTempRoot`, one redirect here covers all writers regardless of how
132
- * each one resolved its root.
60
+ * Absolute scratch tempRoot the test bootstrap arms, so any writer reaching a
61
+ * relative root under test lands in scratch, not the repo's `temp/`.
133
62
  */
134
63
  export const TEST_TEMP_ROOT_ENV = 'MANDREL_TEST_TEMP_ROOT';
135
64
 
136
65
  /**
137
- * Resolve the absolute scratch tempRoot override, or `null` when none is
138
- * configured. Only an **absolute** value is honoured — a relative override
139
- * would re-anchor against the repo tree and defeat the isolation, so it is
140
- * ignored (treated as unset). Module-internal: the behaviour is exercised
141
- * through `anchorTempRoot`, so it is deliberately not exported (keeps the
142
- * public seam to `anchorTempRoot` + `TEST_TEMP_ROOT_ENV`).
66
+ * Only an absolute override is honoured; a relative one would re-anchor
67
+ * into the repo and defeat the isolation.
143
68
  *
144
69
  * @param {NodeJS.ProcessEnv} [env=process.env]
145
70
  * @returns {string|null}
@@ -153,41 +78,19 @@ function testScratchTempRoot(env = process.env) {
153
78
  : null;
154
79
  }
155
80
 
156
- /**
157
- * Environment variable that opts a test-context process back into the real
158
- * `temp/` tree (Story #4711). The `anchorTempRoot` test-context fallback
159
- * refuses to anchor a relative root into the repo's telemetry tree when the
160
- * process is a node:test context; a test that genuinely needs the real tree
161
- * sets this to `'1'` on its own spawn — an explicit, greppable opt-out
162
- * instead of a silent bypass.
163
- */
81
+ /** `'1'` opts a test-context process back into the real `temp/` tree. */
164
82
  export const TEST_ALLOW_REAL_TEMP_ENV = 'MANDREL_TEST_ALLOW_REAL_TEMP';
165
83
 
166
- /**
167
- * Per-process memo for the lazily-created test-context scratch dir, so every
168
- * relative-root resolution in one test process converges on a single scratch
169
- * tree (mirrors the `_mainCheckoutRootCache` pattern above).
170
- */
171
84
  let _testContextScratchDir = null;
172
85
 
173
- /**
174
- * Test-only: clear the test-context scratch memo so a suite can exercise the
175
- * lazy-arming branch repeatedly in one process.
176
- */
86
+ /** Test-only. */
177
87
  export function _clearTestContextScratchCache() {
178
88
  _testContextScratchDir = null;
179
89
  }
180
90
 
181
91
  /**
182
- * Is this process a node:test context? True when the env carries
183
- * `NODE_TEST_CONTEXT` (set by the node:test runner on every spawned test
184
- * child, regardless of how the runner itself was launched) or when the
185
- * process was started with the `--test` flag (a direct `node --test <file>`
186
- * runner process, or in-process isolation modes).
187
- *
188
- * Exported since Story #4837: the feedback loop's issue-filing path guards
189
- * live GitHub writes on this same signal, and a second hand-rolled copy of
190
- * the detection is exactly how the two would drift apart.
92
+ * `NODE_TEST_CONTEXT` (set on every node:test child) or a `--test` execArgv.
93
+ * The single shared detector — the live-filing guard uses it too.
191
94
  *
192
95
  * @param {NodeJS.ProcessEnv} [env=process.env]
193
96
  * @param {string[]} [execArgv=process.execArgv]
@@ -204,39 +107,14 @@ export function inNodeTestContext(
204
107
  }
205
108
 
206
109
  /**
207
- * Anchor a resolved `tempRoot` to the main checkout root when it is a
208
- * relative path (Story #3900). Absolute roots are returned verbatim; a
209
- * relative root is joined onto the main checkout root so every caller
210
- * resolves the same on-disk ledger regardless of the process cwd. When the
211
- * main checkout cannot be resolved (non-repo, git unavailable) the relative
212
- * root is returned unchanged so behaviour degrades to the prior
213
- * cwd-relative semantics rather than throwing.
214
- *
215
- * Test isolation (Story #4696): when the scratch override
216
- * (`MANDREL_TEST_TEMP_ROOT`) is set, a relative root is joined onto the
217
- * scratch dir instead of the main checkout root, so a writer that reaches
218
- * the default (or any relative) root under the test bootstrap lands in
219
- * scratch and never pollutes the repo's real `temp/` telemetry tree. An
220
- * absolute root injected by a well-behaved test still bypasses the redirect
221
- * verbatim.
222
- *
223
- * Process-level arming (Story #4711): the wrapper-armed override above only
224
- * covers processes spawned by `run-tests.js` — a direct `node --test <file>`
225
- * run used to bypass it and append fixture records to the real tree. When no
226
- * override is armed but the process *is* a node:test context (see
227
- * `inNodeTestContext`), a per-process scratch dir is created lazily and the
228
- * relative root anchors there instead. The scratch dir is memoized and — for
229
- * the real `process.env` — written back to `MANDREL_TEST_TEMP_ROOT` so child
230
- * processes the test spawns inherit the same scratch tree. Escape hatch: a
231
- * test that genuinely needs the real tree sets
232
- * `MANDREL_TEST_ALLOW_REAL_TEMP=1` (`TEST_ALLOW_REAL_TEMP_ENV`) to restore
233
- * main-checkout anchoring; the `check-test-temp-hygiene` guard remains the
234
- * backstop either way.
110
+ * Absolute roots pass verbatim. A relative root joins, in order: the armed
111
+ * scratch override; a lazily-created per-process scratch dir when this is a
112
+ * node:test context (published to children via the env) unless
113
+ * `TEST_ALLOW_REAL_TEMP_ENV=1`; the main checkout root; else stays relative.
235
114
  *
236
115
  * @param {string} tempRoot
237
116
  * @param {NodeJS.ProcessEnv} [env=process.env]
238
117
  * @param {{ mkdtemp?: typeof mkdtempSync, execArgv?: string[], onExit?: (fn: () => void) => void }} [deps]
239
- * Injectable for tests.
240
118
  * @returns {string}
241
119
  */
242
120
  export function anchorTempRoot(tempRoot, env = process.env, deps = {}) {
@@ -255,15 +133,13 @@ export function anchorTempRoot(tempRoot, env = process.env, deps = {}) {
255
133
  _testContextScratchDir = mkdtemp(
256
134
  path.join(os.tmpdir(), 'mandrel-test-temp-'),
257
135
  );
258
- // Creator-only reaping (Story #4808): a process that read the root
259
- // from the env returned at `scratch` above and never reaches here,
260
- // so it can never remove a root its parent is still writing to.
136
+ // Creator-only reaping: a process that inherited the root returned at
137
+ // `scratch` above, so it never removes a root its parent still uses.
261
138
  reapOnExit(
262
139
  _testContextScratchDir,
263
140
  deps.onExit ? { onExit: deps.onExit } : {},
264
141
  );
265
142
  if (env === process.env) {
266
- // Children spawned by this test process inherit the same scratch.
267
143
  process.env[TEST_TEMP_ROOT_ENV] = _testContextScratchDir;
268
144
  }
269
145
  }
@@ -274,47 +150,23 @@ export function anchorTempRoot(tempRoot, env = process.env, deps = {}) {
274
150
  }
275
151
 
276
152
  /**
277
- * Synchronous tempRoot extraction. Accepts the canonical full resolved
278
- * config (`{ project, ... }`) and reads `project.paths.tempRoot`.
279
- *
280
- * Returns `'temp'` for `undefined` / non-object input or when
281
- * `project.paths.tempRoot` is missing / empty / non-string.
282
- *
283
- * Cross-script callers that already hold a resolved config should pass it
284
- * here; bare callers omit the argument and accept the framework default.
153
+ * `project.paths.tempRoot`, defaulting to `'temp'`.
285
154
  *
286
155
  * @param {object} [config]
287
156
  * @returns {string}
288
157
  */
289
158
  export function tempRootFrom(config) {
290
159
  if (!config || typeof config !== 'object') return 'temp';
291
- // Post-reshape canonical shape: paths live under `project.paths.*`.
292
160
  const tempRoot = config.project?.paths?.tempRoot;
293
161
  return typeof tempRoot === 'string' && tempRoot.length > 0
294
162
  ? tempRoot
295
163
  : 'temp';
296
164
  }
297
165
 
298
- /**
299
- * Directory segment (under `tempRoot`) holding every orchestration run log —
300
- * the close gate transcripts (`close-gates-<sid>.log`) and the terse-result
301
- * detail dumps (`story-init-result-<sid>.log`, `sync-result-<branch>.log`, …).
302
- *
303
- * Story #4794: the four writers that land here each hand-rolled the temp path
304
- * from a literal `temp` segment joined onto their own cwd, which ignores
305
- * `project.paths.tempRoot` entirely. On a consumer that relocates its temp
306
- * root, the writers wrote to `<cwd>/temp/` while every reader — including the
307
- * retention purge — resolved the configured root, so the artifacts were
308
- * invisible to the tooling meant to manage them. Routing all four through this
309
- * helper also picks up main-checkout anchoring for free, so a close running
310
- * from a Story worktree lands its logs in the same tree the host reads.
311
- */
166
+ /** Holds close gate logs and terse-result detail dumps. */
312
167
  export const ORCHESTRATION_DIRNAME = 'orchestration';
313
168
 
314
169
  /**
315
- * `<tempRoot>/orchestration/` — resolved against the configured temp root and
316
- * anchored to the main checkout, like every other helper in this module.
317
- *
318
170
  * @param {object} [config]
319
171
  * @returns {string}
320
172
  */
@@ -323,16 +175,8 @@ export function orchestrationLogDir(config) {
323
175
  }
324
176
 
325
177
  /**
326
- * Basename of one Story's close gate log (Story #4816 lifted it here from
327
- * `single-story-close/gate-log.js`).
328
- *
329
- * The writer that appends this file and the reader that uses its **freshness**
330
- * to tell a live close from a dead one (`deliver-recover.js`) sit in different
331
- * subtrees, and the reader importing the writer is the wrong edge to draw for
332
- * a filename. Both take it from the module that already owns every other
333
- * tempRoot path instead.
334
- *
335
- * `null` is the sink's no-Story sentinel and keeps its `unknown` spelling.
178
+ * Shared by the gate-log writer and `deliver-recover.js`, which reads its
179
+ * freshness to tell a live close from a dead one.
336
180
  *
337
181
  * @param {number|null} sid
338
182
  * @returns {string}
@@ -342,8 +186,6 @@ function closeGateLogName(sid) {
342
186
  }
343
187
 
344
188
  /**
345
- * `<tempRoot>/orchestration/close-gates-<sid>.log`.
346
- *
347
189
  * @param {number|null} sid
348
190
  * @param {object} [config]
349
191
  * @returns {string}
@@ -353,8 +195,6 @@ export function closeGateLogPath(sid, config) {
353
195
  }
354
196
 
355
197
  /**
356
- * Basename of the persisted terminal envelope for one Story (Story #4816).
357
- *
358
198
  * @param {number} sid
359
199
  * @returns {string}
360
200
  */
@@ -363,18 +203,8 @@ function storyTerminalEnvelopeName(sid) {
363
203
  }
364
204
 
365
205
  /**
366
- * `<tempRoot>/orchestration/story-deliver-terminal-<sid>.json` — the on-disk
367
- * copy of the one terminal envelope a Story's close-and-land emits (Story
368
- * #4816).
369
- *
370
- * Deliberately a sibling of the gate log rather than a per-Story temp dir
371
- * entry: the envelope is a run artifact of the same close that writes
372
- * `close-gates-<sid>.log`, and `deliver-recover.js` reads the pair together to
373
- * tell a finished close from a live one. Sharing `orchestrationLogDir` also
374
- * means it inherits main-checkout anchoring for free — the close runs inside
375
- * `.worktrees/story-<sid>/` while the `/mandrel-deliver` host reads from the main
376
- * checkout, and an un-anchored path would put the envelope somewhere the
377
- * router never looks.
206
+ * A sibling of the gate log: `deliver-recover.js` reads the pair together to
207
+ * tell a finished close from a live one.
378
208
  *
379
209
  * @param {number} sid
380
210
  * @param {object} [config]
@@ -391,13 +221,7 @@ const runId = (id) => {
391
221
  return id;
392
222
  };
393
223
 
394
- /**
395
- * Story #2874 — accept `null` as the standalone-story sentinel.
396
- * Story-level helpers (storyTempDir, signalsFile, etc.) route
397
- * `eid === null` to `<tempRoot>/standalone/story-<sid>/` so that
398
- * standalone Stories (no parent Epic) still get a stable on-disk
399
- * home for signals + traces. All other invalid values still throw.
400
- */
224
+ /** `null` is the standalone-Story sentinel. */
401
225
  const storyEpicId = (id) => {
402
226
  if (id === null) return null;
403
227
  if (!Number.isInteger(id) || id <= 0) {
@@ -421,9 +245,7 @@ const artifactName = (name) => {
421
245
  if (typeof name !== 'string' || name.length === 0) {
422
246
  throw new Error('[temp-paths] artifact name must be a non-empty string');
423
247
  }
424
- // Reject path traversal — every artifact must live directly under the
425
- // resolved Epic / Story dir. Forward slashes and back slashes alike are
426
- // rejected so Windows callers can't sneak `..\foo` past the guard.
248
+ // Reject traversal; backslashes too, so `..\foo` cannot pass on Windows.
427
249
  if (name.includes('/') || name.includes('\\') || name === '..') {
428
250
  throw new Error(
429
251
  `[temp-paths] artifact name must not contain path separators; got ${JSON.stringify(name)}`,
@@ -433,8 +255,6 @@ const artifactName = (name) => {
433
255
  };
434
256
 
435
257
  /**
436
- * `temp/run-<id>/` — every run-scoped artifact lives under here.
437
- *
438
258
  * @param {number} rid
439
259
  * @param {object} [config]
440
260
  * @returns {string}
@@ -444,19 +264,7 @@ export function runTempDir(rid, config) {
444
264
  }
445
265
 
446
266
  /**
447
- * `temp/run-<eid>/stories/story-<sid>/` — every Story-scoped artifact
448
- * lives under here.
449
- *
450
- * Story #2874: accepts `eid === null` for standalone Stories (no
451
- * parent Epic). The standalone variant routes to
452
- * `<tempRoot>/standalone/stories/story-<sid>/` so signals + traces from
453
- * `/single-story-deliver` runs still land in a stable, scannable
454
- * location instead of being dropped on the floor.
455
- *
456
- * Story #2940 introduced the intermediate `stories/` segment so that
457
- * per-Epic top-level artifacts (`techspec.md`, `manifest.md`,
458
- * `retro.md`, `lifecycle.ndjson`, `baselines/`, `checkpoints/`) are
459
- * visually and structurally separated from the per-Story siblings.
267
+ * `eid === null` routes to `<tempRoot>/standalone/stories/story-<sid>/`.
460
268
  *
461
269
  * @param {number|null} eid
462
270
  * @param {number} sid
@@ -472,18 +280,10 @@ export function storyTempDir(eid, sid, config) {
472
280
  return path.join(parent, STORIES_DIRNAME, `story-${storyId(sid)}`);
473
281
  }
474
282
 
475
- /**
476
- * Basename of a per-Story signal stream. Exported so the reader that
477
- * *discovers* streams by walking the temp tree (`signals-writer.js`'s
478
- * cross-Story gather, Story #4824) names the same file the writer does,
479
- * instead of re-spelling the literal in a second module.
480
- */
283
+ /** Exported so stream discovery names the same file the writer does. */
481
284
  export const SIGNALS_BASENAME = 'signals.ndjson';
482
285
 
483
286
  /**
484
- * `temp/run-<eid>/stories/story-<sid>/signals.ndjson` — append-only
485
- * signal stream consumed by the analyzer (Epic #1030 AC1).
486
- *
487
287
  * @param {number} eid
488
288
  * @param {number} sid
489
289
  * @param {object} [config]
@@ -493,24 +293,12 @@ export function signalsFile(eid, sid, config) {
493
293
  return path.join(storyTempDir(eid, sid, config), SIGNALS_BASENAME);
494
294
  }
495
295
 
496
- /**
497
- * Directory segment holding the standalone-Story subtree —
498
- * `<tempRoot>/standalone/stories/story-<sid>/`. Named here (rather than
499
- * inlined in `storyTempDir`) so the cross-Story stream discovery in
500
- * `signals-writer.js` can recognise it without re-spelling the literal.
501
- */
502
296
  export const STANDALONE_DIRNAME = 'standalone';
503
297
 
504
- /**
505
- * Directory segment holding the per-Story subtree under either an Epic run
506
- * dir or the standalone dir (Story #2940's separator).
507
- */
508
298
  export const STORIES_DIRNAME = 'stories';
509
299
 
510
300
  /**
511
- * `<tempRoot>` itself, resolved and main-checkout-anchored. The discovery
512
- * walk needs the root the named helpers are built from; every other consumer
513
- * should keep using a named helper.
301
+ * For the discovery walk only; everything else uses a named helper.
514
302
  *
515
303
  * @param {object} [config]
516
304
  * @returns {string}
@@ -520,20 +308,7 @@ export function resolvedTempRoot(config) {
520
308
  }
521
309
 
522
310
  /**
523
- * `temp/run-<eid>/stories/story-<sid>/lifecycle.ndjson` — the story-scope
524
- * ledger destination for lifecycle events emitted directly by a Story
525
- * (rather than routed through the Epic-scoped bus ledger). Story #4426
526
- * (Epic #4425) introduces the first consumer: a standalone
527
- * `single-story-close` run (no parent Epic) emitting `merge.unlanded`
528
- * needs an on-disk home even though there is no `run-<id>/` directory to
529
- * anchor the event to.
530
- *
531
- * Mirrors `runLedgerPath` exactly, one level down: `eid === null` routes
532
- * through `storyTempDir`'s standalone branch to
533
- * `<tempRoot>/standalone/stories/story-<sid>/lifecycle.ndjson`; a real
534
- * `eid` routes to `<tempRoot>/run-<eid>/stories/story-<sid>/lifecycle.ndjson`,
535
- * so an Epic-attached Story's story-scope ledger sits alongside its
536
- * `signals.ndjson` sibling.
311
+ * Story-scope ledger; `eid === null` routes to the standalone subtree.
537
312
  *
538
313
  * @param {number|null} eid
539
314
  * @param {number} sid
@@ -544,10 +319,7 @@ export const storyLedgerPath = (eid, sid, config) =>
544
319
  storyArtifactPath(eid, sid, 'lifecycle.ndjson', config);
545
320
 
546
321
  /**
547
- * Escape hatch for an Epic-level artifact whose name isn't part of the
548
- * canonical layout (one of the per-Epic perf surfaces, retro mirror, etc.).
549
- * Use the named helpers below for the canonical files; reserve this one
550
- * for ad-hoc additions.
322
+ * Escape hatch for a non-canonical run-level artifact.
551
323
  *
552
324
  * @param {number} eid
553
325
  * @param {string} name
@@ -559,9 +331,6 @@ export function runArtifactPath(eid, name, config) {
559
331
  }
560
332
 
561
333
  /**
562
- * Escape hatch for a Story-level artifact whose name isn't part of the
563
- * canonical layout (signals.ndjson + manifest.md ship named helpers).
564
- *
565
334
  * @param {number} eid
566
335
  * @param {number} sid
567
336
  * @param {string} name
@@ -573,14 +342,7 @@ function storyArtifactPath(eid, sid, name, config) {
573
342
  }
574
343
 
575
344
  /**
576
- * `temp/run-<eid>/lifecycle.ndjson` — append-only lifecycle ledger
577
- * (Story #2510). `appendLedgerEvent` persists one `emitted` record here per
578
- * merge-terminal outcome; Story #5024 retired the `LedgerWriter` listener and
579
- * the `TraceLogger` markdown companion that preceded it.
580
- *
581
- * The path is also the canonical input the standalone `lifecycle-emit`
582
- * CLI feeds to `buildDefaultListenerChain` when assembling the default
583
- * listener roster for an out-of-runner emit.
345
+ * Append-only lifecycle ledger; one record per merge-terminal outcome.
584
346
  *
585
347
  * @param {number} eid
586
348
  * @param {object} [config]
@@ -589,7 +351,5 @@ function storyArtifactPath(eid, sid, name, config) {
589
351
  export const runLedgerPath = (eid, config) =>
590
352
  runArtifactPath(eid, 'lifecycle.ndjson', config);
591
353
 
592
- // --- Canonical Story-level filenames ---
593
-
594
354
  export const storyManifestPath = (eid, sid, config) =>
595
355
  storyArtifactPath(eid, sid, 'manifest.md', config);
@@ -1,16 +1,7 @@
1
1
  /**
2
- * `validateOrchestrationConfig` — hand-written security checks for the
3
- * post-reshape config (Epic #1720 Story #1739).
4
- *
5
- * The structural validation now lives in the top-level AJV schema (run by
6
- * `resolveConfig` against the full `.agentrc.json` document). This module
7
- * carries the security checks that JSON Schema cannot express:
8
- *
9
- * - Shell-metacharacter injection on `github.{owner, repo, operatorHandle}`.
10
- * - Path-traversal containment on `delivery.worktreeIsolation.root`.
11
- *
12
- * Accepts either the full resolved config (`{ project, github, planning,
13
- * delivery }`) or `null` (zero-config callers — no checks needed).
2
+ * Security checks JSON Schema cannot express: shell metacharacters in
3
+ * `github.{owner, repo, operatorHandle}` and path containment of
4
+ * `delivery.worktreeIsolation.root`.
14
5
  */
15
6
 
16
7
  import path from 'node:path';
@@ -23,11 +14,8 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
23
14
  const PROJECT_ROOT = path.resolve(__dirname, '../../../..');
24
15
 
25
16
  /**
26
- * Run the post-reshape security checks against a resolved config bag.
27
- *
28
- * @param {object|null} config - The resolved config (`{ project, github, ... }`)
29
- * or `null` for zero-config callers.
30
- * @throws {Error} If any security check fails.
17
+ * @param {object|null} config - `null` for zero-config callers.
18
+ * @throws {Error}
31
19
  */
32
20
  export function validateOrchestrationConfig(config) {
33
21
  if (config == null) return;
@@ -1,23 +1,11 @@
1
1
  /**
2
- * `delivery.worktreeIsolation` accessor + framework defaults.
3
- *
4
- * Several consumers read this block directly (runtime.js,
5
- * worktree-manager.js, workspace-provisioner.js) and previously each
6
- * carried its own fallback constant. Centralising the defaults here
7
- * lets `applyDefaults()` in `config-resolver.js` enrich the canonical
8
- * block once, so consumers never see `undefined` for a defaulted field
9
- * (which previously meant, e.g., `Boolean(undefined) === false`
10
- * silently disabling worktrees when the operator omitted the block).
2
+ * `delivery.worktreeIsolation` defaults, applied once so no consumer reads
3
+ * `undefined` (e.g. `Boolean(undefined)` silently disabling worktrees).
11
4
  */
12
5
 
13
6
  /**
14
- * Default `nodeModulesStrategy`, platform-aware (Story #4249).
15
- *
16
- * darwin/linux default to `clone` — a copy-on-write (clonefile/reflink) clone
17
- * of the donor's `node_modules` that is effectively free in time and disk on
18
- * APFS / reflink-capable filesystems, with a clean fall-back to `per-worktree`
19
- * on any failure (unsupported fs, cross-volume, etc.). Windows has no reflink
20
- * equivalent on this path, so it keeps the `per-worktree` install default.
7
+ * `clone` is a copy-on-write clone (falls back to `per-worktree` on failure);
8
+ * Windows has no reflink path.
21
9
  *
22
10
  * @param {NodeJS.Platform} [platform]
23
11
  * @returns {'clone' | 'per-worktree'}
@@ -33,15 +21,10 @@ export const WORKTREE_ISOLATION_DEFAULTS = Object.freeze({
33
21
  primeFromPath: null,
34
22
  allowSymlinkOnWindows: false,
35
23
  reapOnSuccess: true,
36
- // Gitignored workspace files copied into each new worktree. Includes the
37
- // operator's local-override files (`.agentrc.local.json`,
38
- // `.agents/instructions.local.md`) so a worktree-isolated agent honors the
39
- // §1.E local-override contract instead of silently falling back to the
40
- // committed `.agentrc.json` placeholders — the gap that left
41
- // `github.operatorHandle` unset inside worktrees and broke Story-lease
42
- // release at close. Missing sources are skipped by the provisioner, so
43
- // listing files that may be absent is safe. Keep in sync with
44
- // `DEFAULT_WORKSPACE_FILES` in `../workspace-provisioner.js`.
24
+ // Local overrides must reach the worktree, or e.g. `operatorHandle` reads
25
+ // the committed placeholder and lease release breaks at close. Absent
26
+ // files are skipped. Keep in sync with `DEFAULT_WORKSPACE_FILES` in
27
+ // `../workspace-provisioner.js`.
45
28
  bootstrapFiles: Object.freeze([
46
29
  '.env',
47
30
  '.mcp.json',
@@ -51,9 +34,7 @@ export const WORKTREE_ISOLATION_DEFAULTS = Object.freeze({
51
34
  });
52
35
 
53
36
  /**
54
- * Read the merged `delivery.worktreeIsolation` block, applying framework
55
- * defaults for any field the operator omitted. Accepts the full resolved
56
- * config, the bare delivery bag, or the bare worktreeIsolation bag.
37
+ * Accepts the full config, the `delivery` bag, or the block itself.
57
38
  *
58
39
  * @param {object | null | undefined} config
59
40
  * @returns {typeof WORKTREE_ISOLATION_DEFAULTS}