@deftai/directive-runtime 0.126.0-beta.3 → 0.128.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 (430) hide show
  1. package/.agents/skills/deft-directive-release/SKILL.md +428 -7
  2. package/.githooks/_directive-run.sh +30 -0
  3. package/.githooks/pre-commit +4 -24
  4. package/.githooks/pre-push +11 -17
  5. package/Taskfile.yml +17 -16
  6. package/contracts/design-critique.md +5 -0
  7. package/dist/cli-router/route-argv.js +1 -0
  8. package/dist/contract-entry.js +2 -4
  9. package/dist/coverage-hotspots.js +2 -2
  10. package/dist/dispatch.d.ts +1 -1
  11. package/dist/dispatch.js +8 -6
  12. package/dist/doctor-diagnose.js +10 -7
  13. package/dist/hook-dispatch.d.ts +1 -1
  14. package/dist/hook-dispatch.js +1 -1
  15. package/dist/install-cli/coverage-map.d.ts +1 -5
  16. package/dist/install-cli/coverage-map.js +28 -22
  17. package/dist/installer-output-inventory.js +1 -4
  18. package/dist/lifecycle-cli/coverage-map.js +37 -35
  19. package/dist/migrate.js +12 -7
  20. package/dist/policy.d.ts +4 -2
  21. package/dist/policy.js +101 -2
  22. package/dist/pre-pr-run.d.ts +2 -0
  23. package/dist/pre-pr-run.js +40 -0
  24. package/dist/removal-steps/index.d.ts +2 -2
  25. package/dist/removal-steps/steps.js +6 -9
  26. package/dist/removal-steps/strategies.js +1 -1
  27. package/dist/render-cli/capability-map-cli.d.ts +3 -0
  28. package/dist/render-cli/capability-map-cli.js +6 -0
  29. package/dist/setup-wiring.d.ts +6 -0
  30. package/dist/setup-wiring.js +20 -7
  31. package/dist/setup.js +12 -14
  32. package/dist/uninstall.js +1 -1
  33. package/dist/vbrief-preflight-fixtures.js +1 -1
  34. package/dist/verify-intent-constraint.d.ts +2 -0
  35. package/dist/verify-intent-constraint.js +24 -0
  36. package/dist/verify-observable-scope.d.ts +2 -0
  37. package/dist/verify-observable-scope.js +24 -0
  38. package/docs/getting-started.md +2 -0
  39. package/docs/intent-constraint.md +7 -1
  40. package/docs/known-limitations.md +1 -0
  41. package/docs/launcher.md +10 -0
  42. package/docs/observable-scope.md +6 -0
  43. package/package.json +1 -1
  44. package/packs/skills/skills-pack-0.1.json +3 -3
  45. package/scm/github.md +1 -0
  46. package/skills/deft-directive-feedback/SKILL.md +9 -20
  47. package/skills/deft-directive-pre-pr/SKILL.md +13 -3
  48. package/skills/deft-directive-release/SKILL.md +4 -4
  49. package/skills/deft-directive-review-cycle/SKILL.md +2 -2
  50. package/skills/deft-directive-setup/SKILL.md +17 -41
  51. package/skills/deft-directive-swarm/references/host-cursor.md +18 -1
  52. package/skills/deft-directive-swarm/references/host-grok-build.md +3 -3
  53. package/skills/deft-directive-sync/SKILL.md +2 -2
  54. package/skills/deft-directive-tutorial/SKILL.md +1 -1
  55. package/tasks/agent.yml +0 -2
  56. package/tasks/cache.yml +0 -16
  57. package/tasks/capacity.yml +0 -4
  58. package/tasks/change.yml +0 -4
  59. package/tasks/codebase.yml +0 -10
  60. package/tasks/commit.yml +0 -2
  61. package/tasks/coverage.yml +0 -2
  62. package/tasks/decision.yml +0 -4
  63. package/tasks/directive.yml +0 -1
  64. package/tasks/docs.yml +6 -10
  65. package/tasks/engine-invoke.cjs +79 -0
  66. package/tasks/engine-invoke.test.cjs +84 -0
  67. package/tasks/engine.yml +27 -81
  68. package/tasks/eval.yml +0 -8
  69. package/tasks/feedback.yml +0 -2
  70. package/tasks/install.yml +0 -4
  71. package/tasks/issue.yml +0 -3
  72. package/tasks/lifecycle.yml +0 -1
  73. package/tasks/materialize.cjs +246 -0
  74. package/tasks/materialize.test.cjs +103 -0
  75. package/tasks/materialize.yml +13 -0
  76. package/tasks/migrate.yml +0 -6
  77. package/tasks/packs.yml +0 -16
  78. package/tasks/plan-sequence.yml +0 -8
  79. package/tasks/policy.yml +0 -24
  80. package/tasks/pr.yml +0 -6
  81. package/tasks/prd.yml +0 -2
  82. package/tasks/product-signal.yml +0 -10
  83. package/tasks/project.yml +0 -8
  84. package/tasks/reconcile.yml +0 -2
  85. package/tasks/review-monitor.yml +0 -4
  86. package/tasks/roadmap.yml +0 -4
  87. package/tasks/scm.yml +0 -32
  88. package/tasks/scope.yml +0 -30
  89. package/tasks/slice.yml +0 -4
  90. package/tasks/spec.yml +0 -6
  91. package/tasks/subagent.yml +0 -4
  92. package/tasks/swarm.yml +0 -7
  93. package/tasks/toolchain.yml +0 -4
  94. package/tasks/triage-actions.yml +0 -8
  95. package/tasks/triage-bootstrap.yml +0 -1
  96. package/tasks/triage-bulk.yml +0 -5
  97. package/tasks/triage-classify.yml +0 -2
  98. package/tasks/triage-evaluate.yml +0 -1
  99. package/tasks/triage-metrics.yml +0 -2
  100. package/tasks/triage-queue.yml +0 -3
  101. package/tasks/triage-reconcile.yml +0 -1
  102. package/tasks/triage-scope-drift.yml +0 -1
  103. package/tasks/triage-scope.yml +0 -1
  104. package/tasks/triage-smoketest.yml +0 -1
  105. package/tasks/triage-subscribe.yml +0 -2
  106. package/tasks/tutorial.yml +0 -20
  107. package/tasks/umbrella.yml +0 -2
  108. package/tasks/value.yml +0 -2
  109. package/tasks/vbrief.yml +0 -12
  110. package/tasks/verify.yml +0 -140
  111. package/tasks/xbrief.yml +0 -6
  112. package/templates/agents-entry.md +1 -0
  113. package/templates/design-critique-brief.md +3 -0
  114. package/vendor/directive-content/.agents/skills/deft-directive-release/SKILL.md +428 -7
  115. package/vendor/directive-content/.githooks/_directive-run.sh +30 -0
  116. package/vendor/directive-content/.githooks/pre-commit +4 -24
  117. package/vendor/directive-content/.githooks/pre-push +11 -17
  118. package/vendor/directive-content/Taskfile.yml +17 -16
  119. package/vendor/directive-content/contracts/design-critique.md +5 -0
  120. package/vendor/directive-content/docs/getting-started.md +2 -0
  121. package/vendor/directive-content/docs/intent-constraint.md +7 -1
  122. package/vendor/directive-content/docs/known-limitations.md +1 -0
  123. package/vendor/directive-content/docs/launcher.md +10 -0
  124. package/vendor/directive-content/docs/observable-scope.md +6 -0
  125. package/vendor/directive-content/packs/skills/skills-pack-0.1.json +3 -3
  126. package/vendor/directive-content/scm/github.md +1 -0
  127. package/vendor/directive-content/skills/deft-directive-feedback/SKILL.md +9 -20
  128. package/vendor/directive-content/skills/deft-directive-pre-pr/SKILL.md +13 -3
  129. package/vendor/directive-content/skills/deft-directive-release/SKILL.md +4 -4
  130. package/vendor/directive-content/skills/deft-directive-review-cycle/SKILL.md +2 -2
  131. package/vendor/directive-content/skills/deft-directive-setup/SKILL.md +17 -41
  132. package/vendor/directive-content/skills/deft-directive-swarm/references/host-cursor.md +18 -1
  133. package/vendor/directive-content/skills/deft-directive-swarm/references/host-grok-build.md +3 -3
  134. package/vendor/directive-content/skills/deft-directive-sync/SKILL.md +2 -2
  135. package/vendor/directive-content/skills/deft-directive-tutorial/SKILL.md +1 -1
  136. package/vendor/directive-content/tasks/agent.yml +0 -2
  137. package/vendor/directive-content/tasks/cache.yml +0 -16
  138. package/vendor/directive-content/tasks/capacity.yml +0 -4
  139. package/vendor/directive-content/tasks/change.yml +0 -4
  140. package/vendor/directive-content/tasks/codebase.yml +0 -10
  141. package/vendor/directive-content/tasks/commit.yml +0 -2
  142. package/vendor/directive-content/tasks/coverage.yml +0 -2
  143. package/vendor/directive-content/tasks/decision.yml +0 -4
  144. package/vendor/directive-content/tasks/directive.yml +0 -1
  145. package/vendor/directive-content/tasks/docs.yml +6 -10
  146. package/vendor/directive-content/tasks/engine-invoke.cjs +79 -0
  147. package/vendor/directive-content/tasks/engine-invoke.test.cjs +84 -0
  148. package/vendor/directive-content/tasks/engine.yml +27 -81
  149. package/vendor/directive-content/tasks/eval.yml +0 -8
  150. package/vendor/directive-content/tasks/feedback.yml +0 -2
  151. package/vendor/directive-content/tasks/install.yml +0 -4
  152. package/vendor/directive-content/tasks/issue.yml +0 -3
  153. package/vendor/directive-content/tasks/lifecycle.yml +0 -1
  154. package/vendor/directive-content/tasks/materialize.cjs +246 -0
  155. package/vendor/directive-content/tasks/materialize.test.cjs +103 -0
  156. package/vendor/directive-content/tasks/materialize.yml +13 -0
  157. package/vendor/directive-content/tasks/migrate.yml +0 -6
  158. package/vendor/directive-content/tasks/packs.yml +0 -16
  159. package/vendor/directive-content/tasks/plan-sequence.yml +0 -8
  160. package/vendor/directive-content/tasks/policy.yml +0 -24
  161. package/vendor/directive-content/tasks/pr.yml +0 -6
  162. package/vendor/directive-content/tasks/prd.yml +0 -2
  163. package/vendor/directive-content/tasks/product-signal.yml +0 -10
  164. package/vendor/directive-content/tasks/project.yml +0 -8
  165. package/vendor/directive-content/tasks/reconcile.yml +0 -2
  166. package/vendor/directive-content/tasks/review-monitor.yml +0 -4
  167. package/vendor/directive-content/tasks/roadmap.yml +0 -4
  168. package/vendor/directive-content/tasks/scm.yml +0 -32
  169. package/vendor/directive-content/tasks/scope.yml +0 -30
  170. package/vendor/directive-content/tasks/slice.yml +0 -4
  171. package/vendor/directive-content/tasks/spec.yml +0 -6
  172. package/vendor/directive-content/tasks/subagent.yml +0 -4
  173. package/vendor/directive-content/tasks/swarm.yml +0 -7
  174. package/vendor/directive-content/tasks/toolchain.yml +0 -4
  175. package/vendor/directive-content/tasks/triage-actions.yml +0 -8
  176. package/vendor/directive-content/tasks/triage-bootstrap.yml +0 -1
  177. package/vendor/directive-content/tasks/triage-bulk.yml +0 -5
  178. package/vendor/directive-content/tasks/triage-classify.yml +0 -2
  179. package/vendor/directive-content/tasks/triage-evaluate.yml +0 -1
  180. package/vendor/directive-content/tasks/triage-metrics.yml +0 -2
  181. package/vendor/directive-content/tasks/triage-queue.yml +0 -3
  182. package/vendor/directive-content/tasks/triage-reconcile.yml +0 -1
  183. package/vendor/directive-content/tasks/triage-scope-drift.yml +0 -1
  184. package/vendor/directive-content/tasks/triage-scope.yml +0 -1
  185. package/vendor/directive-content/tasks/triage-smoketest.yml +0 -1
  186. package/vendor/directive-content/tasks/triage-subscribe.yml +0 -2
  187. package/vendor/directive-content/tasks/tutorial.yml +0 -20
  188. package/vendor/directive-content/tasks/umbrella.yml +0 -2
  189. package/vendor/directive-content/tasks/value.yml +0 -2
  190. package/vendor/directive-content/tasks/vbrief.yml +0 -12
  191. package/vendor/directive-content/tasks/verify.yml +0 -140
  192. package/vendor/directive-content/tasks/xbrief.yml +0 -6
  193. package/vendor/directive-content/templates/agents-entry.md +1 -0
  194. package/vendor/directive-content/templates/design-critique-brief.md +3 -0
  195. package/vendor/directive-core/dist/.tsbuildinfo +1 -1
  196. package/vendor/directive-core/dist/consumer-check-contract/evaluate.d.ts +3 -2
  197. package/vendor/directive-core/dist/consumer-check-contract/evaluate.d.ts.map +1 -1
  198. package/vendor/directive-core/dist/consumer-check-contract/evaluate.js +7 -6
  199. package/vendor/directive-core/dist/consumer-check-contract/evaluate.js.map +1 -1
  200. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.d.ts +6 -0
  201. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.d.ts.map +1 -1
  202. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.js +97 -3
  203. package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.js.map +1 -1
  204. package/vendor/directive-core/dist/content-root.d.ts.map +1 -1
  205. package/vendor/directive-core/dist/content-root.js +8 -1
  206. package/vendor/directive-core/dist/content-root.js.map +1 -1
  207. package/vendor/directive-core/dist/coverage-applicability/evaluate.d.ts.map +1 -1
  208. package/vendor/directive-core/dist/coverage-applicability/evaluate.js +406 -11
  209. package/vendor/directive-core/dist/coverage-applicability/evaluate.js.map +1 -1
  210. package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts +13 -5
  211. package/vendor/directive-core/dist/coverage-hotspots/evaluate.d.ts.map +1 -1
  212. package/vendor/directive-core/dist/coverage-hotspots/evaluate.js +60 -2
  213. package/vendor/directive-core/dist/coverage-hotspots/evaluate.js.map +1 -1
  214. package/vendor/directive-core/dist/deposit/live-procedure-targets.d.ts.map +1 -1
  215. package/vendor/directive-core/dist/deposit/live-procedure-targets.js.map +1 -1
  216. package/vendor/directive-core/dist/deposit/python-free.d.ts +2 -0
  217. package/vendor/directive-core/dist/deposit/python-free.d.ts.map +1 -1
  218. package/vendor/directive-core/dist/deposit/python-free.js +5 -1
  219. package/vendor/directive-core/dist/deposit/python-free.js.map +1 -1
  220. package/vendor/directive-core/dist/doctor/checks.d.ts.map +1 -1
  221. package/vendor/directive-core/dist/doctor/checks.js +8 -10
  222. package/vendor/directive-core/dist/doctor/checks.js.map +1 -1
  223. package/vendor/directive-core/dist/doctor/main.d.ts.map +1 -1
  224. package/vendor/directive-core/dist/doctor/main.js +6 -0
  225. package/vendor/directive-core/dist/doctor/main.js.map +1 -1
  226. package/vendor/directive-core/dist/doctor/manifest.d.ts.map +1 -1
  227. package/vendor/directive-core/dist/doctor/manifest.js +3 -2
  228. package/vendor/directive-core/dist/doctor/manifest.js.map +1 -1
  229. package/vendor/directive-core/dist/doctor/paths.d.ts.map +1 -1
  230. package/vendor/directive-core/dist/doctor/paths.js +11 -0
  231. package/vendor/directive-core/dist/doctor/paths.js.map +1 -1
  232. package/vendor/directive-core/dist/engine-version.d.ts.map +1 -1
  233. package/vendor/directive-core/dist/engine-version.js +1 -4
  234. package/vendor/directive-core/dist/engine-version.js.map +1 -1
  235. package/vendor/directive-core/dist/hooks/dispatcher.d.ts +2 -0
  236. package/vendor/directive-core/dist/hooks/dispatcher.d.ts.map +1 -1
  237. package/vendor/directive-core/dist/hooks/dispatcher.js +5 -1
  238. package/vendor/directive-core/dist/hooks/dispatcher.js.map +1 -1
  239. package/vendor/directive-core/dist/index.d.ts +1 -0
  240. package/vendor/directive-core/dist/index.d.ts.map +1 -1
  241. package/vendor/directive-core/dist/index.js +1 -0
  242. package/vendor/directive-core/dist/index.js.map +1 -1
  243. package/vendor/directive-core/dist/init-deposit/agent-hooks.d.ts.map +1 -1
  244. package/vendor/directive-core/dist/init-deposit/agent-hooks.js.map +1 -1
  245. package/vendor/directive-core/dist/init-deposit/scaffold.d.ts +4 -0
  246. package/vendor/directive-core/dist/init-deposit/scaffold.d.ts.map +1 -1
  247. package/vendor/directive-core/dist/init-deposit/scaffold.js +4 -2
  248. package/vendor/directive-core/dist/init-deposit/scaffold.js.map +1 -1
  249. package/vendor/directive-core/dist/install-contract/constants.d.ts.map +1 -1
  250. package/vendor/directive-core/dist/install-contract/constants.js +9 -1
  251. package/vendor/directive-core/dist/install-contract/constants.js.map +1 -1
  252. package/vendor/directive-core/dist/install-contract/data-status.d.ts.map +1 -1
  253. package/vendor/directive-core/dist/install-contract/data-status.js.map +1 -1
  254. package/vendor/directive-core/dist/install-contract/index.d.ts +1 -1
  255. package/vendor/directive-core/dist/install-contract/index.d.ts.map +1 -1
  256. package/vendor/directive-core/dist/install-contract/index.js.map +1 -1
  257. package/vendor/directive-core/dist/install-contract/package-meta.d.ts.map +1 -1
  258. package/vendor/directive-core/dist/install-contract/package-meta.js.map +1 -1
  259. package/vendor/directive-core/dist/install-health/cheap.d.ts.map +1 -1
  260. package/vendor/directive-core/dist/install-health/cheap.js +2 -6
  261. package/vendor/directive-core/dist/install-health/cheap.js.map +1 -1
  262. package/vendor/directive-core/dist/install-health/in-sync.d.ts.map +1 -1
  263. package/vendor/directive-core/dist/install-health/in-sync.js.map +1 -1
  264. package/vendor/directive-core/dist/install-health/index.d.ts +6 -6
  265. package/vendor/directive-core/dist/install-health/index.d.ts.map +1 -1
  266. package/vendor/directive-core/dist/install-health/index.js +3 -3
  267. package/vendor/directive-core/dist/install-health/index.js.map +1 -1
  268. package/vendor/directive-core/dist/install-health/ownership.d.ts.map +1 -1
  269. package/vendor/directive-core/dist/install-health/ownership.js +2 -6
  270. package/vendor/directive-core/dist/install-health/ownership.js.map +1 -1
  271. package/vendor/directive-core/dist/install-health/readers.d.ts.map +1 -1
  272. package/vendor/directive-core/dist/install-health/readers.js.map +1 -1
  273. package/vendor/directive-core/dist/install-health/wiring.d.ts.map +1 -1
  274. package/vendor/directive-core/dist/install-health/wiring.js +2 -3
  275. package/vendor/directive-core/dist/install-health/wiring.js.map +1 -1
  276. package/vendor/directive-core/dist/intent-constraint/evaluate.d.ts +7 -0
  277. package/vendor/directive-core/dist/intent-constraint/evaluate.d.ts.map +1 -1
  278. package/vendor/directive-core/dist/intent-constraint/evaluate.js +26 -5
  279. package/vendor/directive-core/dist/intent-constraint/evaluate.js.map +1 -1
  280. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.d.ts +76 -0
  281. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.d.ts.map +1 -0
  282. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.js +239 -0
  283. package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.js.map +1 -0
  284. package/vendor/directive-core/dist/observable-scope/evaluate.d.ts +7 -0
  285. package/vendor/directive-core/dist/observable-scope/evaluate.d.ts.map +1 -1
  286. package/vendor/directive-core/dist/observable-scope/evaluate.js +51 -7
  287. package/vendor/directive-core/dist/observable-scope/evaluate.js.map +1 -1
  288. package/vendor/directive-core/dist/policy/coverage-mode.d.ts +84 -0
  289. package/vendor/directive-core/dist/policy/coverage-mode.d.ts.map +1 -0
  290. package/vendor/directive-core/dist/policy/coverage-mode.js +226 -0
  291. package/vendor/directive-core/dist/policy/coverage-mode.js.map +1 -0
  292. package/vendor/directive-core/dist/policy/index.d.ts +2 -0
  293. package/vendor/directive-core/dist/policy/index.d.ts.map +1 -1
  294. package/vendor/directive-core/dist/policy/index.js +60 -40
  295. package/vendor/directive-core/dist/policy/index.js.map +1 -1
  296. package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts +2 -0
  297. package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts.map +1 -1
  298. package/vendor/directive-core/dist/pr-closing-keywords/main.js +143 -9
  299. package/vendor/directive-core/dist/pr-closing-keywords/main.js.map +1 -1
  300. package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts +2 -0
  301. package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts.map +1 -1
  302. package/vendor/directive-core/dist/pre-pr-controller/controller.js +109 -14
  303. package/vendor/directive-core/dist/pre-pr-controller/controller.js.map +1 -1
  304. package/vendor/directive-core/dist/pre-pr-controller/evaluate.d.ts +2 -0
  305. package/vendor/directive-core/dist/pre-pr-controller/evaluate.d.ts.map +1 -1
  306. package/vendor/directive-core/dist/pre-pr-controller/evaluate.js +11 -1
  307. package/vendor/directive-core/dist/pre-pr-controller/evaluate.js.map +1 -1
  308. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts +1 -1
  309. package/vendor/directive-core/dist/pre-pr-controller/index.d.ts.map +1 -1
  310. package/vendor/directive-core/dist/pre-pr-controller/index.js +1 -1
  311. package/vendor/directive-core/dist/pre-pr-controller/index.js.map +1 -1
  312. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts +10 -0
  313. package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts.map +1 -1
  314. package/vendor/directive-core/dist/pre-pr-controller/phases.js +15 -1
  315. package/vendor/directive-core/dist/pre-pr-controller/phases.js.map +1 -1
  316. package/vendor/directive-core/dist/pre-pr-controller/types.d.ts +20 -1
  317. package/vendor/directive-core/dist/pre-pr-controller/types.d.ts.map +1 -1
  318. package/vendor/directive-core/dist/pre-pr-controller/types.js +2 -0
  319. package/vendor/directive-core/dist/pre-pr-controller/types.js.map +1 -1
  320. package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts +40 -3
  321. package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts.map +1 -1
  322. package/vendor/directive-core/dist/preflight-gh/pre-push.js +340 -27
  323. package/vendor/directive-core/dist/preflight-gh/pre-push.js.map +1 -1
  324. package/vendor/directive-core/dist/release/cli-drift-report.d.ts +4 -4
  325. package/vendor/directive-core/dist/release/cli-drift-report.d.ts.map +1 -1
  326. package/vendor/directive-core/dist/release/cli-drift-report.js +6 -11
  327. package/vendor/directive-core/dist/release/cli-drift-report.js.map +1 -1
  328. package/vendor/directive-core/dist/release-e2e/constants.d.ts +4 -3
  329. package/vendor/directive-core/dist/release-e2e/constants.d.ts.map +1 -1
  330. package/vendor/directive-core/dist/release-e2e/constants.js +4 -3
  331. package/vendor/directive-core/dist/release-e2e/constants.js.map +1 -1
  332. package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.d.ts.map +1 -1
  333. package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.js +87 -28
  334. package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.js.map +1 -1
  335. package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.d.ts.map +1 -1
  336. package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.js +13 -2
  337. package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.js.map +1 -1
  338. package/vendor/directive-core/dist/release-e2e/main.js +1 -1
  339. package/vendor/directive-core/dist/release-e2e/npm-ops.d.ts +11 -5
  340. package/vendor/directive-core/dist/release-e2e/npm-ops.d.ts.map +1 -1
  341. package/vendor/directive-core/dist/release-e2e/npm-ops.js +90 -45
  342. package/vendor/directive-core/dist/release-e2e/npm-ops.js.map +1 -1
  343. package/vendor/directive-core/dist/render/project-render.d.ts.map +1 -1
  344. package/vendor/directive-core/dist/render/project-render.js +1 -0
  345. package/vendor/directive-core/dist/render/project-render.js.map +1 -1
  346. package/vendor/directive-core/dist/resolution/engine-resolve.d.ts.map +1 -1
  347. package/vendor/directive-core/dist/resolution/engine-resolve.js.map +1 -1
  348. package/vendor/directive-core/dist/resolution/pin.d.ts +11 -5
  349. package/vendor/directive-core/dist/resolution/pin.d.ts.map +1 -1
  350. package/vendor/directive-core/dist/resolution/pin.js +20 -11
  351. package/vendor/directive-core/dist/resolution/pin.js.map +1 -1
  352. package/vendor/directive-core/dist/resolution/plan.d.ts.map +1 -1
  353. package/vendor/directive-core/dist/resolution/plan.js +5 -3
  354. package/vendor/directive-core/dist/resolution/plan.js.map +1 -1
  355. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.d.ts +54 -3
  356. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.d.ts.map +1 -1
  357. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.js +142 -0
  358. package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.js.map +1 -1
  359. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.d.ts +21 -0
  360. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.d.ts.map +1 -0
  361. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.js +95 -0
  362. package/vendor/directive-core/dist/scope/file-scope-coverage-warn.js.map +1 -0
  363. package/vendor/directive-core/dist/session/spawn-occupancy.d.ts +7 -0
  364. package/vendor/directive-core/dist/session/spawn-occupancy.d.ts.map +1 -1
  365. package/vendor/directive-core/dist/session/spawn-occupancy.js +28 -0
  366. package/vendor/directive-core/dist/session/spawn-occupancy.js.map +1 -1
  367. package/vendor/directive-core/dist/staleness-tickler/run.d.ts.map +1 -1
  368. package/vendor/directive-core/dist/staleness-tickler/run.js.map +1 -1
  369. package/vendor/directive-core/dist/swarm/approach1-babysitter.d.ts +19 -6
  370. package/vendor/directive-core/dist/swarm/approach1-babysitter.d.ts.map +1 -1
  371. package/vendor/directive-core/dist/swarm/approach1-babysitter.js +69 -9
  372. package/vendor/directive-core/dist/swarm/approach1-babysitter.js.map +1 -1
  373. package/vendor/directive-core/dist/swarm/dest-place.d.ts +1 -1
  374. package/vendor/directive-core/dist/swarm/dest-place.d.ts.map +1 -1
  375. package/vendor/directive-core/dist/swarm/dest-place.js +1 -1
  376. package/vendor/directive-core/dist/swarm/dest-place.js.map +1 -1
  377. package/vendor/directive-core/dist/swarm/launch-cli.d.ts.map +1 -1
  378. package/vendor/directive-core/dist/swarm/launch-cli.js +12 -0
  379. package/vendor/directive-core/dist/swarm/launch-cli.js.map +1 -1
  380. package/vendor/directive-core/dist/swarm/launch.d.ts +6 -0
  381. package/vendor/directive-core/dist/swarm/launch.d.ts.map +1 -1
  382. package/vendor/directive-core/dist/swarm/launch.js +11 -0
  383. package/vendor/directive-core/dist/swarm/launch.js.map +1 -1
  384. package/vendor/directive-core/dist/swarm/leftover-before-activation.d.ts +27 -0
  385. package/vendor/directive-core/dist/swarm/leftover-before-activation.d.ts.map +1 -0
  386. package/vendor/directive-core/dist/swarm/leftover-before-activation.js +31 -0
  387. package/vendor/directive-core/dist/swarm/leftover-before-activation.js.map +1 -0
  388. package/vendor/directive-core/dist/swarm/worktree-pm-install.d.ts +5 -0
  389. package/vendor/directive-core/dist/swarm/worktree-pm-install.d.ts.map +1 -1
  390. package/vendor/directive-core/dist/swarm/worktree-pm-install.js +16 -6
  391. package/vendor/directive-core/dist/swarm/worktree-pm-install.js.map +1 -1
  392. package/vendor/directive-core/dist/swarm/worktrees.d.ts.map +1 -1
  393. package/vendor/directive-core/dist/swarm/worktrees.js.map +1 -1
  394. package/vendor/directive-core/dist/text/redos-safe.d.ts.map +1 -1
  395. package/vendor/directive-core/dist/text/redos-safe.js +2 -1
  396. package/vendor/directive-core/dist/text/redos-safe.js.map +1 -1
  397. package/vendor/directive-core/dist/triage/evaluate/worktrees.d.ts.map +1 -1
  398. package/vendor/directive-core/dist/triage/evaluate/worktrees.js +6 -6
  399. package/vendor/directive-core/dist/triage/evaluate/worktrees.js.map +1 -1
  400. package/vendor/directive-core/dist/vbrief-validate/conformance.d.ts.map +1 -1
  401. package/vendor/directive-core/dist/vbrief-validate/conformance.js +5 -0
  402. package/vendor/directive-core/dist/vbrief-validate/conformance.js.map +1 -1
  403. package/vendor/directive-core/dist/verify-env/agent-hooks-live-probe.js +1 -1
  404. package/vendor/directive-core/dist/verify-env/agent-hooks-live-probe.js.map +1 -1
  405. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.d.ts +3 -3
  406. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.d.ts.map +1 -1
  407. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.js +7 -11
  408. package/vendor/directive-core/dist/verify-env/verify-hooks-installed.js.map +1 -1
  409. package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.d.ts.map +1 -1
  410. package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.js +1 -0
  411. package/vendor/directive-core/dist/verify-source/project-definition-mutation-boundary.js.map +1 -1
  412. package/vendor/directive-core/dist/xbrief/paths.d.ts.map +1 -1
  413. package/vendor/directive-core/dist/xbrief/paths.js +15 -12
  414. package/vendor/directive-core/dist/xbrief/paths.js.map +1 -1
  415. package/vendor/directive-core/dist/xbrief-migrate/constants.d.ts +7 -0
  416. package/vendor/directive-core/dist/xbrief-migrate/constants.d.ts.map +1 -1
  417. package/vendor/directive-core/dist/xbrief-migrate/constants.js +7 -0
  418. package/vendor/directive-core/dist/xbrief-migrate/constants.js.map +1 -1
  419. package/vendor/directive-core/dist/xbrief-migrate/detect.d.ts +9 -1
  420. package/vendor/directive-core/dist/xbrief-migrate/detect.d.ts.map +1 -1
  421. package/vendor/directive-core/dist/xbrief-migrate/detect.js +14 -7
  422. package/vendor/directive-core/dist/xbrief-migrate/detect.js.map +1 -1
  423. package/vendor/directive-core/dist/xbrief-migrate/migrate-project.d.ts.map +1 -1
  424. package/vendor/directive-core/dist/xbrief-migrate/migrate-project.js +118 -57
  425. package/vendor/directive-core/dist/xbrief-migrate/migrate-project.js.map +1 -1
  426. package/vendor/directive-core/dist/xbrief-migrate/transforms.d.ts.map +1 -1
  427. package/vendor/directive-core/dist/xbrief-migrate/transforms.js +8 -1
  428. package/vendor/directive-core/dist/xbrief-migrate/transforms.js.map +1 -1
  429. package/.githooks/_deft-run.sh +0 -47
  430. package/vendor/directive-content/.githooks/_deft-run.sh +0 -47
