kenaz 0.3.3 → 0.3.6

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 (451) hide show
  1. package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
  2. package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
  3. package/core/.claude/commands/Ansuz.md +15 -2
  4. package/core/.claude/hooks/__tests__/task-2395-project-registration.test.js +84 -0
  5. package/core/.claude/hooks/handoff-staleness.js +2 -2
  6. package/core/.claude/hooks/session-init.ps1 +49 -49
  7. package/core/.claude/hooks/turn-context.js +50 -2
  8. package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
  9. package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
  10. package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
  11. package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
  12. package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
  13. package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  14. package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  15. package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  16. package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  17. package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  18. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  19. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  20. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  21. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  22. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  23. package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  24. package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  25. package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  26. package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  27. package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
  28. package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
  29. package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  30. package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  31. package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  32. package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
  33. package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  34. package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
  35. package/core/.collaboration/core/task-api.js +1 -4
  36. package/core/.formation/README.md +21 -146
  37. package/core/.formation/bifrost/codex-doctor.js +37 -2
  38. package/core/.formation/bifrost/codex-doctor.test.js +18 -0
  39. package/core/.formation/bifrost/launch.js +1 -1
  40. package/core/.formation/bifrost/openai/codex-hook-shim.js +6 -0
  41. package/core/.formation/bifrost/openai/codex-hook-shim.test.js +11 -1
  42. package/core/.formation/bifrost/setup-codex.js +3 -0
  43. package/core/.formation/native/claude/README.md +1 -1
  44. package/core/.formation/role-map.yaml +3 -3
  45. package/core/.formation/spec/task_operations.parity.test.js +0 -1
  46. package/core/.formation/spec/task_operations.yaml +3 -3
  47. package/core/.formation/tests/hello.txt +2 -2
  48. package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +4 -4
  49. package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
  50. package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
  51. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
  52. package/core/.formation/tools/dispatch.js +33 -554
  53. package/core/.formation/tools/mcp-allowlist.test.js +0 -1
  54. package/core/.formation/tools/post-complete/task2345.test.js +0 -5
  55. package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
  56. package/core/.formation/tools/prompt.js +33 -1623
  57. package/core/.formation/tools/prompt.test.js +26 -594
  58. package/core/.formation/unit/do.yaml +2 -4
  59. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
  60. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
  61. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
  62. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
  63. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
  64. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
  65. package/core/.kenaz/muninn_episode_write.ps1 +17 -17
  66. package/core/.kenaz/specialist/field_report_watermark.json +1 -1
  67. package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
  68. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
  69. package/core/.kenaz/specialist/t1777_probe.txt +1 -1
  70. package/core/.matrix/index.matrix +5 -5
  71. package/core/.rule/general/agent-workflow.yaml +4 -4
  72. package/core/.rule/general/file-size-threshold.yaml +16 -4
  73. package/core/.rule/general/rust-verify-target.yaml +0 -1
  74. package/core/.rule/general/system-invariants.yaml +8 -25
  75. package/core/.specialist/Ansuz/SYSTEM_DOC.md +17 -42
  76. package/core/.specialist/Ansuz/capability.yaml +7 -14
  77. package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +4 -11
  78. package/core/.specialist/Ansuz/elixir.yaml +3 -4
  79. package/core/.specialist/Ansuz/identity_contract.yaml +1 -1
  80. package/core/.specialist/Ansuz/knowledge.yaml +7 -10
  81. package/core/.specialist/Ansuz/rule.yaml +2 -2
  82. package/core/.specialist/Ansuz/tools/verify-and-land.js +22 -0
  83. package/core/.specialist/Ansuz/tools/verify-and-land.test.js +59 -5
  84. package/core/.specialist/Ansuz/workflow.yaml +7 -11
  85. package/core/.specialist/Forseti/core.yaml +1 -1
  86. package/core/.specialist/Heimdall/SKILL.md +1 -1
  87. package/core/.specialist/Heimdall/core.yaml +2 -2
  88. package/core/.specialist/Huginn/rule.yaml +1 -1
  89. package/core/.specialist/tools/README.md +2 -2
  90. package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
  91. package/core/.system/collaboration/README.md +1 -1
  92. package/core/.system/formation/LEGACY_SKILLS.md +2 -0
  93. package/core/.system/formation/POST_COMPLETE.md +2 -0
  94. package/core/.system/formation/README.md +2 -0
  95. package/core/KENAZ_CORE_VERSION +1 -1
  96. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
  97. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
  98. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
  99. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
  100. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
  101. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
  102. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
  103. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
  104. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
  105. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
  106. package/core/dev/jev-eval/README.md +99 -99
  107. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
  108. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
  109. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
  110. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
  111. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
  112. package/core/dev/pipeline/tasks/.gitkeep +1 -1
  113. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
  114. package/core/dev/scripts/check-file-size.js +44 -17
  115. package/core/dev/scripts/init_git.sh +0 -0
  116. package/core/dev/scripts/init_project.sh +0 -0
  117. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
  118. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
  119. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
  120. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
  121. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
  122. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
  123. package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
  124. package/core/dev/scripts/run_once.sh +0 -0
  125. package/core/dev/scripts/setup_mcp.sh +0 -0
  126. package/core/dev/scripts/setup_rag.sh +0 -0
  127. package/core/dev/scripts/start_dev_agent.sh +0 -0
  128. package/core/dev/scripts/start_multi_agent.sh +0 -0
  129. package/core/dev/scripts/sync_task_queue.sh +0 -0
  130. package/core/k-cli/README.md +1 -94
  131. package/core/k-cli/test/TEST_SPEC.md +5 -22
  132. package/core/k-cli/test/run.sh +1 -67
  133. package/core/plugins/kenaz/commands/Amelia.md +1 -1
  134. package/core/plugins/kenaz/commands/Ansuz.md +16 -3
  135. package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
  136. package/core/plugins/kenaz/scripts/sync.js +6 -2
  137. package/core/plugins/kenaz/scripts/ygg.js +13 -1
  138. package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
  139. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
  140. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
  141. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
  142. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
  143. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
  144. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  145. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  146. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  147. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  148. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  149. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  150. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  151. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  152. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  153. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  154. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  155. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  156. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  157. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  158. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
  159. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
  160. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  161. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  162. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  163. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
  164. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  165. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
  166. package/lib/cli.js +11 -4
  167. package/package.json +11 -7
  168. package/vendor/install-kenaz-cli.js +18 -7
  169. package/core/.formation/legion/forge.yaml +0 -299
  170. package/core/.formation/legion/hive.yaml +0 -238
  171. package/core/.formation/squad/blitz.yaml +0 -192
  172. package/core/.formation/squad/strategy-tribunal.yaml +0 -354
  173. package/core/.formation/squad/strategy.yaml +0 -349
  174. package/core/.formation/squad/sweep.yaml +0 -208
  175. package/core/.formation/tools/broadcast.js +0 -103
  176. package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
  177. package/core/.formation/tools/dispatch-notifier.js +0 -84
  178. package/core/.formation/tools/formations.js +0 -1203
  179. package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
  180. package/core/.formation/tools/headless-dryrun.test.js +0 -79
  181. package/core/.formation/tools/headless-v2.js +0 -659
  182. package/core/.formation/tools/headless.js +0 -1071
  183. package/core/.formation/tools/legacy-scheduler.js +0 -1994
  184. package/core/.formation/tools/logger.js +0 -273
  185. package/core/.formation/tools/memory-loader.js +0 -422
  186. package/core/.formation/tools/process-state.js +0 -33
  187. package/core/.formation/tools/remote-conflict.js +0 -98
  188. package/core/.formation/tools/runner.js +0 -1332
  189. package/core/.formation/tools/task-utils.js +0 -344
  190. package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
  191. package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
  192. package/core/.formation/tools/worktree-leak.test.js +0 -162
  193. package/core/k-cli/dist/alaya/run.js +0 -91
  194. package/core/k-cli/dist/core/output.js +0 -24
  195. package/core/k-cli/dist/core/process.js +0 -38
  196. package/core/k-cli/dist/core/project.js +0 -80
  197. package/core/k-cli/dist/core/spawn.js +0 -268
  198. package/core/k-cli/dist/core/types.js +0 -2
  199. package/core/k-cli/dist/dashboard/update.js +0 -53
  200. package/core/k-cli/dist/dashboard/version.js +0 -20
  201. package/core/k-cli/dist/dispatch/run.js +0 -241
  202. package/core/k-cli/dist/dispatch/status.js +0 -103
  203. package/core/k-cli/dist/index.js +0 -283
  204. package/core/k-cli/dist/project/initialize.js +0 -301
  205. package/core/k-cli/dist/project/install.js +0 -89
  206. package/core/k-cli/dist/project/status.js +0 -138
  207. package/core/k-cli/dist/specialist/list.js +0 -100
  208. package/core/k-cli/dist/specialist/run.js +0 -93
  209. package/core/k-cli/dist/task/create.js +0 -194
  210. package/core/k-cli/dist/task/delete.js +0 -98
  211. package/core/k-cli/dist/task/get.js +0 -55
  212. package/core/k-cli/dist/task/list.js +0 -58
  213. package/core/k-cli/dist/task/submit.js +0 -156
  214. package/core/k-cli/dist/ygg/run.js +0 -51
  215. package/core/k-cli/node_modules/.bin/yaml +0 -16
  216. package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
  217. package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
  218. package/core/k-cli/node_modules/.package-lock.json +0 -23
  219. package/core/k-cli/node_modules/yaml/LICENSE +0 -13
  220. package/core/k-cli/node_modules/yaml/README.md +0 -172
  221. package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
  222. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
  223. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
  224. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
  225. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
  226. package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
  227. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
  228. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
  229. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
  230. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
  231. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
  232. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
  233. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
  234. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
  235. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
  236. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
  237. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
  238. package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
  239. package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
  240. package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
  241. package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
  242. package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
  243. package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
  244. package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
  245. package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
  246. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
  247. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
  248. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
  249. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
  250. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
  251. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
  252. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
  253. package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
  254. package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
  255. package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
  256. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
  257. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
  258. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
  259. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
  260. package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
  261. package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
  262. package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
  263. package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
  264. package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
  265. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
  266. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
  267. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
  268. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
  269. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
  270. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
  271. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
  272. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
  273. package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
  274. package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
  275. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
  276. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
  277. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
  278. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
  279. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
  280. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
  281. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
  282. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
  283. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
  284. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
  285. package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
  286. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
  287. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
  288. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
  289. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
  290. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
  291. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
  292. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
  293. package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
  294. package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
  295. package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
  296. package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
  297. package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
  298. package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
  299. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
  300. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
  301. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
  302. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
  303. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
  304. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
  305. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
  306. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
  307. package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
  308. package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
  309. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
  310. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
  311. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
  312. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
  313. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
  314. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
  315. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
  316. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
  317. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
  318. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
  319. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
  320. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
  321. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
  322. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
  323. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
  324. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
  325. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
  326. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
  327. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
  328. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
  329. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
  330. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
  331. package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
  332. package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
  333. package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
  334. package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
  335. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
  336. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
  337. package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
  338. package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
  339. package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
  340. package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
  341. package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
  342. package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
  343. package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
  344. package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
  345. package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
  346. package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
  347. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
  348. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
  349. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
  350. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
  351. package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
  352. package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
  353. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
  354. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
  355. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
  356. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
  357. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
  358. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
  359. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
  360. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
  361. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
  362. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
  363. package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
  364. package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
  365. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
  366. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
  367. package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
  368. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
  369. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
  370. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
  371. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
  372. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
  373. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
  374. package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
  375. package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
  376. package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
  377. package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
  378. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
  379. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
  380. package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
  381. package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
  382. package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
  383. package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
  384. package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
  385. package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
  386. package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
  387. package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
  388. package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
  389. package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
  390. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
  391. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
  392. package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
  393. package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
  394. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
  395. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
  396. package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
  397. package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
  398. package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
  399. package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
  400. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
  401. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
  402. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
  403. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
  404. package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
  405. package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
  406. package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
  407. package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
  408. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
  409. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
  410. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
  411. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
  412. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
  413. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
  414. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
  415. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
  416. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
  417. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
  418. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
  419. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
  420. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
  421. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
  422. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
  423. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
  424. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
  425. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
  426. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
  427. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
  428. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
  429. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
  430. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
  431. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
  432. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
  433. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
  434. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
  435. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
  436. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
  437. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
  438. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
  439. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
  440. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
  441. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
  442. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
  443. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
  444. package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
  445. package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
  446. package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
  447. package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
  448. package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
  449. package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
  450. package/core/k-cli/node_modules/yaml/package.json +0 -97
  451. package/core/k-cli/node_modules/yaml/util.js +0 -2
