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
@@ -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,
@@ -24,6 +24,12 @@ import { applyQualityBootstrap } from './quality-bootstrap.js';
24
24
 
25
25
  export const SYNC_COMMAND = 'node .agents/scripts/sync-claude-commands.js';
26
26
 
27
+ // Epic #4478 (M7-B). The role-scoped agent projection runs in every place the
28
+ // command projection does — `sync:agents` script, `prepare`, and the bootstrap
29
+ // `sync` phase (`runSyncCommands`) — so `.claude/agents/*.md` materializes for
30
+ // hosts that read it, exactly as `.claude/commands/*.md` does.
31
+ export const SYNC_AGENTS_COMMAND = 'node .agents/scripts/sync-claude-agents.js';
32
+
27
33
  export const BOOTSTRAP_COMMAND = 'node .agents/scripts/bootstrap.js';
28
34
 
29
35
  /**
@@ -202,6 +208,7 @@ export function ensurePackageJson(ctx) {
202
208
  const outcomes = {
203
209
  created: false,
204
210
  scriptsSyncCommands: 'already-present',
211
+ scriptsSyncAgents: 'already-present',
205
212
  scriptsPrepare: 'already-present',
206
213
  scriptsBootstrap: 'already-present',
207
214
  };
@@ -220,13 +227,29 @@ export function ensurePackageJson(ctx) {
220
227
  pkg.scripts['sync:commands'] = SYNC_COMMAND;
221
228
  outcomes.scriptsSyncCommands = 'added';
222
229
  }
230
+ if (!pkg.scripts['sync:agents']) {
231
+ pkg.scripts['sync:agents'] = SYNC_AGENTS_COMMAND;
232
+ outcomes.scriptsSyncAgents = 'added';
233
+ }
223
234
  const prepare = pkg.scripts.prepare;
224
235
  if (!prepare) {
225
- pkg.scripts.prepare = SYNC_COMMAND;
236
+ pkg.scripts.prepare = `${SYNC_COMMAND} && ${SYNC_AGENTS_COMMAND}`;
226
237
  outcomes.scriptsPrepare = 'added';
227
- } else if (!prepare.includes('sync-claude-commands.js')) {
228
- pkg.scripts.prepare = `${prepare} && ${SYNC_COMMAND}`;
229
- outcomes.scriptsPrepare = 'appended';
238
+ } else {
239
+ // Append each projection independently so an existing prepare that already
240
+ // carries the command sync still gains the agent sync on the next bootstrap
241
+ // (and both are idempotent — a prepare carrying both is left untouched).
242
+ let next = prepare;
243
+ if (!next.includes('sync-claude-commands.js')) {
244
+ next = `${next} && ${SYNC_COMMAND}`;
245
+ }
246
+ if (!next.includes('sync-claude-agents.js')) {
247
+ next = `${next} && ${SYNC_AGENTS_COMMAND}`;
248
+ }
249
+ if (next !== prepare) {
250
+ pkg.scripts.prepare = next;
251
+ outcomes.scriptsPrepare = 'appended';
252
+ }
230
253
  }
231
254
  // Expose a discoverable `npm run bootstrap` alias for the framework
232
255
  // setup command. An operator-defined `bootstrap` script always wins —
@@ -238,6 +261,7 @@ export function ensurePackageJson(ctx) {
238
261
  const mutated =
239
262
  outcomes.created ||
240
263
  outcomes.scriptsSyncCommands === 'added' ||
264
+ outcomes.scriptsSyncAgents === 'added' ||
241
265
  outcomes.scriptsPrepare !== 'already-present' ||
242
266
  outcomes.scriptsBootstrap === 'added';
243
267
  if (mutated) writeJson(pkgPath, pkg, fsImpl);
@@ -482,25 +506,39 @@ function ensureIssueFormsPhase(ctx) {
482
506
  */
483
507
  export function runSyncCommands(ctx) {
484
508
  const { spawnImpl = defaultSpawnSync } = ctx;
485
- const script = path.join(
509
+ const scriptsDir = path.join(
486
510
  ctx.agentRoot ?? path.join(ctx.projectRoot, '.agents'),
487
511
  'scripts',
488
- 'sync-claude-commands.js',
489
512
  );
490
- const result = spawnImpl(process.execPath, [script], {
491
- cwd: ctx.projectRoot,
492
- encoding: 'utf8',
493
- });
494
- if (result.status !== 0) {
495
- throw new Error(
496
- `[Bootstrap] sync-claude-commands.js failed (exit ${result.status}): ${(
497
- result.stderr ?? ''
498
- )
499
- .trim()
500
- .slice(0, 400)}`,
513
+ // Both projections run here (Epic #4478, M7-B): the command tree AND the
514
+ // role-scoped agent tree, so `mandrel sync` / the postinstall path
515
+ // materializes `.claude/agents/*.md` alongside `.claude/commands/*.md`.
516
+ const projections = [
517
+ { label: 'sync-claude-commands.js', script: 'sync-claude-commands.js' },
518
+ { label: 'sync-claude-agents.js', script: 'sync-claude-agents.js' },
519
+ ];
520
+ const stdouts = [];
521
+ for (const { label, script } of projections) {
522
+ const result = spawnImpl(
523
+ process.execPath,
524
+ [path.join(scriptsDir, script)],
525
+ {
526
+ cwd: ctx.projectRoot,
527
+ encoding: 'utf8',
528
+ },
501
529
  );
530
+ if (result.status !== 0) {
531
+ throw new Error(
532
+ `[Bootstrap] ${label} failed (exit ${result.status}): ${(
533
+ result.stderr ?? ''
534
+ )
535
+ .trim()
536
+ .slice(0, 400)}`,
537
+ );
538
+ }
539
+ stdouts.push((result.stdout ?? '').trim());
502
540
  }
503
- return { ok: true, stdout: (result.stdout ?? '').trim() };
541
+ return { ok: true, stdout: stdouts.filter(Boolean).join('\n') };
504
542
  }
505
543
 
506
544
  /**
@@ -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 }`.