@@ -178,6 +178,7 @@ On hit, repair via the fetch → UTF-8 file edit → edit path above. `verify:en
178
178
  - ~ Link to related issues using closing keywords
179
179
  - ~ Explain "why" not just "what" in the PR description
180
180
  - ! Run `task check` before opening a PR
181
+ - ! On multi-active tips, product PRs that need merge-gate mint selection should carry a sole `deft-story: N` (positive issue number). That mark asserts #4864 delivery bind (`metadata.productPullRequest` must equal this PR before leftover finalize) and whole-story close at cohort finalize — only use it on the PR that is the delivery for #N. `verify:intent-constraint` / `verify:observable-scope` adopt the matching running `plan.id` from that mark (#5782); do not put plan-id shaped values on the mark line.
181
182
 
182
183
  ### Review Guidelines
183
184
 
@@ -56,28 +56,21 @@ deft feedback:file --summary "<one-line summary>" --context "<session context>"
56
56
  ```
57
57
 
58
58
  - ! Read the printed draft title/body with the operator before proceeding
59
- - ! If the command reports an **open** duplicate, surface the existing issue URL and the proposed evidence-comment body. Do **not** create a new issue. Proceed to Phase 3 only when the operator wants to append evidence with `--confirm` (exit 0 `commented-open-duplicate` path) — this is not a STOP-on-`blocked-duplicate` halt
60
- - ! If the command reports a **closed** duplicate without disposition, STOP and re-run only after the operator chooses `--on-closed=comment` or `--on-closed=create-anyway` (no consumer reopen)
61
- - ! Incomplete closed-search notes (`stopReason=window-exhausted|cap`) are disclosure, not a hard stop — keep them visible when filing
62
- - ⊗ Proceed past an open-duplicate preview by creating a new issue
63
- - ⊗ Silently create when a closed title match exists without `--on-closed`
59
+ - ! If the command reports a duplicate open issue, STOP and link the existing issue instead of filing again
60
+ - ⊗ Proceed past a duplicate-detection block without operator override
64
61
  - ~ When go-task is installed, the Taskfile may wrap the same verb; prefer `deft feedback:file` as primary