@@ -2,14 +2,12 @@
2
2
  /**
3
3
  * Formation Dispatch — CLI 入口
4
4
  *
5
- * 根據陣型調度 subagent 執行任務。
6
- * 實際邏輯分散在各模組:loader, prompt, runner, logger, utils。
5
+ * Sub-agent dispatch: prints the JSON payload (promptText + agentParams) the
6
+ * Agent tool (or Codex spawn_agent) consumes. The only live dispatch path.
7
7
  *
8
8
  * Usage:
9
- * node .formation/tools/dispatch.js --skill=do --task=TASK_172
10
- * node .formation/tools/dispatch.js --formation=solo --skill=strategy --task=TASK_172
11
- * node .formation/tools/dispatch.js --formation=squad --skill=blitz --task=TASK_173
12
- * node .formation/tools/dispatch.js --formation=legion --skill=forge --task=TASK_174 --dry-run
9
+ * node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent
10
+ * node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent --harness=codex
13
11
  */
14
12
 
15
13
  const path = require('path');
@@ -21,14 +19,12 @@ const {
21
19
  promptProfile, extractRigor, extractComplexity, splitPromptSections,
22
20
  applyRustCheckToPrefix,
23
21
  } = require('./prompt');
24
- const { runSingle, runParallel } = require('./runner');
25
22
  const {
26
- generateSessionId, ensureGitReady, ROOT, loadDashboardModels,
23
+ ROOT, loadDashboardModels,
27
24
  resolveWorktreeDecision, dispatchLockPath, tryAcquireDispatchLock, dispatchLockStaleness,
28
25
  createWorktree, ensureWorktreeDirIgnored, COLLABORATION_API,
29
26
  getVerifyOfflineCommand,
30
27
  } = require('./utils');
