mandrel 1.93.0 → 2.0.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 (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -1,23 +1,14 @@
1
1
  /**
2
- * spec-author-prompts.js — single source of the Tech Spec and Acceptance
3
- * Spec authoring system prompts (Epic #4474, M3 PR2).
2
+ * spec-author-prompts.js — Story-scoped Spec / Acceptance authoring prompts.
4
3
  *
5
- * **Single source of the prompt bodies.** These two prompts were lifted
6
- * VERBATIM from the "(authoritative)" fenced blocks in
7
- * `.agents/skills/core/epic-plan-spec-author/SKILL.md` "Tech Spec system
8
- * prompt" and § "Acceptance Spec system prompt") as the M3 side of the
9
- * M3/M8 boundary handshake: the `plan-context.js` envelope renders them
10
- * into `systemPrompts.spec` / `systemPrompts.acceptance` so the envelope
11
- * is authoritative from day one, and M8 (#4479) then deletes the
12
- * skill-side copies. This mirrors the Story #4162 pattern established by
13
- * `decomposer-prompts.js` for the decompose prompt: one rendered carrier,
14
- * no second verbatim copy to drift.
4
+ * v2 keeps a single executable document per Story. These prompts used to
5
+ * author a separate Epic Tech Spec + Acceptance Spec that were folded into
6
+ * the Epic body and then restated on Stories — a duplication source. They
7
+ * now author only Story `## Spec` approach prose and remind authors that
8
+ * acceptance lives once on the Story (`acceptance[]` / `## Acceptance`).
15
9
  */
16
10
 
17
11
  /**
18
- * The Tech Spec authoring system prompt (verbatim from the
19
- * `epic-plan-spec-author` SKILL's authoritative block).
20
- *
21
12
  * @returns {string}
22
13
  */
23
14
  export function renderTechSpecSystemPrompt() {
@@ -25,9 +16,6 @@ export function renderTechSpecSystemPrompt() {
25
16
  }
26
17
 
27
18
  /**
28
- * The Acceptance Spec authoring system prompt (verbatim from the
29
- * `epic-plan-spec-author` SKILL's authoritative block).
30
- *
31
19
  * @returns {string}
32
20
  */
33
21
  export function renderAcceptanceSpecSystemPrompt() {
@@ -35,40 +23,54 @@ export function renderAcceptanceSpecSystemPrompt() {
35
23
  }
36
24
 
37
25
  const TECH_SPEC_SYSTEM_PROMPT = `You are an expert Engineering Architect.
38
- Your job is to convert an Epic into a Technical Specification for implementation.
26
+ Your job is to author the Story's \`## Spec\` approach section the technical
27
+ how for one cohesive, executable Story. There is no separate Epic Tech Spec
28
+ document and no spill-to-docs path.
39
29
 
40
- The Tech Spec should outline:
41
- 1. Delivery Slicing — propose how the Epic's enumerated capabilities cluster into shippable Stories. This count is a CEILING, not a target: the Phase 8 consolidation pass may merge below your proposed count when slices form dependent single-consumer chains, but never splits above it. Do NOT coarsen the Epic enumeration to produce this; the grouping recommendation is the granularity lever.
42
- 2. Architecture & Design
43
- 3. Data Models (if any)
44
- 4. API Changes (if any)
45
- 5. Core Components
46
- 6. Security & Privacy Considerations
30
+ The Spec should outline only what an implementing agent needs beyond Goal /
31
+ Changes / Acceptance:
32
+ 1. Architecture & Design (approach, seams, reuse)
33
+ 2. Data Models (if any)
34
+ 3. API Changes (if any)
35
+ 4. Core Components
36
+ 5. Security & Privacy Considerations
47
37
 
48
38
  CRITICAL REQUIREMENTS:
49
- - Respond ONLY with valid Markdown.
50
- - Do not use top-level <h1> (# ) tags. Open the document with the \`## Delivery Slicing\` section — it is the primary input to Phase 8 consolidation, so author it first and hang the rest of the spec off it.
51
- - Do NOT restate the Epic's Context, Goal, or Scope — your output lands as sections of the same Epic body, which travels into every downstream story agent's prompt, so any restatement is pure duplication and a drift risk. If a brief technical orientation is genuinely useful, add an optional \`## Technical Overview\` of no more than 2–3 sentences that names the *technical approach* only (which subsystems are touched and reused); never re-narrate the problem statement, goals, or scope.
39
+ - Respond ONLY with valid Markdown suitable to paste into a Story \`## Spec\`.
40
+ - Do not use top-level <h1> (# ) tags. Prefer \`##\` / \`###\` under Spec.
41
+ - Do NOT restate the Story's Goal, Acceptance, Verify, Changes, or Non-Goals
42
+ those sections already live on the same Story body. Restatement is
43
+ duplication and a drift risk. If a brief orientation helps, keep a
44
+ \`## Technical Overview\` to 2–3 sentences naming the technical approach only.
45
+ - Do NOT author a Delivery Slicing / fan-out table. If the work needs multiple
46
+ independent Stories, say so in one short note and stop — oversized Specs
47
+ mean the Story should be split, not documented elsewhere.
52
48
  - Format architectural decisions clearly with bullet points.
53
- - Author the \`## Delivery Slicing\` section as a markdown table with columns \`Slice | What ships | Independent?\`, using noun-phrase slice names (e.g. "Foundation", "Transport seam", "Send helper") that map onto Feature titles. "Independent?" answers: can this slice ship to production and provide value without the next slice landing? A slice you mark "Independent? No" MUST carry a one-line justification (parallelism, risk isolation, or delivery-envelope pressure); an unjustified dependent single-consumer slice folds into its consumer by default rather than shipping as its own Story.`;
49
+ - Keep the Spec lean enough to stay inline on the Story (persist rejects
50
+ over-budget Specs; they are never written under docs/).`;
54
51
 
55
52
  const ACCEPTANCE_SPEC_SYSTEM_PROMPT = `You are an expert Acceptance Engineer.
56
- Your job is to convert an Epic and a Tech Spec into a structured Acceptance Specification that drives features-first BDD authoring.
53
+ Your job is to help author the Story's binding acceptance contract not a
54
+ separate Acceptance Spec document.
57
55
 
58
- The Acceptance Spec should outline:
59
- 1. Acceptance Table — one row per user-visible outcome, expressed as a Markdown table with columns: AC ID | Outcome | Feature File | Scenario | Disposition
60
- 2. Stable AC IDs — assign AC-1, AC-2, ... in document order; reuse the same ID across re-plans when an Outcome is materially unchanged so scenario tags (@ac-N) stay aligned
61
- 3. Disposition tag each row with one of: new | updated | unchanged
56
+ v2 rule: acceptance lives **once**, on the Story:
57
+ - Machine contract: top-level \`acceptance[]\` (and \`verify[]\`) on the ticket JSON
58
+ - Human document: the same items rendered under \`## Acceptance\` / \`## Verify\`
59
+ on the Story body (persist syncs top-level into the body)
62
60
 
63
- The Epic body's \`## Acceptance Criteria\` bullets are the single source of truth for what the spec verifies. Your table does not re-invent criteria it anchors each one to a specific Epic AC bullet.
61
+ Do **not** author an Epic Acceptance Table, PRD restatement, or a second
62
+ criteria list inside \`## Spec\`.
64
63
 
65
64
  CRITICAL REQUIREMENTS:
66
- - Respond ONLY with valid Markdown.
67
- - Do not use top-level <h1> (# ) tags. Start with ## Acceptance Table the table lands as a section of the Epic body, so it must NOT reuse the Epic's own ## Acceptance Criteria heading.
68
- - Every AC row MUST have a stable AC ID of the form AC-<n> (AC-1, AC-2, ...) — do not reorder IDs across re-plans; new ACs get fresh sequential IDs.
69
- - Every AC row MUST carry a Disposition value from the enum: new | updated | unchanged. (At Epic close, the acceptance reconciler overwrites Disposition with the verification outcome — satisfied | pending | missing — inside this section only; on re-plan, reset each row to the authoring enum.)
70
- - Each Outcome MUST be a **terse restatement keyed to a specific Epic \`## Acceptance Criteria\` bullet** — lead the Outcome with the bullet's anchor (its quoted lead phrase or an explicit "Epic AC N" index) and keep the rest to a single user-visible behaviour. Do NOT re-elaborate the Epic bullet in independent words: a free-standing Outcome that paraphrases the criterion without naming the bullet it verifies is forbidden, because it drifts from the Epic silently. No DB assertions, no HTTP status codes, no internal implementation details.
71
- - Where one Epic AC bullet genuinely expands into several user-visible outcomes, emit one row per outcome and declare the split on each — e.g. lead with "splits Epic AC 3" — so the fan-out is explicit rather than hidden.
72
- - Anchor coverage MUST be complete and auditable: every Epic AC bullet MUST be covered by at least one row, and every row MUST anchor to an Epic AC bullet. Flag divergence in the authored spec instead of dropping it — if an Epic AC bullet has no corresponding row, or a row has no Epic anchor, call it out explicitly (a note beneath the table) rather than silently omitting the bullet or emitting an unanchored row.
73
- - Cite proposed feature file paths under tests/features/** so Phase 8 can scaffold matching scenarios.
74
- - Acceptance Outcomes MUST NOT prescribe a commit subject that begins with a non-Conventional-Commits prefix (allowed leading types: feat|fix|chore|refactor|perf|docs|style|test|build|ci|revert). The legacy \`baseline-refresh\` token used as a leading subject prescription is forbidden — commitlint will reject it at commit time, and the decompose-time validator (\`ticket-validator.js\` → \`validateAcceptanceSubjectPrefix\`) will reject the decompose with \`code: 'forbidden-subject-prefix'\`. Use a Conventional-Commits subject (e.g. \`chore(baselines): refresh ...\`) and a body trailer (e.g. \`baseline-refresh: true\` — trailer with a value, not a subject prefix) when a machine-readable marker is needed. See Epic #2501 for rationale.`;
65
+ - Respond ONLY with guidance or a draft \`acceptance[]\` / \`verify[]\` list for
66
+ one Storynever a parallel "Acceptance Spec" markdown artifact.
67
+ - Every acceptance item MUST be observable from outside the agent (command
68
+ exits 0, file exists, selector resolves, fixture count matches). Reject
69
+ vague "matches the spec" / "looks good" items.
70
+ - Every verify entry MUST name a tier in parentheses: unit | contract | e2e |
71
+ validate (or \`manual:<reason>\` when genuinely unverifiable in isolation).
72
+ - Do NOT re-elaborate Goal or Spec prose inside acceptance items bind the
73
+ outcome, not the approach.
74
+ - Acceptance Outcomes MUST NOT prescribe a commit subject that begins with a
75
+ non-Conventional-Commits prefix (allowed leading types: feat|fix|chore|
76
+ refactor|perf|docs|style|test|build|ci|revert).`;
@@ -1,19 +1,19 @@
1
1
  /**
2
- * epic-body-sections.js — marker-delimited managed sections of the Epic body.
2
+ * ticket-body-sections.js — marker-delimited managed sections of a
3
+ * planning ticket body.
3
4
  *
4
5
  * Story #4324 retired the `context::tech-spec` / `context::acceptance-spec`
5
- * ticket classes: the Epic body is now the single planning document. The
6
- * Tech Spec (opening with `## Delivery Slicing`, per #4316) and the
7
- * Acceptance Spec's AC-ID table (`## Acceptance Table`, Outcomes keyed to
8
- * Epic AC bullets per #4315) land as **managed sections** of the Epic body,
9
- * delimited by invisible HTML comment markers so each writer can update
10
- * *only its own region* without rewriting the rest of the body.
6
+ * ticket classes: the planning ticket body is the single planning document.
7
+ * The Tech Spec (opening with `## Delivery Slicing`, per #4316) and the
8
+ * Acceptance Spec's AC-ID table (`## Acceptance Table`) land as **managed
9
+ * sections**, delimited by invisible HTML comment markers so each writer
10
+ * can update *only its own region* without rewriting the rest of the body.
11
11
  *
12
12
  * Section-scoped writes are the load-bearing contract (extending the
13
13
  * single-writer discipline #4303 established for the body trailer):
14
14
  *
15
- * - The Phase 7 spec persist path (`epic-plan-spec/phases/plan-epic.js`)
16
- * upserts the `techSpec` and `acceptanceTable` regions.
15
+ * - The `/plan` persist path upserts the `techSpec` and `acceptanceTable`
16
+ * regions.
17
17
  * - The close-time acceptance reconciler
18
18
  * (`acceptance-spec-reconciler.js`) reads and rewrites the
19
19
  * `acceptanceTable` region only (verification dispositions).
@@ -32,7 +32,7 @@
32
32
  *
33
33
  * @type {Readonly<Record<'techSpec'|'acceptanceTable', { start: string, end: string, label: string }>>}
34
34
  */
35
- export const EPIC_BODY_SECTIONS = Object.freeze({
35
+ export const TICKET_BODY_SECTIONS = Object.freeze({
36
36
  techSpec: Object.freeze({
37
37
  start: '<!-- mandrel:tech-spec:start -->',
38
38
  end: '<!-- mandrel:tech-spec:end -->',
@@ -47,7 +47,7 @@ export const EPIC_BODY_SECTIONS = Object.freeze({
47
47
 
48
48
  /**
49
49
  * Canonical heading the acceptance-table region opens with. Distinct from
50
- * the Epic's ideation `## Acceptance Criteria` bullets (which remain the
50
+ * the ticket's ideation `## Acceptance Criteria` bullets (which remain the
51
51
  * SSOT for *what* the table verifies — the table anchors to those bullets).
52
52
  */
53
53
  export const ACCEPTANCE_TABLE_HEADING = '## Acceptance Table';
@@ -56,7 +56,7 @@ export const ACCEPTANCE_TABLE_HEADING = '## Acceptance Table';
56
56
  * Regex matching the Tech Spec's required opening heading (same variants
57
57
  * `spec-section-validator.js` accepts). Exported so it is the single
58
58
  * source of truth for this pattern — `spec-section-validator.js`,
59
- * `epic-plan-clarity.js`, and `consolidation-precondition.js` all import
59
+ * `consolidation-precondition.js` all import
60
60
  * it rather than each carrying their own copy.
61
61
  */
62
62
  export const DELIVERY_SLICING_RE = /^##\s+(?:Delivery\s+)?Slicing\s*$/im;
@@ -66,10 +66,10 @@ export const DELIVERY_SLICING_RE = /^##\s+(?:Delivery\s+)?Slicing\s*$/im;
66
66
  * @returns {{ start: string, end: string, label: string }}
67
67
  */
68
68
  function descriptor(kind) {
69
- const d = EPIC_BODY_SECTIONS[kind];
69
+ const d = TICKET_BODY_SECTIONS[kind];
70
70
  if (!d) {
71
71
  throw new TypeError(
72
- `epic-body-sections: unknown section kind "${kind}" (expected ${Object.keys(EPIC_BODY_SECTIONS).join(' | ')})`,
72
+ `ticket-body-sections: unknown section kind "${kind}" (expected ${Object.keys(TICKET_BODY_SECTIONS).join(' | ')})`,
73
73
  );
74
74
  }
75
75
  return d;
@@ -103,7 +103,7 @@ function locate(body, kind) {
103
103
  * @param {'techSpec'|'acceptanceTable'} kind
104
104
  * @returns {boolean}
105
105
  */
106
- export function hasEpicSection(body, kind) {
106
+ export function hasTicketSection(body, kind) {
107
107
  return locate(body, kind) !== null;
108
108
  }
109
109
 
@@ -115,7 +115,7 @@ export function hasEpicSection(body, kind) {
115
115
  * @param {'techSpec'|'acceptanceTable'} kind
116
116
  * @returns {string|null}
117
117
  */
118
- export function extractEpicSection(body, kind) {
118
+ export function extractTicketSection(body, kind) {
119
119
  const loc = locate(body, kind);
120
120
  if (!loc) return null;
121
121
  return body.slice(loc.contentStart, loc.contentEnd).trim();
@@ -136,7 +136,7 @@ export function extractEpicSection(body, kind) {
136
136
  * @param {string} content Section content (headings included).
137
137
  * @returns {string}
138
138
  */
139
- export function upsertEpicSection(body, kind, content) {
139
+ export function upsertTicketSection(body, kind, content) {
140
140
  const { start, end } = descriptor(kind);
141
141
  const safeBody = typeof body === 'string' ? body : '';
142
142
  const trimmedContent = typeof content === 'string' ? content.trim() : '';
@@ -179,7 +179,7 @@ export function upsertEpicSection(body, kind, content) {
179
179
  * @param {'techSpec'|'acceptanceTable'} kind
180
180
  * @returns {string}
181
181
  */
182
- export function stripEpicSection(body, kind) {
182
+ export function stripTicketSection(body, kind) {
183
183
  const { end } = descriptor(kind);
184
184
  const loc = locate(body, kind);
185
185
  if (!loc) return typeof body === 'string' ? body : '';
@@ -189,7 +189,7 @@ export function stripEpicSection(body, kind) {
189
189
  }
190
190
 
191
191
  /**
192
- * Re-plan / decompose detection: true when the Epic body carries folded
192
+ * Re-plan / decompose detection: true when the ticket body carries folded
193
193
  * Tech Spec content — the managed region, or (defence in depth for a
194
194
  * hand-authored body) a bare `## Delivery Slicing` heading.
195
195
  *
@@ -197,7 +197,7 @@ export function stripEpicSection(body, kind) {
197
197
  * @returns {boolean}
198
198
  */
199
199
  export function hasTechSpecContent(body) {
200
- if (hasEpicSection(body, 'techSpec')) return true;
200
+ if (hasTicketSection(body, 'techSpec')) return true;
201
201
  return typeof body === 'string' && DELIVERY_SLICING_RE.test(body);
202
202
  }
203
203
 
@@ -217,9 +217,9 @@ const DELIVERY_DROP_HEADINGS = new Set([
217
217
  ]);
218
218
 
219
219
  /**
220
- * Slice an Epic body down to the sections a delivery story agent acts on.
220
+ * Slice a planning ticket body down to the sections a delivery story agent acts on.
221
221
  *
222
- * KEEP: the Epic title / preamble before the first `##`, `## Goal`,
222
+ * KEEP: the ticket title / preamble before the first `##`, `## Goal`,
223
223
  * `## Non-Goals`, `## User Stories`, the `techSpec` managed region, and —
224
224
  * fail-open — any unknown / operator-authored `##` section not in the drop
225
225
  * list. DROP: `## Context`, `## Scope`, `## Acceptance Criteria`, and the
@@ -236,12 +236,12 @@ const DELIVERY_DROP_HEADINGS = new Set([
236
236
  * @param {string} body
237
237
  * @returns {string}
238
238
  */
239
- export function sliceEpicBodyForDelivery(body) {
239
+ export function sliceTicketBodyForDelivery(body) {
240
240
  if (typeof body !== 'string' || body.length === 0) return '';
241
241
 
242
242
  // 1. Drop the acceptance-table managed region outright (authoring/close
243
243
  // machinery, never delivery context).
244
- let working = stripEpicSection(body, 'acceptanceTable');
244
+ let working = stripTicketSection(body, 'acceptanceTable');
245
245
 
246
246
  // 2. Protect the techSpec managed region from heading-boundary slicing by
247
247
  // lifting it out behind an opaque placeholder, then restoring it after
@@ -261,7 +261,7 @@ export function sliceEpicBodyForDelivery(body) {
261
261
 
262
262
  // 3. Slice plain `##` sections by heading boundaries, dropping only the
263
263
  // known ideation/authoring headings. The preamble before the first
264
- // `##` (Epic title / lede) is always kept.
264
+ // `##` (ticket title / lede) is always kept.
265
265
  const kept = [];
266
266
  let dropping = false;
267
267
  for (const line of working.split('\n')) {
@@ -291,7 +291,7 @@ export function sliceEpicBodyForDelivery(body) {
291
291
 
292
292
  /**
293
293
  * Strip the retired machine-managed `## Planning Artifacts` checklist from
294
- * an Epic body (the section that linked the now-retired context tickets).
294
+ * a planning ticket body (the section that linked the now-retired context tickets).
295
295
  * The slice ends at the next `## ` heading, a managed-region marker, or
296
296
  * EOF. Historical bodies without the section pass through untouched.
297
297
  *
@@ -336,7 +336,7 @@ export function shouldSkip(
336
336
  }
337
337
 
338
338
  /**
339
- * Delete the evidence file for `scopeId`. Called by `story-init.js` at the
339
+ * Delete the evidence file for `scopeId`. Called by `single-story-init.js` at the
340
340
  * start of each Story so a re-run always starts clean. Idempotent —
341
341
  * absent file is not an error.
342
342
  *
@@ -2,8 +2,8 @@
2
2
  * lib/wave-runner/ready-set.js — the path-agnostic ready-set scheduling
3
3
  * core.
4
4
  *
5
- * This module is the scheduling kernel both the Epic and standalone
6
- * delivery paths dispatch through. It replaces wave-*batch* selection
5
+ * This module is the scheduling kernel the v2 `/deliver` multi-Story path
6
+ * dispatches through (`stories-wave-tick.js`). It replaces wave-*batch* selection
7
7
  * (group N must fully drain before group N+1 opens) with *continuous*,
8
8
  * dependency-driven selection: a Story becomes dispatchable the instant
9
9
  * **its own** dependencies are satisfied, regardless of whether unrelated
@@ -15,14 +15,14 @@
15
15
  * reads GitHub, the lifecycle ledger, nor a checkpoint, and it dispatches
16
16
  * nothing. Callers supply the live Story records (already fetched), the
17
17
  * resolved `inFlight` count, and the `globalCap`, and receive back the set
18
- * of Stories that are safe to dispatch on this beat. Later Stories wire the
19
- * Epic / standalone adapters on top of this core; this Story ships the core
20
- * alone and does not modify `tick.js` or `stories-wave-tick.js`.
18
+ * of Stories that are safe to dispatch on this beat. The
19
+ * `stories-wave-tick.js` adapter wires this core; this module does not
20
+ * modify that CLI surface.
21
21
  *
22
22
  * Three exports:
23
23
  * - `classifyStory(story)` — live-label classifier mapping a Story
24
24
  * record's labels + issue state to one of `done | blocked | executing |
25
- * ready`. Mirrors the done-predicate `tick.js` already uses
25
+ * ready`. Mirrors the done-predicate this module uses
26
26
  * (`agent::done` OR closed issue) so a Story closed manually through
27
27
  * the GitHub UI is recognised as done.
28
28
  * - `storiesOverlap(a, b)` — the file-overlap co-dispatch guard: true
@@ -145,7 +145,7 @@ export function provision({
145
145
  /**
146
146
  * Throw if any required workspace file is missing from `worktree`. Used as a
147
147
  * runtime guard (called right after every worktree create in
148
- * `story-init.js`) and as a test oracle.
148
+ * `single-story-init.js`) and as a test oracle.
149
149
  *
150
150
  * When `sourceRoot` is supplied, the thrown error carries the missing target
151
151
  * path and an exact `cp`/`copy` command the operator can paste to remediate.
@@ -52,14 +52,12 @@ const WINDOWS_CWD_RE =
52
52
  * proves the Story branch was integrated even though the current HEAD
53
53
  * has diverged, so the worktree is still safe to reap.
54
54
  *
55
- * `opts.epicRef` is the canonical option name (e.g. `epic/1114`).
56
- * `opts.epicBranch` is accepted as a back-compat alias so existing call
57
- * sites that thread `{ epicBranch }` through `reap()` keep working until
58
- * they migrate.
55
+ * `opts.epicBranch` is the integration / base ref the Story must already
56
+ * be merged into (e.g. `main` or a plan-run branch).
59
57
  *
60
58
  * @param {object} ctx
61
59
  * @param {string} wtPath
62
- * @param {{ epicRef?: string|null, epicBranch?: string|null }} [opts]
60
+ * @param {{ epicBranch?: string|null }} [opts]
63
61
  * @returns {Promise<{ safe: boolean, reason?: string }>}
64
62
  */
65
63
  export async function isSafeToRemove(ctx, wtPath, opts = {}) {
@@ -67,7 +65,7 @@ export async function isSafeToRemove(ctx, wtPath, opts = {}) {
67
65
  if (!local.safe) return local;
68
66
  if (local.reason === 'path-missing') return local;
69
67
 
70
- const epicRef = opts.epicRef ?? opts.epicBranch ?? null;
68
+ const epicRef = opts.epicBranch ?? opts.epicRef ?? null;
71
69
  if (!epicRef) return { safe: true };
72
70
 
73
71
  return checkMergeReachability(ctx, wtPath, local.branch, epicRef);
@@ -483,7 +481,7 @@ function checkReapPreconditions(ctx, _storyId, opts, wtPath) {
483
481
 
484
482
  async function ensureSafeOrForceDiscard(ctx, storyId, wtPath, opts) {
485
483
  const safety = await isSafeToRemove(ctx, wtPath, {
486
- epicRef: opts.epicBranch ?? opts.epicRef ?? null,
484
+ epicBranch: opts.epicBranch ?? null,
487
485
  });
488
486
  if (safety.safe) return { ok: true, discardedPaths: null };
489
487
 
@@ -4,7 +4,7 @@
4
4
  * Issue-body conformance lint (Story #4227).
5
5
  *
6
6
  * Runs the canonical `story-body.parse()` against a human-opened
7
- * `type::story` / `type::epic` issue body and reports whether the body
7
+ * `type::story` issue body and reports whether the body
8
8
  * round-trips. This is the drift guard between the generated GitHub Issue
9
9
  * Forms (`lib/bootstrap/issue-forms-template.js`) and the parser: if a
10
10
  * human files a ticket whose body `parse()` rejects (or which lacks the
@@ -114,12 +114,12 @@ export function evaluateIssueBody(body) {
114
114
 
115
115
  const problems = [];
116
116
 
117
- // A legacy string body parses but carries no structured sections — that
117
+ // An unstructured body parses but carries no structured sections — that
118
118
  // is exactly the human-filed shape this lint exists to catch.
119
- if (result.info.isLegacyStringBody) {
119
+ if (result.info.isUnstructuredBody) {
120
120
  problems.push(
121
121
  'The body has no recognised `## Goal` / `## Acceptance` / `## Verify` sections. ' +
122
- 'File via the Story/Epic issue form so it round-trips through the parser.',
122
+ 'File via the Story issue form so it round-trips through the parser.',
123
123
  );
124
124
  }
125
125
 
@@ -162,7 +162,7 @@ export function renderConformanceComment(verdict) {
162
162
  '',
163
163
  ...verdict.problems.map((p) => `- ${p}`),
164
164
  '',
165
- 'The quickest fix is to refile using the **Story** or **Epic** issue form ' +
165
+ 'The quickest fix is to refile using the **Story** issue form ' +
166
166
  '(New issue → pick the template), which lays out the required sections.',
167
167
  ];
168
168
  if (verdict.warnings.length > 0) {
@@ -196,32 +196,40 @@ function gh(args) {
196
196
  }
197
197
 
198
198
  /**
199
- * CLI entry. Reads the target issue (number from `--issue` or the
200
- * `ISSUE_NUMBER` env), fetches its body + labels, and — when the body is
201
- * non-conformant — upserts a single marker comment. Always exits 0 (the
202
- * lint *informs*, it does not block), unless an unexpected I/O error occurs.
199
+ * Stage 5: only `type::story` tickets are in scope (type::epic retired).
203
200
  *
204
- * Flags:
205
- * --issue <n> Issue number (defaults to env ISSUE_NUMBER).
206
- * --repo <o/r> owner/repo (defaults to env GITHUB_REPOSITORY).
207
- * --dry-run Evaluate + print the verdict, never touch GitHub.
201
+ * @param {string[]} labelNames
202
+ * @returns {boolean}
208
203
  */
209
- async function main() {
210
- const args = process.argv.slice(2);
211
- const get = (flag) => {
212
- const i = args.indexOf(flag);
213
- return i >= 0 ? args[i + 1] : undefined;
214
- };
215
- const dryRun = args.includes('--dry-run');
216
- const issue = get('--issue') ?? process.env.ISSUE_NUMBER;
217
- const repo = get('--repo') ?? process.env.GITHUB_REPOSITORY;
218
-
219
- if (!issue) {
220
- throw new Error('lint-issue-body: --issue <n> or ISSUE_NUMBER is required');
221
- }
204
+ export function isStoryTicket(labelNames) {
205
+ return Array.isArray(labelNames) && labelNames.includes('type::story');
206
+ }
222
207
 
208
+ /**
209
+ * Evaluate an issue payload and optionally post a conformance comment.
210
+ * Pure with respect to GitHub when `ghFn` is injected — the CLI `main`
211
+ * is a thin argv wrapper around this helper.
212
+ *
213
+ * @param {{
214
+ * issue: string|number,
215
+ * repo?: string,
216
+ * dryRun?: boolean,
217
+ * ghFn?: (args: string[]) => string,
218
+ * write?: (s: string) => void,
219
+ * }} opts
220
+ * @returns {{ skipped?: string, conformant?: boolean, problems?: string[] }}
221
+ */
222
+ export function runLintIssueBody({
223
+ issue,
224
+ repo,
225
+ dryRun = false,
226
+ ghFn = gh,
227
+ write = (s) => {
228
+ process.stdout.write(s);
229
+ },
230
+ }) {
223
231
  const repoArgs = repo ? ['--repo', repo] : [];
224
- const raw = gh([
232
+ const raw = ghFn([
225
233
  'issue',
226
234
  'view',
227
235
  String(issue),
@@ -231,20 +239,14 @@ async function main() {
231
239
  ]);
232
240
  const { body, labels } = JSON.parse(raw);
233
241
  const labelNames = (labels ?? []).map((l) => l.name);
234
- const isTicket =
235
- labelNames.includes('type::story') || labelNames.includes('type::epic');
236
-
237
- if (!isTicket) {
238
- // Machine-parsable JSON envelope → process.stdout.write (not console.log),
239
- // per the .agents/scripts logging contract (tests/enforcement/no-console).
240
- process.stdout.write(
241
- `${JSON.stringify({ issue: Number(issue), skipped: 'not-a-ticket' })}\n`,
242
- );
243
- return;
242
+ if (!isStoryTicket(labelNames)) {
243
+ const envelope = { issue: Number(issue), skipped: 'not-a-ticket' };
244
+ write(`${JSON.stringify(envelope)}\n`);
245
+ return envelope;
244
246
  }
245
247
 
246
248
  const verdict = evaluateIssueBody(body ?? '');
247
- process.stdout.write(
249
+ write(
248
250
  `${JSON.stringify({
249
251
  issue: Number(issue),
250
252
  conformant: verdict.conformant,
@@ -252,10 +254,39 @@ async function main() {
252
254
  })}\n`,
253
255
  );
254
256
 
255
- if (verdict.conformant || dryRun) return;
257
+ if (verdict.conformant || dryRun) {
258
+ return {
259
+ conformant: verdict.conformant,
260
+ problems: verdict.problems,
261
+ };
262
+ }
256
263
 
257
264
  const comment = renderConformanceComment(verdict);
258
- gh(['issue', 'comment', String(issue), ...repoArgs, '--body', comment]);
265
+ ghFn(['issue', 'comment', String(issue), ...repoArgs, '--body', comment]);
266
+ return { conformant: false, problems: verdict.problems };
267
+ }
268
+
269
+ /**
270
+ * CLI entry. Reads the target issue (number from `--issue` or the
271
+ * `ISSUE_NUMBER` env), fetches its body + labels, and — when the body is
272
+ * non-conformant — upserts a single marker comment. Always exits 0 (the
273
+ * lint *informs*, it does not block), unless an unexpected I/O error occurs.
274
+ */
275
+ async function main() {
276
+ const args = process.argv.slice(2);
277
+ const get = (flag) => {
278
+ const i = args.indexOf(flag);
279
+ return i >= 0 ? args[i + 1] : undefined;
280
+ };
281
+ const issue = get('--issue') ?? process.env.ISSUE_NUMBER;
282
+ if (!issue) {
283
+ throw new Error('lint-issue-body: --issue <n> or ISSUE_NUMBER is required');
284
+ }
285
+ runLintIssueBody({
286
+ issue,
287
+ repo: get('--repo') ?? process.env.GITHUB_REPOSITORY,
288
+ dryRun: args.includes('--dry-run'),
289
+ });
259
290
  }
260
291
 
261
292
  runAsCli(import.meta.url, main, { source: 'lint-issue-body' });
@@ -25,7 +25,7 @@
25
25
  * friendlier "you're offline" signal before any version probe.
26
26
  *
27
27
  * Severity is consistent with framework preflight conventions
28
- * (cf. `story-close.js` runStoryClosePreflight, `epic-deliver-preflight.js`):
28
+ * (cf. `single-story-close.js` runStoryClosePreflight, `mandrel-update-preflight.js`):
29
29
  * the consumer-shape check is a hard stop (blocker), dirty-index and offline
30
30
  * are warn-only and never block the run.
31
31
  *
@@ -33,7 +33,8 @@
33
33
  * (% progress + blockers), not the firehose of per-story transitions;
34
34
  * the default allowlist is the five `epic-*` events. Payload envelope:
35
35
  * `{ text, severity, event?, level?, ticketId?, epicId?, phase? }` —
36
- * `text` always populated for back-compat with `{text}`-only consumers.
36
+ * `text` is the primary human-readable body (Slack-style incoming
37
+ * webhooks read this field).
37
38
  *
38
39
  * Each channel filters independently — no fallback chain. Severity is
39
40
  * carried as envelope metadata (so Slack consumers can color-code by it
@@ -93,8 +94,8 @@ function buildWebhookPayload({
93
94
  : '';
94
95
  const text = `${prefix}${ticketPart}: ${cleanMessage}`;
95
96
 
96
- // `text` first for back-compat with `{text}`-only consumers (Slack-style
97
- // incoming webhooks). Typed fields follow for routable subscribers.
97
+ // `text` is the primary human-readable body; typed fields follow for
98
+ // routable subscribers.
98
99
  const envelope = { text, severity };
99
100
  if (Number.isFinite(numericTicketId) && numericTicketId > 0) {
100
101
  envelope.ticketId = numericTicketId;