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
@@ -32,9 +32,11 @@ const EXECUTION_SCHEMA = {
32
32
 
33
33
  /**
34
34
  * `delivery.lease` — assignee-as-lease primitive (Story #3480). `ttlMs` is
35
- * the staleness window: a ticket claim whose owner has not emitted a
36
- * `story.heartbeat` within this many milliseconds is reclaimable by another
37
- * operator. Defaults to 900000 (15 min) in `lib/config/limits.js`.
35
+ * the staleness window: a ticket claim whose owner's last heartbeat is older
36
+ * than this many milliseconds is reclaimable by another operator. Defaults to
37
+ * 900000 (15 min) in `lib/config/limits.js`. Note the shipped guards fail
38
+ * closed (no live heartbeat source since A22 removed the inert emitter), so
39
+ * a stranded claim is cleared with `--steal` rather than by TTL expiry.
38
40
  */
39
41
  const LEASE_SCHEMA = {
40
42
  type: 'object',
@@ -64,40 +66,13 @@ const DELIVER_RUNNER_SCHEMA = {
64
66
  type: 'object',
65
67
  properties: {
66
68
  concurrencyCap: { type: 'integer', minimum: 1 },
67
- progressReportIntervalSec: { type: 'integer', minimum: 0 },
68
- verifyConcurrencyCap: { type: 'integer', minimum: 1 },
69
69
  },
70
70
  additionalProperties: false,
71
71
  };
72
72
 
73
73
  /**
74
- * `delivery.retro.perfThresholds` (Story #3042, Task #3043) — operator-tunable
75
- * gates for the retro perf-signals classifier. Defaults are documented inline
76
- * here and mirrored in `lib/orchestration/retro-perf-heuristics.js
77
- * (DEFAULT_RETRO_PERF_THRESHOLDS)` and the static schema mirror.
78
- *
79
- * `utilisation` / `bootstrapShare` are unit-interval ratios; values outside
80
- * [0, 1] fall back to defaults at the resolver. `capBindingRunLength` is a
81
- * positive integer count of consecutive cap-binding waves.
74
+ * `delivery.worktreeIsolation` — per-Story git worktree provisioning.
82
75
  */
83
- const RETRO_PERF_THRESHOLDS_SCHEMA = {
84
- type: 'object',
85
- properties: {
86
- utilisation: { type: 'number', minimum: 0, maximum: 1 },
87
- bootstrapShare: { type: 'number', minimum: 0, maximum: 1 },
88
- capBindingRunLength: { type: 'integer', minimum: 1 },
89
- },
90
- additionalProperties: false,
91
- };
92
-
93
- const RETRO_SCHEMA = {
94
- type: 'object',
95
- properties: {
96
- perfThresholds: RETRO_PERF_THRESHOLDS_SCHEMA,
97
- },
98
- additionalProperties: false,
99
- };
100
-
101
76
  const WORKTREE_ISOLATION_SCHEMA = {
102
77
  type: 'object',
103
78
  properties: {
@@ -110,11 +85,15 @@ const WORKTREE_ISOLATION_SCHEMA = {
110
85
  primeFromPath: { type: ['string', 'null'], minLength: 1 },
111
86
  allowSymlinkOnWindows: { type: 'boolean' },
112
87
  reapOnSuccess: { type: 'boolean' },
113
- reapOnCancel: { type: 'boolean' },
114
88
  bootstrapFiles: {
115
89
  type: 'array',
116
90
  items: { type: 'string', minLength: 1 },
117
- default: ['.env', '.mcp.json'],
91
+ default: [
92
+ '.env',
93
+ '.mcp.json',
94
+ '.agentrc.local.json',
95
+ '.agents/instructions.local.md',
96
+ ],
118
97
  },
119
98
  },
120
99
  additionalProperties: false,
@@ -132,20 +111,14 @@ const WORKTREE_ISOLATION_SCHEMA = {
132
111
  };
133
112
 
134
113
  /**
135
- * `delivery.signals` — detector thresholds for the three surviving
136
- * performance-signal categories. `churn` and `idle` were dropped (low
137
- * signal-to-noise). Each block is shallow-merged by the resolver.
114
+ * `delivery.signals` — detector thresholds for the surviving
115
+ * performance-signal categories. `hotspot` was retired with its detector
116
+ * (Epic #4406); `churn` and `idle` were dropped earlier (low signal-to-noise).
117
+ * Each block is shallow-merged by the resolver.
138
118
  */
139
119
  const SIGNALS_SCHEMA = {
140
120
  type: 'object',
141
121
  properties: {
142
- hotspot: {
143
- type: 'object',
144
- properties: {
145
- p95Multiplier: { type: 'number', minimum: 0 },
146
- },
147
- additionalProperties: false,
148
- },
149
122
  rework: {
150
123
  type: 'object',
151
124
  properties: {
@@ -165,115 +138,73 @@ const SIGNALS_SCHEMA = {
165
138
  };
166
139
 
167
140
  /**
168
- * `delivery.lifecycle` — knobs consumed by the lifecycle event bus
169
- * (Epic #2172). `timeouts` is a per-event budget map (eventName → seconds)
170
- * used by Story 11's `TimeoutWatchdog` listener; missing entries fall back
171
- * to in-listener defaults. `heartbeatWarnSeconds` is the no-progress
172
- * threshold consumed by `HeartbeatMonitor`. Story #2227 lays down the
173
- * keys; consumers land in later stories.
174
- */
175
- const LIFECYCLE_SCHEMA = {
176
- type: 'object',
177
- properties: {
178
- timeouts: {
179
- type: 'object',
180
- additionalProperties: { type: 'integer', minimum: 1 },
181
- },
182
- heartbeatWarnSeconds: { type: 'integer', minimum: 1 },
183
- },
184
- additionalProperties: false,
185
- };
186
-
187
- /**
188
- * `delivery.mergeWatch` knobs consumed by the MergeWatcher lifecycle
189
- * listener (Story #2896, Epic #2880). `intervalSeconds` is the poll
190
- * cadence between `gh pr view --json mergeCommit,mergedAt` probes after
191
- * `epic.merge.armed`; `maxBudgetSeconds` is the total wall-clock budget
192
- * before the watcher surfaces `agent::blocked` with reason
193
- * `budget-exceeded`. Both keys default in the listener when omitted
194
- * (30s / 3600s).
141
+ * `delivery.mergeWatch` — knobs consumed by the close-and-land merge wait
142
+ * listener (Story #2896, Epic #2880) and by the close-and-land merge wait
143
+ * (`single-story-close/phases/confirm-merge.js`). `intervalSeconds` is the
144
+ * poll cadence between `gh pr view` probes after the arm.
145
+ *
146
+ * The two budgets are deliberately separate axes (Story #4543):
147
+ *
148
+ * - `maxWaitSeconds` bounds **one invocation** of the merge wait. Its
149
+ * default (300s) fits inside a single host tool invocation, whose
150
+ * ceiling is ~10 minutes; the gates that run before the wait already
151
+ * consume minutes of that. Expiry is NOT a block — the wait returns a
152
+ * resumable `pending` terminal with no label mutation. A headless caller
153
+ * with no such ceiling raises it to keep land-in-one-block semantics.
154
+ * - `maxBudgetSeconds` bounds the **cumulative** wait across resumes,
155
+ * anchored at the PR's `createdAt` so re-entering the wait does not
156
+ * restart the clock. Exhausting *this* is the genuine give-up condition
157
+ * that classifies and blocks.
158
+ *
159
+ * `updateAttempts` caps how many times the wait will bring a
160
+ * behind-the-base PR up to date before giving the branch up as unwinnable,
161
+ * rather than waiting out the budget behind a base it could have merged.
162
+ * All keys default in the consumer when omitted (30s / 300s / 3600s / 3).
195
163
  */
196
164
  const MERGE_WATCH_SCHEMA = {
197
165
  type: 'object',
198
166
  properties: {
199
167
  intervalSeconds: { type: 'integer', minimum: 1 },
168
+ maxWaitSeconds: { type: 'integer', minimum: 1 },
200
169
  maxBudgetSeconds: { type: 'integer', minimum: 1 },
170
+ updateAttempts: { type: 'integer', minimum: 0 },
201
171
  },
202
172
  additionalProperties: false,
203
173
  };
204
174
 
205
175
  /**
206
- * `delivery.epicAudit` bounded-retry knobs for /deliver Phase 4
207
- * (epic-audit). `maxFixAttempts` caps how many times the auto-fix loop
208
- * retries a single finding (Story #2611, Epic #2586). `maxFixScopeFiles`
209
- * caps how many files a single auto-fix may touch before escalating to
210
- * `agent::blocked` (default 5) — a deliberately narrow bound for
211
- * unattended auto-fixes, independent of the Story-sizing thresholds in
212
- * `ticket-validator-sizing.js`.
213
- *
214
- * `autoFixSeverity` (Story #4399) is the threshold that governs which findings
215
- * the Epic-close host-LLM remediation loop fixes on-branch. It is **tier-aware**
216
- * (Story #4412, Epic #4405): the Epic-close audit tier defaults to `high`
217
- * (route only 🔴 Critical + 🟠 High into remediation; 🟡 Medium + 🟢 Suggestion
218
- * graduate to follow-up issues) because 🟡 Medium code-quality concerns are
219
- * already remediated shift-left at the write-time and Story-scope tiers — the
220
- * slim outermost tier stops re-paying to fix them where a fix is most
221
- * expensive. Setting `medium` opts back into routing 🔴/🟠/🟡 on-branch. The
222
- * enum is the single validation seam: a configured value round-trips through
223
- * the resolver, and any value outside `['high', 'medium']` is rejected at load.
224
- * Hard cutover per `rules/git-conventions.md` — there is no back-compat flag.
176
+ * `delivery.epicAudit` was removed on v2 (Story-only delivery — no
177
+ * epic-audit runner). Remediation policy lives on `delivery.codeReview`
178
+ * (`CODE_REVIEW_SCHEMA` imported from the quality schema module).
225
179
  */
226
- const EPIC_AUDIT_SCHEMA = {
227
- type: 'object',
228
- properties: {
229
- maxFixAttempts: { type: 'integer', minimum: 0 },
230
- maxFixScopeFiles: { type: 'integer', minimum: 1 },
231
- autoFixSeverity: { type: 'string', enum: ['high', 'medium'] },
232
- },
233
- additionalProperties: false,
234
- };
235
180
 
236
- // Epic #4475 (M4-A) — single-delivery routing kill-switch.
237
- // `delivery.routing.singleDelivery` (default true via getDeliveryRouting) is
238
- // the global kill-switch for the single-delivery route. When true (the
239
- // default), an Epic marked `delivery::single` at plan time routes to the
240
- // single-delivery helper; when false, EVERY Epic — even a single-marked one —
241
- // is forced down the fan-out path (the instant, code-rollback-free per-consumer
242
- // revert). Shipped INERT in M4-A: the router's single verdict falls through to
243
- // fan-out until M4-B wires the executor, so the knob has no observable effect
244
- // yet.
245
181
  // Epic #4478 (M7-B) — role-scoped-agent kill-switch + maker-checker floor.
182
+ // Stage 6 dropped `delivery.routing.singleDelivery` (v1 epic route switch).
246
183
  // `delivery.routing.roleScopedAgents` (default true via getDeliveryRouting)
247
184
  // flips converted delivery spawns onto their `.claude/agents/<role>.md` boot
248
185
  // context; false falls back to `subagent_type: general-purpose` (the instant
249
186
  // per-consumer revert + the escape for hosts that ignore `.claude/agents/`).
250
187
  // `delivery.routing.freshCriticSampleRate` (default 0.2, clamped [0, 1]) is the
251
- // maker-checker sampling floor forcing a fraction of low-risk acceptance
252
- // clusters through a fresh critic.
188
+ // maker-checker sampling floor forcing a fraction of low-derived-level
189
+ // acceptance clusters through a fresh critic.
253
190
  const ROUTING_SCHEMA = {
254
191
  type: 'object',
255
192
  properties: {
256
- singleDelivery: { type: 'boolean' },
257
193
  roleScopedAgents: { type: 'boolean' },
258
194
  freshCriticSampleRate: { type: 'number', minimum: 0, maximum: 1 },
195
+ ceremonyProfile: {
196
+ type: 'string',
197
+ enum: ['minimal', 'standard', 'strict'],
198
+ },
199
+ closeAndLand: { type: 'boolean' },
259
200
  },
260
201
  additionalProperties: false,
261
202
  };
262
203
 
263
- // Story #2899 (Epic #2880) — performance defaults + preflight (F13).
264
- // `delivery.ci.skipForStoryPushes` (default true via getCiDelivery): when
265
- // true, pre-push tooling appends a `[skip ci]` trailer to Story-branch
266
- // commit subjects so intermediate pushes do not stampede the CI fleet.
267
- // The Epic-branch merge commit produced by story-close.js's merge
268
- // runner never carries the marker, regardless of this flag.
269
- //
270
- // Story #4356 (Epic #4355) — CI-aware delivery namespace. `earlyPr` gates
271
- // whether /deliver opens the Epic PR early (before every Story merges) so CI
272
- // starts warming while later waves run; defaults to `true` via getCiDelivery.
273
- // `watch.*` tunes the merge/CI watch poll loop (poll cadence, poll cap, and
274
- // how many times the watcher may resume after a transient stall).
275
- // `autoMerge` selects the merge posture: `"trust-ci"` (default) merges once
276
- // required checks pass, `"strict"` additionally requires a clean review gate.
204
+ // Story #4356 (Epic #4355) — CI-aware delivery namespace. `watch.*` tunes
205
+ // the merge/CI watch poll loop; `autoMerge` selects the merge posture.
206
+ // Retired: `earlyPr` (Epic early-PR warmup) and `requireChecks` (no
207
+ // AutomergePredicate reader on v2).
277
208
  const CI_WATCH_SCHEMA = {
278
209
  type: 'object',
279
210
  properties: {
@@ -287,33 +218,8 @@ const CI_WATCH_SCHEMA = {
287
218
  const CI_DELIVERY_SCHEMA = {
288
219
  type: 'object',
289
220
  properties: {
290
- skipForStoryPushes: { type: 'boolean' },
291
- earlyPr: { type: 'boolean' },
292
221
  watch: CI_WATCH_SCHEMA,
293
222
  autoMerge: { type: 'string', enum: ['trust-ci', 'strict'] },
294
- // Story #4472 — fail-closed-without-checks policy. When `true`, the
295
- // AutomergePredicate refuses to arm merge in a repo that reports zero
296
- // required checks ("no checks reported"), treating the absence of a CI
297
- // gate as a hard block instead of green. Defaults to `false` so a
298
- // checks-less repo with green close-validation gates lands headlessly
299
- // rather than parking on the operator-merges path.
300
- requireChecks: { type: 'boolean' },
301
- },
302
- additionalProperties: false,
303
- };
304
-
305
- // Story #2899 (Epic #2880) — `delivery.preflight.*` thresholds consumed
306
- // by `epic-deliver-preflight.js`. When any value is exceeded the CLI
307
- // surfaces a breach in its envelope and the workflow flips the Epic to
308
- // `agent::blocked` (see /deliver Phase 1 prelude).
309
- const PREFLIGHT_SCHEMA = {
310
- type: 'object',
311
- properties: {
312
- maxStories: { type: 'integer', minimum: 1 },
313
- maxWaves: { type: 'integer', minimum: 1 },
314
- maxInstallCostSeconds: { type: 'integer', minimum: 1 },
315
- maxGithubApiRequests: { type: 'integer', minimum: 1 },
316
- maxClaudeQuotaTokens: { type: 'integer', minimum: 1 },
317
223
  },
318
224
  additionalProperties: false,
319
225
  };
@@ -401,31 +307,19 @@ export const DELIVERY_SCHEMA = {
401
307
  type: 'object',
402
308
  properties: {
403
309
  execution: EXECUTION_SCHEMA,
404
- maxTokenBudget: { type: 'integer', minimum: 1 },
405
310
  lease: LEASE_SCHEMA,
406
311
  docsFreshness: DOCS_FRESHNESS_SCHEMA,
407
312
  deliverRunner: DELIVER_RUNNER_SCHEMA,
408
313
  worktreeIsolation: WORKTREE_ISOLATION_SCHEMA,
409
314
  signals: SIGNALS_SCHEMA,
410
315
  quality: QUALITY_SCHEMA,
411
- lifecycle: LIFECYCLE_SCHEMA,
412
316
  mergeWatch: MERGE_WATCH_SCHEMA,
413
- epicAudit: EPIC_AUDIT_SCHEMA,
414
317
  codeReview: CODE_REVIEW_SCHEMA,
415
- retro: RETRO_SCHEMA,
416
318
  refactorStage: REFACTOR_STAGE_SCHEMA,
417
319
  acceptanceEval: ACCEPTANCE_EVAL_SCHEMA,
418
320
  feedbackLoop: FEEDBACK_LOOP_SCHEMA,
419
321
  ci: CI_DELIVERY_SCHEMA,
420
322
  routing: ROUTING_SCHEMA,
421
- preflight: PREFLIGHT_SCHEMA,
422
- // Cross-Story concurrency-hazard gate (Story #2297). When true,
423
- // `epic-deliver-prepare` refuses to flip the Epic to
424
- // `agent::executing` if the upcoming waves still carry any conflict
425
- // finding (Story #2296). Off by default; operators using the gate
426
- // also need to wire findings into prepare via the runtime injection
427
- // surface.
428
- failOnConcurrencyHazards: { type: 'boolean' },
429
323
  },
430
324
  additionalProperties: false,
431
325
  };
@@ -14,12 +14,20 @@
14
14
  // aggregate into per-gate files under `config/gates/`.
15
15
  import { GATES_SCHEMA } from './config/gates/index.js';
16
16
 
17
+ // Story #4531: miDropMustRefactor (here) and autoRefresh.miDropCap (below)
18
+ // were retired. Both were schema-validated, defaulted, and resolved, but
19
+ // never consumed by the gate they were named for — quality-preview.js's
20
+ // computeExitCode short-circuits on miExit (derived from the ALREADY-
21
+ // consumed delivery.quality.gates.maintainability.tolerance) before either
22
+ // knob is ever read. maintainability.tolerance is now the single documented
23
+ // MI-drop control. See lib/migrations/index.js for the consumer-config
24
+ // migration that strips these keys on upgrade (additionalProperties: false
25
+ // below means a leftover key is a hard AJV failure, not a silent no-op).
17
26
  const CODING_GUARDRAILS_SCHEMA = {
18
27
  type: 'object',
19
28
  properties: {
20
29
  cyclomaticFlag: { type: 'integer', minimum: 1 },
21
30
  cyclomaticMustFix: { type: 'integer', minimum: 1 },
22
- miDropMustRefactor: { type: 'number', minimum: 0 },
23
31
  requireSiblingTest: { type: 'boolean' },
24
32
  },
25
33
  additionalProperties: false,
@@ -29,7 +37,6 @@ const AUTO_REFRESH_SCHEMA = {
29
37
  type: 'object',
30
38
  properties: {
31
39
  enabled: { type: 'boolean' },
32
- miDropCap: { type: 'number', minimum: 0 },
33
40
  crapJumpCap: { type: 'number', minimum: 0 },
34
41
  scope: { type: 'string', enum: ['diff', 'full'] },
35
42
  },
@@ -123,12 +130,11 @@ export const QUALITY_SCHEMA = {
123
130
  };
124
131
 
125
132
  /**
126
- * `delivery.codeReview` — sibling to `delivery.epicAudit`. Same bounded
127
- * retry + scope cap, applied to /deliver Phase 5 (code-review).
133
+ * `delivery.codeReview` — review-provider chain + bounded-retry knobs for
134
+ * the /deliver code-review ceremony (Story-close and plan-run close).
128
135
  *
129
- * `autoFixSeverity` (Story #4399) is the sibling of
130
- * `delivery.epicAudit.autoFixSeverity`: the threshold that governs which
131
- * Phase 5 findings the host-LLM focused-fix routing remediates on-branch —
136
+ * `autoFixSeverity` (Story #4399) is the threshold that governs which
137
+ * findings the host-LLM focused-fix routing remediates on-branch —
132
138
  * `medium` (default) routes 🔴/🟠/🟡 while 🟢 still graduates, `high`
133
139
  * reproduces the pre-4399 Critical/High-only routing.
134
140
  */
@@ -144,15 +150,10 @@ export const CODE_REVIEW_SCHEMA = {
144
150
  // hatch reserved for adapter-specific options.
145
151
  //
146
152
  // Story #2871 added `security-review` to the inline registry plus
147
- // a multi-provider `providers: []` chain shape. When `providers` is
148
- // set and non-empty, it wins over the legacy single-string
149
- // `provider` field. Chain entries can also reference the
150
- // `ultrareview` manual-prompt provider via `manualPrompt: true`.
151
- provider: {
152
- type: 'string',
153
- enum: ['native', 'codex', 'security-review'],
154
- default: 'native',
155
- },
153
+ // the `providers: []` chain shape. Chain entries can also reference
154
+ // the `ultrareview` manual-prompt provider via `manualPrompt: true`.
155
+ // When `providers` is unset or empty, the factory defaults to
156
+ // `[{ name: 'native' }]`.
156
157
  providers: {
157
158
  type: 'array',
158
159
  items: {
@@ -109,25 +109,57 @@ const PROJECT_SCHEMA = {
109
109
 
110
110
  /**
111
111
  * Curated webhook event vocabulary. The webhook channel is gated by an
112
- * explicit allowlist of event names — the webhook narrative is "epic %
113
- * progress + blockers", not the firehose of per-story transitions that the
114
- * GitHub-comment channel still receives.
112
+ * explicit allowlist of event names — the vocabulary mirrors the events the
113
+ * v2 runtime actually emits through `notify()` (Story transitions, merge
114
+ * outcomes, loop lifecycle beats).
115
+ *
116
+ * `story.heartbeat` was retired here (A22): the vocabulary's contract is
117
+ * "events the runtime actually emits", and nothing could emit this one. Its
118
+ * emitter (`emit-story-heartbeat.js`) demanded an `epicId >= 1` while the
119
+ * sole call path (`single-story-init.js` → `setActiveStoryEnv`) passed
120
+ * `epicId: null`, so `CC_EPIC_ID` was never set and the hook that would have
121
+ * fired the beat always short-circuited. Emitter, hook, and schema are all
122
+ * deleted; keeping the name allowlistable would let an operator subscribe to
123
+ * a channel that can never deliver. Removing it from the enum makes a
124
+ * resurrection fail loudly at config-validation time rather than silently
125
+ * never firing.
115
126
  */
116
127
  export const WEBHOOK_EVENT_NAMES = Object.freeze([
117
- 'epic-started',
118
- 'epic-progress',
119
- 'epic-blocked',
120
- 'epic-unblocked',
121
- 'epic-complete',
128
+ 'state-transition',
129
+ 'story-merged',
130
+ 'story-closing',
131
+ 'operator-message',
132
+ 'merge.unlanded',
133
+ 'merge.flip-failed',
134
+ 'loop.tick',
122
135
  ]);
123
136
 
124
137
  /**
125
138
  * Curated GitHub-comment event vocabulary. The comment channel is gated by
126
139
  * an explicit allowlist of event names — same model as `webhookEvents`.
140
+ *
141
+ * **Deliberately narrower than {@link WEBHOOK_EVENT_NAMES}**, and the axis
142
+ * is ticket scope, not importance. A comment is written *onto a Story
143
+ * issue*, so only events that are about one Story, and whose message reads
144
+ * as narrative an operator wants durably on the ticket, belong here. The
145
+ * webhook-only remainder — `merge.unlanded`, `merge.flip-failed`,
146
+ * `loop.tick` — are run-scoped or firehose beats;
147
+ * mirroring them onto the ticket would bury the narrative under machine
148
+ * chatter, and `notify()` drops a comment for any dispatch without a
149
+ * resolvable ticket id regardless.
150
+ *
151
+ * `story-closing` IS in scope by that rule (Story-scoped, `level: 'story'`,
152
+ * human-readable — the same shape as `story-merged`) and its earlier
153
+ * absence was an oversight: the event was emittable to webhooks but could
154
+ * not be allowlisted for comments at all. It is in the vocabulary but NOT
155
+ * in the shipped default (`config/github.js` `NOTIFICATIONS_DEFAULTS`) —
156
+ * opting in is an operator choice, not a behaviour change forced on every
157
+ * consumer.
127
158
  */
128
159
  export const COMMENT_EVENT_NAMES = Object.freeze([
129
160
  'state-transition',
130
161
  'story-merged',
162
+ 'story-closing',
131
163
  'operator-message',
132
164
  ]);
133
165
 
@@ -208,19 +240,14 @@ const GITHUB_SCHEMA = {
208
240
  // planning.* — inputs to /plan
209
241
  // ---------------------------------------------------------------------------
210
242
 
211
- /**
212
- * `planning.context` bounded planning-context budget for `--emit-context`
213
- * payloads. When the full payload would exceed `maxBytes`, planners switch
214
- * to a summary representation.
215
- */
216
- const PLANNING_CONTEXT_SCHEMA = {
217
- type: 'object',
218
- properties: {
219
- maxBytes: { type: 'integer', minimum: 1024 },
220
- summaryMode: { type: 'string', enum: ['auto', 'always', 'never'] },
221
- },
222
- additionalProperties: false,
223
- };
243
+ // Story #4541: `planning.context.{maxBytes, summaryMode}` was retired. The
244
+ // `applyBudget` pass it fed lost its last caller in the v2 cutover, and it
245
+ // bounded a field the envelope builders discarded before shipping the raw seed
246
+ // anyway so the key resolved but capped nothing. The live bound on
247
+ // planner-context size is the fixed `PLAN_CONTEXT_ENVELOPE_BYTE_CEILING` in
248
+ // `lib/orchestration/plan-context.js`. Setting `planning.context` is now
249
+ // rejected as an additional property, so a resurrected key fails loudly rather
250
+ // than silently doing nothing.
224
251
 
225
252
  /**
226
253
  * Story #2634 — `planning.codebaseSnapshot` controls the structural
@@ -246,66 +273,79 @@ const CODEBASE_SNAPSHOT_SCHEMA = {
246
273
  additionalProperties: false,
247
274
  };
248
275
 
249
- /**
250
- * `planning.taskSizing` — Story-sizing thresholds consumed by
251
- * `ticket-validator-sizing.js`. Operator overrides shallow-merge with
252
- * `DEFAULT_TASK_SIZING` defaults (softFiles 15, hardFiles 30,
253
- * softAcceptanceCount 10 — the uniform relaxed profile from Story #3874).
254
- * Story #3760 collapsed the per-profile matrix and the parallel
255
- * `testSurface` axis into a flat set of knobs; the `sizingProfile` enum was
256
- * replaced by an optional body-level `wide` declaration that lifts the
257
- * `hardFiles` rejection. The hard `maxAcceptance` ceiling was removed after
258
- * the Epic #4355 decomposition experiment — acceptance mass is advisory-only.
259
- */
260
- const TASK_SIZING_SCHEMA = {
261
- type: 'object',
262
- properties: {
263
- softFiles: { type: 'integer', minimum: 1 },
264
- hardFiles: { type: 'integer', minimum: 1 },
265
- softAcceptanceCount: { type: 'integer', minimum: 1 },
266
- // Under-size (merge-candidate) thresholds (Story #4312). A Story whose
267
- // footprint is at or below BOTH ceilings and that carries a `depends_on`
268
- // edge to a sibling trips the advisory `merge-candidate` soft finding.
269
- mergeCandidateMaxFiles: { type: 'integer', minimum: 1 },
270
- mergeCandidateMaxAcceptance: { type: 'integer', minimum: 1 },
271
- },
272
- additionalProperties: false,
273
- };
274
-
275
276
  const PLANNING_SCHEMA = {
276
277
  type: 'object',
277
278
  properties: {
278
279
  riskHeuristics: LIST_OR_EXTENDER_OF_STRINGS,
279
- context: PLANNING_CONTEXT_SCHEMA,
280
280
  codebaseSnapshot: CODEBASE_SNAPSHOT_SCHEMA,
281
- taskSizing: TASK_SIZING_SCHEMA,
282
281
  // Cross-Story conflict-finding severity gates. Off by default so
283
282
  // existing repos keep advisory-only behaviour; flipping either to
284
283
  // `true` upgrades the matching finding class to `'hard'`, which routes
285
284
  // it through the validator's `errors[]` channel and trips the bounded
286
285
  // decompose loop's re-prompt gate.
287
- failOnSharedEditors: { type: 'boolean' },
288
- requireExplicitCrossStoryDeps: { type: 'boolean' },
286
+ // `planning.modelCapacity` was collapsed to the framework constant
287
+ // `DEFAULT_MODEL_CAPACITY` in ticket-validator-sizing.js (authored-
288
+ // tokens-only mass); setting it in a config is rejected as an
289
+ // additional property.
290
+ failOnSharedEditors: {
291
+ type: 'boolean',
292
+ description:
293
+ 'When true, upgrade shared-editor conflict findings to hard errors (default false — advisory soft findings only).',
294
+ },
295
+ requireExplicitCrossStoryDeps: {
296
+ type: 'boolean',
297
+ description:
298
+ 'When true, upgrade implicit cross-Story dependency findings to hard errors (default false — advisory soft findings only).',
299
+ },
289
300
  // Cross-cutting registry conflict knobs consumed by
290
301
  // `ticket-validator-conflicts.js` (wired through
291
302
  // `epic-plan-decompose/phases/planning-artifacts.js`).
292
303
  // `crossCuttingRegistries` names the registry paths whose concurrent
293
304
  // edits are flagged; `failOnRegistryConflicts` upgrades that finding to
294
305
  // `'hard'`. `failOnLargeFanOut` / `largeFanOutThreshold` gate the
295
- // single-Story fan-out finding.
296
- crossCuttingRegistries: LIST_OR_EXTENDER_OF_STRINGS,
297
- failOnRegistryConflicts: { type: 'boolean' },
298
- failOnLargeFanOut: { type: 'boolean' },
299
- largeFanOutThreshold: { type: 'integer', minimum: 0 },
306
+ // delete blast-radius finding (call sites of a module a Story marks
307
+ // `assumption: "deletes"`).
308
+ crossCuttingRegistries: {
309
+ ...LIST_OR_EXTENDER_OF_STRINGS,
310
+ description:
311
+ 'Registry path patterns whose concurrent edits across Stories are flagged as conflicts. Defaults to the framework listener/handler index patterns when omitted.',
312
+ },
313
+ failOnRegistryConflicts: {
314
+ type: 'boolean',
315
+ description:
316
+ 'When true, upgrade cross-cutting registry conflict findings to hard errors (default false).',
317
+ },
318
+ failOnLargeFanOut: {
319
+ type: 'boolean',
320
+ description:
321
+ 'When true, upgrade fan-out-warning findings (delete blast radius) to hard errors (default false — soft advisory).',
322
+ },
323
+ largeFanOutThreshold: {
324
+ type: 'integer',
325
+ minimum: 0,
326
+ description:
327
+ 'Call-site count above which a Story that deletes a module emits a fan-out-warning. Counts base-branch references to the deleted path basename. Soft by default; does not size or reject Stories. Default 10.',
328
+ },
300
329
  // Navigability-reachability config consumed by the plan-persist draft
301
- // reachability gate (Epic #4131 F7; demoted into persist by #4474 PR6
302
- // the manual epic-plan-healthcheck --paranoid re-check reads it too).
330
+ // reachability gate (Epic #4131 F7; demoted into persist by #4474 PR6).
303
331
  // Opt-in: absent or empty routeGlobs degrades to a silent no-op.
304
332
  navigation: {
305
333
  type: 'object',
334
+ description:
335
+ 'Opt-in navigability reachability gate. Absent or empty routeGlobs is a silent no-op.',
306
336
  properties: {
307
- routeGlobs: { type: 'array', items: { type: 'string' } },
308
- navRegistry: { type: 'array', items: { type: 'string' } },
337
+ routeGlobs: {
338
+ type: 'array',
339
+ items: { type: 'string' },
340
+ description:
341
+ 'Glob patterns (e.g. pages/**, app/**/route.ts) marking paths that add a user-facing route.',
342
+ },
343
+ navRegistry: {
344
+ type: 'array',
345
+ items: { type: 'string' },
346
+ description:
347
+ 'Tokens identifying the nav-registry SSOT a route-adding Story is expected to reference.',
348
+ },
309
349
  },
310
350
  additionalProperties: false,
311
351
  },