mandrel 1.94.0 → 2.1.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 (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * plan-phase-cleanup.js — Post-phase temp-file cleanup for `/plan`.
3
3
  *
4
- * The spec and decompose phases write several Epic-scoped temp files under
5
- * the per-Epic tree (`temp/epic-<id>/planner-context.json`,
6
- * `temp/epic-<id>/techspec.md`, etc. — see `lib/config/temp-paths.js`). The
4
+ * The spec and decompose phases write several run-scoped temp files under
5
+ * the per-run tree (`temp/run-<id>/planner-context.json`,
6
+ * `temp/run-<id>/techspec.md`, etc. — see `lib/config/temp-paths.js`). The
7
7
  * workflow .md previously told the operator to `Remove-Item` those files by
8
8
  * name at the end of each phase, which rots: adding a new temp file in the
9
9
  * script required a synchronized markdown edit, and missed edits left
@@ -19,20 +19,20 @@
19
19
  * never sinks a successful phase.
20
20
  *
21
21
  * Migration note (Epic #1030 Story #1040): the legacy flat layout
22
- * (`temp/planner-context-epic-<id>.json` etc.) has been retired. The
23
- * resolver now delegates to `epicArtifactPath` from
24
- * `lib/config/temp-paths.js`, which yields `temp/epic-<id>/<basename>`
22
+ * (`temp/planner-context-for-<id>.json` etc.) has been retired. The
23
+ * resolver now delegates to `runArtifactPath` from
24
+ * `lib/config/temp-paths.js`, which yields `temp/run-<id>/<basename>`
25
25
  * under the configured `tempRoot`.
26
26
  */
27
27
 
28
28
  import fs from 'node:fs/promises';
29
29
  import path from 'node:path';
30
- import { epicArtifactPath } from './config/temp-paths.js';
30
+ import { runArtifactPath } from './config/temp-paths.js';
31
31
  import { PROJECT_ROOT, resolveConfig } from './config-resolver.js';
32
32
 
33
33
  /**
34
- * Map of phase → artifact basenames (no path components). The per-Epic
35
- * directory prefix is supplied by `epicArtifactPath` at resolution time.
34
+ * Map of phase → artifact basenames (no path components). The per-run
35
+ * directory prefix is supplied by `runArtifactPath` at resolution time.
36
36
  */
37
37
  export const PHASE_TEMP_BASENAMES = Object.freeze({
38
38
  spec: Object.freeze([
@@ -45,15 +45,13 @@ export const PHASE_TEMP_BASENAMES = Object.freeze({
45
45
  // plan-phase artifact and deletes them ONLY at terminal success (after
46
46
  // the `agent::ready` flip), fixing the mid-pipeline deletion defect where
47
47
  // per-phase cleanup removed artifacts a `--force`/`--resume` re-persist
48
- // was still entitled to reuse. `risk-verdict.json` joins the set here:
49
- // the split-phase cleanup never owned it, which orphaned it in temp/.
48
+ // was still entitled to reuse.
50
49
  // `plan-metrics.json` stays deliberately excluded (PR1) — the ledger
51
50
  // must survive cleanup so the whole plan run is visible in one stream.
52
51
  persist: Object.freeze([
53
52
  'planner-context.json',
54
53
  'techspec.md',
55
54
  'acceptance-spec.md',
56
- 'risk-verdict.json',
57
55
  'decomposer-context.json',
58
56
  'tickets.json',
59
57
  ]),
@@ -84,8 +82,8 @@ export function resolvePhaseTempPaths(phase, epicId, repoRoot = PROJECT_ROOT) {
84
82
  config = undefined;
85
83
  }
86
84
  return basenames.map((basename) => {
87
- const rel = epicArtifactPath(epicId, basename, config);
88
- // `epicArtifactPath` yields a path under `tempRoot` (relative when
85
+ const rel = runArtifactPath(epicId, basename, config);
86
+ // `runArtifactPath` yields a path under `tempRoot` (relative when
89
87
  // tempRoot is itself relative — the framework default). Rebase
90
88
  // relative paths against `repoRoot` so callers always receive an
91
89
  // absolute path — matches the pre-migration contract that
@@ -2,305 +2,36 @@
2
2
  * planning-corpus.js — corpus-aware context for the standalone-Story
3
3
  * planning path (Story #4432).
4
4
  *
5
- * `/plan --idea` previously drafted a standalone Story from a blank
6
- * slate: the seed, the body template, and a title-only duplicate scan.
7
- * For a change request that is really a small delta against an
8
- * already-delivered surface, that blank slate throws away context the
9
- * project already has — the docs digest and the relevant Tech Spec
10
- * sections of existing Epics that cover the touched area.
11
- *
12
- * This module assembles that inherited context (`corpusContext`) for
13
- * `story-plan.js`'s `--emit-context` envelope:
5
+ * `/plan --seed` drafts a standalone Story from the seed, the body
6
+ * template, and a title-only duplicate scan. This module assembles the
7
+ * inherited context (`corpusContext`) for `story-plan.js`'s
8
+ * `--emit-context` envelope:
14
9
  *
15
10
  * 1. `docsDigest` — the same per-project docs digest
16
11
  * `orchestration/docs-digest.js` builds for `/deliver` Story
17
12
  * children, reused here so the standalone path gets the same
18
13
  * compact outline instead of re-reading the whole docs set.
19
14
  * `null` when `project.docsContextFiles` is not configured.
20
- * 2. `relevantSections` — a ranked list of existing Epic Tech Spec
21
- * (or lede, when no Tech Spec region exists) excerpts that overlap
22
- * with the seed, so the draft can build on prior art instead of
23
- * re-deriving it.
24
- *
25
- * The Epic list surface (`provider.getEpics`) maps every issue through
26
- * `issueToEpicListItem`, which deliberately omits `body` (a list-scale
27
- * payload trim). Body content therefore requires an **explicit**,
28
- * bounded per-candidate fetch via `provider.getEpic(id)` — never a
29
- * silent assumption that the list response carries prose to score
30
- * against.
31
- *
32
- * Relevance scoring reuses the same `tokenize` / `overlapScore` Jaccard
33
- * primitives `duplicate-search.js` exports for Epic-dedupe and
34
- * `story-plan.js` reuses for Story-dedupe — one matcher, three
35
- * consumers, no forked scoring logic.
15
+ * 2. `relevantSections` — always `[]`. This field previously carried
16
+ * ranked Tech Spec excerpts mined from open Epics. v2.0.0 removed
17
+ * the Epic tier, and the provider's Epic-list surface was reduced
18
+ * to a `return []` stub, which made the entire ranking pipeline a
19
+ * permanent no-op. The pipeline has been removed; the field is
20
+ * retained so the envelope shape stays stable for its consumers.
36
21
  */
37
22
 
38
- import { overlapScore, tokenize } from './duplicate-search.js';
39
- import { extractEpicSection, hasEpicSection } from './epic-body-sections.js';
40
- import { Logger } from './Logger.js';
41
23
  import { buildDocsDigest } from './orchestration/docs-digest.js';
42
24
 
43
- /** Top-K Epics kept after the cheap title-only ranking pass. */
44
- const DEFAULT_CORPUS_MAX_CANDIDATES = 5;
45
-
46
- /**
47
- * Bound on the explicit per-candidate body fetch. Keeps corpus-context
48
- * assembly at a fixed, small number of GitHub reads regardless of how
49
- * many open Epics the repo carries.
50
- */
51
- export const DEFAULT_CORPUS_BODY_FETCH_TOP_K = 3;
52
-
53
- /** Minimum Jaccard overlap for a section excerpt to be worth surfacing. */
54
- const DEFAULT_CORPUS_MIN_SCORE = 0.1;
55
-
56
- /** Max relevant-section excerpts returned in the envelope. */
57
- const DEFAULT_CORPUS_MAX_SECTIONS = 5;
58
-
59
- /** Excerpt length cap (chars) so one oversized Tech Spec doesn't blow the envelope. */
60
- const EXCERPT_MAX_CHARS = 600;
61
-
62
- /**
63
- * Page-scan cap passed to `provider.getEpics({ state: 'open', pageCap })`.
64
- * The corpus lookup only ever ranks the list down to a top-5 shortlist
65
- * (`DEFAULT_CORPUS_MAX_CANDIDATES`), so there is no need to inherit
66
- * `paginateRest`'s full default ceiling (50 pages / 5000 items) to build
67
- * it — a bounded scan keeps this call a fixed, small number of GitHub
68
- * reads regardless of how many open Epics the repo carries.
69
- */
70
- const CORPUS_EPICS_PAGE_CAP = 5;
71
-
72
- /**
73
- * Rank open Epics by title-overlap with the seed. This is the cheap
74
- * first pass over the list surface (title only — `issueToEpicListItem`
75
- * has no `body`), used solely to pick the bounded top-K candidates
76
- * worth an explicit body fetch. It is not the final relevance signal;
77
- * `extractRelevantSections` re-scores against actual section content.
78
- *
79
- * @param {{ seed: string, epics: Array<{ id:number, title:string }>, maxResults?: number }} opts
80
- * @returns {Array<{ id:number, title:string, score:number }>}
81
- */
82
- export function rankCandidateEpics({
83
- seed,
84
- epics,
85
- maxResults = DEFAULT_CORPUS_MAX_CANDIDATES,
86
- }) {
87
- if (!seed || typeof seed !== 'string') {
88
- throw new Error('rankCandidateEpics: seed must be a non-empty string');
89
- }
90
- if (!Array.isArray(epics)) {
91
- throw new Error('rankCandidateEpics: epics must be an array');
92
- }
93
- const seedTokens = tokenize(seed);
94
- if (seedTokens.size === 0) return [];
95
-
96
- const ranked = [];
97
- for (const epic of epics) {
98
- if (!epic || typeof epic.title !== 'string') continue;
99
- const score = overlapScore(seedTokens, tokenize(epic.title));
100
- ranked.push({
101
- id: epic.id,
102
- title: epic.title,
103
- score: Number(score.toFixed(4)),
104
- });
105
- }
106
- ranked.sort((a, b) => b.score - a.score);
107
- return ranked.slice(0, maxResults);
108
- }
109
-
110
- /**
111
- * Fetch full bodies for the top-K ranked candidates via the single-issue
112
- * read (`provider.getEpic`), which — unlike the `getEpics` list mapper —
113
- * does carry `body`. This is the explicit, bounded fetch the corpus
114
- * lookup performs instead of assuming the list surface already has
115
- * prose to score: a candidate never contributes a relevant section
116
- * without this round-trip resolving its body.
117
- *
118
- * A single candidate's fetch failing (deleted issue, transient error) is
119
- * non-fatal — it is dropped from the result rather than aborting corpus
120
- * assembly for every other candidate. Failures are logged via
121
- * `Logger.debug` (stderr) so they are visible under
122
- * `AGENT_LOG_LEVEL=verbose` triage without violating the friction-
123
- * telemetry posture in `.agents/instructions.md` §1.H of never silently
124
- * swallowing an error.
125
- *
126
- * The bounded candidate slice is fetched concurrently
127
- * (`Promise.allSettled`) rather than sequentially — `topK` is a fixed
128
- * small ceiling (default 3), so this is a bounded fan-out, not an
129
- * unbounded one, and it removes the serial network-latency stacking a
130
- * plain `for`-await loop would otherwise incur.
131
- *
132
- * @param {{ provider: object, candidates: Array<{ id:number, title:string }>, topK?: number }} opts
133
- * @returns {Promise<Array<{ id:number, title:string, body:string }>>}
134
- */
135
- export async function fetchCandidateBodies({
136
- provider,
137
- candidates,
138
- topK = DEFAULT_CORPUS_BODY_FETCH_TOP_K,
139
- }) {
140
- if (!provider || typeof provider.getEpic !== 'function') return [];
141
- if (!Array.isArray(candidates) || candidates.length === 0) return [];
142
-
143
- const bounded = candidates.slice(0, topK);
144
- const settled = await Promise.allSettled(
145
- bounded.map(async (candidate) => {
146
- const epic = await provider.getEpic(candidate.id);
147
- return {
148
- id: candidate.id,
149
- title: candidate.title ?? epic?.title ?? '',
150
- body: epic?.body ?? '',
151
- };
152
- }),
153
- );
154
-
155
- const results = [];
156
- for (let i = 0; i < settled.length; i += 1) {
157
- const outcome = settled[i];
158
- if (outcome.status === 'fulfilled') {
159
- results.push(outcome.value);
160
- continue;
161
- }
162
- // Best-effort: one candidate failing to resolve must not abort
163
- // corpus-context assembly for the rest — but the failure is still
164
- // surfaced for triage rather than silently swallowed.
165
- Logger.debug(
166
- `[planning-corpus] fetchCandidateBodies: candidate #${bounded[i].id} failed to resolve: ${outcome.reason?.message ?? outcome.reason}`,
167
- );
168
- }
169
- return results;
170
- }
171
-
172
- /**
173
- * Extract a scoreable excerpt from an Epic body: the managed Tech Spec
174
- * region when present (the folded `## Delivery Slicing` section, #4324),
175
- * otherwise the ideation lede — the prose before the first `##` heading
176
- * — so a plain-body Epic still contributes something to score.
177
- *
178
- * @param {string} body
179
- * @returns {{ kind:'techSpec'|'lede', content:string }}
180
- */
181
- function extractScoreableExcerpt(body) {
182
- if (hasEpicSection(body, 'techSpec')) {
183
- return { kind: 'techSpec', content: extractEpicSection(body, 'techSpec') };
184
- }
185
- const lede = (body ?? '').split(/^##\s+/m)[0].trim();
186
- return { kind: 'lede', content: lede };
187
- }
188
-
189
- /**
190
- * Rank existing-Epic body excerpts (Tech Spec section, or lede) by
191
- * overlap with the seed. Reuses the same `tokenize` / `overlapScore`
192
- * primitives as the title-ranking pass above and as
193
- * `duplicate-search.js` — one matcher shared across every corpus /
194
- * dedupe surface.
195
- *
196
- * @param {{ seed:string, epicBodies: Array<{ id:number, title:string, body:string }>, maxResults?: number, minScore?: number }} opts
197
- * @returns {Array<{ epicId:number, epicTitle:string, section:'techSpec'|'lede', score:number, excerpt:string }>}
198
- */
199
- export function extractRelevantSections({
200
- seed,
201
- epicBodies,
202
- maxResults = DEFAULT_CORPUS_MAX_SECTIONS,
203
- minScore = DEFAULT_CORPUS_MIN_SCORE,
204
- }) {
205
- if (!seed || typeof seed !== 'string') {
206
- throw new Error('extractRelevantSections: seed must be a non-empty string');
207
- }
208
- if (!Array.isArray(epicBodies)) {
209
- throw new Error('extractRelevantSections: epicBodies must be an array');
210
- }
211
- const seedTokens = tokenize(seed);
212
- if (seedTokens.size === 0) return [];
213
-
214
- const ranked = [];
215
- for (const epic of epicBodies) {
216
- if (!epic) continue;
217
- const { kind, content } = extractScoreableExcerpt(epic.body ?? '');
218
- if (!content) continue;
219
- const score = overlapScore(seedTokens, tokenize(content));
220
- if (score < minScore) continue;
221
- ranked.push({
222
- epicId: epic.id,
223
- epicTitle: epic.title ?? null,
224
- section: kind,
225
- score: Number(score.toFixed(4)),
226
- excerpt: content.slice(0, EXCERPT_MAX_CHARS),
227
- });
228
- }
229
- ranked.sort((a, b) => b.score - a.score);
230
- return ranked.slice(0, maxResults);
231
- }
232
-
233
25
  /**
234
26
  * Assemble the `corpusContext` field of the story-plan context envelope.
235
- * Pure orchestration over the three helpers above plus `buildDocsDigest`
236
- * — no I/O beyond what `provider` and the docs-digest reader perform.
237
- *
238
- * `relevantSections` is `[]` (not an error) when the provider has no
239
- * `getEpics` surface, the seed tokenizes to nothing, or no candidate
240
- * clears `minScore` — the standalone-Story draft path degrades to
241
- * exactly today's blank-slate behavior in that case.
242
27
  *
243
28
  * @param {{
244
- * seed: string,
245
- * provider?: { getEpics?: Function, getEpic?: Function },
246
29
  * docsContextFiles?: string[],
247
30
  * docsRoot?: string,
248
- * maxCandidates?: number,
249
- * bodyFetchTopK?: number,
250
- * maxSections?: number,
251
- * minScore?: number,
252
31
  * }} opts
253
32
  * @returns {Promise<{ docsDigest: string|null, relevantSections: Array<object> }>}
254
33
  */
255
- export async function buildCorpusContext({
256
- seed,
257
- provider,
258
- docsContextFiles,
259
- docsRoot,
260
- maxCandidates = DEFAULT_CORPUS_MAX_CANDIDATES,
261
- bodyFetchTopK = DEFAULT_CORPUS_BODY_FETCH_TOP_K,
262
- maxSections = DEFAULT_CORPUS_MAX_SECTIONS,
263
- minScore = DEFAULT_CORPUS_MIN_SCORE,
264
- }) {
34
+ export async function buildCorpusContext({ docsContextFiles, docsRoot }) {
265
35
  const docsDigest = await buildDocsDigest({ docsContextFiles, docsRoot });
266
-
267
- let relevantSections = [];
268
- if (provider && typeof provider.getEpics === 'function') {
269
- // A single candidate-listing call failing (rate limit, transient
270
- // network error, provider outage) must not abort the whole
271
- // `--emit-context` envelope build — degrade to an empty candidate
272
- // list instead of letting the rejection propagate out of the
273
- // caller's `Promise.all` and take down the rest of the envelope
274
- // (body template, tech-stack summary, docs digest) with it.
275
- let epics = [];
276
- try {
277
- epics = await provider.getEpics({
278
- state: 'open',
279
- pageCap: CORPUS_EPICS_PAGE_CAP,
280
- });
281
- } catch (err) {
282
- Logger.debug(
283
- `[planning-corpus] buildCorpusContext: provider.getEpics failed, degrading to an empty candidate list: ${err?.message ?? err}`,
284
- );
285
- epics = [];
286
- }
287
- const ranked = rankCandidateEpics({
288
- seed,
289
- epics: Array.isArray(epics) ? epics : [],
290
- maxResults: maxCandidates,
291
- });
292
- const bodies = await fetchCandidateBodies({
293
- provider,
294
- candidates: ranked,
295
- topK: bodyFetchTopK,
296
- });
297
- relevantSections = extractRelevantSections({
298
- seed,
299
- epicBodies: bodies,
300
- maxResults: maxSections,
301
- minScore,
302
- });
303
- }
304
-
305
- return { docsDigest, relevantSections };
36
+ return { docsDigest, relevantSections: [] };
306
37
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * This module is the single implementation of the "run the registry, fail
5
5
  * fast on blockers, log auto-fixes" pattern. The consumer entry points
6
- * (story-close.js, epic-deliver-preflight.js, the npm test wrapper, and
6
+ * (`single-story-close.js`, `mandrel-update-preflight.js`, the npm test wrapper, and
7
7
  * the bootstrap scripts) call `runPreflight({ scope })` instead of
8
8
  * re-implementing the same assemble+run+format+exit-2 dance.
9
9
  *
@@ -13,7 +13,7 @@
13
13
  * auto-fixes. The wrapper prints a human-readable blocker table
14
14
  * (`id · summary · fixCommand`) before returning. Code 2 is the
15
15
  * project-wide "preflight refused" reservation — see
16
- * .agents/workflows/helpers/deliver-epic.md for the rationale.
16
+ * `.agents/workflows/helpers/deliver-story.md` for the rationale.
17
17
  *
18
18
  * Auto-fixes are logged via `logFixes` before the blocker check so the
19
19
  * operator sees the "we corrected X" line even when a separate blocker
@@ -52,8 +52,8 @@ const DEFAULT_LOGGER = {
52
52
  * flag, finding/fix routing, and pretty-print of the blocker table.
53
53
  *
54
54
  * @param {object} opts
55
- * @param {string} opts.scope Consumer surface — `'epic-close'`,
56
- * `'story-close'`, `'npm-test'`, etc.
55
+ * @param {string} opts.scope Consumer surface — `'story-close'`,
56
+ * `'npm-test'`, `'diagnose'`, etc.
57
57
  * @param {boolean} [opts.autoFix=true] Forwarded to `runChecks`. Defaults
58
58
  * to `true` because every wiring call site at this Story's level wants
59
59
  * auto-correction (the `retro` consumer that needs `autoFix:false` does
@@ -9,8 +9,8 @@
9
9
  // `.agents/rules/testing-standards.md` (unit / contract / acceptance) are
10
10
  // PRESENT, and which are ABSENT — and why.
11
11
  //
12
- // A scenario that is skipped does not exercise anything — a `@skip` /
13
- // `@pending` Gherkin tag (or a runner equivalent such as `it.skip` / `xit` /
12
+ // A scenario that is skipped does not exercise anything — a `@skip`
13
+ // Gherkin tag (or a runner equivalent such as `it.skip` / `xit` /
14
14
  // `describe.skip`, or a `skipped: true` descriptor field) means the test is
15
15
  // inert at run time. This module therefore treats a skipped test as ABSENT
16
16
  // for its tier: it never bumps a tier into `present`, because a tier whose
@@ -49,10 +49,10 @@ export const TIERS = Object.freeze(['unit', 'contract', 'acceptance']);
49
49
  const PRESENT = 'present';
50
50
  const ABSENT = 'absent';
51
51
 
52
- /** True when `value` contains a `@skip` or `@pending` Gherkin-style tag. */
52
+ /** True when `value` contains a `@skip` Gherkin-style tag. */
53
53
  function hasSkipTag(value) {
54
54
  if (typeof value !== 'string') return false;
55
- return /(^|[\s,])@(skip|pending)\b/i.test(value);
55
+ return /(^|[\s,])@skip\b/i.test(value);
56
56
  }
57
57
 
58
58
  /** True when `value` contains a runner-level skip/pending marker. */
@@ -67,7 +67,7 @@ function hasRunnerSkipMarker(value) {
67
67
  /**
68
68
  * True when a test descriptor is marked skipped/pending and therefore must
69
69
  * NOT count toward its tier. Recognizes:
70
- * - a `@skip` / `@pending` tag in a `tags` array or whitespace/comma string,
70
+ * - a `@skip` tag in a `tags` array or whitespace/comma string,
71
71
  * - the same tags embedded in a path or descriptor `name`,
72
72
  * - explicit boolean flags (`skipped`, `pending`),
73
73
  * - runner skip markers in a path/name (`it.skip`, `xit`, `xdescribe`,
@@ -142,7 +142,7 @@ export async function verifySurfaceMap(surfaceMap, gitPort, baseRef) {
142
142
  * with no network when the ports are fakes.
143
143
  *
144
144
  * @param {{
145
- * epicNumber: number,
145
+ * ticketNumber: number,
146
146
  * githubPort: GithubPort,
147
147
  * gitPort: GitPort,
148
148
  * surfaceMap?: SurfaceMapEntry[],
@@ -162,7 +162,7 @@ export async function verifySurfaceMap(surfaceMap, gitPort, baseRef) {
162
162
  */
163
163
  export async function hydrateQaContext(opts) {
164
164
  const {
165
- epicNumber,
165
+ ticketNumber,
166
166
  githubPort,
167
167
  gitPort,
168
168
  surfaceMap = [],
@@ -172,9 +172,9 @@ export async function hydrateQaContext(opts) {
172
172
  fsImpl,
173
173
  } = opts ?? {};
174
174
 
175
- if (!Number.isInteger(epicNumber)) {
175
+ if (!Number.isInteger(ticketNumber)) {
176
176
  throw new Error(
177
- 'hydrateQaContext: `epicNumber` is required and must be an integer',
177
+ 'hydrateQaContext: `ticketNumber` is required and must be an integer',
178
178
  );
179
179
  }
180
180
  if (!githubPort || typeof githubPort.fetchIssue !== 'function') {
@@ -192,7 +192,7 @@ export async function hydrateQaContext(opts) {
192
192
  );
193
193
  }
194
194
 
195
- const epicIssue = await githubPort.fetchIssue(epicNumber);
195
+ const epicIssue = await githubPort.fetchIssue(ticketNumber);
196
196
  const epic = {
197
197
  number: epicIssue.number,
198
198
  body: epicIssue.body ?? '',
@@ -10,8 +10,8 @@
10
10
  * + `schema`; `buildSpanTree` was a throwing placeholder.
11
11
  * - Epic #1181 / Story #1440 / Task #1461 — placeholder replaced by
12
12
  * the real export from `./span-tree.js`.
13
- * - Story #1476 — `appendSignal` / `appendTrace` / `appendEpicSignal`
14
- * re-exported here via `./write.js` so the gate scripts (and any
13
+ * - Story #1476 — `appendSignal` / `appendTrace` re-exported here
14
+ * via `./write.js` so the gate scripts (and any
15
15
  * new code) converge on `lib/signals/` instead of importing the
16
16
  * writer directly from `lib/observability/`.
17
17
  *
@@ -21,19 +21,6 @@
21
21
  import { read } from './read.js';
22
22
  import * as schema from './schema.js';
23
23
  import { buildSpanTree } from './span-tree.js';
24
- import {
25
- appendEpicSignal,
26
- appendSignal,
27
- appendTrace,
28
- forEachLine,
29
- } from './write.js';
24
+ import { appendSignal, appendTrace, forEachLine } from './write.js';
30
25
 
31
- export {
32
- appendEpicSignal,
33
- appendSignal,
34
- appendTrace,
35
- buildSpanTree,
36
- forEachLine,
37
- read,
38
- schema,
39
- };
26
+ export { appendSignal, appendTrace, buildSpanTree, forEachLine, read, schema };