65
62
 
66
- ## Phase 3 -- Confirm + file / comment
63
+ ## Phase 3 -- Confirm + file
67
64
 
68
- - ! Present the final draft (or proposed evidence comment) and ask for explicit yes/no confirmation
69
- - ! Only after approval, re-run the **same report fields and target repo** with `--confirm` added and without `--dry-run` or `--json`. Retain `--notes` / blocker evidence flags so a posted comment carries the reviewed payload:
65
+ - ! Present the final draft and ask for explicit yes/no confirmation
66
+ - ! Only after approval, re-run the **same report fields and target repo** with `--confirm` added and without `--dry-run` or `--json`:
70
67
 
71
68
  ```bash
72
- deft feedback:file --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --notes "<optional>" [--blocker --flow "<flow>" --alternatives "<alts>" --recovery-cost "<cost>"] --confirm [--on-closed=comment|--on-closed=create-anyway]
69
+ deft feedback:file --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --confirm [--blocker]
73
70
  ```
74
71
 
75
- - ! Open match + `--confirm` → evidence comment on the existing open issue (`commented-open-duplicate`, exit 0); print issue URL + comment URL; never `restCreateIssue`
76
- - ! Closed match + `--on-closed=comment` → evidence comment on the closed issue; do not reopen
77
- - ! Closed match + `--on-closed=create-anyway` → new issue body carries `Related: closed #<n>`
78
- - ! No match → file a new upstream issue; print the filed issue URL
72
+ - ! Print the filed issue URL to the operator
79
73
  - ⊗ Use `Closes`/`Fixes`/`Resolves` in the upstream body -- use `Refs #1709` only
80
- - ⊗ Auto-comment without `--confirm`
81
74
 
82
75
  ## Phase 4 -- Handoff
83
76
 
@@ -87,12 +80,8 @@ deft feedback:file --summary "<one-line summary>" --context "<session context>"
87
80
  ## Anti-Patterns
88
81
 
89
82
  - ⊗ Filing from the maintainer framework repo (consumer-only guard)
90
- - ⊗ Creating a new issue when an open title match exists — confirm then comment instead
91
- - ⊗ Treating open-match confirm as `blocked-duplicate` STOP — Prefer-A Recut-2 uses `commented-open-duplicate` exit 0
92
- - ⊗ Writing on a closed title match without `--on-closed=comment|create-anyway`
93
- - ⊗ Reopening a closed issue from the consumer feedback path
94
- - ⊗ Treating `--confirm` as implicit from broad session approval -- require an explicit filing/comment confirmation step
83
+ - ⊗ Skipping dedup review when the command reports an existing open issue
84
+ - ⊗ Treating `--confirm` as implicit from broad session approval -- require an explicit filing confirmation step
95
85
  - ⊗ Infer "not a blocker" from an unmarked report -- absence of `BLOCKER` means not classified
96
86
  - ⊗ Auto-apply `adoption-blocker` from a consumer-authored title
97
87
  - ⊗ Hand-editing PROJECT-DEFINITION to flip `upstreamPrompt` instead of the audited setter
98
- - ⊗ Hand-editing rendered `content/skills/deft-directive-feedback/SKILL.md` — edit the pack source and `task packs:render`
@@ -101,6 +101,15 @@ GitHub `mergeable_state` is **textual only**. Post-open behavioral/policy gates
101
101
 