31
- const { refreshCache, hasRemoteConflict, hasRemoteFileConflict, isCacheStale } = require('./remote-conflict');
32
28
 
33
29
  // TASK_1815: the Agent tool's `model` parameter accepts ONLY these Claude
34
30
  // family names — no versions, no [1m] speed modifiers, no full model ids.
@@ -448,66 +444,9 @@ function samePath(a, b) {
448
444
  }
449
445
 
450
446
  // ─────────────────────────────────────────
451
- // Yggdrasil 廣播(lazy load, fire-and-forget)
447
+ // Isolation routing
452
448
  // ─────────────────────────────────────────
453
449
 
454
- let _supabaseClient = null;
455
- let _taskSync = null;
456
- let _commitSync = null;
457
- function getSupabaseClient(projectPath) {
458
- if (_supabaseClient === undefined) return null;
459
- if (!_supabaseClient) try { _supabaseClient = require('./supabase-client'); } catch { _supabaseClient = undefined; return null; }
460
- return _supabaseClient.getClient(projectPath);
461
- }
462
- function getTaskSync() {
463
- if (_taskSync === undefined) return null;
464
- if (!_taskSync) try { _taskSync = require('./task-sync'); } catch { _taskSync = undefined; return null; }
465
- return _taskSync;
466
- }
467
- function getCommitSync() {
468
- if (_commitSync === undefined) return null;
469
- if (!_commitSync) try { _commitSync = require('./commit-sync'); } catch { _commitSync = undefined; return null; }
470
- return _commitSync;
471
- }
472
-
473
- /**
474
- * 同步 commit 到 kenaz_commits。
475
- * 回傳 Promise(await 時確保完成,或 fire-and-forget)。
476
- */
477
- function syncCommit(taskId, projectPath) {
478
- try {
479
- const cs = getCommitSync();
480
- if (!cs) return Promise.resolve();
481
- return cs.syncLatestCommit({ taskId, projectPath }).catch(() => {});
482
- } catch { return Promise.resolve(); }
483
- }
484
-
485
- /**
486
- * 廣播 kenaz_status。
487
- * 回傳 Promise — caller 可 await 確保完成(cleanup 場景),
488
- * 或 fire-and-forget(上線廣播場景)。
489
- */
490
- function broadcastStatus(projectPath, updates) {
491
- try {
492
- const sb = getSupabaseClient(projectPath);
493
- if (!sb) return Promise.resolve();
494
- const { client, config } = sb;
495
- const ts = getTaskSync();
496
- const project = ts?.resolveProjectName?.(projectPath || ROOT) || path.basename(ROOT);
497
- return client.from('kenaz_status').upsert({
498
- node_name: config.node_name,
499
- project,
500
- ...updates,
501
- }, { onConflict: 'node_name,project' }).then(() => {}).catch(() => {});
502
- } catch { return Promise.resolve(); }
503
- }
504
-
505
- // ─────────────────────────────────────────
506
- // Active dispatch registry(Dashboard Agent Monitor 用)
507
- // ─────────────────────────────────────────
508
-
509
- const ACTIVE_DISPATCH_FILE = path.join(ROOT, '.formation', '.active-dispatches.json');
510
-
511
450
  /**
512
451
  * TASK_1833: THE single isolation-routing decision for a dispatch. Consumed by
513
452
  * the real sub-agent path — do not copy the check:
@@ -566,59 +505,6 @@ function resolveDispatchIsolation({ projectPath = null, useWorktreeOverride = nu
566
505
  };
567
506
  }
568
507
 
569
- function readActiveDispatches() {
570
- try {
571
- if (fs.existsSync(ACTIVE_DISPATCH_FILE)) {
572
- return JSON.parse(fs.readFileSync(ACTIVE_DISPATCH_FILE, 'utf-8'));
573
- }
574
- } catch { /* corrupted file */ }
575
- return [];
576
- }
577
-
578
- function writeActiveDispatches(list) {
579
- try {
580
- fs.writeFileSync(ACTIVE_DISPATCH_FILE, JSON.stringify(list, null, 2));
581
- } catch { /* ignore */ }
582
- }
583
-
584
- function registerDispatch({ sessionId, logPath, taskId, formation, projectPath: pp }) {
585
- const list = readActiveDispatches();
586
- const nextEntry = {
587
- sessionId,
588
- logPath,
589
- taskId,
590
- formation,
591
- startedAt: new Date().toISOString(),
592
- projectPath: pp || null,
593
- };
594
- const existingIndex = list.findIndex(d => d.sessionId === sessionId);
595
- if (existingIndex >= 0) {
596
- const mergedEntry = {
597
- ...list[existingIndex],
598
- startedAt: list[existingIndex].startedAt || nextEntry.startedAt,
599
- };
600
- for (const [key, value] of Object.entries(nextEntry)) {
601
- if (key === 'startedAt') continue;
602
- if (value !== null && value !== undefined) {
603
- mergedEntry[key] = value;
604
- }
605
- }
606
- list[existingIndex] = mergedEntry;
607
- } else {
608
- list.push(nextEntry);
609
- }
610
- writeActiveDispatches(list);
611
- }
612
-
613
- function unregisterDispatch(sessionId) {
614
- const list = readActiveDispatches().filter(d => d.sessionId !== sessionId);
615
- if (list.length === 0) {
616
- try { fs.unlinkSync(ACTIVE_DISPATCH_FILE); } catch { /* ignore */ }
617
- } else {
618
- writeActiveDispatches(list);
619
- }
620
- }
621
-
622
508
  // ─────────────────────────────────────────
623
509
  // Cortex Context 注入(dispatch 前自動注入相關檔案摘要)
624
510
  // ─────────────────────────────────────────
@@ -837,385 +723,6 @@ function checkDependencies(taskData, projectPath) {
837
723
  const unmet = deps.filter(dep => !completedIds.has(dep));
838
724
  return { blocked: unmet.length > 0, unmet, blockedDeps };
839
725
  }
840
-
841
- // ─────────────────────────────────────────
842
- // 調度主函數
843
- // ─────────────────────────────────────────
844
-
845
- async function dispatch(options) {
846
- const {
847
- formation = 'unit',
848
- skill = 'do',
849
- task,
850
- output = null,
851
- dryRun = false,
852
- projectPath = null
853
- } = options;
854
-
855
- const sessionId = generateSessionId();
856
-
857
- // 1. 載入技能定義
858
- const skillDef = loadSkill(formation, skill);
859
-
860
- // 2. 載入任務(如果是 TASK_ID,支援 projectPath)
861
- const loadOpts = projectPath ? { projectPath } : undefined;
862
- const taskData = task && task.startsWith('TASK_') ? loadTask(task, loadOpts) : null;
863
- const taskInput = task || '';
864
-
865
- // 2.5 依賴預檢:確認所有依賴都已完成
866
- if (taskData) {
867
- const depCheck = checkDependencies(taskData, projectPath);
868
- if (depCheck.blocked) {
869
- console.error(`❌ Dispatch blocked: ${taskInput} has unmet dependencies`);
870
- for (const dep of depCheck.unmet) {
871
- if (depCheck.blockedDeps && depCheck.blockedDeps.includes(dep)) {
872
- console.error(` ??${dep} ??blocked`);
873
- continue;
874
- }
875
- console.error(` ⛔ ${dep} — not in done/completed`);
876
- }
877
- console.error(` → Complete the dependencies first, or use --force to override`);
878
- if (!options.force) {
879
- process.exitCode = 1;
880
- return null;
881
- }
882
- console.warn(` ⚠️ --force: dispatching despite unmet dependencies`);
883
- }
884
- }
885
-
886
- // 3. 組裝 prompt(注入 projectPath context + Yggdrasil network context)
887
- const promptOptions = {};
888
- if (projectPath) {
889
- promptOptions.projectPath = projectPath;
890
- }
891
- if (taskInput && taskInput.startsWith('TASK_')) {
892
- promptOptions.taskId = taskInput;
893
- }
894
-
895
- // Yggdrasil: 查詢遠端節點狀態,注入 prompt 讓 Agent 知道其他人在做什麼
896
- const taskScopePaths = (() => {
897
- try {
898
- if (!taskData) return [];
899
- const parsed = JSON.parse(taskData);
900
- return parsed.scope_paths || [];
901
- } catch { return []; }
902
- })();
903
- try {
904
- const ts = getTaskSync();
905
- if (ts) {
906
- const [onlineNodes, remoteTasks] = await Promise.all([
907
- ts.getOnlineNodes(projectPath).catch(() => []),
908
- ts.getRemoteActiveTasks(projectPath).catch(() => []),
909
- ]);
910
- if (onlineNodes.length > 0 || remoteTasks.length > 0) {
911
- const sb = getSupabaseClient(projectPath);
912
- promptOptions.yggdrasilContext = {
913
- onlineNodes,
914
- remoteTasks,
915
- myNodeName: sb?.config?.node_name || 'unknown',
916
- myScopePaths: taskScopePaths,
917
- };
918
- }
919
- }
920
- } catch { /* Yggdrasil context is best-effort */ }
921
-
922
- let prompt = buildPrompt(skillDef, taskInput, taskData, promptOptions);
923
-
924
- // 3.5 Cortex Context 注入:將 scope_paths 相關檔案摘要注入 prompt
925
- // TASK_1998: "Related Files Preview" is CONTEXT volume, driven by
926
- // complexity — simple/medium drop it entirely (it was 3.9 KB of mostly
927
- // low-relevance file-head previews on the measured TASK_1992 prompt),
928
- // complex keeps it.
929
- const _dietProfile = promptProfile({ rigor: extractRigor(taskData), complexity: extractComplexity(taskData) });
930
- if (typeof prompt === 'string' && taskScopePaths.length > 0 && !_dietProfile.skipRelatedFilesPreview) {
931
- const cortexCtx = buildCortexContext(taskScopePaths, projectPath);
932
- if (cortexCtx) {
933
- prompt = prompt + '\n' + cortexCtx;
934
- }
935
- }
936
-
937
- console.log(`⚔️ Formation Dispatch`);
938
- console.log(` Formation: ${formation}`);
939
- console.log(` Skill: ${skill}`);
940
- console.log(` Task: ${taskInput.slice(0, 60)}${taskInput.length > 60 ? '...' : ''}`);
941
- console.log(` Session: ${sessionId}`);
942
- if (projectPath) console.log(` Project: ${projectPath}`);
943
-
944
- // 4. 確保子專案 git 已就緒(TASK_2274: dry-run 不得 git init — 只回報)
945
- if (dryRun) {
946
- if (projectPath && !fs.existsSync(path.join(projectPath, '.git'))) console.log(' [dry-run] would git init: ' + projectPath);
947
- } else {
948
- ensureGitReady(projectPath);
949
- }
950
-
951
- // 4.5 遠端衝突預檢(警告但不阻擋)
952
- const scopePaths = taskData?.scope_paths || [];
953
- if (scopePaths.length > 0) {
954
- try {
955
- if (isCacheStale()) {
956
- await refreshCache(projectPath);
957
- }
958
- const taskConflict = hasRemoteConflict(scopePaths);
959
- if (taskConflict.conflict) {
960
- console.log(`\n ⚠️ Remote conflict: ${taskConflict.conflictNode} is working on ${taskConflict.conflictTask}`);
961
- }
962
- const fileConflict = hasRemoteFileConflict(scopePaths);
963
- if (fileConflict.conflict) {
964
- console.log(` ⚠️ Remote file conflict: ${fileConflict.conflictNode} is touching ${fileConflict.conflictFile}`);
965
- }
966
- } catch {
967
- // 衝突檢查失敗不阻擋 dispatch
968
- }
969
- }
970
-
971
-
972
- // M1 (TASK_1758): Dispatch-time scope gate + resource lease
973
- {
974
- const _sgRoot = projectPath || ROOT;
975
- const _sgSession = _getProvenSessionId(_sgRoot); // TASK_2265: proven identity only
976
- const _sgPaths = (() => { try { return taskData ? JSON.parse(taskData).scope_paths || [] : []; } catch { return []; } })();
977
- const _sgResult = checkDispatchScopeGate(_sgPaths, _sgRoot, _sgSession, !!options.force, taskInput);
978
- if (_sgResult.collisions.length > 0) {
979
- for (const col of _sgResult.collisions) {
980
- const pl = col.paths.slice(0,3).join(', ') + (col.paths.length > 3 ? ' +' + (col.paths.length-3) + ' more' : '');
981
- if (_sgResult.blocked) {
982
- console.error(' Scope conflict with stream ' + col.stream_label + ' (task ' + col.task_id + '): ' + pl);
983
- } else {
984
- console.warn(' WARNING scope conflict with stream ' + col.stream_label + ' (task ' + col.task_id + '): ' + pl);
985
- }
986
- }
987
- if (_sgResult.blocked) {
988
- console.error('Dispatch blocked: scope overlap with live stream(s). Use --force to override.');
989
- process.exitCode = 1;
990
- return null;
991
- }
992
- }
993
- // TASK_1863: adopt our own claim marker (written by the chain's pre-claim /
994
- // move→active) so a post-gate rejection below releases it — TASK_1833
995
- // late-failure semantics extended from resource leases to the claim marker.
996
- const _sgResources = (() => { try { return taskData ? JSON.parse(taskData).resources || [] : []; } catch { return []; } })();
997
- // TASK_2274: dry-run takes no claim adoption / resource locks (mirrors the subagent path)
998
- const _sgClaim = dryRun ? null : adoptSelfClaimMarker(taskInput, _sgRoot, _sgSession);
999
- if (_sgResources.length > 0 && dryRun) {
1000
- console.log(' [dry-run] resource locks NOT acquired: ' + _sgResources.join(', '));
1001
- } else if (_sgResources.length > 0) {
1002
- const _sgLock = acquireResourceLocks(_sgResources, _sgRoot, _sgSession, taskInput);
1003
- if (_sgLock.failed.length > 0) {
1004
- for (const fail of _sgLock.failed) {
1005
- const hi = fail.holder ? ' (session=' + fail.holder.owner_session + ', task=' + fail.holder.task_id + ')' : '';
1006
- console.error((fail.orphan ? 'WARNING' : 'ERROR') + ': resource ' + fail.name + (fail.orphan ? ' ORPHAN lock' : ' busy') + hi);
1007
- }
1008
- releaseResourceLocks(_sgLock.acquired, _sgRoot);
1009
- if (!options.force) { releaseAdoptedClaimMarker(_sgClaim); console.error('Dispatch blocked: resource lock conflict. Use --force to override.'); process.exitCode = 1; return null; }
1010
- console.warn('WARNING: proceeding despite resource lock conflicts (--force).');
1011
- } else if (_sgLock.acquired.length > 0) {
1012
- console.log(' Resource locks acquired: ' + _sgLock.acquired.join(', '));
1013
- console.log(' (Release after merge: node .specialist/tools/stream-lease.js resource-release --name=<resource>)');
1014
- }
1015
- }
1016
- }
1017
-
1018
- // 5. Dry run
1019
- if (dryRun) {
1020
- return handleDryRun(formation, prompt);
1021
- }
1022
-
1023
- // 5.5 Yggdrasil: 廣播上線狀態
1024
- // Note: cleanup 由 child.on('close') 處理(await 確保完成)
1025
- // process.on('exit') 不支援 async,不適合做 Supabase cleanup
1026
- if (formation !== 'legion') {
1027
- broadcastStatus(projectPath, {
1028
- is_online: true,
1029
- current_task: taskInput || null,
1030
- touching_files: scopePaths || [],
1031
- });
1032
-
1033
- // Yggdrasil: 同步任務狀態為 active
1034
- if (taskInput.startsWith('TASK_')) {
1035
- const ts = getTaskSync();
1036
- if (ts) {
1037
- const sb = getSupabaseClient(projectPath);
1038
- const myNode = sb?.config?.node_name || null;
1039
- ts.syncTaskStatus({
1040
- taskId: taskInput,
1041
- status: 'active',
1042
- claimedBy: myNode,
1043
- scopePaths: taskScopePaths,
1044
- projectPath,
1045
- }).catch(() => {});
1046
- }
1047
- }
1048
-
1049
- // Signal handlers: 盡力 cleanup(best-effort,process 會等 promise)
1050
- const handleSignal = (code) => {
1051
- broadcastStatus(projectPath, { current_task: null, touching_files: [] })
1052
- .finally(() => process.exit(code));
1053
- };
1054
- process.on('SIGINT', () => handleSignal(130));
1055
- process.on('SIGTERM', () => handleSignal(143));
1056
- }
1057
-
1058
- // 6. 根據陣型執行(傳入 projectPath + sessionId for registry)
1059
- return execute(formation, { prompt, skill, sessionId, output, projectPath, taskId: taskInput });
1060
- }
1061
-
1062
- // ─────────────────────────────────────────
1063
- // Dry Run
1064
- // ─────────────────────────────────────────
1065
-
1066
- function handleDryRun(formation, prompt) {
1067
- if (formation === 'squad' && Array.isArray(prompt)) {
1068
- console.log(`\n--- SQUAD PROMPTS (${prompt.length} members) ---\n`);
1069
- for (const m of prompt) {
1070
- console.log(`=== Member: ${m.memberId} (skill: ${m.skill}) ===`);
1071
- console.log(m.prompt);
1072
- console.log('');
1073
- }
1074
- console.log(`--- END ---`);
1075
- } else if (formation === 'legion' && prompt.members) {
1076
- console.log(`\n--- LEGION CONFIG ---`);
1077
- console.log(`Team: ${prompt.teamName}`);
1078
- console.log(`Description: ${prompt.teamDesc}`);
1079
- console.log(`Members: ${prompt.members.length}`);
1080
- console.log(`\n--- LEAD PROMPT ---\n`);
1081
- console.log(prompt.lead.prompt);
1082
- console.log(`\n--- MEMBER PROMPTS ---\n`);
1083
- for (const m of prompt.members) {
1084
- console.log(`=== ${m.name} (${m.agentType}) ===`);
1085
- console.log(m.prompt);
1086
- console.log('');
1087
- }
1088
- console.log(`--- END ---`);
1089
- } else {
1090
- console.log(`\n--- PROMPT ---\n`);
1091
- console.log(prompt);
1092
- console.log(`\n--- END ---`);
1093
- }
1094
- }
1095
-
1096
- // ─────────────────────────────────────────
1097
- // 執行分發
1098
- // ─────────────────────────────────────────
1099
-
1100
- function execute(formation, opts) {
1101
- const { prompt, skill, sessionId, output, projectPath, taskId } = opts;
1102
-
1103
- switch (formation) {
1104
- case 'unit':
1105
- case 'solo': {
1106
- const child = runSingle({
1107
- prompt,
1108
- formation,
1109
- skill,
1110
- sessionId,
1111
- outputPath: output,
1112
- projectPath
1113
- });
1114
-
1115
- // 註冊 dispatch(Dashboard Agent Monitor 用)
1116
- registerDispatch({ sessionId, logPath: child._formation?.logPath, taskId, formation, projectPath });
1117
-
1118
- // Cleanup guard: 確保只執行一次,防止 close + formation:done 重複觸發
1119
- let cleanedUp = false;
1120
- const cleanup = (code) => {
1121
- if (cleanedUp) return;
1122
- cleanedUp = true;
1123
- unregisterDispatch(sessionId);
1124
- // Keep event loop alive with a timer so Supabase HTTP requests can complete
1125
- // before Node.js exits (child close leaves no other handles active)
1126
- const keepAlive = setTimeout(() => {}, 10000);
1127
-
1128
- // Yggdrasil: 同步任務最終狀態到 kenaz_tasks
1129
- const syncFinalStatus = (() => {
1130
- if (!taskId || !taskId.startsWith('TASK_')) return Promise.resolve();
1131
- try {
1132
- const ts = getTaskSync();
1133
- if (!ts) return Promise.resolve();
1134
- return ts.syncTaskStatus({
1135
- taskId,
1136
- status: code === 0 ? 'done' : 'failed',
1137
- projectPath,
1138
- }).catch(() => {});
1139
- } catch { return Promise.resolve(); }
1140
- })();
1141
-
1142
- Promise.allSettled([
1143
- broadcastStatus(projectPath, { current_task: null, touching_files: [] }),
1144
- code === 0 ? syncCommit(taskId, projectPath) : Promise.resolve(),
1145
- syncFinalStatus,
1146
- ]).then(() => {
1147
- clearTimeout(keepAlive);
1148
- });
1149
- };
1150
-
1151
- child.on('close', cleanup);
1152
- // Fallback: formation:done fires when result is received, even if process lingers
1153
- child.on('formation:done', cleanup);
1154
-
1155
- return child;
1156
- }
1157
-
1158
- case 'squad': {
1159
- if (!Array.isArray(prompt)) {
1160
- throw new Error('Squad prompt builder should return an array of member prompts');
1161
- }
1162
-
1163
- // Squad: 註冊整個 session
1164
- registerDispatch({ sessionId, logPath: null, taskId, formation: 'squad', projectPath });
1165
-
1166
- const result = runParallel({
1167
- members: prompt,
1168
- formation,
1169
- sessionId,
1170
- projectPath
1171
- });
1172
-
1173
- // runParallel returns a promise; await cleanup 確保完成
1174
- if (result && typeof result.then === 'function') {
1175
- const cleanup = (results) => {
1176
- unregisterDispatch(sessionId);
1177
-
1178
- // Yggdrasil: 同步任務最終狀態(squad 以全員成功為準)
1179
- const syncFinalStatus = (() => {
1180
- if (!taskId || !taskId.startsWith('TASK_')) return Promise.resolve();
1181
- try {
1182
- const ts = getTaskSync();
1183
- if (!ts) return Promise.resolve();
1184
- const allSuccess = Array.isArray(results) && results.every(r => r.exitCode === 0);
1185
- return ts.syncTaskStatus({
1186
- taskId,
1187
- status: allSuccess ? 'done' : 'failed',
1188
- projectPath,
1189
- }).catch(() => {});
1190
- } catch { return Promise.resolve(); }
1191
- })();
1192
-
1193
- return Promise.allSettled([
1194
- broadcastStatus(projectPath, { current_task: null, touching_files: [] }),
1195
- syncFinalStatus,
1196
- ]);
1197
- };
1198
- result.then(cleanup, () => cleanup(null));
1199
- }
1200
-
1201
- return result;
1202
- }
1203
-
1204
- case 'legion':
1205
- // Legion 不 spawn 進程,輸出 TeamCreate 配置供 Formation Lead 使用
1206
- console.log(`\n⚔️ Legion: TeamCreate configuration generated`);
1207
- console.log(` Team: ${prompt.teamName}`);
1208
- console.log(` Members: ${prompt.members.length}`);
1209
- console.log(`\n Legion 不直接啟動進程。`);
1210
- console.log(` 請使用 TeamCreate API 搭配以上配置啟動團隊。`);
1211
- console.log(` 或使用 --dry-run 查看完整 prompt。`);
1212
- return prompt;
1213
-
1214
- default:
1215
- throw new Error(`Unknown formation: ${formation}`);
1216
- }
1217
- }
1218
-
1219
726
  // ─────────────────────────────────────────
