mandrel 1.94.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -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];
@@ -53,25 +53,10 @@ export const MAINTAINABILITY_EXCLUSIONS = Object.freeze(
53
53
  // escomplex: same "pattern" parse failure as acceptance-spec-reconciler;
54
54
  // both files share the lifecycle-lint regex-driven scan helpers.
55
55
  '.agents/scripts/check-lifecycle-lint.js',
56
- // escomplex: "traveler[node.type] is not a function" — AST node type the
57
- // upstream traveler table is missing (top-level await / private fields).
58
- '.agents/scripts/lib/orchestration/epic-cleanup.js',
59
- // escomplex: same "traveler[node.type] is not a function" — emitted by
60
- // the spec-reconciler's `async` operator-comment IIFE.
61
- '.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js',
62
56
  // escomplex: "this[node.callee.type] is not a function" — the cyclomatic
63
57
  // visitor lacks a handler for one of the quality-watch CLI's call shapes.
64
58
  '.agents/scripts/quality-watch.js',
65
59
  // 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
- // escomplex: parse-fails (MI=0) on the spec-freshness phase's optional-
70
- // chained destructuring fallthrough. Same upstream family as the other
71
- // "pattern" / destructuring failures; carve-out so the phase split of
72
- // epic-plan-spec doesn't poison the global rollup.
73
- '.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js',
74
- // escomplex: "Cannot read properties of undefined (reading 'pattern')" —
75
60
  // the audit-to-stories parser reuses the same regex-property scan
76
61
  // patterns as acceptance-spec-reconciler.
77
62
  '.agents/scripts/lib/audit-to-stories/parse-audit-md.js',
@@ -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
  /**
@@ -13,14 +13,18 @@
13
13
  * framework default at the next bump. The push-to-main job still passes
14
14
  * `--full-scope` so a self-diff doesn't degrade to "no files in diff".
15
15
  *
16
- * 2. **Pass `--epic-ref` where the firing site is Epic-aware.** Inside
17
- * `/deliver` the close-validation chain already threads
18
- * `--epic-ref epic/<id>`; on CI the equivalent surface is the PR's
19
- * base branch. The template wires `--epic-ref ${EPIC_REF}` through an
20
- * env var the workflow computes from `github.head_ref` (story-N
21
- * branches name their Epic in the PR title or via the dispatch
22
- * manifest). When `EPIC_REF` is empty, both gates fall through to the
23
- * `main`-tracked baseline — so the env-var expansion is always safe.
16
+ * 2. **Pin the baseline read to the PR's base branch via `BASELINE_REF`.**
17
+ * Inside `/deliver` the close-validation chain sets the same env var
18
+ * (`close-validation/gates.js` `BASELINE_REF: origin/<baseBranch>`);
19
+ * on CI the equivalent surface is the PR's base branch. This is an
20
+ * ENV VAR, not a CLI flag: `check-baselines.js` resolves it through
21
+ * `resolveDispatchScope`, and the `--epic-ref` flag this template used
22
+ * to pass never existed on it it was left over from the separate
23
+ * `check-crap.js` / `check-maintainability.js` CLIs that were unified
24
+ * away, and it named the ref `epic/<base>`, a branch the Story-only
25
+ * model never creates. When `BASELINE_REF` is empty (push-to-base,
26
+ * where there is no base to compare against) both gates fall through to
27
+ * the working-tree baseline, so the expansion is always safe.
24
28
  *
25
29
  * The renderer is a pure string template so the integration test can assert
26
30
  * on its exact shape without instantiating a YAML parser.
@@ -61,19 +65,15 @@ export function renderCiWorkflow(opts = {}) {
61
65
  # Diff-scoped via the framework default (Story #1394 flipped
62
66
  # --changed-since to '${baseRef}'). On PRs we let the default win;
63
67
  # on push-to-main we pass --full-scope so a self-diff doesn't
64
- # collapse to an empty file set. EPIC_REF is set when the head ref
65
- # points at a story branch under an Epic — the gate then reads the
66
- # per-Epic baseline snapshot via baseline-loader.readBaselineAtRef.
68
+ # collapse to an empty file set. BASELINE_REF makes the gate read
69
+ # the baseline at the base branch tip via
70
+ # baseline-loader.readBaselineAtRef.
67
71
  env:
68
- EPIC_REF: \${{ env.EPIC_REF }}
72
+ BASELINE_REF: \${{ env.BASELINE_REF }}
69
73
  run: |
70
74
  mkdir -p temp
71
75
  if [[ "\${{ github.event_name }}" == "pull_request" ]]; then
72
- if [[ -n "\${EPIC_REF}" ]]; then
73
- npm run crap:check -- --epic-ref "\${EPIC_REF}" --json temp/crap-report.json
74
- else
75
- npm run crap:check -- --json temp/crap-report.json
76
- fi
76
+ npm run crap:check -- --json temp/crap-report.json
77
77
  else
78
78
  npm run crap:check -- --full-scope --json temp/crap-report.json
79
79
  fi
@@ -112,15 +112,14 @@ jobs:
112
112
  permissions:
113
113
  contents: read
114
114
  env:
115
- # Story #1120: when the PR head ref names an Epic story branch
116
- # (story-N or story/epic-<id>/<n>), the gate CLIs read the canonical
117
- # main baseline at the Epic branch HEAD via --epic-ref (git show).
118
- # Empty when the head ref is not an Epic story branch — both gates
119
- # fall through to the working-tree baseline, so the env-var
120
- # expansion is always safe. Per-epic ratchet snapshots themselves
121
- # live under temp/epic/<id>/baselines/ (Story #1467) — ephemeral
122
- # scratch state, never read by this CI gate.
123
- EPIC_REF: \${{ github.head_ref && contains(github.head_ref, 'story') && format('epic/{0}', github.event.pull_request.base.ref) || '' }}
115
+ # Story #1120: on a PR the gate CLIs read the canonical baseline at
116
+ # the BASE branch tip via --baseline-ref (git show), not from the
117
+ # PR head's working tree a branch that edited its own baseline
118
+ # must not be allowed to grade itself against the edit.
119
+ # Empty on push-to-${baseRef} (there is no base to compare against),
120
+ # where both gates fall through to the working-tree baseline, so the
121
+ # env-var expansion is always safe.
122
+ BASELINE_REF: \${{ github.event_name == 'pull_request' && format('origin/{0}', github.event.pull_request.base.ref) || '' }}
124
123
  BASE_REF: ${baseRef}
125
124
  steps:
126
125
  - name: Checkout Code
@@ -147,16 +146,12 @@ jobs:
147
146
  # the project's BASE_REF, so PRs no longer pass --changed-since
148
147
  # explicitly. push-to-${baseRef} runs with --full-scope so the
149
148
  # diff-scoped default doesn't degrade to a self-diff (= empty file
150
- # set). EPIC_REF carries the per-Epic snapshot when present.
149
+ # set). BASELINE_REF pins the baseline read to the base branch tip.
151
150
  env:
152
- EPIC_REF: \${{ env.EPIC_REF }}
151
+ BASELINE_REF: \${{ env.BASELINE_REF }}
153
152
  run: |
154
153
  if [[ "\${{ github.event_name }}" == "pull_request" ]]; then
155
- if [[ -n "\${EPIC_REF}" ]]; then
156
- npm run maintainability:check -- --epic-ref "\${EPIC_REF}"
157
- else
158
- npm run maintainability:check
159
- fi
154
+ npm run maintainability:check
160
155
  else
161
156
  npm run maintainability:check -- --full-scope
162
157
  fi
@@ -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,
@@ -110,9 +110,14 @@ export function buildMutationManifest(ctx = {}) {
110
110
  const entries = [];
111
111
 
112
112
  // --- ide-wiring -------------------------------------------------------
113
- // Claude Code / IDE integration: the system-prompt import, the
114
- // UserPromptSubmit sync hook, the generated flat command surface, and the
115
- // .gitignore entry that keeps the generated tree out of git.
113
+ // Claude Code / IDE integration: the system-prompt import, the generated
114
+ // flat command surface, and the .gitignore entry that keeps the
115
+ // generated tree out of git. (Story #4527/#4530: the UserPromptSubmit
116
+ // per-prompt re-sync hook entry was removed alongside the hook itself —
117
+ // it raced the harness's own read of the same directory and reported
118
+ // "0 file(s) synced" on effectively every invocation; the real sync
119
+ // points — `prepare`, `mandrel sync`/`update`, doctor's
120
+ // `commands-in-sync` — already cover every case.)
116
121
  entries.push(
117
122
  {
118
123
  phaseGroup: PHASE_GROUPS.IDE_WIRING,
@@ -122,14 +127,6 @@ export function buildMutationManifest(ctx = {}) {
122
127
  'Wire the @.agents/instructions.md system-prompt import so Claude Code hydrates the framework on cold start.',
123
128
  reversible: true,
124
129
  },
125
- {
126
- phaseGroup: PHASE_GROUPS.IDE_WIRING,
127
- target: rel('.claude', 'settings.json'),
128
- action: 'merge',
129
- detail:
130
- 'Add the UserPromptSubmit re-sync hook so the /<command> tree stays current.',
131
- reversible: true,
132
- },
133
130
  {
134
131
  phaseGroup: PHASE_GROUPS.IDE_WIRING,
135
132
  target: rel('.claude', 'commands'),