mandrel 1.94.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 (393) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/story-worker.md +12 -13
  3. package/.agents/docs/SDLC.md +489 -1285
  4. package/.agents/docs/agentrc-reference.json +177 -67
  5. package/.agents/docs/configuration.md +104 -138
  6. package/.agents/docs/execution-reference.md +17 -20
  7. package/.agents/docs/quality-gates.md +13 -19
  8. package/.agents/docs/workflows.md +3 -3
  9. package/.agents/instructions.md +70 -81
  10. package/.agents/rules/ci-remediation.md +8 -12
  11. package/.agents/rules/git-conventions-reference.md +6 -7
  12. package/.agents/rules/git-conventions.md +16 -22
  13. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  14. package/.agents/schemas/agentrc.schema.json +54 -214
  15. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  16. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  17. package/.agents/schemas/risk-verdict.schema.json +0 -13
  18. package/.agents/scripts/analyze-execution.js +1 -1
  19. package/.agents/scripts/audit-to-stories.js +7 -7
  20. package/.agents/scripts/boot-sweep.js +1 -1
  21. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  22. package/.agents/scripts/check-prepush-recovery.js +1 -1
  23. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  24. package/.agents/scripts/lib/Logger.js +6 -10
  25. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  26. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  27. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  28. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  29. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  30. package/.agents/scripts/lib/baselines/reader.js +1 -6
  31. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  32. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  33. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  34. package/.agents/scripts/lib/checks/index.js +2 -1
  35. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  36. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  37. package/.agents/scripts/lib/cli-args.js +16 -7
  38. package/.agents/scripts/lib/close-validation/gates.js +2 -2
  39. package/.agents/scripts/lib/config/ci.js +6 -31
  40. package/.agents/scripts/lib/config/delivery-routing.js +45 -29
  41. package/.agents/scripts/lib/config/explain.js +55 -36
  42. package/.agents/scripts/lib/config/limits.js +17 -58
  43. package/.agents/scripts/lib/config/paths.js +0 -2
  44. package/.agents/scripts/lib/config/quality.js +1 -1
  45. package/.agents/scripts/lib/config/runners.js +17 -50
  46. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  47. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  48. package/.agents/scripts/lib/config-resolver.js +2 -7
  49. package/.agents/scripts/lib/config-settings-schema-delivery.js +24 -148
  50. package/.agents/scripts/lib/config-settings-schema-quality.js +8 -14
  51. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  52. package/.agents/scripts/lib/dependency-parser.js +3 -2
  53. package/.agents/scripts/lib/doc-tiers.js +2 -2
  54. package/.agents/scripts/lib/duplicate-search.js +211 -41
  55. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  56. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  57. package/.agents/scripts/lib/framework-version.js +2 -3
  58. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  59. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  60. package/.agents/scripts/lib/git-utils.js +32 -6
  61. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  62. package/.agents/scripts/lib/label-constants.js +10 -23
  63. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  64. package/.agents/scripts/lib/observability/active-story-env.js +1 -1
  65. package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
  66. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  67. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  68. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  69. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
  70. package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
  71. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  72. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  73. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  74. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  75. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  76. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  77. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  78. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  79. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  80. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  81. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  82. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  83. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  84. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  85. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  86. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  87. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  88. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  89. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  90. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  91. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  92. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  93. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  94. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  95. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +13 -13
  96. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  97. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  98. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  99. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  100. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  101. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  102. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  103. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  104. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  105. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  106. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  107. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  108. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  109. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  110. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  111. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  112. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  113. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  114. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  115. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  116. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  117. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  118. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  119. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  120. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  121. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  122. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  123. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  124. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  125. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  126. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  127. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  128. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  129. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  130. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  131. package/.agents/scripts/lib/orchestration/ticket-validator.js +2 -7
  132. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  133. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  134. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  135. package/.agents/scripts/lib/planning-corpus.js +16 -11
  136. package/.agents/scripts/lib/preflight-runner.js +2 -2
  137. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  138. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  139. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  140. package/.agents/scripts/lib/story-adjacency.js +11 -14
  141. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  142. package/.agents/scripts/lib/story-plan.js +2 -4
  143. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  144. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  145. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  146. package/.agents/scripts/lib/validation-evidence.js +1 -1
  147. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  148. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  149. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  150. package/.agents/scripts/lint-issue-body.js +71 -40
  151. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  152. package/.agents/scripts/notify.js +4 -3
  153. package/.agents/scripts/plan-context.js +64 -74
  154. package/.agents/scripts/plan-persist.js +121 -280
  155. package/.agents/scripts/plan-run-epilogue.js +97 -0
  156. package/.agents/scripts/providers/github/issues.js +17 -33
  157. package/.agents/scripts/providers/github/mappers.js +0 -12
  158. package/.agents/scripts/providers/github/tickets.js +2 -5
  159. package/.agents/scripts/resolve-plan-run.js +117 -0
  160. package/.agents/scripts/signals-view.js +24 -19
  161. package/.agents/scripts/single-story-close.js +11 -14
  162. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  163. package/.agents/scripts/single-story-init.js +29 -20
  164. package/.agents/scripts/stories-wave-tick.js +6 -6
  165. package/.agents/scripts/story-plan.js +26 -47
  166. package/.agents/scripts/update-ticket-state.js +6 -15
  167. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  168. package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
  169. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  170. package/.agents/skills/skills.index.json +3 -43
  171. package/.agents/starter-agentrc.json +0 -5
  172. package/.agents/templates/agent-protocol.md +9 -10
  173. package/.agents/workflows/audit-architecture.md +3 -3
  174. package/.agents/workflows/audit-clean-code.md +3 -3
  175. package/.agents/workflows/audit-dependencies.md +3 -3
  176. package/.agents/workflows/audit-devops.md +3 -3
  177. package/.agents/workflows/audit-documentation.md +5 -5
  178. package/.agents/workflows/audit-lighthouse.md +3 -3
  179. package/.agents/workflows/audit-navigability.md +3 -2
  180. package/.agents/workflows/audit-performance.md +3 -3
  181. package/.agents/workflows/audit-privacy.md +3 -3
  182. package/.agents/workflows/audit-quality.md +3 -3
  183. package/.agents/workflows/audit-security.md +3 -3
  184. package/.agents/workflows/audit-seo.md +3 -3
  185. package/.agents/workflows/audit-sre.md +3 -3
  186. package/.agents/workflows/audit-to-stories.md +20 -20
  187. package/.agents/workflows/audit-ux-ui.md +3 -3
  188. package/.agents/workflows/deliver.md +122 -174
  189. package/.agents/workflows/git-cleanup.md +3 -4
  190. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  191. package/.agents/workflows/helpers/acceptance-self-eval.md +16 -29
  192. package/.agents/workflows/helpers/code-review.md +70 -193
  193. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  194. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  195. package/.agents/workflows/helpers/diagnose.md +10 -10
  196. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  197. package/.agents/workflows/helpers/signals.md +16 -16
  198. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  199. package/.agents/workflows/mandrel-update.md +2 -1
  200. package/.agents/workflows/plan.md +112 -145
  201. package/.agents/workflows/qa-assist.md +24 -30
  202. package/.agents/workflows/qa-explore.md +29 -38
  203. package/.agents/workflows/qa-run.md +2 -2
  204. package/README.md +9 -8
  205. package/docs/CHANGELOG.md +30 -0
  206. package/lib/migrations/index.js +6 -5
  207. package/package.json +2 -2
  208. package/.agents/agents/retro.md +0 -42
  209. package/.agents/personas/architect.md +0 -113
  210. package/.agents/personas/devops-engineer.md +0 -38
  211. package/.agents/personas/engineer.md +0 -33
  212. package/.agents/personas/project-manager.md +0 -114
  213. package/.agents/personas/qa-engineer.md +0 -95
  214. package/.agents/personas/security-engineer.md +0 -111
  215. package/.agents/personas/technical-writer.md +0 -101
  216. package/.agents/schemas/dispatch-manifest.json +0 -232
  217. package/.agents/schemas/epic-spec.schema.json +0 -153
  218. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  219. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  220. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  221. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  222. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  223. package/.agents/scripts/dispatcher.js +0 -295
  224. package/.agents/scripts/epic-audit-prepare.js +0 -497
  225. package/.agents/scripts/epic-audit-recheck.js +0 -274
  226. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  227. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  228. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  229. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  230. package/.agents/scripts/epic-plan-clarity.js +0 -211
  231. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  232. package/.agents/scripts/epic-reconcile.js +0 -625
  233. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  234. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  235. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  236. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  237. package/.agents/scripts/lib/config/preflight.js +0 -58
  238. package/.agents/scripts/lib/config/retro.js +0 -77
  239. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  240. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  241. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  242. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  243. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  244. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  245. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  246. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  247. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  248. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  249. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  250. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  251. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  252. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  253. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  254. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  255. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  256. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  257. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  258. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  259. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  260. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  261. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  262. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  263. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  264. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  265. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  266. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  267. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  268. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  269. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  270. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  271. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  272. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  273. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  274. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  275. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  276. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  277. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  278. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  279. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  280. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  281. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  282. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  283. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  284. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  285. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  286. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  287. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  288. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  289. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  290. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  291. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  292. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  293. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  294. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  295. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  296. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  297. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  298. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  299. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  300. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  301. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  302. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  303. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  304. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  305. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  306. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  307. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  308. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  309. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  310. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  311. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  312. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  313. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  314. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  315. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  316. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  317. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  318. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  319. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  320. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  321. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  322. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  323. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  324. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  325. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  326. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  327. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  328. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  329. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  330. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  331. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  332. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  333. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  334. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  335. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  336. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  337. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  338. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  339. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  340. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  341. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  342. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  343. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  344. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  345. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  346. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  347. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  348. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  349. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  350. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  351. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  352. package/.agents/scripts/lib/spec/index.js +0 -36
  353. package/.agents/scripts/lib/spec/loader.js +0 -425
  354. package/.agents/scripts/lib/spec/state.js +0 -208
  355. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  356. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  357. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  358. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  359. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  360. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  361. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  362. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  363. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  364. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  365. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  366. package/.agents/scripts/lifecycle-emit.js +0 -510
  367. package/.agents/scripts/retro-run.js +0 -218
  368. package/.agents/scripts/slice-phase.js +0 -361
  369. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  370. package/.agents/scripts/story-close.js +0 -294
  371. package/.agents/scripts/story-init.js +0 -599
  372. package/.agents/scripts/story-phase.js +0 -369
  373. package/.agents/scripts/wave-tick.js +0 -464
  374. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  375. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  376. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  377. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  378. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  379. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  380. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  381. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  382. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  383. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  384. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  385. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  386. package/.agents/workflows/helpers/epic-audit.md +0 -189
  387. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  388. package/.agents/workflows/helpers/epic-testing.md +0 -125
  389. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  390. package/.agents/workflows/helpers/plan-epic.md +0 -353
  391. package/.agents/workflows/helpers/plan-story.md +0 -251
  392. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  393. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -3,7 +3,7 @@
3
3
  * check-prepush-recovery.js — gate decision for the pre-push coverage step.
4
4
  *
5
5
  * Story #3162. The pre-push hook normally runs `coverage-capture.js` +
6
- * `crap:check` on every push. During a `story-close.js` recovery (operator
6
+ * `crap:check` on every push. During a pre-v2 `story-close.js` recovery (operator
7
7
  * pushing `epic/<id>` to unblock a run after a merge-orchestrator failure),
8
8
  * a pre-existing coverage regression on `epic/<id>` — unrelated to the
9
9
  * Story under recovery — hard-blocks the push and forces a `--no-verify`
@@ -20,7 +20,12 @@
20
20
  import { existsSync, readdirSync, rmSync } from 'node:fs';
21
21
  import path from 'node:path';
22
22
  import { runAsCli } from './lib/cli-utils.js';
23
- import { isReservedTestEpicTempDirName } from './lib/test-reserved-epic-temp-ids.js';
23
+
24
+ const RESERVED_TEST_EPIC_TEMP_DIR = /^epic-999\d{3}$/;
25
+
26
+ function isReservedTestEpicTempDirName(name) {
27
+ return RESERVED_TEST_EPIC_TEMP_DIR.test(name);
28
+ }
24
29
 
25
30
  /**
26
31
  * @param {object} [opts]
@@ -18,7 +18,6 @@
18
18
  * - `silent` → only `fatal` emits.
19
19
  * - `info` → default. Emits `info` and above; suppresses `debug`.
20
20
  * - `verbose` → emits everything (including `debug`).
21
- * - `debug` → alias for `verbose` (backward compatible).
22
21
  */
23
22
  /**
24
23
  * Recognized log levels, lowest-noise first. Anything outside this set
@@ -26,9 +25,7 @@
26
25
  *
27
26
  * @type {ReadonlySet<string>}
28
27
  */
29
- const VALID_LEVELS = Object.freeze(
30
- new Set(['silent', 'info', 'verbose', 'debug']),
31
- );
28
+ const VALID_LEVELS = Object.freeze(new Set(['silent', 'info', 'verbose']));
32
29
 
33
30
  /**
34
31
  * Process-wide level override. `null` means "no explicit override — read
@@ -50,7 +47,7 @@ let levelOverride = null;
50
47
  * the level branches react in-process, without a child process per level
51
48
  * (Story #3329).
52
49
  *
53
- * @returns {'silent'|'info'|'verbose'|'debug'}
50
+ * @returns {'silent'|'info'|'verbose'}
54
51
  */
55
52
  export function resolveLevel() {
56
53
  const raw = (
@@ -63,12 +60,12 @@ export function resolveLevel() {
63
60
 
64
61
  /**
65
62
  * Pin the process-wide log level, bypassing `AGENT_LOG_LEVEL`. Pass a
66
- * recognized level (`silent` / `info` / `verbose` / `debug`) to force it,
63
+ * recognized level (`silent` / `info` / `verbose`) to force it,
67
64
  * or `null` to clear the pin and restore env-driven resolution. An
68
65
  * unrecognized non-null value throws so callers cannot silently pin a
69
66
  * level that resolves to `info`.
70
67
  *
71
- * @param {('silent'|'info'|'verbose'|'debug')|null} level
68
+ * @param {('silent'|'info'|'verbose')|null} level
72
69
  * @returns {void}
73
70
  */
74
71
  export function setLevel(level) {
@@ -78,15 +75,14 @@ export function setLevel(level) {
78
75
  }
79
76
  if (typeof level !== 'string' || !VALID_LEVELS.has(level.toLowerCase())) {
80
77
  throw new RangeError(
81
- `setLevel: level must be one of silent|info|verbose|debug or null (got ${level})`,
78
+ `setLevel: level must be one of silent|info|verbose or null (got ${level})`,
82
79
  );
83
80
  }
84
81
  levelOverride = level.toLowerCase();
85
82
  }
86
83
 
87
84
  function debugEnabled() {
88
- const level = resolveLevel();
89
- return level === 'verbose' || level === 'debug';
85
+ return resolveLevel() === 'verbose';
90
86
  }
91
87
 
92
88
  function infoEnabled() {
@@ -189,8 +189,8 @@ export async function runAuditSuite({
189
189
  injectedRules,
190
190
  injectedWriteArtifact,
191
191
  }) {
192
- const { agentSettings } = resolveConfig();
193
- const paths = getPaths({ agentSettings });
192
+ const config = resolveConfig();
193
+ const paths = getPaths(config);
194
194
  const callerSubstitutions = substitutions ?? {};
195
195
  const rules = injectedRules ?? (await loadRules(paths));
196
196
 
@@ -109,10 +109,10 @@ export const LENS_TIERS = Object.freeze(['local', 'cumulative', 'global']);
109
109
  * @throws {Error} When the manifest cannot be read or parsed.
110
110
  */
111
111
  function readAuditRulesSync() {
112
- const { agentSettings } = resolveConfig();
112
+ const config = resolveConfig();
113
113
  const rulesPath = path.join(
114
114
  PROJECT_ROOT,
115
- getPaths({ agentSettings }).schemasRoot,
115
+ getPaths(config).schemasRoot,
116
116
  'audit-rules.json',
117
117
  );
118
118
  try {
@@ -160,7 +160,7 @@ export function resolveLensTier(lens) {
160
160
  * every path) matches every change set here, so its concern is verified at
161
161
  * BOTH innermost tiers — the
162
162
  * write-time checklist threading and this Story-scope lens pass — and excluded
163
- * from Epic close (a local lens is dropped by {@link selectEpicCloseLenses}).
163
+ * from the retired Epic-close roster (local lenses stay Story-scope only).
164
164
  * A local lens with an empty `filePatterns` list matches nothing here, so a
165
165
  * diff matching no local lens's patterns yields an empty roster and adds no
166
166
  * lens work.
@@ -300,12 +300,12 @@ export async function selectAudits({
300
300
  gitTimeoutMsOverride,
301
301
  gateModeOpts,
302
302
  }) {
303
- const { agentSettings } = resolveConfig();
303
+ const config = resolveConfig();
304
304
  const timeoutMs = gitTimeoutMsOverride ?? DEFAULT_GIT_TIMEOUT_MS;
305
305
 
306
306
  const rulesPath = path.join(
307
307
  PROJECT_ROOT,
308
- getPaths({ agentSettings }).schemasRoot,
308
+ getPaths(config).schemasRoot,
309
309
  'audit-rules.json',
310
310
  );
311
311
  let rulesData;
@@ -1,17 +1,17 @@
1
1
  /**
2
- * lib/audit-to-stories/seed-epic-from-findings.js
2
+ * lib/audit-to-stories/seed-from-findings.js
3
3
  *
4
- * Build the `--idea`-shaped seed markdown that `/plan` Phase 1
5
- * consumes when the operator picks the Single-Epic grouping mode.
4
+ * Build the `/plan --seed`-shaped one-pager markdown that the audit-to-
5
+ * stories Single-plan grouping path emits for `/plan` to consume.
6
6
  *
7
- * The seed renders the canonical one-pager sections so the idea-refinement
8
- * skill can sharpen it without having to invent context:
7
+ * The seed renders the canonical one-pager sections so the authoring
8
+ * pass can sharpen it without having to invent context:
9
9
  * - Problem Statement (aggregated severity profile)
10
10
  * - Recommended Direction (rollup of recommendations by dimension)
11
11
  * - Key Assumptions (carries the source-report links forward)
12
12
  * - MVP Scope (the proposed Stories, one bullet per group)
13
- * - Key Files (explicit file paths so /plan Phase 7 decompose
14
- * has concrete anchors)
13
+ * - Key Files (explicit file paths so `/plan` authoring has concrete
14
+ * anchors)
15
15
  * - Not Doing (out-of-scope items by convention)
16
16
  *
17
17
  * Pure: returns a string. The caller decides where to persist it.
@@ -112,14 +112,14 @@ function formatKeyAssumptions(sourceReports) {
112
112
  * @param {string[]} params.sourceReports — list of source report paths.
113
113
  * @returns {string}
114
114
  */
115
- export function buildEpicSeedMarkdown({ groups, findings, sourceReports }) {
115
+ export function buildPlanSeedMarkdown({ groups, findings, sourceReports }) {
116
116
  if (
117
117
  !Array.isArray(groups) ||
118
118
  !Array.isArray(findings) ||
119
119
  !Array.isArray(sourceReports)
120
120
  ) {
121
121
  throw new Error(
122
- 'buildEpicSeedMarkdown: groups, findings, sourceReports must all be arrays',
122
+ 'buildPlanSeedMarkdown: groups, findings, sourceReports must all be arrays',
123
123
  );
124
124
  }
125
125
  const problem = formatProblemStatement(findings);
@@ -26,28 +26,215 @@
26
26
  * @module lib/baselines/kernel
27
27
  */
28
28
 
29
- import * as bundleSize from './kinds/bundle-size.js';
30
- import * as coverage from './kinds/coverage.js';
31
- import * as crap from './kinds/crap.js';
32
- import * as duplication from './kinds/duplication.js';
33
- import * as lighthouse from './kinds/lighthouse.js';
34
- import * as lint from './kinds/lint.js';
35
- import * as maintainability from './kinds/maintainability.js';
36
- import * as mutation from './kinds/mutation.js';
29
+ import {
30
+ applyEpsilon as bundleSizeApplyEpsilon,
31
+ compare as bundleSizeCompare,
32
+ kernelVersion as bundleSizeKernelVersion,
33
+ keyField as bundleSizeKeyField,
34
+ mergeRows as bundleSizeMergeRows,
35
+ name as bundleSizeName,
36
+ projectRow as bundleSizeProjectRow,
37
+ rollup as bundleSizeRollup,
38
+ sortRows as bundleSizeSortRows,
39
+ } from './kinds/bundle-size.js';
40
+ import {
41
+ applyEpsilon as coverageApplyEpsilon,
42
+ compare as coverageCompare,
43
+ kernelVersion as coverageKernelVersion,
44
+ keyField as coverageKeyField,
45
+ mergeRows as coverageMergeRows,
46
+ name as coverageName,
47
+ projectRow as coverageProjectRow,
48
+ rollup as coverageRollup,
49
+ sortRows as coverageSortRows,
50
+ } from './kinds/coverage.js';
51
+ import {
52
+ applyEpsilon as crapApplyEpsilon,
53
+ compare as crapCompare,
54
+ kernelVersion as crapKernelVersion,
55
+ keyField as crapKeyField,
56
+ mergeRows as crapMergeRows,
57
+ name as crapName,
58
+ projectRow as crapProjectRow,
59
+ rollup as crapRollup,
60
+ sortRows as crapSortRows,
61
+ } from './kinds/crap.js';
62
+ import {
63
+ applyEpsilon as duplicationApplyEpsilon,
64
+ compare as duplicationCompare,
65
+ kernelVersion as duplicationKernelVersion,
66
+ keyField as duplicationKeyField,
67
+ mergeRows as duplicationMergeRows,
68
+ name as duplicationName,
69
+ projectRow as duplicationProjectRow,
70
+ rollup as duplicationRollup,
71
+ sortRows as duplicationSortRows,
72
+ } from './kinds/duplication.js';
73
+ import {
74
+ applyEpsilon as lighthouseApplyEpsilon,
75
+ compare as lighthouseCompare,
76
+ kernelVersion as lighthouseKernelVersion,
77
+ keyField as lighthouseKeyField,
78
+ mergeRows as lighthouseMergeRows,
79
+ name as lighthouseName,
80
+ projectRow as lighthouseProjectRow,
81
+ rollup as lighthouseRollup,
82
+ sortRows as lighthouseSortRows,
83
+ } from './kinds/lighthouse.js';
84
+ import {
85
+ applyEpsilon as lintApplyEpsilon,
86
+ compare as lintCompare,
87
+ kernelVersion as lintKernelVersion,
88
+ keyField as lintKeyField,
89
+ mergeRows as lintMergeRows,
90
+ name as lintName,
91
+ projectRow as lintProjectRow,
92
+ rollup as lintRollup,
93
+ sortRows as lintSortRows,
94
+ } from './kinds/lint.js';
95
+ import {
96
+ applyEpsilon as maintainabilityApplyEpsilon,
97
+ compare as maintainabilityCompare,
98
+ kernelVersion as maintainabilityKernelVersion,
99
+ keyField as maintainabilityKeyField,
100
+ mergeRows as maintainabilityMergeRows,
101
+ name as maintainabilityName,
102
+ projectRow as maintainabilityProjectRow,
103
+ rollup as maintainabilityRollup,
104
+ sortRows as maintainabilitySortRows,
105
+ } from './kinds/maintainability.js';
106
+ import {
107
+ applyEpsilon as mutationApplyEpsilon,
108
+ compare as mutationCompare,
109
+ kernelVersion as mutationKernelVersion,
110
+ keyField as mutationKeyField,
111
+ mergeRows as mutationMergeRows,
112
+ name as mutationName,
113
+ projectRow as mutationProjectRow,
114
+ rollup as mutationRollup,
115
+ sortRows as mutationSortRows,
116
+ } from './kinds/mutation.js';
117
+
118
+ /**
119
+ * Assemble the kind-module protocol from named imports.
120
+ *
121
+ * Prefer named imports over `import * as kind` here: knip (and the
122
+ * dead-exports ratchet) cannot see members reached only through
123
+ * `getKindModule(kind).projectRow(...)` after a namespace import, so
124
+ * star-imports of `kinds/*.js` produced systematic false-positive dead
125
+ * exports for the protocol surface (`name`, `keyField`, `kernelVersion`,
126
+ * `projectRow`, `sortRows`, `rollup`, …).
127
+ *
128
+ * @param {object} members
129
+ * @returns {object}
130
+ */
131
+ function bindKindModule(members) {
132
+ return Object.freeze({
133
+ name: members.name,
134
+ keyField: members.keyField,
135
+ kernelVersion: members.kernelVersion,
136
+ projectRow: members.projectRow,
137
+ sortRows: members.sortRows,
138
+ rollup: members.rollup,
139
+ compare: members.compare,
140
+ applyEpsilon: members.applyEpsilon,
141
+ mergeRows: members.mergeRows,
142
+ });
143
+ }
37
144
 
38
145
  /**
39
146
  * Registry of every shipped kind module. Keys mirror the per-kind schema
40
147
  * filenames so a future "list all kinds" iterator can stay declarative.
41
148
  */
42
149
  const KIND_MODULES = Object.freeze({
43
- lint,
44
- coverage,
45
- crap,
46
- maintainability,
47
- mutation,
48
- lighthouse,
49
- 'bundle-size': bundleSize,
50
- duplication,
150
+ lint: bindKindModule({
151
+ name: lintName,
152
+ keyField: lintKeyField,
153
+ kernelVersion: lintKernelVersion,
154
+ projectRow: lintProjectRow,
155
+ sortRows: lintSortRows,
156
+ rollup: lintRollup,
157
+ compare: lintCompare,
158
+ applyEpsilon: lintApplyEpsilon,
159
+ mergeRows: lintMergeRows,
160
+ }),
161
+ coverage: bindKindModule({
162
+ name: coverageName,
163
+ keyField: coverageKeyField,
164
+ kernelVersion: coverageKernelVersion,
165
+ projectRow: coverageProjectRow,
166
+ sortRows: coverageSortRows,
167
+ rollup: coverageRollup,
168
+ compare: coverageCompare,
169
+ applyEpsilon: coverageApplyEpsilon,
170
+ mergeRows: coverageMergeRows,
171
+ }),
172
+ crap: bindKindModule({
173
+ name: crapName,
174
+ keyField: crapKeyField,
175
+ kernelVersion: crapKernelVersion,
176
+ projectRow: crapProjectRow,
177
+ sortRows: crapSortRows,
178
+ rollup: crapRollup,
179
+ compare: crapCompare,
180
+ applyEpsilon: crapApplyEpsilon,
181
+ mergeRows: crapMergeRows,
182
+ }),
183
+ maintainability: bindKindModule({
184
+ name: maintainabilityName,
185
+ keyField: maintainabilityKeyField,
186
+ kernelVersion: maintainabilityKernelVersion,
187
+ projectRow: maintainabilityProjectRow,
188
+ sortRows: maintainabilitySortRows,
189
+ rollup: maintainabilityRollup,
190
+ compare: maintainabilityCompare,
191
+ applyEpsilon: maintainabilityApplyEpsilon,
192
+ mergeRows: maintainabilityMergeRows,
193
+ }),
194
+ mutation: bindKindModule({
195
+ name: mutationName,
196
+ keyField: mutationKeyField,
197
+ kernelVersion: mutationKernelVersion,
198
+ projectRow: mutationProjectRow,
199
+ sortRows: mutationSortRows,
200
+ rollup: mutationRollup,
201
+ compare: mutationCompare,
202
+ applyEpsilon: mutationApplyEpsilon,
203
+ mergeRows: mutationMergeRows,
204
+ }),
205
+ lighthouse: bindKindModule({
206
+ name: lighthouseName,
207
+ keyField: lighthouseKeyField,
208
+ kernelVersion: lighthouseKernelVersion,
209
+ projectRow: lighthouseProjectRow,
210
+ sortRows: lighthouseSortRows,
211
+ rollup: lighthouseRollup,
212
+ compare: lighthouseCompare,
213
+ applyEpsilon: lighthouseApplyEpsilon,
214
+ mergeRows: lighthouseMergeRows,
215
+ }),
216
+ 'bundle-size': bindKindModule({
217
+ name: bundleSizeName,
218
+ keyField: bundleSizeKeyField,
219
+ kernelVersion: bundleSizeKernelVersion,
220
+ projectRow: bundleSizeProjectRow,
221
+ sortRows: bundleSizeSortRows,
222
+ rollup: bundleSizeRollup,
223
+ compare: bundleSizeCompare,
224
+ applyEpsilon: bundleSizeApplyEpsilon,
225
+ mergeRows: bundleSizeMergeRows,
226
+ }),
227
+ duplication: bindKindModule({
228
+ name: duplicationName,
229
+ keyField: duplicationKeyField,
230
+ kernelVersion: duplicationKernelVersion,
231
+ projectRow: duplicationProjectRow,
232
+ sortRows: duplicationSortRows,
233
+ rollup: duplicationRollup,
234
+ compare: duplicationCompare,
235
+ applyEpsilon: duplicationApplyEpsilon,
236
+ mergeRows: duplicationMergeRows,
237
+ }),
51
238
  });
52
239
 
53
240
  /**
@@ -55,10 +242,11 @@ const KIND_MODULES = Object.freeze({
55
242
  * callers can't silently fall through to undefined behaviour.
56
243
  *
57
244
  * @param {string} kind
58
- * @returns {{ name: string, kernelVersion: () => string, keyField: string,
245
+ * @returns {{ name: string, keyField: string, kernelVersion: () => string,
59
246
  * projectRow: (row: object) => object,
60
247
  * sortRows: (rows: object[]) => object[],
61
- * rollup: (rows: object[], components?: object[]) => object }}
248
+ * rollup: (rows: object[], components?: object[]) => object,
249
+ * compare?: Function, applyEpsilon?: Function, mergeRows?: Function }}
62
250
  */
63
251
  export function getKindModule(kind) {
64
252
  const mod = KIND_MODULES[kind];
@@ -62,10 +62,6 @@ export const MAINTAINABILITY_EXCLUSIONS = Object.freeze(
62
62
  // escomplex: "this[node.callee.type] is not a function" — the cyclomatic
63
63
  // visitor lacks a handler for one of the quality-watch CLI's call shapes.
64
64
  '.agents/scripts/quality-watch.js',
65
- // escomplex: "Cannot read properties of undefined (reading 'pattern')" —
66
- // same family as acceptance-spec-reconciler. The audit recheck CLI uses
67
- // the same regex-property scan helpers.
68
- '.agents/scripts/epic-audit-recheck.js',
69
65
  // escomplex: parse-fails (MI=0) on the spec-freshness phase's optional-
70
66
  // chained destructuring fallthrough. Same upstream family as the other
71
67
  // "pattern" / destructuring failures; carve-out so the phase split of
@@ -86,15 +86,10 @@ function resolveBaselinePath(kind, opts = {}) {
86
86
  cwd,
87
87
  configPath: opts.configPath,
88
88
  });
89
- const gateBlock =
90
- resolved?.agentSettings?.delivery?.quality?.gates?.[kind] ??
91
- resolved?.delivery?.quality?.gates?.[kind] ??
92
- null;
89
+ const gateBlock = resolved?.delivery?.quality?.gates?.[kind] ?? null;
93
90
  if (gateBlock?.baselinePath) {
94
91
  configured = gateBlock.baselinePath;
95
92
  } else {
96
- // Fall through to the legacy {lint, crap, maintainability} envelope
97
- // exposed by getBaselines.
98
93
  const flat = getBaselines(resolved ?? {});
99
94
  if (kind === 'lint' || kind === 'crap' || kind === 'maintainability') {
100
95
  configured = flat[kind]?.path ?? null;
@@ -62,9 +62,7 @@ export const BDD_RUNNER_TAG_TABLE = Object.freeze({
62
62
  /**
63
63
  * Shared set of tag tokens that mean "this scenario does not yet satisfy
64
64
  * its AC — treat coverage as pending, not satisfied." Sourced from every
65
- * `pendingTag` value in `BDD_RUNNER_TAG_TABLE` plus the historical
66
- * `@pending` literal for backward compatibility with feature files
67
- * authored before runner-aware detection.
65
+ * pending-tag value in `BDD_RUNNER_TAG_TABLE` (today `@skip` / `skip`).
68
66
  *
69
67
  * Both the prefixed (`@skip`) and the unprefixed (`skip`) form of each
70
68
  * tag are included so consumers can look up either the raw tag string
@@ -75,18 +73,16 @@ export const BDD_RUNNER_TAG_TABLE = Object.freeze({
75
73
  * - `acceptance-spec-reconciler.classifyCoverage` — membership check
76
74
  * against parsed scenario tag sets.
77
75
  * - Contract tests that walk `BDD_RUNNER_TAG_TABLE` and assert each
78
- * `pendingTag` is registered here, guarding against drift when a
76
+ * pending tag is registered here, guarding against drift when a
79
77
  * new runner is added.
80
78
  */
81
79
  export const PENDING_TAGS = Object.freeze(
82
- new Set([
83
- ...Object.values(BDD_RUNNER_TAG_TABLE).flatMap((tag) => [
80
+ new Set(
81
+ Object.values(BDD_RUNNER_TAG_TABLE).flatMap((tag) => [
84
82
  tag,
85
83
  tag.startsWith('@') ? tag.slice(1) : `@${tag}`,
86
84
  ]),
87
- '@pending',
88
- 'pending',
89
- ]),
85
+ ),
90
86
  );
91
87
 
92
88
  /**
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * bootstrap/issue-forms-template — Story #4227 (framework-gap)
3
3
  *
4
- * Generates GitHub **Issue Forms** (`.github/ISSUE_TEMPLATE/story.yml` and
5
- * `epic.yml`) derived from the canonical Story-body SSOT
4
+ * Generates the GitHub **Story Issue Form**
5
+ * (`.github/ISSUE_TEMPLATE/story.yml`) derived from the canonical Story-body SSOT
6
6
  * (`lib/story-body/story-body.js`). The forms exist so a human filing a
7
- * Story/Epic in the GitHub web UI produces a body that round-trips through
7
+ * Story in the GitHub web UI produces a body that round-trips through
8
8
  * the same `story-body.parse()` agents rely on — closing the
9
9
  * human↔agent ticket-shape gap.
10
10
  *
@@ -57,12 +57,11 @@ import path from 'node:path';
57
57
  const ISSUE_TEMPLATE_RELATIVE_DIR = '.github/ISSUE_TEMPLATE';
58
58
 
59
59
  /**
60
- * Relative paths of the two generated forms, surfaced as constants so tests
61
- * and the bootstrap caller assert the canonical write targets without
62
- * re-deriving them.
60
+ * Relative path of the generated Story form, surfaced as a constant so tests
61
+ * and the bootstrap caller assert the canonical write target without
62
+ * re-deriving it.
63
63
  */
64
64
  export const STORY_FORM_RELATIVE_PATH = `${ISSUE_TEMPLATE_RELATIVE_DIR}/story.yml`;
65
- export const EPIC_FORM_RELATIVE_PATH = `${ISSUE_TEMPLATE_RELATIVE_DIR}/epic.yml`;
66
65
 
67
66
  /**
68
67
  * The human **intent subset** of the Story-body schema, in canonical
@@ -102,8 +101,12 @@ export const HUMAN_INTENT_FIELDS = [
102
101
  heading: 'Changes',
103
102
  label: 'Changes',
104
103
  description:
105
- 'Files or globs this work touches, one per line (e.g. `- src/foo.js: add handler`). Advisory — the binding contract is Acceptance/Verify.',
106
- placeholder: '- src/foo.js: add the handler\n- tests/foo.test.js: cover it',
104
+ 'Files this work touches, one per line as JSON objects: ' +
105
+ '`{ "path": "…", "assumption": "creates"|"refactors-existing"|"exists"|"deletes" }`. ' +
106
+ 'Advisory — the binding contract is Acceptance/Verify.',
107
+ placeholder:
108
+ '- {"path":"src/foo.js","assumption":"creates"}\n' +
109
+ '- {"path":"tests/foo.test.js","assumption":"creates"}',
107
110
  required: false,
108
111
  kind: 'textarea',
109
112
  },
@@ -132,8 +135,10 @@ export const HUMAN_INTENT_FIELDS = [
132
135
  id: 'references',
133
136
  heading: 'References',
134
137
  label: 'References',
135
- description: 'Read-only paths worth consulting, one per line. Optional.',
136
- placeholder: '- docs/architecture.md',
138
+ description:
139
+ 'Read-only paths worth consulting, one per line as JSON objects ' +
140
+ '`{ "path": "…", "assumption": "exists" }`. Optional.',
141
+ placeholder: '- {"path":"docs/architecture.md","assumption":"exists"}',
137
142
  required: false,
138
143
  kind: 'textarea',
139
144
  },
@@ -220,27 +225,26 @@ const GENERATED_BANNER =
220
225
  '# (lint-issue-body.js) is the drift guard between this form and the parser.';
221
226
 
222
227
  /**
223
- * Render the GitHub Issue Form YAML for a given ticket type (`story` or
224
- * `epic`). Both forms share the identical human-intent field set — the
225
- * difference is the `type::` label and the form name/description — because
226
- * `parse()` is type-agnostic over the body shape.
228
+ * Render the GitHub Issue Form YAML for Stories. Epics are no longer a
229
+ * ticket type in the label taxonomy, so the generated human-entry surface
230
+ * is story-only.
227
231
  *
228
232
  * The output is deterministic so the round-trip + idempotency tests assert
229
233
  * on its exact shape.
230
234
  *
231
- * @param {'story'|'epic'} ticketType
235
+ * @param {'story'} ticketType
232
236
  * @param {IssueFormOptions} [opts]
233
237
  * @returns {string}
234
238
  */
235
239
  export function renderIssueForm(ticketType, opts = {}) {
236
- if (ticketType !== 'story' && ticketType !== 'epic') {
240
+ if (ticketType !== 'story') {
237
241
  throw new Error(
238
- `renderIssueForm: ticketType must be 'story' or 'epic', got ${ticketType}`,
242
+ `renderIssueForm: ticketType must be 'story', got ${ticketType}`,
239
243
  );
240
244
  }
241
245
  const entryStateLabel = opts.entryStateLabel ?? 'agent::review-spec';
242
- const typeLabel = `type::${ticketType}`;
243
- const titleCase = ticketType === 'story' ? 'Story' : 'Epic';
246
+ const typeLabel = 'type::story';
247
+ const titleCase = 'Story';
244
248
  const projectSuffix = opts.projectName ? ` for ${opts.projectName}` : '';
245
249
 
246
250
  const fieldBlocks = HUMAN_INTENT_FIELDS.map(renderFieldBlock).join('\n');
@@ -309,8 +313,8 @@ export const CONFORMANCE_WORKFLOW_RELATIVE_PATH =
309
313
 
310
314
  /**
311
315
  * Render the CI workflow that runs the issue-body conformance lint
312
- * (`lint-issue-body.js`) on opened/edited `type::story` / `type::epic`
313
- * issues. This is the mechanism that prevents the generated forms and
316
+ * (`lint-issue-body.js`) on opened/edited `type::story` issues. This is
317
+ * the mechanism that prevents the generated form and
314
318
  * `story-body.parse()` from silently drifting (Story #4227 acceptance).
315
319
  * Deterministic so the bootstrap test asserts its exact shape. Internal —
316
320
  * exposed to consumers only through {@link ensureIssueForms}.
@@ -321,7 +325,7 @@ function renderConformanceWorkflow() {
321
325
  return `# Issue-body conformance lint (Story #4227).
322
326
  #
323
327
  # Generated by agents-bootstrap-github. Runs the canonical story-body parser
324
- # against human-opened type::story / type::epic issues and comments when the
328
+ # against human-opened type::story issues and comments when the
325
329
  # body does not round-trip, instead of letting the supported human entry
326
330
  # points (e.g. /plan from an existing Epic ID) fail silently later. The lint
327
331
  # informs; it never fails the issue. Re-run /agents-bootstrap-github to refresh.
@@ -362,7 +366,7 @@ jobs:
362
366
  }
363
367
 
364
368
  /**
365
- * Write (or refresh) both issue forms into a project checkout. Idempotent at
369
+ * Write (or refresh) the Story issue form into a project checkout. Idempotent at
366
370
  * the byte level — mirrors {@link ensureCiWorkflow}'s contract:
367
371
  *
368
372
  * - file absent → `created`
@@ -378,7 +382,7 @@ jobs:
378
382
  * @param {IssueFormOptions} [args.options]
379
383
  * @param {boolean} [args.write=true] - When `false`, compute the would-be
380
384
  * actions without touching disk (dry-run).
381
- * @returns {{ forms: Array<{ type: 'story'|'epic'|'conformance-workflow',
385
+ * @returns {{ forms: Array<{ type: 'story'|'conformance-workflow',
382
386
  * action: 'created'|'unchanged'|'custom-skip',
383
387
  * path: string, rendered: string }> }}
384
388
  */
@@ -387,20 +391,15 @@ export function ensureIssueForms(args) {
387
391
  const options = args.options ?? {};
388
392
  const write = args.write !== false;
389
393
 
390
- // Each target pairs a ticket-type key with the rendered body. The
391
- // conformance workflow is materialized alongside the forms because it is
392
- // the forms' drift guard — they ship as one unit.
394
+ // Each target pairs a type key with the rendered body. The conformance
395
+ // workflow is materialized alongside the form because it is the form's
396
+ // drift guard — they ship as one unit.
393
397
  const targets = [
394
398
  {
395
399
  type: 'story',
396
400
  rel: STORY_FORM_RELATIVE_PATH,
397
401
  rendered: renderIssueForm('story', options),
398
402
  },
399
- {
400
- type: 'epic',
401
- rel: EPIC_FORM_RELATIVE_PATH,
402
- rendered: renderIssueForm('epic', options),
403
- },
404
403
  {
405
404
  type: 'conformance-workflow',
406
405
  rel: CONFORMANCE_WORKFLOW_RELATIVE_PATH,
@@ -4,11 +4,11 @@
4
4
  * Asserts that `git config core.bare` on the main checkout is NOT set
5
5
  * to `true`. This guards the old failure mode where an `npm test` path
6
6
  * mis-set `core.bare=true` on the main checkout, after which
7
- * `story-close.js`'s post-rebase `git checkout` aborted with
7
+ * `single-story-close.js`'s post-rebase `git checkout` aborted with
8
8
  * `fatal: this operation must be run in a work tree`. `cleanGitEnv`
9
9
  * already lands the live fix; this check is the regression guard.
10
10
  *
11
- * Severity is `blocker` because story-close cannot recover on its own
11
+ * Severity is `blocker` because single-story-close cannot recover on its own
12
12
  * — the operator must run `git config --unset core.bare` (or rely on
13
13
  * `cleanGitEnv` to do it before the rebase). The check is
14
14
  * refuse-and-print: the `fixCommand` is the literal unset, and the
@@ -2,7 +2,8 @@
2
2
  * checks/index.js — Discovery-based registry + runner for self-healing checks.
3
3
  *
4
4
  * This module is the single entry point for every consumer surface that
5
- * runs checks (preflight guards at `epic-deliver.js` / `story-close.js`, the
5
+ * runs checks (preflight guards at `single-story-close.js` and
6
+ * `mandrel-update-preflight.js`, the
6
7
  * `npm test` wrapper, the `diagnose.js` CLI viewer, and the retro hook in
7
8
  * `retro-runner.js`). Each surface calls `runChecks({ scope, autoFix, state })`
8
9
  * with its own scope and gets back `{ findings, fixed }`.