1220
727
  // CLI
1221
728
  // ─────────────────────────────────────────
@@ -1228,22 +735,21 @@ if (require.main === module) {
1228
735
  ⚔️ Formation Dispatch
1229
736
 
1230
737
  Usage:
1231
- node .formation/tools/dispatch.js --skill=<name> --task=<TASK_ID|description>
738
+ node .formation/tools/dispatch.js --skill=<name> --task=<TASK_ID|description> --dispatch-mode=subagent
1232
739
 
1233
740
  Options:
1234
- --formation <name> Formation type: unit (default), solo, squad, legion
741
+ --formation <name> Skill folder: unit (default) or solo
1235
742
  --skill <name> Skill to use (YAML filename without extension)
1236
743
  --task <value> Task ID (TASK_XXX) or free-text description
1237
- --concurrency <n> Parallel execution slots (default 3, max 5, legacy only)
1238
- --output <path> Custom log output path
1239
- --dry-run Only print the prompt, don't launch
1240
- --prompt-only Print raw prompt text to stdout (machine-readable, no headers)
1241
- --dispatch-mode <mode> Output mode: formation (default), subagent (JSON params for Agent tool)
1242
- --dispatch-model <id> TASK_1998 R3: subagent-path model override (wins over
744
+ --dry-run Build and print the payload with no side effects
745
+ --dispatch-mode <mode> Required: subagent (JSON params for the Agent tool)
746
+ --harness <name> claude (default) | codex (Codex spawn_agent payload)
747
+ --project-path <path> Target sub-project (omit for the core repo)
748
+ --dispatch-model <id> TASK_1998 R3: model override (wins over
1243
749
  dashboard-models.json dispatchModelByRigor and the
1244
750
  default — the dashboard dispatchModel, used for
1245
751
  every rigor unless dispatchModelByRigor sets that
1246
- rigor's entry). Only used with --dispatch-mode=subagent.
752
+ rigor's entry).
1247
753
  --use-worktree <bool> TASK_1833: dispatch-time worktree toggle (true|false).
1248
754
  Overrides env FORMATION_USE_WORKTREE and the target
1249
755
  project's .kenaz/project.yaml use_worktree. For
@@ -1262,25 +768,12 @@ Options:
1262
768
  (with --release-lock: release a lock this session
1263
769
  cannot prove it owns)
1264
770
 
1265
- Formation-Skill Quick Reference:
1266
- unit: do, think, plan
1267
- solo: strategy, diagnosis
1268
- squad: blitz, sweep
1269
- legion: forge, hive
771
+ Skills: unit: do, think, plan; solo: strategy, diagnosis.
1270
772
 
1271
773
  Sub-agent dispatch (Ansuz billing-aware path):
1272
774
  node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent
1273
775
  → prints JSON: { promptText, taskId, agentParams: { model, isolation, description } }
1274
776
  Ansuz passes promptText to Agent tool with agentParams for worktree-isolated execution.
1275
-
1276
- Headless Mode (recommended for long tasks):
1277
- node .formation/tools/headless.js --formation=legion --skill=forge --task=TASK_174
1278
-
1279
- Examples:
1280
- node .formation/tools/dispatch.js --skill=do --task=TASK_172
1281
- node .formation/tools/dispatch.js --formation=solo --skill=strategy --task="評估新功能"
1282
- node .formation/tools/dispatch.js --formation=squad --skill=blitz --task=TASK_173
1283
- node .formation/tools/dispatch.js --formation=legion --skill=forge --task=TASK_174 --dry-run
1284
777
  `);
1285
778
  process.exit(0);
1286
779
  }
@@ -1300,10 +793,8 @@ Examples:
1300
793
  const formation = getArg('--formation') || 'unit';
1301
794
  const skill = getArg('--skill');
1302
795
  const task = getArg('--task');
1303
- const output = getArg('--output');
1304
796
  const projectPath = getArg('--project-path');
1305
797
  const dryRun = args.includes('--dry-run');
1306
- const promptOnly = args.includes('--prompt-only');
1307
798
  const dispatchModeCli = getArg('--dispatch-mode');
1308
799
  // TASK_1998 R3: subagent-path model override — wins over dashboard
1309
800
  // dispatchModelByRigor and the dashboard dispatchModel default. Accepts
@@ -1370,30 +861,18 @@ Examples:
1370
861
  process.exit(1);
1371
862
  }
1372
863
 
1373
- // Sub-agent mode: output JSON params for Agent tool consumption
1374
- if (dispatchModeCli === 'subagent') {
1375
- getSubagentDispatchParams({ formation, skill, task, projectPath, force, useWorktree: useWorktreeCli, dispatchModelOverride: dispatchModelCli, dryRun, harness: harnessCli }).then(result => {
1376
- if (!result) { process.exitCode = 1; return; }
1377
- process.stdout.write(JSON.stringify(result, null, 2) + '\n');
1378
- });
1379
- return;
1380
- }
1381
-
1382
- // Prompt-only mode: output raw prompt to stdout (machine-readable, no decorations)
1383
- if (promptOnly) {
1384
- const skillDef = loadSkill(formation, skill);
1385
- const loadOpts = projectPath ? { projectPath } : undefined;
1386
- const taskData = task && task.startsWith('TASK_') ? loadTask(task, loadOpts) : null;
1387
- const promptOptions = {};
1388
- if (projectPath) promptOptions.projectPath = projectPath;
1389
- if (task && task.startsWith('TASK_')) promptOptions.taskId = task;
1390
- const rawPrompt = buildPrompt(skillDef, task, taskData, promptOptions);
1391
- const text = typeof rawPrompt === 'string' ? rawPrompt : JSON.stringify(rawPrompt);
1392
- process.stdout.write(text + '\n');
1393
- return;
864
+ // Sub-agent mode (the only dispatch path): output JSON params for Agent tool consumption
865
+ if (dispatchModeCli !== 'subagent') {
866
+ console.error('❌ --dispatch-mode=subagent is required (Formation headless/squad/legion dispatch is retired)');
867
+ process.exit(1);
1394
868
  }
1395
-
1396
- dispatch({ formation, skill, task, output, dryRun, projectPath, force });
869
+ getSubagentDispatchParams({ formation, skill, task, projectPath, force, useWorktree: useWorktreeCli, dispatchModelOverride: dispatchModelCli, dryRun, harness: harnessCli }).then(result => {
870
+ if (!result) { process.exitCode = 1; return; }
871
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
872
+ }).catch(e => {
873
+ console.error('❌ ' + (e && e.message ? e.message : e));
874
+ process.exitCode = 1;
875
+ });
1397
876
  }
1398
877
 
1399
878
  // ─────────────────────────────────────────
@@ -1511,14 +990,14 @@ async function getSubagentDispatchParams(options) {
1511
990
  }
1512
991
  if (routing.family === 'bifrost' && !isCodex) {
1513
992
  if (!routing.adapter) {
1514
- console.error('❌ dashboard-models.json sets dispatchFamily=bifrost but dispatchAdapter is missing/empty — refusing to silently dispatch with the native Claude CLI. Fix the model selection (Quick Actions → Default Models) or dashboard-models.json, then use Formation dispatch (kenaz_dispatch).');
993
+ console.error('❌ dashboard-models.json sets dispatchFamily=bifrost but dispatchAdapter is missing/empty — refusing to silently dispatch with the native Claude CLI. Fix the model selection (Quick Actions → Default Models) or dashboard-models.json.');
1515
994
  } else {
1516
- console.error(`❌ dashboard-models.json sets dispatchFamily=bifrost (dispatchAdapter '${routing.adapter}') — sub-agent dispatch cannot run non-Claude models (the Agent tool only accepts Claude models); refusing to silently dispatch with the native Claude CLI. Use Formation dispatch (kenaz_dispatch) instead — it routes through the Bifrost adapter.`);
995
+ console.error(`❌ dashboard-models.json sets dispatchFamily=bifrost (dispatchAdapter '${routing.adapter}') — sub-agent dispatch cannot run non-Claude models (the Agent tool only accepts Claude models); refusing to silently dispatch with the native Claude CLI. Select a Claude model in Default Models.`);
1517
996
  }
1518
997
  return null;
1519
998
  }
1520
999
  if (!isCodex && routing.family && routing.family !== 'claude') {
1521
- console.error(`❌ dashboard-models.json sets unsupported dispatchFamily '${routing.family}' (expected 'claude' or 'bifrost') — refusing to silently dispatch with the native Claude CLI. Fix the model selection (Quick Actions → Default Models) or use Formation dispatch (kenaz_dispatch).`);
1000
+ console.error(`❌ dashboard-models.json sets unsupported dispatchFamily '${routing.family}' (expected 'claude' or 'bifrost') — refusing to silently dispatch with the native Claude CLI. Fix the model selection (Quick Actions → Default Models).`);
1522
1001
  return null;
1523
1002
  }
1524
1003
 
@@ -1538,7 +1017,7 @@ async function getSubagentDispatchParams(options) {
1538
1017
  // TASK_2315: Codex inherits the session model — nothing to translate or pass.
1539
1018
  const translated = isCodex ? { model: null, lossless: true } : translateModelForAgentTool(rawModel);
1540
1019
  if (!isCodex && !translated.model) {
1541
- console.error(`❌ ${resolution.label} '${rawModel}' cannot be mapped to an Agent tool model family (${AGENT_TOOL_MODEL_ENUM.join('|')}) — refusing to silently guess a substitute model. Fix the model selection (Quick Actions → Default Models) or use Formation dispatch (kenaz_dispatch), which accepts full model ids via --dispatch-model.`);
1020
+ console.error(`❌ ${resolution.label} '${rawModel}' cannot be mapped to an Agent tool model family (${AGENT_TOOL_MODEL_ENUM.join('|')}) — refusing to silently guess a substitute model. Fix the model selection (Quick Actions → Default Models).`);
1542
1021
  return null;
1543
1022
  }
1544
1023
  const dispatchModel = translated.model;
@@ -1546,7 +1025,7 @@ async function getSubagentDispatchParams(options) {
1546
1025
  ? { requested: rawModel, inherited: true }
1547
1026
  : { requested: rawModel, agentToolModel: dispatchModel, granularityLoss: !translated.lossless };
1548
1027
  if (!translated.lossless) {
1549
- process.stderr.write(`[dispatch] model '${rawModel}' → Agent tool family '${dispatchModel}' — the Agent tool only expresses family names (${AGENT_TOOL_MODEL_ENUM.join('|')}); version/speed selections (e.g. 5 vs 4.x, [1m]) are NOT expressible on the subagent path. If the exact version matters, use Formation dispatch (kenaz_dispatch), which passes full model ids.\n`);
1028
+ process.stderr.write(`[dispatch] model '${rawModel}' → Agent tool family '${dispatchModel}' — the Agent tool only expresses family names (${AGENT_TOOL_MODEL_ENUM.join('|')}); version/speed selections (e.g. 5 vs 4.x, [1m]) are NOT expressible on the subagent path. If the exact version matters, choose a model whose family the Agent tool can express.\n`);
1550
1029
  }
1551
1030
  // TASK_1998 R3 (+ two-axis policy): the resolved choice, always printed
1552
1031
  // (unlike the granularity block above, which only fires on lossy translation).
@@ -1705,7 +1184,7 @@ async function getSubagentDispatchParams(options) {
1705
1184
  // (same two-axis gate as the Formation-dispatch path above). `rigor` and
1706
1185
  // `complexity` were both extracted in step 1 (rigor needed earlier, for
1707
1186
  // model resolution).
1708
- const dietProfile = promptProfile({ rigor, complexity });
1187
+ const dietProfile = promptProfile({ complexity });
1709
1188
  if (taskScopePaths.length > 0 && !dietProfile.skipRelatedFilesPreview) {
1710
1189
  const cortexCtx = buildCortexContext(taskScopePaths, projectPath);
1711
1190
  if (cortexCtx) promptText = promptText + '\n' + cortexCtx;
@@ -1928,4 +1407,4 @@ function setupSubagentCrossProjectWorktree(projectPath, taskInput) {
1928
1407
  };
1929
1408
  }
1930
1409
 
1931
- module.exports = { dispatch, getSubagentDispatchParams, checkDispatchScopeGate, releaseDispatchLock, resolveDispatchIsolation, _getProvenSessionId, _getOwnConversationId, _isOwnClaimMarker, _buildCortexContext: buildCortexContext };
1410
+ module.exports = { getSubagentDispatchParams, checkDispatchScopeGate, releaseDispatchLock, resolveDispatchIsolation, _getProvenSessionId, _getOwnConversationId, _isOwnClaimMarker, _buildCortexContext: buildCortexContext };