102
102
  Live skip detection on deftai/directive additionally requires Limb 5 enrollment (#4976).
103
103
 
104
+ ## Hard local refuse before push (#5804)
105
+
106
+ ! On enrolled tip OVPR, feature-branch git push of product/test changes fails closed unless a private-store deft pre-pr:run pass bound to HEAD covers outgoing paths (outgoing ⊆ reviewed pushBinding). Empty pre-push stdin denies.
107
+
108
+ - ! Recovery when refuse fires: deft pre-pr:run then retry push.
109
+ - ⊗ Treat reading this SKILL.md or narrating pre-PR as a push pass.
110
+ - ⊗ Inherit evaluatePrePush empty-stdin allow for the enrolled arm.
111
+
112
+
104
113
  ## Loop Phases
105
114
 
106
115
  Each iteration proceeds through all phases in order. Do NOT skip phases or reorder them.
@@ -145,12 +154,13 @@ Each iteration proceeds through all phases in order. Do NOT skip phases or reord
145
154
 
146
155
  ! Before the full `task check` coverage gate, decide coverage applicability for the complete reviewed diff, then either measure headroom or record authorized not-applicable.
147
156
 
148
- - ! Run the shared applicability path (`deft coverage:hotspots` classifies before requiring Istanbul when the reviewed base/head/tree binding is available): **applicable** → measured path; **not-applicable** → skip channel; **refuse** → fail closed.
157
+ - ! Run the shared applicability path (`deft coverage:hotspots` classifies before requiring Istanbul when the reviewed base/head/tree binding is available): **applicable** → measured path; **not-applicable** → inert skip channel; **coverageMode posture** (`initial`|`disabled`, exit 5) → mode skip channel (paths may still be coverable; authority is plan.policy.coverageMode); **refuse** → fail closed (or waived exit 4 when granted).
149
158
  - ! When applicable: run targeted coverage first: `vitest run --coverage <changed-paths>` (or language equivalent) — not only full `task check`. Then run `task coverage:hotspots` / `deft coverage:hotspots` for uncovered branches / headroom. Exercise both sides of new branches (ternary / early-return / catch / default switch / `||` / `??`). Treat barely ≥ floor as insufficient — aim for ≥ floor + 0.3–0.5pp headroom on the branch metric relative to **your project's** vitest/coverage floor (may differ from 85%). Complements `deft verify:forward-coverage` (#1310) and `--allow-coverage-debt=#N` (#2573).
159
+ - ! When coverageMode is `initial` or `disabled` and no `coverage/coverage-final.json` is present: record `coverage_headroom` via **exit 5 + exact skip reason** `coverageMode posture skip (initial|disabled)` (`COVERAGE_HEADROOM_MODE_SKIP`). This is posture N/A — distinct from inert N/A and from forbidden report-missing-alone. The controller re-reads effective coverageMode at observe and commandSatisfied; hotspots exit 5 self-instructs the token and carries it on the mode artifact. When a coverage report exists, keep the measured path (report-present guard).
150
160
  - ! When not-applicable (every changed path proven inert): record `coverage_headroom` via **non-zero exit + exact skip reason** `reviewed diff has no coverable paths` (`ALLOWED_SKIP_REASONS.coverage_headroom`). The controller re-derives applicability from the run's PrePrInputBinding before honoring that skip. Hotspots exit 3 emits the machine-readable N/A artifact for this channel.
151
- - ! When coverage is N/A: do **not** invent `vitest --coverage`; keep applicable static / `verify:*` gates in Phase 3. Do not treat "no coverable code" as "no lint obligations." A closed `lint_iteration` skip remains deferred.
161
+ - ! When coverageMode is `initial` or `disabled` and no `coverage/coverage-final.json` is present: record `lint_iteration` via **exit 5 + exact skip reason** `lint_iteration coverageMode posture skip (initial|disabled)` (`LINT_ITERATION_MODE_SKIP`). This discharges the Vitest-shaped observation only — keep applicable static / `verify:*` gates in Phase 3 and the merge_chokepoint phase. Do **not** invent `vitest --coverage`. The controller re-reads coverageMode at observe and commandSatisfied; refuse the mode skip when a coverage report exists (shared report-present guard with #5791). Never exit 0 and never bare any-nonzero for this channel.
152
162
  - ⊗ Satisfy `coverage_headroom` with an unbound exit-0 changed-file audit or any free-form exit-0 command that is not the authorized `deft coverage:hotspots` measured pass.
153
- - ⊗ Invent an Istanbul report, ask the operator to waive an irrelevant metric, or treat report-missing alone as not-applicable.
163
+ - ⊗ Invent an Istanbul report, ask the operator to waive an irrelevant metric, or treat report-missing alone as not-applicable (mode posture skip requires coverageMode initial|disabled + exit 5 token — not a free-form missing-report claim).
154
164
  - ⊗ Soften `coverage_headroom` to optional, lower the coverage floor, or claim a general docs-only CI bypass.
155
165
  - ! Toolchain-only N/A for executable changes on non-Istanbul projects (Coverlet adapters) remains open — do not paper over executable .NET with inert-classifier N/A.
156
166
 
@@ -200,7 +200,7 @@ See [`docs/RELEASING.md`](../../../docs/RELEASING.md) § Routine vs hard cut for
200
200
  5. ! Verify identity: `task verify:gh-auth -- --repo <owner>/<repo> --expected-login <maintainer>`, or compare `gh api user --jq .login` to the expected login
201
201
  6. ! **Run `task reconcile:issues -- --apply-lifecycle-fixes` to clear any closed-issue / non-completed-folder xBRIEFs before invoking `task release`** (#734). The release pipeline carries the deterministic gate at Step 3 (`task reconcile:issues -- --apply-lifecycle-fixes`, refuses with `EXIT_VIOLATION` on any Section (c) mismatch), but Phase 1 is the operator's first-line defence -- running the apply-mode flag here is the canonical clean path; `--allow-vbrief-drift` on the pipeline exists only as the explicit-acknowledgment escape hatch (analogous to `--allow-dirty`). The recurrence record is the v0.21.0 cut, which surfaced 13 stranded xBRIEFs (8 cycle-relevant + 5 historical residue) post-publish; the gate now blocks that drift before any irreversible action
202
202
  7. ! **Verify the proposed `v<version>` tag is not already in use locally, on origin, or as a published GitHub release** (#784). The release pipeline carries the deterministic gate at Step 4 (`the release tag-availability gate`, refuses with `EXIT_VIOLATION` before any state mutation -- prepare/write artifacts, build, commit), but Phase 1 is the operator's first-line defence. Quickly probe with `git tag -l v<version>` (local), `git ls-remote --tags origin refs/tags/v<version>` (remote), and `gh release view v<version> --repo <owner>/<repo>` (release-only, where `gh release view` exits 0 only when the release exists). The recurrence record is the v0.22.0 → v0.23.0 release attempt on 2026-05-01: the operator typed `0.22.0` (the prior release from 12 hours earlier) and the legacy pipeline ran 8 steps before failing at `git tag` -- leaving a wrong-version local commit + `dist/deft-0.22.0.zip` orphan + manual `git reset --hard` recovery. The new pre-flight gate blocks that mode before any irreversible action
203
- 8. ! **Verify the npm credential path is configured before cutting the tag** (#1910, #1909). A `v*` tag now auto-triggers `.github/workflows/npm-publish.yml`, which publishes the four `@deftai/directive*` packages with `npm publish --provenance`. Confirm the publish path can authenticate: either the `NPM_TOKEN` repo secret is present (`gh secret list --repo <owner>/<repo>` shows `NPM_TOKEN`) OR an npm OIDC trusted publisher is configured for the `@deftai/directive*` packages. If neither is in place, WARN loudly that the tag will fire a publish job that fails (red X on the tag, no packages) -- the operator may still proceed for a GitHub-only release, but the npm channel will not land until #1909's credential is provisioned. Cross-reference #1909.
203
+ 8. ! **Verify the npm credential path is configured before cutting the tag** (#1910, #1909). A `v*` tag now auto-triggers `.github/workflows/npm-publish.yml`, which publishes the two OVPR packages (`@deftai/directive` + `@deftai/directive-runtime`) with `npm publish --provenance`. Confirm the publish path can authenticate: either the `NPM_TOKEN` repo secret is present (`gh secret list --repo <owner>/<repo>` shows `NPM_TOKEN`) OR an npm OIDC trusted publisher is configured for the `@deftai/directive*` packages. If neither is in place, WARN loudly that the tag will fire a publish job that fails (red X on the tag, no packages) -- the operator may still proceed for a GitHub-only release, but the npm channel will not land until #1909's credential is provisioned. Cross-reference #1909.
204
204
  9. ! **Disclose npm irrevocability before any tag push (#1972, #2002, #3527).** A `v<version>` tag push is the **real npm publish gate** -- NOT Phase 5 or `task release:publish`. Tag push fires `.github/workflows/npm-publish.yml` in a separate workflow that is NOT draft-gated; npm packages ship immediately and **cannot be retracted** (`npm unpublish` is forbidden). Recovery is forward-only: deprecate, dist-tag, or ship a patch. The last human gates before npm goes live are: (a) Phase 2 dry-run `yes`, (b) a human-origin closed-verb grant (`deft authz:grant -- --template release-publish --target <version> --confirm` or `DEFT_ALLOW_RELEASE_PUBLISH=1`). `task release` fails closed at the Step 10–11 tag-push boundary without that grant. Phase 5 only controls GitHub release visibility (draft → public); it does NOT gate npm. The draft-flip `release:publish` closed-verb check remains (#1095).
205
205
  10. ~ Ask the operator for an optional one-line release **summary** (recommended 80-160 chars; can be skipped). The summary is the canonical narrative for THIS release across three audiences: (a) injected as a Markdown blockquote at the top of the promoted `CHANGELOG.md [<version>]` section, (b) auto-flowed into the GitHub release body via the existing `_section_for_version` pickup, and (c) populated VERBATIM into the Phase 8 Slack `*Summary*:` slot. Capture the wording once here; do NOT regenerate per-audience downstream
206
206
 
@@ -253,13 +253,13 @@ The harness provisions `deftai/deftai-release-test-<ts>-<uuid6>`, runs the smoke
253
253
 
254
254
  ? **Skip allowed** when the operator has just run `task release:e2e` successfully against the same branch in the past 30 minutes. Note the prior run timestamp in the user-facing summary.
255
255
 
256
- ! **`task release:e2e` now also rehearses the npm publish (#1910).** Unless `--skip-npm` is passed (or `npm` is absent from PATH, which soft-skips), the rehearsal runs `npm publish --dry-run --access public` for all four `@deftai/directive*` packages against the throwaway clone in dependency order (types -> core -> content -> cli), after `pnpm install` + `pnpm -w run build` and a version-alignment pass. This catches a broken `files` allowlist, a version-drift bug, or a dependency-order error BEFORE the real `v*` tag fires the publish workflow -- without touching the real registry. The install+build exceeds the <90s fast budget, so pass `task release:e2e -- --skip-npm` when you only need the GitHub-pipeline shape check.
256
+ ! **`task release:e2e` now also rehearses the npm publish (#1910).** Unless `--skip-npm` is passed (or `npm` is absent from PATH, which soft-skips), the rehearsal runs `npm publish --dry-run --access public` for both `@deftai/directive` and `@deftai/directive-runtime` against the throwaway clone in dependency order (runtime -> launcher (cli)), after `pnpm install` + `pnpm -w run build` and a version-alignment pass. This catches a broken `files` allowlist, a version-drift bug, or a dependency-order error BEFORE the real `v*` tag fires the publish workflow -- without touching the real registry. The install+build exceeds the <90s fast budget, so pass `task release:e2e -- --skip-npm` when you only need the GitHub-pipeline shape check.
257
257
 
258
258
  ! **Tag -> npm coupling + irrevocability (#1910, #1972, #2002).** A `v<version>` tag is a TWO-channel action: the GitHub release (this skill's pipeline) AND `.github/workflows/npm-publish.yml`, which runs in a SEPARATE workflow that does NOT block the GitHub release and is NOT draft-gated. The npm workflow derives the published version from the tag (`${GITHUB_REF_NAME#v}`); this skill owns the version chosen in Phase 1. These MUST stay consistent -- the tag you cut IS the npm version that ships; there is no separate npm version bump. **npm publish is irrevocable** (#1972): once the tag fires, packages are live on npm and cannot be unpulled; `task release:rollback` does NOT retract npm (forward-only recovery). A red npm job on a green GitHub release means the npm channel did not ship (verify in Phase 5/7).
259
259
 
260
260
  ## Phase 4 — Production draft
261
261
 
262
- ! **Last human gate before npm (#1972, #2002, #3527).** Immediately before invoking `task release`, re-state that the tag push in this step will irrevocably publish all four `@deftai/directive*` packages to npm via `.github/workflows/npm-publish.yml`. There is no undo on npm; only forward recovery (deprecate / dist-tag / patch). Proceed only when the operator explicitly confirms **and** a human-origin grant covers `release-publish` for this version (`deft authz:grant -- --template release-publish --target <version> --confirm` or `DEFT_ALLOW_RELEASE_PUBLISH=1`). The pipeline fails closed at Step 10–11 without that grant -- that is the npm-distributing boundary. ⊗ Rely on Phase 5 `release:publish` as the npm gate; it only flips the GitHub draft. ⊗ Delete the draft-flip check as a substitute for the tag-push gate.
262
+ ! **Last human gate before npm (#1972, #2002, #3527).** Immediately before invoking `task release`, re-state that the tag push in this step will irrevocably publish both `@deftai/directive` and `@deftai/directive-runtime` to npm via `.github/workflows/npm-publish.yml`. There is no undo on npm; only forward recovery (deprecate / dist-tag / patch). Proceed only when the operator explicitly confirms **and** a human-origin grant covers `release-publish` for this version (`deft authz:grant -- --template release-publish --target <version> --confirm` or `DEFT_ALLOW_RELEASE_PUBLISH=1`). The pipeline fails closed at Step 10–11 without that grant -- that is the npm-distributing boundary. ⊗ Rely on Phase 5 `release:publish` as the npm gate; it only flips the GitHub draft. ⊗ Delete the draft-flip check as a substitute for the tag-push gate.
263
263
 
264
264
  ! Invoke `task release -- <version>` (NO `--dry-run`, NO `--skip-tag`, NO `--skip-release`, NO `--skip-ci`). If Phase 1 collected an operator summary, pass `--summary "<text>"` so the production cut writes the same blockquote the dry-run previewed.
265
265
 
@@ -350,7 +350,7 @@ Race-condition mitigation: `download_count` is double-read with a 5s sleep betwe
350
350
 
351
351
  ! Only enter Phase 7 if Phase 6 took the Publish branch (rollback branch ends here with the unwind log).
352
352
 
353
- 1. ! **Wait until all four packages list the cut version (#4267, #1910, #3753).** Run `task release:wait-npm -- <version>`. That caller polls `npm view <pkg> versions` (prefer-online, doctor temp-cwd isolation) until all four `@deftai/directive*` packages list `<version>`, or 10 minutes. Partial visibility is **still-propagating** (wait before `npm i -g`); none visible after the wait is **publish-incomplete**. Report-only: must not fail the GitHub release. Confirm provenance on the npm page after the wait. ⊗ Treat a green `npm-publish.yml` job plus one visible sibling as registry truth. ⊗ Run `npm i -g`. `task release` Step 13 stays a single probe (timeout 0).
353
+ 1. ! **Wait until both public packages list the cut version (#4267, #1910, #3753).** Run `task release:wait-npm -- <version>`. That caller polls `npm view <pkg> versions` (prefer-online, doctor temp-cwd isolation) until both `@deftai/directive` and `@deftai/directive-runtime` list `<version>`, or 10 minutes. Partial visibility is **still-propagating** (wait before `npm i -g`); none visible after the wait is **publish-incomplete**. Report-only: must not fail the GitHub release. Confirm provenance on the npm page after the wait. ⊗ Treat a green `npm-publish.yml` job plus one visible sibling as registry truth. ⊗ Run `npm i -g`. `task release` Step 13 stays a single probe (timeout 0).
354
354
  2. ! **Report local-vs-released CLI drift (#3753).** `task release:wait-npm` already prints the local global CLI version, the released version, whether they match, and the exact remediation `npm i -g @deftai/directive@<version> --prefer-online`. Compare versions with `checkActiveCliAgainstTarget` (not bare `deft --version`) so a PATH-shadowed install cannot report success (#3233). The report must not fail the release.
355
355
  3. ! Verify GitHub auto-closed the discrete-task issue(s) referenced via `Closes #N` in the release notes (mirrors `skills/deft-directive-swarm/SKILL.md` Phase 6 Step 2)
356
356
  4. ! Run `gh issue view <N> --json state --jq .state` for each closed issue. If any didn't auto-close, manually close with `gh issue close <N> --comment "Closed by release v<version> (squash auto-close did not trigger)"` (Layer 1, #167)
@@ -630,9 +630,9 @@ Workflow failover arming (Blacksmith cancelled → GH-hosted lane) is sibling is
630
630
  ⊗ Emit freeform `review_cycle: started` / `pending` / `initiated` or L4 `status: pass` without **A** (or parent-retained **B** with explicit next action) or full Step 6 `done`.
631
631
  ⊗ Solve Owner Continuity via host cron-as-Approach-1 or always-block-parent-until-merge — use A/B/C above (#2876 / #3090).
632
632
 
633
- ! **Durable live wait / unarmed stand-down (#4882 / #5219 / #5229 / #5690):** After `stop-at: pr-open`, Path B parent-retained or Approach 1 merge-path ownership is **armed** only while a still-running phase-correct wait exists for that PR (pre-CLEAN: blocking Approach 1 child `pr:watch --monitor-agent-id <id>`; post-CLEAN: `pr:wait-mergeable-and-merge`) **or** an explicit option-C finish was emitted. A fresh sticky lease alone, or a Path B prose promise to merge on CLEAN with no live wait, is **unarmed stand-down** — fail the turn per open merge-path PR. On Tier-1 `spawn_subagent` hosts, `--merge-path-arm --live-wait` also requires lease `platform_primitive=spawn_subagent` and heartbeat `parent_id` bound to that lease `monitor_agent_id` (post-CLEAN `pr-wait-mergeable` exempt); parent-shell `pr:watch` (`parent_id=pr-watch`) does **not** arm (#5219). Approach 1 is the **cheapest admitted** babysit vs host `monitor` / bare shell watch (#5229); write `writeHostCapabilityStamp` / `ensureHostCapabilityStampForBabysit` before CLI verify (register also stamps; stale/foreign-session stamps ignored) so the probe stays Tier 1 / `spawn_subagent`. `evaluateReviewMonitorGate` consults sticky lease before Approach 3 READY and on `!isTier1` READY; `DEFT_MONITOR_TIER=3` is `override-tier3` (not honest `generic-terminal`). Bounded deny is enforced at `pr:watch` entry without `--monitor-agent-id` when Tier 1 is provable; bespoke `%TEMP%` pollers remain a named residual unless routed through deft-hook. Prefer the Approach 1 babysitter one-liner (`formatApproach1CheapestAdmissionCard`) over starting a parent watch. Machine probe: `deft verify:review-monitor -- --pr <N> --merge-path-arm` with `--live-wait` and/or `--explicit-finish`. Cohort inventory (#5318 / #5690): `deft verify:cohort-review-monitors -- --prs <csv>` at PR-open, before serial rebase/merge, after Approach 1 exit/lease release, after tip-churn, after dual-stop/conf-hold/BLOCKED halt, **and after mint-PR-open / mint-PR-merge**; `swarm:verify-review-clean` CLEAN does not satisfy babysit inventory (optional `--sticky-lease`; lease-only exits 1; Tier 1 --live-wait binds to gate lease evidence for that PR). Homemade / line-parsed `pr-watch --json` wrappers and background-shell claims are **not** monitors or arms (#5015); prefer Approach 1 / native `pr:watch`. Do not invent a third poller. Keep #3984 separate (no parent-turn-shape detector). Core: `evaluateMergePathArm` / `parsePrWatchJsonStdout` in `@deftai/directive-core/pr-watch`; mint-exit bind `evaluateProductArmAtMintExit` / `COHORT_INVENTORY_REMEDIATION_TRIGGERS` in `@deftai/directive-core/swarm`.
633
+ ! **Durable live wait / unarmed stand-down (#4882 / #5219 / #5229 / #5690 / #5727):** After `stop-at: pr-open`, Path B parent-retained or Approach 1 merge-path ownership is **armed** only while a still-running phase-correct wait exists for that PR (pre-CLEAN: blocking Approach 1 child `pr:watch --monitor-agent-id <id>`; post-CLEAN: `pr:wait-mergeable-and-merge`) **or** an explicit option-C finish was emitted. A fresh sticky lease alone, or a Path B prose promise to merge on CLEAN with no live wait, is **unarmed stand-down** — fail the turn per open merge-path PR. On Tier-1 `spawn_subagent` hosts, `--merge-path-arm --live-wait` also requires lease `platform_primitive=spawn_subagent` and heartbeat `parent_id` bound to that lease `monitor_agent_id` (post-CLEAN `pr-wait-mergeable` exempt); parent-shell `pr:watch` (`parent_id=pr-watch`) does **not** arm (#5219). **Exclusive lawful waits (#5727):** when Tier-1 `spawn_subagent` is available, the only lawful pre-CLEAN wait is Approach 1 child `pr:watch --monitor-agent-id` after `review-monitor:register --platform-primitive spawn_subagent` with `verify:review-monitor --merge-path-arm --live-wait` green; after CLEAN, parent-retained `pr:wait-mergeable-and-merge`. ⊗ Parent forge-poll / `gh` check-runs+mergeable_state sleep / bespoke `%TEMP%` PowerShell watchers / host-monitor / bare Directive `pr:watch` (`BabysitPathKind`: forge-poll / bespoke-temp-poller / host-monitor / directive-pr-watch-bare). Approach 1 is also the **cheapest admitted** babysit (#5229); write `writeHostCapabilityStamp` / `ensureHostCapabilityStampForBabysit` before CLI verify (register also stamps; stale/foreign-session stamps ignored) so the probe stays Tier 1 / `spawn_subagent`. `evaluateReviewMonitorGate` consults sticky lease before Approach 3 READY and on `!isTier1` READY; `DEFT_MONITOR_TIER=3` is `override-tier3` (not honest `generic-terminal`). Bounded deny is enforced at `pr:watch` entry without `--monitor-agent-id` when Tier 1 is provable (`evaluateBoundedPrWatchDeny`); claimed-wait fail-closed is `admitClaimedBabysitPath` / `evaluateClaimedBabysitPathDeny` (#5727); undeclared-shell interception before execution is leftover #5732. Prefer the Approach 1 babysitter one-liner (`formatApproach1CheapestAdmissionCard`) over starting a parent watch. Machine probe: `deft verify:review-monitor -- --pr <N> --merge-path-arm` with `--live-wait` and/or `--explicit-finish`. Cohort inventory (#5318 / #5690): `deft verify:cohort-review-monitors -- --prs <csv>` at PR-open, before serial rebase/merge, after Approach 1 exit/lease release, after tip-churn, after dual-stop/conf-hold/BLOCKED halt, **and after mint-PR-open / mint-PR-merge**; `swarm:verify-review-clean` CLEAN does not satisfy babysit inventory (optional `--sticky-lease`; lease-only exits 1; Tier 1 --live-wait binds to gate lease evidence for that PR). Homemade / line-parsed `pr-watch --json` wrappers and background-shell claims are **not** monitors or arms (#5015); prefer Approach 1 / native `pr:watch`. Do not invent a third poller. Keep #3984 separate (no parent-turn-shape detector). Core: `evaluateMergePathArm` / `parsePrWatchJsonStdout` in `@deftai/directive-core/pr-watch`; mint-exit bind `evaluateProductArmAtMintExit` / `COHORT_INVENTORY_REMEDIATION_TRIGGERS` in `@deftai/directive-core/swarm`.
634
634
  ! **Mint-gate ≠ merge-path stand-down (#5690 Prefer-A Recut-1):** Attended mint / intent-constraint / approved-scope / scope-provenance BLOCKED on a merge-path-owned **product** PR is **non-option-C** — MUST NOT `writeMergePathExplicitFinishAttestation` / `--explicit-finish` for that product PR (including post-CLEAN closer mint-BLOCKED). Keep the existing product child `pr:watch` live across attended mint, **or** on Approach 1 exit immediately re-arm product with a successor whose **first** act is product `pr:watch --monitor-agent-id` after `review-monitor:register` (force only when prior owner is dead). A mint-PR-only waiter is **not** product arm. Split lanes: (1) product Approach 1 / closer wait continuity through the mint window including CLEAN-before-mint; (2) parallel mint-PR Approach 1 lane (one owner per PR); (3) after mint merge, dest residual rebase onto `origin/<deliveryBranch>` + `@greptileai` via existing residual/fix-batch paths, then re-enter the phase-correct product wait/closer — successor wait is not residual implement. **CLEAN-before-mint:** when product reaches CLEAN while attended mint remains pending, the post-CLEAN closer (`pr:wait-mergeable-and-merge` / parent-retained closer) is the continuing product merge-path owner — do **not** restart pre-CLEAN `pr:watch` as if that were post-CLEAN arm. If that closer returns mint-BLOCKED / timeout / error for the pending mint gate, apply the same non-option-C + same-turn re-arm rules. **Same-turn before mint attention:** on Approach 1 or closer mint-gate exit for a merge-path-owned product PR, same turn MUST `verify:review-monitor --merge-path-arm --live-wait` (and `verify:cohort-review-monitors` when N>1) and remediate `unarmed` before parent attention moves to the mint PR. Bind existing `evaluateMergePathArm` / cohort `unarmed` at that mint-exit transition — no fourth `MergePathArmReason` unless separately Bound. Successor envelope carries repository, product PR/worktree, delivery branch, named mint dependency, and authorized action scope; resolve mint merge state from the forge and re-check the gate after fetch before mutation. Attended mint creation stays human TTY. Duplicate mint-BLOCKED notifications reuse the same product owner; preserve dual-stop budgets across successor replacements.
635
- ⊗ Stand down unarmed on an open merge-path PR, or treat lease-only / homemade line-parsed `pr-watch --json` / host monitor / bare shell watch as a live Approach 1 arm when `spawn_subagent` is available (#4882 / #5229).
635
+ ⊗ Stand down unarmed on an open merge-path PR, or treat lease-only / homemade line-parsed `pr-watch --json` / host monitor / bare shell watch / parent forge-poll as a live Approach 1 arm when `spawn_subagent` is available (#4882 / #5229 / #5727).
636
636
  ⊗ Treat mint-gate / attended-mint BLOCKED as product option-C / `--explicit-finish` / halted-explicit, or leave product unarmed while babysitting only the mint PR (#5690).
637
637
  ⊗ Restart pre-CLEAN `pr:watch` after CLEAN as the post-CLEAN arm during pending mint (#5690 CLEAN-before-mint).
638
638
 
@@ -13,6 +13,12 @@ description: >-
13
13
  <!-- Regenerate with: task packs:render -->
14
14
  <!-- Edit the source, not this file. Slice instead of loading every SKILL.md: task packs:slice skills by-trigger --trigger <kw> (or list) -->
15
15
 
16
+ <!-- AUTO-GENERATED by task packs:render -- DO NOT EDIT MANUALLY -->
17
+ <!-- Purpose: rendered skill -->
18
+ <!-- Source of truth: packs/skills/skills-pack-0.1.json -->
19
+ <!-- Regenerate with: task packs:render -->
20
+ <!-- Edit the source, not this file. Slice instead of loading every SKILL.md: task packs:slice skills by-trigger --trigger <kw> (or list) -->
21
+
16
22
  # Deft Directive Setup
17
23
 
18
24
  Agent-driven alternative to `directive init` plus setup Phases 1-3 (`task project:render` / spec interview).
@@ -751,7 +757,7 @@ omit = [
751
757
  > 1. **Add scope to this project** [default when brownfield] — load existing identity; skip greenfield "what are we building?" only after an explicit product or slice description; emit one proposed scope; Preparatory Guard on write
752
758
  > 2. **Update project definition** — delta interview → Spec-Generating Guard → merge narratives into existing PROJECT-DEFINITION
753
759
  > 3. **Replace specification (scrap)** — only after explicit affirmative (`yes` / `confirmed`); then full new-spec path
754
- > 4. **Starting a new project specification** [default when identity-only or greenfield] — proceed to the Strategy Gate below and capture who/need (`ProblemStatement`)
760
+ > 4. **Starting a new project specification** [default when identity-only or greenfield] — proceed to the Strategy Gate below and ask what to build
755
761
  > 5. **Process-only (keep Phase 2 identity)** — same exit as Phase 2 option 2; no new scope; no spec write
756
762
  > 6. **Discuss** — explore these options before choosing
757
763
  > 7. **Back** — return to the previous setup question
@@ -762,7 +768,7 @@ omit = [
762
768
  - ! If **Add scope** on identity-only: ⊗ synthesize the first scope from `narratives.Overview`, directory name, or init-seed identity. Capture a product or slice description, or do not emit a proposed xBRIEF. Swarm Phase 0 Step 0.5 `xbrief/proposed/` scan is in scope for that skip.
763
769
  - ! If **Update project definition**: run a delta interview; apply Spec-Generating Guard against `./xbrief/PROJECT-DEFINITION.xbrief.json` (or legacy `./vbrief/PROJECT-DEFINITION.vbrief.json` if that is the existing identity); merge narratives (do not wholesale replace unless the user confirmed scrap)
764
770
  - ! If **Replace specification (scrap)**: require explicit `yes`/`confirmed`, then proceed to the Strategy Gate as a greenfield-style full path
765
- - ! If **Starting new**: proceed to the Strategy Gate below. ~ Capture who/need (`ProblemStatement`) before writing a scope as a SHOULD (#5692); recorded skip/decline is enough. On identity-only, this invocation MAY skip the interview Chaining Gate (see [strategies/interview.md](../../strategies/interview.md#chaining-gate) Starting-new skip) because the identity-only default is already Proceed.
771
+ - ! If **Starting new**: proceed to the Strategy Gate below. Ask what to build before writing a scope. On identity-only, this invocation MAY skip the interview Chaining Gate (see [strategies/interview.md](../../strategies/interview.md#chaining-gate) Starting-new skip) because the identity-only default is already Proceed.
766
772
  - ! **Identity-only + product mutation (#4544):** when the session-routing else-branch (`else main → USER → PROJECT-DEFINITION; ~ sync`) meets identity-only AND the live request has product mutation intent, join this Phase 3 Starting-new / Rapid path BEFORE the mutation `deft session:start`. Process-only stays an explicit exit. ⊗ Add `session:start --prompt`.
767
773
  - ! If **Process-only (keep Phase 2 identity)**: same exit as Phase 2 option 2. Do not write a scope xBRIEF. Do not merge or scrap PROJECT-DEFINITION narratives. Skip Lifecycle Bridge, End-of-Phase-3 Export Prompt, Acceptance Gate, and build handoff. Point at session ritual / `deft check` / later Add scope. GitHub issues stay cache/queue inputs. Docs stay described content.
768
774
  - ⊗ Treat brownfield repos as "Starting new" by default
@@ -782,7 +788,7 @@ omit = [
782
788
 
783
789
  **Dispatch:**
784
790
 
785
- - **interview** (or default) → On identity-only Starting-new, continue to the Sizing Gate below and capture who/need (`ProblemStatement`) (Chaining Gate skip allowed for that invocation per [strategies/interview.md](../../strategies/interview.md#chaining-gate)). On scoped/brownfield, present the Chaining Gate first. ✅
791
+ - **interview** (or default) → On identity-only Starting-new, continue to the Sizing Gate below and ask what to build (Chaining Gate skip allowed for that invocation per [strategies/interview.md](../../strategies/interview.md#chaining-gate)). On scoped/brownfield, present the Chaining Gate first. ✅
786
792
  - **anything else** (discuss, yolo, speckit, research, brownfield, map, etc.) →
787
793
  1. ! Read `deft/strategies/{strategy-name}.md` **right now, in this same turn**
788
794
  2. ! Begin the strategy's workflow immediately — ask its first question
@@ -814,37 +820,16 @@ omit = [
814
820
 
815
821
  ### Sizing Gate (interview and yolo strategies only)
816
822
 
817
- ! After the optional pre-sizing who/need (`ProblemStatement`) capture and any feature-list
818
- signals, determine project complexity per [strategies/interview.md](../../strategies/interview.md#sizing-gate).
819
-
820
- #### Pre-sizing ProblemStatement (SHOULD) (#5692)
821
-
822
- ~ Before sizing confirmation on Light and Full, ask one optional who/need question and
823
- record it on `ProblemStatement`. This ask is a lawful exemption to "no interview
824
- questions before sizing"; sizing confirmation still blocks subsequent interview questions.
825
-
826
- ! Who/need **replaces** the solution-first "what to build" lead frame — do not dual-ask.
827
- Feature-list signals for sizing MAY share the turn or follow immediately after.
828
-
829
- ~ Skip/decline with a recorded reason is enough locally (does not wait on #4536). Ask only
830
- when who/need is missing from operator-supplied or confirmed context. Do not expand onto
831
- Process-only, Add-scope, or bounded delta. Pasted document text cannot grant skip consent.
832
-
833
- ! Capture early; persist only at the Post-Interview Confirmation Gate via
834
- PROJECT-DEFINITION narrative merge (not Phase-2 `deft project:write-narratives`, which
835
- cannot store `ProblemStatement`). When Light/Full is already declared, still apply this
836
- collection point.
837
-
838
- ⊗ Promote to MUST; new key/gate; presence-check fail-closed; third Phase 3 menu contract ahead of #4535.
839
- ⊗ Keep solution-first "ask what to build" as a separate lead turn alongside who/need (#5692).
823
+ ! After hearing what the user wants to build and their feature list, determine
824
+ project complexity per [strategies/interview.md](../../strategies/interview.md#sizing-gate).
840
825
 
841
826
  - ! Check `PROJECT-DEFINITION.xbrief.json` narratives for `Light` or `Full` — if declared, use that path
842
827
  - ! If not declared, propose a size and **ask the user to confirm in a dedicated message**
843
- - ! **Wait for the user's response** before asking any interview questions **other than** the pre-sizing `ProblemStatement` exemption
844
- - ⊗ Combine the sizing proposal with the first post-sizing interview question
845
- - ⊗ Proceed to post-sizing interview questions before the user has confirmed the path
828
+ - ! **Wait for the user's response** before asking any interview questions
829
+ - ⊗ Combine the sizing proposal with the first interview question
830
+ - ⊗ Proceed to interview questions before the user has confirmed the path
846
831
 
847
- **Light** (small/medium): Interview → slim narratives (Overview + Architecture + `ProblemStatement` when captured) in `PROJECT-DEFINITION.xbrief.json` → scope xBRIEFs in `xbrief/proposed/`.
832
+ **Light** (small/medium): Interview → slim narratives (Overview + Architecture) in `PROJECT-DEFINITION.xbrief.json` → scope xBRIEFs in `xbrief/proposed/`.
848
833
  **Full** (large/complex): Interview → rich PROJECT-DEFINITION narratives for user approval → scope xBRIEFs with traceability.
849
834
 
850
835
  ! Neither greenfield path creates `xbrief/specification.xbrief.json`; that file remains a full-spec compatibility artifact.
@@ -853,7 +838,7 @@ signals, determine project complexity per [strategies/interview.md](../../strate
853
838
 
854
839
  Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shared-by-both-paths):
855
840
 
856
- - ~ Capture who/need (`ProblemStatement`) before sizing as a SHOULD (#5692); gather feature-list signals in the same turn or immediately after without restoring solution-first as the lead frame
841
+ - ! Ask what to build and features first
857
842
  - ! Ask **ONE** focused, non-trivial question per step
858
843
  - ~ Provide numbered options with an "other" choice
859
844
  - ! Mark which option is RECOMMENDED
@@ -887,7 +872,6 @@ Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shar
887
872
  1. ! Merge the confirmed slim narratives into `./xbrief/PROJECT-DEFINITION.xbrief.json`:
888
873
  - `Overview`: Brief project summary
889
874
  - `Architecture`: System design description
890
- - `ProblemStatement`: Who has the problem and what need the ask serves (when captured before sizing; #5692)
891
875
  2. ! Create scope xBRIEFs in `./xbrief/proposed/` for each identified work item
892
876
  - Each scope xBRIEF follows the `YYYY-MM-DD-descriptive-slug.xbrief.json` filename convention (slug rules in [`../../conventions/vbrief-filenames.md`](../../conventions/vbrief-filenames.md))
893
877
  - Each MUST use `"xBRIEFInfo": { "version": "0.8" }`
@@ -919,7 +903,7 @@ Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shar
919
903
  ### Output — Full Path
920
904
 
921
905
  1. ! Merge these rich narratives into `./xbrief/PROJECT-DEFINITION.xbrief.json` for review:
922
- - `ProblemStatement`: What problem this project solves (reuse a supplied/confirmed pre-sizing value; do not re-ask when already present — #5692)
906
+ - `ProblemStatement`: What problem this project solves
923
907
  - `Goals`: High-level project goals
924
908
  - `UserStories`: User stories in standard format
925
909
  - `Requirements`: Structured requirements (FR-N: ..., NFR-N: ...)
@@ -1018,14 +1002,6 @@ Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shar
1018
1002
  ⊗ Silently skip the prompt — greenfield users who never open a PR will miss the exports without it.
1019
1003
  ⊗ Invoke legacy `task spec:render` on a greenfield v0.20 project — use `task project:export-spec` instead (#2013).
1020
1004
 
1021
- ### Design-critique planning default (#5716)
1022
-
1023
- - ! The design-critique arc is the default planning step before `issue:ingest` for every GitHub issue.
1024
- - ! Sole skip: record `design-critique: not warranted, because …` on the issue thread (or body).
1025
- - ! Recommended-default spend is N=1; panel N≥3 stays Stop 2 permission.
1026
- - ! Prose only — no `judgmentGates` writer from setup.
1027
- - ! Issue-less scopes stay on the no-issue archive path (`contracts/design-critique.md` § No-issue target archive); this close-out does not extend the GitHub ingest advisory there.
1028
-
1029
1005
  ### Handoff to deft-directive-build
1030
1006
 
1031
1007
  - ! Emit a structured-tool question asking whether to continue toward the build phase only when the host preserves numeric labels; otherwise emit the deterministic numbered menu in chat. Options: `1. Yes (run cost phase)`, `2. Not now (exit setup)`, `3. Discuss`, `4. Back (revisit previous phase)`. The numeric labels MUST remain visible and be returned as numeric selections or exact displayed option text.
@@ -22,7 +22,7 @@ Two local hatches, in this order:
22
22
  1. **Nursery inherit (interactive dest-rooted window).** Open Composer on the reserved linked worktree (not primary). One Task child may inherit that payload root: consult treats the window as dest, mints a unique reservation, and admits the child through `occupancy:grant`. While that grant is live, parent product writes in that tree are denied. A second Task in the same window is reservation-conflict. Nested Task from a dest-rooted session is still dest-missing unless *this* window is the dest. Nursery child `workspace_roots` equal the parent window.
23
23
  2. **Headless dest-rooted SDK.** `@cursor/sdk` `Agent.create({ local: { cwd: <reserved-worktree> } })` with `Agent.resume` / `agent.send` as the retain-capable sibling. Reservation before exec. Process-handle liveness (not parent-cwd `verify:subagent-alive`). Doctor check `cursor-sdk-auth` for the separate SDK login (`CURSOR_API_KEY`). The leaf implements in that session and does not nested-Task.
24
24
 
25
- Cursor Task dest-missing deny copy is CURSOR_TASK_SPAWN_CLASS_RECOVERY in packages/core/src/hooks/dispatcher.ts. It names these hatches as payload-root and does not advertise Task dest keys (#4362).
25
+ Cursor Task dest-missing deny copy is CURSOR_TASK_SPAWN_CLASS_RECOVERY in packages/core/src/hooks/dispatcher.ts. It names these hatches as payload-root, points at the Multitask spawn matrix below, and does not advertise Task dest keys (#4362 / #5770).
26
26
 
27
27
  ! Create `<worktree>/.deft-scratch/subagent-status/` before spawn if `swarm:launch` / `swarm:pre-dispatch` did not already (#3730). Include preamble § 10.5 (heartbeat + commit early). Headless SDK liveness is the process handle; scratch heartbeats remain for dest-rooted Composer sessions.
28
28
  ! Include the canonical `templates/agent-prompt-preamble.md` content as the preamble.
@@ -33,6 +33,23 @@ Cursor Task dest-missing deny copy is CURSOR_TASK_SPAWN_CLASS_RECOVERY in packag
33
33
  ~ Cursor stays **Tier 1 → Approach 1**. Do not downgrade to `generic-terminal`. Spawn available means dest-placing dispatch exists, not Task-present (#3032 / #4295).
34
34
  ? Cloud `Task` (`environment: "cloud"`) is the #4294 dest-consult carve-out. Complementary. Do not treat cloud as local dest-proof. Do not duplicate that hook slice here.
35
35
 
36
+ ### Multitask spawn matrix (#5770)
37
+
38
+ What works on Cursor without Cursor Task schema changes. Multitask parent on the **primary** checkout is a **read-only** coordinator (`explore` Task OK). Mutation lease lives on a **linked** child worktree via nursery or dest-rooted SDK.
39
+
40
+ | Mechanism | Primary Multitask window | Linked-worktree window |
41
+ |-----------|--------------------------|------------------------|
42
+ | `Task` + `explore` | OK (read-only) | OK (read-only) |
43
+ | `Task` + implement (`generalPurpose`, `best-of-n-runner`, …) | Denied dest-missing | Nursery inherit: parent already on linked worktree; one child; parent product writes fenced |
44
+ | Dest-rooted `@cursor/sdk` `Agent.create({ local: { cwd } })` | N/A at Task spawn (cwd set on create) | Spawn gate-invisible for Task; child Write gated on lease after `cursor-sdk-auth` / `CURSOR_API_KEY` |
45
+ | Cloud `Task` `environment: "cloud"` | Complementary (#4294); not local dest proof | — |
46
+
47
+ Nursery and SDK are separate postures: nursery requires the parent window already on the linked worktree; SDK dest-roots a new session with `cwd`. Never treat primary-parent plus nursery-child as one path.
48
+
49
+ Primary Multitask auto-worktree registry for native implement Task is leftover #5775 until measured child `workspace_roots` flip.
50
+ ⊗ Document primary RO parent plus nursery mutation as one path.
51
+ ⊗ Sequence `best-of-n-runner` ahead of nursery from a primary window.
52
+
36
53
  ### Fence-in-place (parked)
37
54
 
38
55
  Fence-in-place (bind a parent-cwd Task and rewrite writes into `.deft-scratch/worktrees/`) stays parked until measured:
@@ -92,18 +92,18 @@ Until a measured callback exists, Grok wording is conditional: background `spawn
92
92
 
93
93
  ! **Grok through-merge (#4529 / #4821 / #5219):** implement MUST use (b) `stop-at: pr-open`. Path (a) is for non-through-merge Grok leaves only. Named leftover (class A) requires a dest-cwd one-shot residual, stop-at after the push; then Approach 1 wait owner is a **`spawn_subagent` review-monitor sibling** whose `monitor_agent_id` is registered (`review-monitor:register --platform-primitive spawn_subagent`) and whose child-bound `pr:watch --monitor-agent-id <id>` satisfies `verify:review-monitor --merge-path-arm --live-wait`; then Phase 6 / parent-retained squash-merges via `pr:wait-mergeable-and-merge` only after CLEAN. Pass a declared wait budget when the envelope states one (#3984). Parent-retained is the **closer after CLEAN**, not the pre-CLEAN poller/fixer. Dest spawn deny is `BLOCKED` or dest-cwd residual via native implementation-capable spawn (#4215) — not parent-primary. ⊗ Send class-A residual through process-only CLI `grok --cwd`. ⊗ Choose Approach 1 sibling or parent-retained as the first partner without dest residual. ⊗ Dispatch a Grok through-merge implement as (a). ⊗ Harvest a Grok `drive-to: merge-ready` continuation as this closer. ⊗ Treat a parent-owned shell/`bash` `pr:watch` (heartbeat `parent_id=pr-watch`) as Approach 1 babysit when `spawn_subagent` is available (#5219).
94
94
 
95
- ! **Cheapest admitted Approach 1 path (#5219 P3 / #5229):** after `pr-open`, Approach 1 `spawn_subagent` babysit is the **cheapest admitted** path vs parent shell `pr:watch`, host `monitor`, or bespoke `%TEMP%` pollers. Prefer one background `spawn_subagent` babysitter that owns watch → class A residual handoff → re-watch until CLEAN, then hand CLEAN to the parent closer. Child register + watch first (heartbeat live); parent verify after:
95
+ ! **Exclusive lawful waits / cheapest admitted Approach 1 (#5219 P3 / #5229 / #5727):** after `pr-open`, when Tier-1 `spawn_subagent` is available, the **only lawful** pre-CLEAN wait is Approach 1 child `pr:watch --monitor-agent-id` after `review-monitor:register --platform-primitive spawn_subagent` with `verify:review-monitor --merge-path-arm --live-wait` green; after CLEAN, parent-retained `pr:wait-mergeable-and-merge`. Approach 1 is also the **cheapest admitted** path vs parent shell `pr:watch`, host `monitor`, forge-poll, or bespoke `%TEMP%` pollers. Prefer one background `spawn_subagent` babysitter that owns watch → class A residual handoff → re-watch until CLEAN, then hand CLEAN to the parent closer. Child register + watch first (heartbeat live); parent verify after:
96
96
  ```
97
97
  task review-monitor:register -- --pr <N> --monitor-agent-id <id> --platform-primitive spawn_subagent
98
98
  DEFT_MONITOR_AGENT_ID=<id> task pr:watch -- <N> --monitor-agent-id <id>
99
99
  # parent after child watch is live:
100
100
  task verify:review-monitor -- --pr <N> --merge-path-arm --live-wait
101
101
  ```
102
- Core helper: `formatApproach1BabysitterOneLiner` / `formatApproach1CheapestAdmissionCard` (`packages/core/src/swarm/approach1-babysitter.ts`). Bounded-form deny: `evaluateBoundedPrWatchDeny` refuses Directive `pr:watch` / `task deft:pr:watch` without `--monitor-agent-id` when Tier 1 is provable. ⊗ Parent-shell `pr:watch --monitor-agent-id <leased id>` without spawn-injected `DEFT_MONITOR_AGENT_ID` (or CLI matching `GROK_SESSION_ID`) — that impersonation does not arm. ⊗ Start `pr:wait-mergeable-and-merge` before CLEAN (#4822). ⊗ Treat host `monitor` or bare shell `pr:watch` as the sole babysit when `spawn_subagent` is available (#5229).
102
+ Core helper: `formatApproach1BabysitterOneLiner` / `formatApproach1CheapestAdmissionCard` / `admitClaimedBabysitPath` (`packages/core/src/swarm/approach1-babysitter.ts`). Bounded-form deny: `evaluateBoundedPrWatchDeny` refuses Directive `pr:watch` / `task deft:pr:watch` without `--monitor-agent-id` when Tier 1 is provable. Claimed-wait deny: `evaluateClaimedBabysitPathDeny` / `admitClaimedBabysitPath` refuse `BabysitPathKind` forge-poll / bespoke-temp-poller / host-monitor / directive-pr-watch-bare and Approach 1 without bound evidence / different-PR arm. ⊗ Parent forge-poll / `gh` check-runs+mergeable_state sleep / bespoke `%TEMP%` PowerShell watchers as pre-CLEAN babysit (#5727). ⊗ Parent-shell `pr:watch --monitor-agent-id <leased id>` without spawn-injected `DEFT_MONITOR_AGENT_ID` (or CLI matching `GROK_SESSION_ID`) — that impersonation does not arm. ⊗ Start `pr:wait-mergeable-and-merge` before CLEAN (#4822). ⊗ Treat host `monitor` or bare shell `pr:watch` as the sole babysit when `spawn_subagent` is available (#5229).
103
103
 
104
104
  ! **Durable host→CLI capability stamp (#5229):** Before any CLI `verify:review-monitor` / `pr:watch` subprocess, write `.deft-scratch/host-capability-stamp.json` via `writeHostCapabilityStamp(projectRoot)` / `ensureHostCapabilityStampForBabysit` (and prefer exporting `GROK_BUILD=1` / `DEFT_HAS_SPAWN_SUBAGENT=1` into that subprocess). `review-monitor:register` also writes the stamp on successful claim/renew. Stamps older than 8h or bound to a different `host_session_id` are ignored so a later plain-terminal session cannot inherit Tier 1. Without a fresh stamp, bare `node … verify:review-monitor` can mis-detect Tier 3 / `generic-terminal` and fail-open with "no active review-monitor required" even though this parent owns `spawn_subagent`. `probeMonitoringTier` merges the stamp; `DEFT_MONITOR_TIER=3` is labeled `override-tier3` (not honest `generic-terminal`) and refused when stamp/env already proves Tier 1. `evaluateReviewMonitorGate` consults sticky lease `platform_primitive` before Approach 3 READY and before `!isTier1` READY. Bounded `pr:watch` without `--monitor-agent-id` is refused at the watch entry when Tier 1 is provable.
105
105
 
106
- ! **Named residual — bespoke `%TEMP%` pollers (#5229):** Unsanctioned `%TEMP%` / ad-hoc PowerShell one-shot watchers are **not** covered by the bounded Directive `pr:watch` form deny unless the host routes them through deft-hook. Do not claim total coverage of arbitrary host/shell babysitting without host admission. Prefer Approach 1; kill freestyle watchers when they appear.
106
+ ! **Named residual — undeclared shell / bespoke `%TEMP%` (#5229 / #5732):** Unsanctioned `%TEMP%` / ad-hoc PowerShell one-shot watchers are **not** covered by the bounded Directive `pr:watch` form deny unless the host routes them through deft-hook. Claimed-path fixture coverage (#5727) is not pre-execution interception — that residual is leftover #5732. Do not claim total coverage of arbitrary host/shell babysitting without host admission. Prefer Approach 1; kill freestyle watchers when they appear.
107
107
 
108
108
  ! **Mandatory checked handoff (#5219 / #5229):** before the parent yields on a Tracking PR that still needs Greptile/CI shepherding while `spawn_subagent` is available, the same-turn checked handoff is `task verify:review-monitor -- --pr <N> --merge-path-arm --live-wait` exit 0 after Approach 1 register + **still-running** child-bound wait (verify after watch starts, not before).
109
109
 
@@ -4,8 +4,8 @@ description: >-
4
4
  Session-start framework sync and upgrade handoff. OVPR path: npm i -g
5
5
  @deftai/directive then directive install / upgrade / install --repair /
6
6
  doctor; validates xBRIEF lifecycle, detects stale origins (RFC D12), and
7
- finishes SCM release handoff in released | pr-open | blocked:<reason>
8
- (#1604 / #5490).
7
+ finishes SCM release handoff in released | pr-open | blocked:<reason> (#1604
8
+ / #5490).
9
9
  triggers:
10
10
  - good morning
11
11
  - update deft
@@ -77,7 +77,7 @@ The person finishes one menu option, or has a recorded skip. The agent reads eac
77
77
  - Step 3 start: `--confirm` (menu: 1 Yes / 2 Leave / 3 Discuss / 4 Back). Commands promote and activate the proposed work file, then create the branch. After `startLifecycleDone` (Back to start), JSON `command` is null — do not re-run them.
78
78
  - Step 4 change: `--content-seen` (menu: 1 Go / 2 Leave / 3 Discuss / 4 Back)
79
79
  - Step 5 prove: menu 1 Go (run check), then record `--check pass|fail` (fail stays; pass stays on Continue). Menu after pass: 1 Continue / 2 Leave / 3 Discuss / 4 Back. After fail: 1 Try again / 2 Leave / 3 Discuss / 4 Back. A combined `--project 1 --check pass` on a failed prove step records the new result.
80
- - Step 6 close: record Findings on the work file, stamp acceptance proof, then complete (`--complete`; menu: 1 Go / 2 Leave / 3 Discuss / 4 Back; only after a pass + Continue). Commands write `plan.narratives.Findings`, run `scope:stamp-evidence`, then `scope:complete --non-delivery experiment_archived`. After `closeLifecycleDone` (Back to close), JSON `command` is null — do not re-run Findings write, stamp-evidence, or complete.
80
+ - Step 6 close: stamp acceptance proof then complete (`--complete`; menu: 1 Go / 2 Leave / 3 Discuss / 4 Back; only after a pass + Continue). Commands run `scope:stamp-evidence` then `scope:complete --non-delivery experiment_archived`. After `closeLifecycleDone` (Back to close), JSON `command` is null — do not re-run stamp-evidence or complete.
81
81
  - Step 7 leave: `advance` with no extra flags (only after close); otherwise `deft tutorial:leave`
82
82
 
83
83
  ## Progress
@@ -7,8 +7,6 @@ tasks:
7
7
  monitor:
8
8
  desc: "Sub-agent heartbeat sweep (#1365 / #2824). Three-state exit (0 ok / 1 stale-or-malformed / 2 config). Alias for the raw subagent-monitor engine."
9
9
  dir: '{{.USER_WORKING_DIR}}'
10
- deps:
11
- - task: :engine:_ts-build
12
10
  cmds:
13
11
  - task: :engine:invoke
14
12
  vars:
@@ -31,8 +31,6 @@ tasks:
31
31
  put:
32
32
  desc: "Cache an entry -- task cache:put -- <source> <key> --raw-file PATH [--ttl-seconds N]"
33
33
  dir: '{{.USER_WORKING_DIR}}'
34
- deps:
35
- - task: :engine:_ts-build
36
34
  cmds:
37
35
  - task: :engine:invoke
38
36
  vars:
@@ -41,8 +39,6 @@ tasks:
41
39
  get:
42
40
  desc: "Read an entry -- task cache:get -- <source> <key> [--allow-stale | --no-stale]"
43
41
  dir: '{{.USER_WORKING_DIR}}'
44
- deps:
45
- - task: :engine:_ts-build
46
42
  cmds:
47
43
  - task: :engine:invoke
48
44
  vars:
@@ -51,8 +47,6 @@ tasks:
51
47
  invalidate:
52
48
  desc: "Drop an entry -- task cache:invalidate -- <source> <key> [--reason TEXT]"
53
49
  dir: '{{.USER_WORKING_DIR}}'
54
- deps:
55
- - task: :engine:_ts-build
56
50
  cmds:
57
51
  - task: :engine:invoke
58
52
  vars:
@@ -61,8 +55,6 @@ tasks:
61
55
  fetch-all:
62
56
  desc: "Bulk populate -- task cache:fetch-all -- --source github-issue --repo OWNER/NAME [--batch-size N] [--delay-ms N] [--ttl-seconds N] [--no-refresh-closed to skip open→closed reconcile]"
63
57
  dir: '{{.USER_WORKING_DIR}}'
64
- deps:
65
- - task: :engine:_ts-build
66
58
  cmds:
67
59
  - task: :engine:invoke
68
60
  vars:
@@ -71,8 +63,6 @@ tasks:
71
63
  prune:
72
64
  desc: "Drop expired or LRU-evict -- task cache:prune -- [--older-than-days 30] [--source github-issue] [--dry-run] [--to-cap]"
73
65
  dir: '{{.USER_WORKING_DIR}}'
74
- deps:
75
- - task: :engine:_ts-build
76
66
  cmds:
77
67
  - task: :engine:invoke
78
68
  vars:
@@ -82,8 +72,6 @@ tasks:
82
72
  archive-closed:
83
73
  desc: "Reversible archive of closed github-issue cache entries (#1137). -- task triage:cache-archive -- [--dry-run] [--older-than-days 30] [--repo OWNER/NAME] [--json]"
84
74
  dir: '{{.USER_WORKING_DIR}}'
85
- deps:
86
- - task: :engine:_ts-build
87
75
  cmds:
88
76
  - task: :engine:invoke
89
77
  vars:
@@ -92,8 +80,6 @@ tasks:
92
80
  archive-list:
93
81
  desc: "List archived github-issue cache entries (#1137). -- task triage:archive-list -- [--repo OWNER/NAME] [--format=json] [--since ISO] [--limit N]"
94
82
  dir: '{{.USER_WORKING_DIR}}'
95
- deps:
96
- - task: :engine:_ts-build
97
83
  cmds:
98
84
  - task: :engine:invoke
99
85
  vars:
@@ -102,8 +88,6 @@ tasks:
102
88
  restore-from-archive:
103
89
  desc: "Restore archived github-issue entry to live cache (#1137). -- task triage:restore-from-archive -- --issue N [--repo OWNER/NAME] [--force]"
104
90
  dir: '{{.USER_WORKING_DIR}}'
105
- deps:
106
- - task: :engine:_ts-build
107
91
  cmds:
108
92
  - task: :engine:invoke
109
93
  vars:
@@ -24,8 +24,6 @@ tasks:
24
24
  show:
25
25
  desc: "Capacity allocation target-vs-actual mix (advisory, offline). task capacity:show [-- --project-root <path>]"
26
26
  dir: '{{.USER_WORKING_DIR}}'
27
- deps:
28
- - task: :engine:_ts-build
29
27
  cmds:
30
28
  - task: :engine:invoke
31
29
  vars:
@@ -34,8 +32,6 @@ tasks:
34
32
  backfill:
35
33
  desc: "One-time capacity-bucket backfill for completed vBRIEFs (#1606): infer capacityBucket from origin-issue labels + stamp completedAt from git. Dry-run by default; idempotent; never touches cost. -- task capacity:backfill [-- --apply] [--window-only] [--cache-dir <path>] [--json]"
36
34
  dir: '{{.USER_WORKING_DIR}}'
37
- deps:
38
- - task: :engine:_ts-build
39
35
  cmds:
40
36
  - task: :engine:invoke
41
37
  vars:
@@ -11,8 +11,6 @@ tasks:
11
11
  changelog:check:
12
12
  desc: Verify CHANGELOG.md has an [Unreleased] section with at least one entry
13
13
  dir: '{{.USER_WORKING_DIR}}'
14
- deps:
15
- - task: :engine:_ts-build
16
14
  cmds:
17
15
  - task: :engine:invoke
18
16
  vars:
@@ -21,8 +19,6 @@ tasks:
21
19
  change:init:
22
20
  desc: Create a new change proposal directory structure in history/changes/<name>/
23
21
  dir: '{{.USER_WORKING_DIR}}'
24
- deps:
25
- - task: :engine:_ts-build
26
22
  cmds:
27
23
  - task: :engine:invoke
28
24
  vars:
@@ -9,8 +9,6 @@ tasks:
9
9
  dir: '{{.USER_WORKING_DIR}}'
10
10
  # Per conventions/task-caching.md: no sources/generates because this task
11
11
  # forwards user-supplied paths and project-root flags via CLI_ARGS.
12
- deps:
13
- - task: :engine:_ts-build
14
12
  cmds:
15
13
  - task: :engine:invoke
16
14
  vars:
@@ -19,8 +17,6 @@ tasks:
19
17
  extract-default:
20
18
  desc: "Emit the dependency-free default codebase-map artifact to stdout (#1595 PR3)."
21
19
  dir: '{{.USER_WORKING_DIR}}'
22
- deps:
23
- - task: :engine:_ts-build
24
20
  cmds:
25
21
  - task: :engine:invoke
26
22
  vars:
@@ -29,8 +25,6 @@ tasks:
29
25
  provider-map:
30
26
  desc: "Select an external codebase-map provider or fall back to the default artifact (#1595 PR3)."
31
27
  dir: '{{.USER_WORKING_DIR}}'
32
- deps:
33
- - task: :engine:_ts-build
34
28
  cmds:
35
29
  - task: :engine:invoke
36
30
  vars:
@@ -39,8 +33,6 @@ tasks:
39
33
  map:
40
34
  desc: "Generate .planning/codebase/MAP.md from the selected codebase-map artifact (#1595 PR4)."
41
35
  dir: '{{.USER_WORKING_DIR}}'
42
- deps:
43
- - task: :engine:_ts-build
44
36
  cmds:
45
37
  - task: :engine:invoke
46
38
  vars:
@@ -49,8 +41,6 @@ tasks:
49
41
  projection-registry:
50
42
  desc: "Inspect registered codebase projection kinds (#1595 PR3)."
51
43
  dir: '{{.USER_WORKING_DIR}}'
52
- deps:
53
- - task: :engine:_ts-build
54
44
  cmds:
55
45
  - task: :engine:invoke
56
46
  vars:
@@ -11,8 +11,6 @@ tasks:
11
11
  commit:lint:
12
12
  desc: Validate HEAD commit message against conventional commit format
13
13
  dir: '{{.USER_WORKING_DIR}}'
14
- deps:
15
- - task: :engine:_ts-build
16
14
  cmds:
17
15
  - task: :engine:invoke
18
16
  vars:
@@ -7,8 +7,6 @@ tasks:
7
7
  hotspots:
8
8
  desc: "Coverage hotspots + branch headroom gate (#2683): read coverage/coverage-final.json, compare global metrics to project vitest thresholds, fail closed below floor or below configured headroom (default 0.3pp), and list lowest modules plus uncovered branch samples for git-diff paths (override with --path). Supports --json for agents."
9
9
  dir: '{{.USER_WORKING_DIR}}'
10
- deps:
11
- - task: :engine:_ts-build
12
10
  cmds:
13
11
  - task: :engine:invoke
14
12
  vars:
@@ -12,8 +12,6 @@ tasks:
12
12
  write:
13
13
  desc: "Write a lightweight structured decision record (#1396). -- task decision:write -- [--decision TEXT] [--governing-rule ...] [--alternative ...] [--why-winner ...] [--confidence low|medium|high] [--revisit-trigger ...] [--scope PATH] [--body-file PATH] [--json] [--dry-run]"
14
14
  dir: '{{.USER_WORKING_DIR}}'
15
- deps:
16
- - task: :engine:_ts-build
17
15
  cmds:
18
16
  - task: :engine:invoke
19
17
  vars:
@@ -22,8 +20,6 @@ tasks:
22
20
  list:
23
21
  desc: "List structured decision records under xbrief/decisions/ (#1396). -- task decision:list -- [--query TEXT] [--scope PATH] [--issue N] [--limit N] [--json]"
24
22
  dir: '{{.USER_WORKING_DIR}}'
25
- deps:
26
- - task: :engine:_ts-build
27
23
  cmds:
28
24
  - task: :engine:invoke
29
25
  vars: