mandrel 1.93.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -1,660 +0,0 @@
1
- /**
2
- * lib/orchestration/context-hydration-engine.js — Context Hydration Engine (SDK)
3
- *
4
- * Stateless, async logic for assembling the full execution prompt for an
5
- * agent task. Extracted from the CLI entry point to enable reuse across
6
- * consumers (CLI wrappers, tests).
7
- *
8
- * This module is the SDK layer — it has no knowledge of CLI arguments,
9
- * file I/O decisions, or process.exit(). All I/O choices are delegated
10
- * to the caller.
11
- *
12
- * Consumers import `hydrateContext` from this module directly — the former
13
- * `hydrate-context.js` CLI wrapper was retired (#4482) with no live consumer.
14
- *
15
- * @see .agents/scripts/lib/ITicketingProvider.js
16
- */
17
-
18
- import crypto from 'node:crypto';
19
- import fs from 'node:fs';
20
- import path from 'node:path';
21
- import { getCommands } from '../config/commands.js';
22
- import {
23
- getLimits,
24
- getPaths,
25
- PROJECT_ROOT,
26
- resolveConfig,
27
- } from '../config-resolver.js';
28
- import { sliceEpicBodyForDelivery } from '../epic-body-sections.js';
29
- import { resolveFrameworkVersion } from '../framework-version.js';
30
- import { Logger } from '../Logger.js';
31
- import {
32
- buildEnvelope,
33
- DEFAULT_ELIDE_POLICIES,
34
- DEFAULT_SECTION_PRIORITIES,
35
- elideEnvelope,
36
- envelopeToPrompt,
37
- } from './context-envelope.js';
38
- import { loadSkillCapsule } from './skill-capsule-loader.js';
39
-
40
- // ---------------------------------------------------------------------------
41
- // File-content cache — the agent-protocol template and persona files are
42
- // read-only during a dispatch run. Skill bodies are loaded via
43
- // `skills.index.json` + `loadSkillCapsule` (not cached here).
44
- // ---------------------------------------------------------------------------
45
-
46
- const _fileCache = new Map();
47
-
48
- function readFileCached(absPath) {
49
- if (_fileCache.has(absPath)) return _fileCache.get(absPath);
50
- const content = fs.readFileSync(absPath, 'utf8');
51
- _fileCache.set(absPath, content);
52
- return content;
53
- }
54
-
55
- let _skillsIndexCache = null;
56
-
57
- function loadSkillsIndex() {
58
- if (!_skillsIndexCache) {
59
- const indexPath = path.join(
60
- PROJECT_ROOT,
61
- '.agents',
62
- 'skills',
63
- 'skills.index.json',
64
- );
65
- _skillsIndexCache = JSON.parse(fs.readFileSync(indexPath, 'utf8'));
66
- }
67
- return _skillsIndexCache;
68
- }
69
-
70
- /**
71
- * Test-only seam: clear the persona/skill/template cache between runs.
72
- * The `__` prefix matches the project convention for test-only exports
73
- * (see `git-utils.__setGitRunners`, `git-utils.__setSleep`).
74
- */
75
- export function __resetContextCache() {
76
- _fileCache.clear();
77
- _skillsIndexCache = null;
78
- }
79
-
80
- /**
81
- * Resolve activated skills to Policy Capsule payloads via `skills.index.json`.
82
- *
83
- * Capsule-only is the contract (Story #3863, hard cutover): only the Policy
84
- * Capsule is hydrated. The full `SKILL.md` body is never inlined into a task
85
- * prompt — the sub-agent reads it on demand via the rendered pointer path.
86
- *
87
- * @param {object} task - Normalized task (skills[]).
88
- * @param {object} skillsIndex - Parsed `skills.index.json` body.
89
- * @returns {Array<{ skill: string, capsule: string, source: string, path: string }>}
90
- */
91
- export function buildSkillCapsuleSections(task, skillsIndex) {
92
- const entries = [];
93
-
94
- for (const skill of task.skills ?? []) {
95
- try {
96
- const {
97
- capsule,
98
- source,
99
- path: skillPath,
100
- } = loadSkillCapsule(skill, skillsIndex);
101
- entries.push({ skill, capsule, source, path: skillPath });
102
- } catch (err) {
103
- Logger.warn(`[Hydrator] Failed to load skill ${skill}: ${err.message}`);
104
- }
105
- }
106
-
107
- return entries;
108
- }
109
-
110
- /**
111
- * Render skill capsule entries for the prose prompt and envelope
112
- * `skillCapsules` section. Each entry carries its capsule plus a pointer
113
- * instruction so the sub-agent knows to `Read` the full `SKILL.md` when the
114
- * task needs the playbook beyond the capsule's non-negotiables. The source is
115
- * recorded per skill for auditors.
116
- *
117
- * @param {Array<{ skill: string, capsule: string, source: string, path: string }>} entries
118
- * @returns {string}
119
- */
120
- export function formatSkillCapsulesSection(entries) {
121
- if (!entries.length) return '';
122
- let out = '## Activated Skills\n\n';
123
- for (const { skill, capsule, source, path: skillPath } of entries) {
124
- out += `### Skill: ${skill} (source: ${source})\n${capsule}\n\n`;
125
- out += `Read the full playbook on demand: \`Read ${skillPath}\`.\n\n`;
126
- }
127
- return out.trimEnd();
128
- }
129
-
130
- // ---------------------------------------------------------------------------
131
- // Internal helpers
132
- // ---------------------------------------------------------------------------
133
-
134
- /**
135
- * Resolve the framework version. Delegates to the shared
136
- * {@link resolveFrameworkVersion} helper (single owner of the root
137
- * `package.json` read) so the hydrator and the ticket-body stamp read the same
138
- * source. Retained as a thin named wrapper so the mismatch-warning call sites
139
- * below read against a stable local name.
140
- *
141
- * @returns {string}
142
- */
143
- function getVersion() {
144
- return resolveFrameworkVersion();
145
- }
146
-
147
- /**
148
- * Parse the work-breakdown hierarchy from a Task ticket body.
149
- *
150
- * Looks for patterns like: `Epic: #1`, `Story: #3`.
151
- *
152
- * @param {string} body
153
- * @returns {Record<string, number>}
154
- */
155
- function parseHierarchy(body) {
156
- const result = {};
157
- if (!body) return result;
158
-
159
- const matches = [...body.matchAll(/([A-Za-z\s]+):\s*#(\d+)/gi)];
160
- for (const match of matches) {
161
- const key = match[1].trim().toLowerCase().replace(/\s+/g, '');
162
- const val = Number.parseInt(match[2], 10);
163
- result[key] = val; // e.g. { epic: 1, story: 3 }
164
- }
165
- return result;
166
- }
167
-
168
- /**
169
- * Extract the markdown list items under a `## <heading>` section of a
170
- * Story body. Returns an empty array when the section is missing or has
171
- * no list items. Recognises both `- ` (incl. `- [ ]` / `- [x]`) and
172
- * `* ` bullet markers — matches the parser in `manifest-builder.js`
173
- * so the inline-acceptance contract round-trips verbatim across the two
174
- * call sites (manifest projection and context hydration).
175
- *
176
- * @param {string} body
177
- * @param {string} heading
178
- * @returns {string[]}
179
- */
180
- function extractSectionList(body, heading) {
181
- if (typeof body !== 'string' || body.length === 0) return [];
182
- const pattern = new RegExp(
183
- `^##\\s+${heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*$`,
184
- 'mi',
185
- );
186
- const startMatch = body.match(pattern);
187
- if (!startMatch || startMatch.index == null) return [];
188
- const startIdx = startMatch.index + startMatch[0].length;
189
- const rest = body.slice(startIdx);
190
- const nextHeading = rest.search(/^##\s+/m);
191
- const block = nextHeading === -1 ? rest : rest.slice(0, nextHeading);
192
- const items = [];
193
- for (const rawLine of block.split(/\r?\n/)) {
194
- const line = rawLine.trim();
195
- const m = line.match(/^[-*]\s+(?:\[[ xX]\]\s+)?(.*)$/);
196
- if (m && m[1].length > 0) items.push(m[1].trim());
197
- }
198
- return items;
199
- }
200
-
201
- /**
202
- * Extract the inline `## Acceptance` / `## Acceptance Criteria` and
203
- * `## Verify` checklists from a Story body. Used by 2-tier hydration to
204
- * populate the `acceptanceCriteria` and `verificationCommands` envelope
205
- * sections directly from the dispatched Story ticket — under 2-tier the
206
- * Story IS the unit of execution and carries acceptance/verify inline
207
- * (no child tickets to walk).
208
- *
209
- * @param {string} body
210
- * @returns {{ acceptance: string[], verify: string[] }}
211
- */
212
- export function extractStorySections(body) {
213
- const canonical = extractSectionList(body, 'Acceptance Criteria');
214
- const acceptance =
215
- canonical.length > 0 ? canonical : extractSectionList(body, 'Acceptance');
216
- const verify = extractSectionList(body, 'Verify');
217
- return { acceptance, verify };
218
- }
219
-
220
- /**
221
- * Remove one `## <heading>` section (heading line through the last line
222
- * before the next `## ` heading, or EOF) from a Story body. Byte-preserving
223
- * outside the removed span. No-op when the heading is absent. Case- and
224
- * whitespace-tolerant to match `extractSectionList`.
225
- *
226
- * @param {string} body
227
- * @param {string} heading
228
- * @returns {string}
229
- */
230
- function stripSection(body, heading) {
231
- if (typeof body !== 'string' || body.length === 0) return body ?? '';
232
- const pattern = new RegExp(
233
- `^##\\s+${heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*$`,
234
- 'mi',
235
- );
236
- const startMatch = body.match(pattern);
237
- if (!startMatch || startMatch.index == null) return body;
238
- const start = startMatch.index;
239
- const afterHeading = start + startMatch[0].length;
240
- const rest = body.slice(afterHeading);
241
- const nextHeading = rest.search(/^##\s+/m);
242
- const end = nextHeading === -1 ? body.length : afterHeading + nextHeading;
243
- const before = body.slice(0, start).replace(/\n+$/, '\n');
244
- const after = body.slice(end).replace(/^\n+/, '');
245
- return (before + after).replace(/\n{3,}/g, '\n\n').trimEnd();
246
- }
247
-
248
- /**
249
- * Strip the inline `## Acceptance Criteria` / `## Acceptance` and `## Verify`
250
- * sections from a Story body. Used to build the `taskInstructions` section
251
- * when the dedicated `acceptanceCriteria` / `verificationCommands` envelope
252
- * sections already carry those lists — so the binding acceptance/verify
253
- * content appears exactly once in the hydrated envelope rather than being
254
- * duplicated between the dedicated sections and the full task body.
255
- *
256
- * Each heading group is stripped only when its own dedicated section was
257
- * emitted (`acceptance` gates `## Acceptance Criteria` + `## Acceptance`;
258
- * `verify` gates `## Verify`). This keeps the strip symmetric with what was
259
- * reproduced elsewhere in the envelope: a `## Verify` section that carried no
260
- * bullets (so no dedicated `verificationCommands` section fired) is left
261
- * intact in `taskInstructions` rather than being silently dropped. Both flags
262
- * default to `true` so a no-argument call preserves the original
263
- * strip-everything behaviour.
264
- *
265
- * @param {string} body
266
- * @param {{ acceptance?: boolean, verify?: boolean }} [opts]
267
- * @returns {string}
268
- */
269
- export function stripStorySectionsForTaskInstructions(
270
- body,
271
- { acceptance = true, verify = true } = {},
272
- ) {
273
- if (typeof body !== 'string' || body.length === 0) return body ?? '';
274
- let out = body;
275
- if (acceptance) {
276
- out = stripSection(out, 'Acceptance Criteria');
277
- out = stripSection(out, 'Acceptance');
278
- }
279
- if (verify) {
280
- out = stripSection(out, 'Verify');
281
- }
282
- return out;
283
- }
284
-
285
- /**
286
- * Detect whether the dispatched unit is a 2-tier Story (Story is the
287
- * leaf, carries inline acceptance/verify) vs. a 4-tier Task (Task is
288
- * the leaf, Story is one level up). The decision is made off the
289
- * `type::*` label the dispatcher already stamps on every ticket; it
290
- * does not depend on `planning.hierarchy`, so this engine
291
- * stays correct even when a 4-tier Epic ships in a 2-tier-default repo
292
- * (or vice versa) during the Epic #3078 dual-shape window.
293
- *
294
- * @param {object} task
295
- * @returns {boolean}
296
- */
297
- function isTwoTierStoryTask(task) {
298
- const labels = task?.labels ?? [];
299
- return labels.includes('type::story');
300
- }
301
-
302
- /**
303
- * Load and substitute placeholders in the agent-protocol template. Extracted
304
- * from {@link hydrateContext} to keep its complexity manageable.
305
- *
306
- * @param {object} args
307
- * @param {{ templatesRoot: string }} args.paths
308
- * @param {object} args.settings - resolved config (post-reshape `project.*` / `delivery.*` shape)
309
- * @param {string} args.currentVersion
310
- * @param {string} args.taskBranch
311
- * @param {string} args.epicBranch
312
- * @param {string|number} args.taskId
313
- * @returns {string} hydrated template body, or '' on read failure
314
- */
315
- function loadProtocolTemplate({
316
- paths,
317
- settings,
318
- currentVersion,
319
- taskBranch,
320
- epicBranch,
321
- taskId,
322
- }) {
323
- try {
324
- const pTemplatePath = path.join(
325
- PROJECT_ROOT,
326
- paths.templatesRoot,
327
- 'agent-protocol.md',
328
- );
329
- const tpl = readFileCached(pTemplatePath);
330
- const commands = getCommands(settings);
331
- const baseBranch = settings?.baseBranch ?? 'main';
332
- const protectedBranches = Array.isArray(settings?.git?.protectedBranches)
333
- ? settings.git.protectedBranches
334
- : [baseBranch];
335
- const protectedList = protectedBranches.map((b) => `\`${b}\``).join(', ');
336
- return tpl
337
- .replace(/\{\{PROTOCOL_VERSION\}\}/g, currentVersion)
338
- .replace(/\{\{BRANCH_NAME\}\}/g, taskBranch)
339
- .replace(/\{\{EPIC_BRANCH\}\}/g, epicBranch)
340
- .replace(/\{\{TASK_ID\}\}/g, taskId)
341
- .replace(/\{\{VALIDATE_CMD\}\}/g, commands.validate)
342
- .replace(/\{\{TEST_CMD\}\}/g, commands.test)
343
- .replace(/\{\{PROTECTED_BRANCHES\}\}/g, protectedList);
344
- } catch (err) {
345
- Logger.warn(`[Hydrator] Failed to load agent-protocol.md: ${err.message}`);
346
- return '';
347
- }
348
- }
349
-
350
- // ---------------------------------------------------------------------------
351
- // Envelope assembly helpers
352
- // ---------------------------------------------------------------------------
353
-
354
- /**
355
- * @param {object} ticket
356
- * @param {string} retrievedAt
357
- * @returns {import('./context-envelope.js').TicketSnapshot}
358
- */
359
- function ticketSnapshot(ticket, retrievedAt) {
360
- const body = ticket.body ?? '';
361
- const id = ticket.id ?? ticket.number;
362
- const version =
363
- ticket.updatedAt ?? ticket.updated_at ?? ticket.updatedAtISO ?? retrievedAt;
364
- const hash = crypto
365
- .createHash('sha256')
366
- .update(body)
367
- .digest('hex')
368
- .slice(0, 12);
369
- return { id, version: String(version), hash, retrievedAt };
370
- }
371
-
372
- /**
373
- * @param {object} task
374
- * @returns {import('./context-envelope.js').ContextEnvelope['task']}
375
- */
376
- function envelopeTaskFrom(task) {
377
- return {
378
- id: task.id,
379
- title: task.title,
380
- persona: task.persona,
381
- skills: task.skills,
382
- protocolVersion: task.protocolVersion,
383
- };
384
- }
385
-
386
- /**
387
- * @param {object} task
388
- * @param {import('../ITicketingProvider.js').ITicketingProvider} provider
389
- * @param {number} epicId
390
- * @param {object} agentSettings - Legacy-shim settings bag or resolved config.
391
- * @returns {Promise<{ content: string, provenance: import('./context-envelope.js').TicketSnapshot[] }>}
392
- */
393
- async function buildHierarchySections(task, provider, epicId, agentSettings) {
394
- const hierarchyKeys = parseHierarchy(task.body);
395
- let hierarchyContext = '## Work Breakdown Hierarchy\n\n';
396
- const provenance = [];
397
- const retrievedAt = new Date().toISOString();
398
-
399
- const depth = agentSettings?.contextDepth ?? 'standard';
400
- const idsToFetch = [];
401
-
402
- // Story #4324 — the context-ticket classes are retired: the Epic body IS
403
- // the planning document (ideation sections + folded Tech Spec sections).
404
- // `full` and `standard` fetch the identical Epic / Story pair; both
405
- // branches are kept so the `contextDepth` setting stays a stable API
406
- // surface.
407
- if (depth === 'full') {
408
- idsToFetch.push({ key: 'Epic', id: epicId || hierarchyKeys.epic });
409
- idsToFetch.push({ key: 'Story', id: hierarchyKeys.story });
410
- } else if (depth === 'standard') {
411
- idsToFetch.push({ key: 'Epic', id: epicId || hierarchyKeys.epic });
412
- idsToFetch.push({ key: 'Story', id: hierarchyKeys.story });
413
- } else if (depth === 'minimal') {
414
- idsToFetch.push({ key: 'Story', id: hierarchyKeys.story });
415
- }
416
-
417
- const fetchPromises = idsToFetch
418
- .filter((item) => item.id)
419
- .map(async (item) => {
420
- try {
421
- const t = await provider.getTicket(item.id);
422
- provenance.push(ticketSnapshot(t, retrievedAt));
423
- // Hydration section-slicing guardrail (Story #4340): the Epic body
424
- // is sliced down to only the sections a delivery story agent acts
425
- // on — Goal / Non-Goals / User Stories / Tech Spec (plus any
426
- // operator-authored section, fail-open). Ideation / authoring /
427
- // close machinery (## Context, ## Scope, ## Acceptance Criteria,
428
- // and the ## Acceptance Table managed region) is dropped so
429
- // per-story prompt size stays flat versus the pre-fold baseline.
430
- const body =
431
- item.key === 'Epic' ? sliceEpicBodyForDelivery(t.body ?? '') : t.body;
432
- return `### ${item.key}: ${t.title} (#${t.id})\n\n${body}\n`;
433
- } catch (err) {
434
- const detail = err?.message ? `: ${err.message}` : '';
435
- Logger.warn(
436
- `[Hydrator] hierarchy fetch failed for ${item.key} #${item.id}${detail}`,
437
- );
438
- return `### ${item.key}: #${item.id} — ⚠️ unavailable (fetch failed${detail})\n`;
439
- }
440
- });
441
-
442
- const fetchedHierarchy = await Promise.all(fetchPromises);
443
- hierarchyContext += fetchedHierarchy.filter(Boolean).join('\n---\n\n');
444
- return { content: hierarchyContext, provenance };
445
- }
446
-
447
- /**
448
- * @param {object} task
449
- * @param {{ templatesRoot: string, personasRoot: string, skillsRoot: string }} paths
450
- * @param {object} agentSettings - Legacy-shim settings bag or resolved config.
451
- * @param {string} currentVersion
452
- * @param {string} taskBranch
453
- * @param {string} epicBranch
454
- * @returns {{ warnings: string[], sections: import('./context-envelope.js').Section[] }}
455
- */
456
- function buildStaticSections(
457
- task,
458
- paths,
459
- agentSettings,
460
- currentVersion,
461
- taskBranch,
462
- epicBranch,
463
- ) {
464
- const warnings = [];
465
-
466
- if (task.protocolVersion && task.protocolVersion !== currentVersion) {
467
- warnings.push(
468
- `⚠️ WARNING: Protocol version mismatch. Task was planned with v${task.protocolVersion}, but is executing with v${currentVersion}.`,
469
- );
470
- Logger.warn(
471
- `[Hydrator] Protocol version mismatch on Task #${task.id}: planned with v${task.protocolVersion}, executing with v${currentVersion}`,
472
- );
473
- }
474
-
475
- const sections = [];
476
- const protocolTpl = loadProtocolTemplate({
477
- paths,
478
- settings: agentSettings,
479
- currentVersion,
480
- taskBranch,
481
- epicBranch,
482
- taskId: task.id,
483
- });
484
- if (protocolTpl) {
485
- sections.push({
486
- name: 'protocolPolicy',
487
- priority: DEFAULT_SECTION_PRIORITIES.protocolPolicy,
488
- elideWhenOverBudget: DEFAULT_ELIDE_POLICIES.protocolPolicy,
489
- content: protocolTpl,
490
- source: { kind: 'file', ref: 'templates/agent-protocol.md' },
491
- });
492
- }
493
-
494
- if (task.persona) {
495
- try {
496
- const pPath = path.join(
497
- PROJECT_ROOT,
498
- paths.personasRoot,
499
- `${task.persona}.md`,
500
- );
501
- if (fs.existsSync(pPath)) {
502
- sections.push({
503
- name: 'persona',
504
- priority: DEFAULT_SECTION_PRIORITIES.persona,
505
- elideWhenOverBudget: DEFAULT_ELIDE_POLICIES.persona,
506
- content: `## Persona: ${task.persona}\n\n${readFileCached(pPath)}`,
507
- source: { kind: 'file', ref: `personas/${task.persona}.md` },
508
- });
509
- }
510
- } catch (err) {
511
- Logger.warn(
512
- `[Hydrator] Failed to load persona ${task.persona}: ${err.message}`,
513
- );
514
- }
515
- }
516
-
517
- if (task.skills?.length > 0) {
518
- try {
519
- const skillsIndex = loadSkillsIndex();
520
- const entries = buildSkillCapsuleSections(task, skillsIndex);
521
- const skillsContext = formatSkillCapsulesSection(entries);
522
- if (skillsContext) {
523
- sections.push({
524
- name: 'skillCapsules',
525
- priority: DEFAULT_SECTION_PRIORITIES.skillCapsules,
526
- elideWhenOverBudget: DEFAULT_ELIDE_POLICIES.skillCapsules,
527
- content: skillsContext,
528
- source: { kind: 'derived', ref: 'activated-skills' },
529
- });
530
- }
531
- } catch (err) {
532
- Logger.warn(`[Hydrator] Failed to load skills index: ${err.message}`);
533
- }
534
- }
535
-
536
- // Track which dedicated section(s) were emitted so taskInstructions drops
537
- // only the inline sections that were actually reproduced elsewhere in the
538
- // envelope — keeping each binding acceptance/verify item present exactly
539
- // once, without dropping a bulletless section that has no dedicated twin.
540
- let acceptanceEmitted = false;
541
- let verifyEmitted = false;
542
- if (isTwoTierStoryTask(task)) {
543
- const { acceptance, verify } = extractStorySections(task.body ?? '');
544
- if (acceptance.length > 0) {
545
- acceptanceEmitted = true;
546
- sections.push({
547
- name: 'acceptanceCriteria',
548
- priority: DEFAULT_SECTION_PRIORITIES.acceptanceCriteria,
549
- elideWhenOverBudget: DEFAULT_ELIDE_POLICIES.acceptanceCriteria,
550
- content:
551
- `## Acceptance Criteria (Story #${task.id})\n\n` +
552
- acceptance.map((item) => `- ${item}`).join('\n'),
553
- source: { kind: 'ticket', ref: String(task.id) },
554
- });
555
- }
556
- if (verify.length > 0) {
557
- verifyEmitted = true;
558
- sections.push({
559
- name: 'verificationCommands',
560
- priority: DEFAULT_SECTION_PRIORITIES.verificationCommands,
561
- elideWhenOverBudget: DEFAULT_ELIDE_POLICIES.verificationCommands,
562
- content:
563
- `## Verify (Story #${task.id})\n\n` +
564
- verify.map((item) => `- ${item}`).join('\n'),
565
- source: { kind: 'ticket', ref: String(task.id) },
566
- });
567
- }
568
- }
569
-
570
- // When a dedicated acceptance/verify section carries that list, strip the
571
- // matching inline heading(s) from the task body so they are not duplicated
572
- // in taskInstructions. Each group is gated on its own section: an inline
573
- // section with no dedicated twin (e.g. a bulletless `## Verify`) is left
574
- // intact. When neither fired, taskInstructions is byte-identical to the
575
- // full body.
576
- const taskBody =
577
- acceptanceEmitted || verifyEmitted
578
- ? stripStorySectionsForTaskInstructions(task.body ?? '', {
579
- acceptance: acceptanceEmitted,
580
- verify: verifyEmitted,
581
- })
582
- : task.body;
583
- sections.push({
584
- name: 'taskInstructions',
585
- priority: DEFAULT_SECTION_PRIORITIES.taskInstructions,
586
- elideWhenOverBudget: DEFAULT_ELIDE_POLICIES.taskInstructions,
587
- content: `## Task Instructions (Issue #${task.id}: ${task.title})\n\n${taskBody}`,
588
- source: { kind: 'ticket', ref: String(task.id) },
589
- });
590
-
591
- return { warnings, sections };
592
- }
593
-
594
- // ---------------------------------------------------------------------------
595
- // Public SDK export
596
- // ---------------------------------------------------------------------------
597
-
598
- /**
599
- * Hydrate the execution context into a {@link ContextEnvelope}.
600
- *
601
- * @param {object} task - The normalized task object from the dispatcher
602
- * @param {import('../ITicketingProvider.js').ITicketingProvider} provider
603
- * @param {string} epicBranch - e.g. `epic/71`
604
- * @param {string} taskBranch - e.g. `story/epic-71/my-story`
605
- * @param {number} epicId
606
- * @returns {Promise<import('./context-envelope.js').ContextEnvelope>}
607
- */
608
- export async function hydrateContext(
609
- task,
610
- provider,
611
- epicBranch,
612
- taskBranch,
613
- epicId,
614
- ) {
615
- const { agentSettings } = resolveConfig();
616
- const maxTokens = getLimits({
617
- agentSettings: agentSettings ?? {},
618
- }).maxTokenBudget;
619
-
620
- const paths = getPaths({ agentSettings });
621
- const currentVersion = getVersion();
622
- const { warnings, sections: staticSections } = buildStaticSections(
623
- task,
624
- paths,
625
- agentSettings,
626
- currentVersion,
627
- taskBranch,
628
- epicBranch,
629
- );
630
-
631
- const { content: hierarchyContent, provenance } =
632
- await buildHierarchySections(task, provider, epicId, agentSettings);
633
-
634
- const sections = [...staticSections];
635
- const hierarchySection = {
636
- name: 'hierarchy',
637
- priority: DEFAULT_SECTION_PRIORITIES.hierarchy,
638
- elideWhenOverBudget: DEFAULT_ELIDE_POLICIES.hierarchy,
639
- content: hierarchyContent,
640
- source: { kind: 'derived', ref: 'work-breakdown-hierarchy' },
641
- };
642
- const taskIdx = sections.findIndex((s) => s.name === 'taskInstructions');
643
- if (taskIdx >= 0) {
644
- sections.splice(taskIdx, 0, hierarchySection);
645
- } else {
646
- sections.push(hierarchySection);
647
- }
648
-
649
- const envelope = buildEnvelope({
650
- task: envelopeTaskFrom(task),
651
- sections,
652
- provenance,
653
- warnings,
654
- maxTokens,
655
- });
656
-
657
- return elideEnvelope(envelope, maxTokens);
658
- }
659
-
660
- export { envelopeToPrompt };