oh-my-opencode 4.8.1 → 4.9.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 (507) hide show
  1. package/dist/agents/prometheus/system-prompt.d.ts +1 -1
  2. package/dist/agents/sisyphus/claude-fable-5.d.ts +19 -0
  3. package/dist/agents/sisyphus/claude-opus-4-7.d.ts +3 -1
  4. package/dist/agents/sisyphus/claude-opus-4-8.d.ts +19 -0
  5. package/dist/agents/sisyphus/index.d.ts +4 -0
  6. package/dist/agents/types.d.ts +2 -2
  7. package/dist/cli/doctor/checks/codex.d.ts +1 -0
  8. package/dist/cli/doctor/checks/tools-gh.d.ts +8 -1
  9. package/dist/cli/doctor/index.d.ts +1 -0
  10. package/dist/cli/doctor/types.d.ts +2 -0
  11. package/dist/cli/index.js +1885 -776
  12. package/dist/cli/install-codex/codex-config-permissions.d.ts +1 -1
  13. package/dist/cli/install-codex/codex-config-plugins.d.ts +1 -0
  14. package/dist/cli/install-codex/codex-config-toml.d.ts +1 -0
  15. package/dist/cli/install-codex/codex-installer-bin-dir.d.ts +8 -0
  16. package/dist/cli/install-codex/install-codex.d.ts +1 -8
  17. package/dist/cli/install-codex/lsp-daemon-reaper.d.ts +5 -0
  18. package/dist/cli/sparkshell-condense.d.ts +10 -0
  19. package/dist/cli/sparkshell-parse.d.ts +3 -0
  20. package/dist/cli/sparkshell-session-context.d.ts +20 -0
  21. package/dist/cli/sparkshell-spark.d.ts +23 -0
  22. package/dist/cli/sparkshell.d.ts +8 -1
  23. package/dist/cli-node/index.js +92552 -0
  24. package/dist/config/schema/agent-names.d.ts +2 -0
  25. package/dist/config/schema/hooks.d.ts +0 -2
  26. package/dist/config/schema/keyword-detector.d.ts +0 -6
  27. package/dist/config/schema/oh-my-opencode-config.d.ts +2 -4
  28. package/dist/create-hooks.d.ts +0 -2
  29. package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
  30. package/dist/features/background-agent/parent-wake-flush-runner.d.ts +2 -0
  31. package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -0
  32. package/dist/features/background-agent/parent-wake-session-history.d.ts +4 -0
  33. package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -0
  34. package/dist/features/builtin-commands/templates/handoff.d.ts +1 -1
  35. package/dist/features/builtin-skills/index.d.ts +1 -1
  36. package/dist/features/builtin-skills/skills.d.ts +4 -0
  37. package/dist/features/opencode-runtime-skills/source-server.d.ts +16 -1
  38. package/dist/features/opencode-skill-loader/skill-definition-record.d.ts +2 -0
  39. package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +2 -0
  40. package/dist/features/team-mode/types.d.ts +1 -0
  41. package/dist/features/tmux-subagent/failed-readiness-cache.d.ts +28 -0
  42. package/dist/features/tmux-subagent/manager.d.ts +1 -9
  43. package/dist/features/tmux-subagent/resolve-server-url.d.ts +3 -0
  44. package/dist/hooks/anthropic-context-window-limit-recovery/executor.d.ts +1 -1
  45. package/dist/hooks/index.d.ts +0 -1
  46. package/dist/hooks/keyword-detector/constants.d.ts +0 -4
  47. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +1 -1
  48. package/dist/index.js +9001 -1795
  49. package/dist/oh-my-opencode.schema.json +2 -4
  50. package/dist/plugin/chat-params.d.ts +1 -8
  51. package/dist/plugin/hooks/create-core-hooks.d.ts +0 -2
  52. package/dist/plugin/hooks/create-session-hooks.d.ts +0 -2
  53. package/dist/plugin/hooks/create-transform-hooks.d.ts +1 -2
  54. package/dist/plugin/messages-transform.d.ts +0 -1
  55. package/dist/shared/model-availability.d.ts +10 -2
  56. package/package.json +25 -18
  57. package/packages/ast-grep-mcp/dist/cli.js +2 -10
  58. package/packages/git-bash-mcp/dist/cli.js +11 -4
  59. package/packages/lsp-daemon/dist/cli.d.ts +2 -0
  60. package/packages/lsp-daemon/dist/cli.js +3711 -0
  61. package/packages/lsp-daemon/dist/daemon-client.d.ts +19 -0
  62. package/packages/lsp-daemon/dist/daemon-client.js +114 -0
  63. package/packages/lsp-daemon/dist/daemon-server.d.ts +12 -0
  64. package/packages/lsp-daemon/dist/daemon-server.js +106 -0
  65. package/packages/lsp-daemon/dist/ensure-daemon.d.ts +21 -0
  66. package/packages/lsp-daemon/dist/ensure-daemon.js +97 -0
  67. package/packages/lsp-daemon/dist/index.d.ts +5 -0
  68. package/packages/lsp-daemon/dist/index.js +3573 -0
  69. package/packages/lsp-daemon/dist/lock.d.ts +7 -0
  70. package/packages/lsp-daemon/dist/lock.js +61 -0
  71. package/packages/lsp-daemon/dist/package.json +6 -0
  72. package/packages/lsp-daemon/dist/paths.d.ts +11 -0
  73. package/packages/lsp-daemon/dist/paths.js +49 -0
  74. package/packages/lsp-daemon/dist/proxy.d.ts +10 -0
  75. package/packages/lsp-daemon/dist/proxy.js +61 -0
  76. package/packages/lsp-daemon/dist/request-routing.d.ts +9 -0
  77. package/packages/lsp-daemon/dist/request-routing.js +44 -0
  78. package/packages/lsp-daemon/dist/run-daemon.d.ts +1 -0
  79. package/packages/lsp-daemon/dist/run-daemon.js +11 -0
  80. package/packages/lsp-daemon/dist/socket-jsonrpc.d.ts +5 -0
  81. package/packages/lsp-daemon/dist/socket-jsonrpc.js +25 -0
  82. package/packages/lsp-daemon/package.json +38 -0
  83. package/packages/lsp-tools-mcp/dist/cli.js +0 -0
  84. package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +40 -17
  85. package/packages/lsp-tools-mcp/dist/lsp/client.js +11 -9
  86. package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +5 -5
  87. package/packages/lsp-tools-mcp/dist/lsp/directory-diagnostics.js +5 -3
  88. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.d.ts +1 -0
  89. package/packages/lsp-tools-mcp/dist/lsp/effective-extension.js +8 -0
  90. package/packages/lsp-tools-mcp/dist/lsp/infer-extension.js +3 -2
  91. package/packages/lsp-tools-mcp/dist/lsp/language-mappings.js +1 -0
  92. package/packages/lsp-tools-mcp/dist/lsp/server-definitions.js +12 -0
  93. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.d.ts +12 -0
  94. package/packages/lsp-tools-mcp/dist/lsp/server-install-state.js +51 -0
  95. package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +2 -1
  96. package/packages/lsp-tools-mcp/dist/request-context.d.ts +7 -0
  97. package/packages/lsp-tools-mcp/dist/request-context.js +14 -0
  98. package/packages/lsp-tools-mcp/dist/tools.js +44 -1
  99. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +46 -33
  100. package/packages/omo-codex/plugin/.mcp.json +1 -1
  101. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.d.ts +7 -0
  102. package/packages/omo-codex/plugin/components/comment-checker/dist/apply-patch.js +173 -0
  103. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.d.ts +2 -0
  104. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +10 -0
  105. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.d.ts +22 -0
  106. package/packages/omo-codex/plugin/components/comment-checker/dist/codex-hook.js +165 -0
  107. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.d.ts +1 -0
  108. package/packages/omo-codex/plugin/components/comment-checker/dist/core-values.js +1 -0
  109. package/packages/omo-codex/plugin/components/comment-checker/dist/core.d.ts +5 -0
  110. package/packages/omo-codex/plugin/components/comment-checker/dist/core.js +4 -0
  111. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.d.ts +6 -0
  112. package/packages/omo-codex/plugin/components/comment-checker/dist/hook-input.js +10 -0
  113. package/packages/omo-codex/plugin/components/comment-checker/dist/record.d.ts +2 -0
  114. package/packages/omo-codex/plugin/components/comment-checker/dist/record.js +11 -0
  115. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.d.ts +3 -0
  116. package/packages/omo-codex/plugin/components/comment-checker/dist/request-extractor.js +104 -0
  117. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.d.ts +26 -0
  118. package/packages/omo-codex/plugin/components/comment-checker/dist/runner.js +144 -0
  119. package/packages/omo-codex/plugin/components/comment-checker/dist/types.d.ts +43 -0
  120. package/packages/omo-codex/plugin/components/comment-checker/dist/types.js +1 -0
  121. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  122. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  123. package/packages/omo-codex/plugin/components/git-bash/dist/cli.d.ts +2 -0
  124. package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +29 -0
  125. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.d.ts +28 -0
  126. package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +137 -0
  127. package/packages/omo-codex/plugin/components/git-bash/dist/index.d.ts +1 -0
  128. package/packages/omo-codex/plugin/components/git-bash/dist/index.js +1 -0
  129. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  130. package/packages/omo-codex/plugin/components/git-bash/package.json +5 -2
  131. package/packages/omo-codex/plugin/components/lsp/.mcp.json +1 -1
  132. package/packages/omo-codex/plugin/components/lsp/dist/cli.d.ts +2 -0
  133. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +42 -0
  134. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.d.ts +2 -0
  135. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook-cli.js +40 -0
  136. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.d.ts +16 -0
  137. package/packages/omo-codex/plugin/components/lsp/dist/codex-hook.js +180 -0
  138. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.d.ts +12 -0
  139. package/packages/omo-codex/plugin/components/lsp/dist/lsp-session-state.js +95 -0
  140. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.d.ts +6 -0
  141. package/packages/omo-codex/plugin/components/lsp/dist/mutated-file-paths.js +79 -0
  142. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  143. package/packages/omo-codex/plugin/components/lsp/package.json +7 -7
  144. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-daemon.mjs +68 -0
  145. package/packages/omo-codex/plugin/components/lsp/scripts/build-lsp-tools.mjs +45 -22
  146. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  147. package/packages/omo-codex/plugin/components/lsp/src/codex-hook-cli.ts +1 -1
  148. package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +6 -2
  149. package/packages/omo-codex/plugin/components/lsp/src/lsp-session-state.ts +4 -0
  150. package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +68 -0
  151. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +8 -20
  152. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +69 -96
  153. package/packages/omo-codex/plugin/components/rules/dist/cli.d.ts +2 -0
  154. package/packages/omo-codex/plugin/components/rules/dist/cli.js +118 -0
  155. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.d.ts +5 -0
  156. package/packages/omo-codex/plugin/components/rules/dist/codex-hook-options.js +1 -0
  157. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.d.ts +47 -0
  158. package/packages/omo-codex/plugin/components/rules/dist/codex-hook.js +127 -0
  159. package/packages/omo-codex/plugin/components/rules/dist/config.d.ts +2 -0
  160. package/packages/omo-codex/plugin/components/rules/dist/config.js +100 -0
  161. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.d.ts +2 -0
  162. package/packages/omo-codex/plugin/components/rules/dist/context-pressure.js +26 -0
  163. package/packages/omo-codex/plugin/components/rules/dist/debug-log.d.ts +8 -0
  164. package/packages/omo-codex/plugin/components/rules/dist/debug-log.js +36 -0
  165. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.d.ts +7 -0
  166. package/packages/omo-codex/plugin/components/rules/dist/dynamic-target-fingerprints.js +65 -0
  167. package/packages/omo-codex/plugin/components/rules/dist/event-budget.d.ts +3 -0
  168. package/packages/omo-codex/plugin/components/rules/dist/event-budget.js +14 -0
  169. package/packages/omo-codex/plugin/components/rules/dist/hook-output.d.ts +2 -0
  170. package/packages/omo-codex/plugin/components/rules/dist/hook-output.js +24 -0
  171. package/packages/omo-codex/plugin/components/rules/dist/path-utils.d.ts +4 -0
  172. package/packages/omo-codex/plugin/components/rules/dist/path-utils.js +24 -0
  173. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.d.ts +13 -0
  174. package/packages/omo-codex/plugin/components/rules/dist/persistent-cache.js +172 -0
  175. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.d.ts +6 -0
  176. package/packages/omo-codex/plugin/components/rules/dist/post-compact-budget.js +74 -0
  177. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.d.ts +4 -0
  178. package/packages/omo-codex/plugin/components/rules/dist/post-compact-claim.js +6 -0
  179. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.d.ts +1 -0
  180. package/packages/omo-codex/plugin/components/rules/dist/post-compact-directive.js +32 -0
  181. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.d.ts +13 -0
  182. package/packages/omo-codex/plugin/components/rules/dist/post-compact-state.js +29 -0
  183. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.d.ts +9 -0
  184. package/packages/omo-codex/plugin/components/rules/dist/rules/cache.js +51 -0
  185. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.d.ts +70 -0
  186. package/packages/omo-codex/plugin/components/rules/dist/rules/constants.js +101 -0
  187. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.d.ts +5 -0
  188. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-cache.js +60 -0
  189. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.d.ts +6 -0
  190. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-dynamic-loader.js +61 -0
  191. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.d.ts +7 -0
  192. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-loader.js +60 -0
  193. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.d.ts +11 -0
  194. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-paths.js +75 -0
  195. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.d.ts +6 -0
  196. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-static-loader.js +29 -0
  197. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.d.ts +44 -0
  198. package/packages/omo-codex/plugin/components/rules/dist/rules/engine-types.js +1 -0
  199. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.d.ts +5 -0
  200. package/packages/omo-codex/plugin/components/rules/dist/rules/engine.js +85 -0
  201. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.d.ts +6 -0
  202. package/packages/omo-codex/plugin/components/rules/dist/rules/errors.js +12 -0
  203. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.d.ts +14 -0
  204. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-cache.js +51 -0
  205. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.d.ts +6 -0
  206. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-paths.js +33 -0
  207. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.d.ts +5 -0
  208. package/packages/omo-codex/plugin/components/rules/dist/rules/finder-sources.js +40 -0
  209. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.d.ts +28 -0
  210. package/packages/omo-codex/plugin/components/rules/dist/rules/finder.js +146 -0
  211. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.d.ts +7 -0
  212. package/packages/omo-codex/plugin/components/rules/dist/rules/formatter.js +112 -0
  213. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.d.ts +18 -0
  214. package/packages/omo-codex/plugin/components/rules/dist/rules/matcher.js +93 -0
  215. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.d.ts +3 -0
  216. package/packages/omo-codex/plugin/components/rules/dist/rules/ordering.js +27 -0
  217. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.d.ts +7 -0
  218. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-frontmatter.js +30 -0
  219. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.d.ts +2 -0
  220. package/packages/omo-codex/plugin/components/rules/dist/rules/parser-yaml.js +237 -0
  221. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.d.ts +3 -0
  222. package/packages/omo-codex/plugin/components/rules/dist/rules/parser.js +31 -0
  223. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.d.ts +1 -0
  224. package/packages/omo-codex/plugin/components/rules/dist/rules/plugin-root.js +48 -0
  225. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.d.ts +1 -0
  226. package/packages/omo-codex/plugin/components/rules/dist/rules/project-root.js +23 -0
  227. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.d.ts +14 -0
  228. package/packages/omo-codex/plugin/components/rules/dist/rules/scanner.js +111 -0
  229. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.d.ts +3 -0
  230. package/packages/omo-codex/plugin/components/rules/dist/rules/sources.js +9 -0
  231. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.d.ts +18 -0
  232. package/packages/omo-codex/plugin/components/rules/dist/rules/truncator.js +59 -0
  233. package/packages/omo-codex/plugin/components/rules/dist/rules/types.d.ts +126 -0
  234. package/packages/omo-codex/plugin/components/rules/dist/rules/types.js +8 -0
  235. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.d.ts +6 -0
  236. package/packages/omo-codex/plugin/components/rules/dist/rules-engine-factory.js +20 -0
  237. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.d.ts +3 -0
  238. package/packages/omo-codex/plugin/components/rules/dist/session-state-lock.js +41 -0
  239. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.d.ts +10 -0
  240. package/packages/omo-codex/plugin/components/rules/dist/sparkshell-awareness.js +90 -0
  241. package/packages/omo-codex/plugin/components/rules/dist/static-injection.d.ts +3 -0
  242. package/packages/omo-codex/plugin/components/rules/dist/static-injection.js +128 -0
  243. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.d.ts +6 -0
  244. package/packages/omo-codex/plugin/components/rules/dist/tool-paths.js +168 -0
  245. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.d.ts +4 -0
  246. package/packages/omo-codex/plugin/components/rules/dist/transcript-rule-filter.js +49 -0
  247. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.d.ts +4 -0
  248. package/packages/omo-codex/plugin/components/rules/dist/transcript-search.js +91 -0
  249. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  250. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  251. package/packages/omo-codex/plugin/components/rules/src/codex-hook.ts +4 -2
  252. package/packages/omo-codex/plugin/components/rules/src/config.ts +13 -0
  253. package/packages/omo-codex/plugin/components/rules/src/event-budget.ts +17 -0
  254. package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +4 -1
  255. package/packages/omo-codex/plugin/components/rules/src/post-compact-directive.ts +39 -0
  256. package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +16 -0
  257. package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -0
  258. package/packages/omo-codex/plugin/components/rules/src/rules/types.ts +4 -0
  259. package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +53 -4
  260. package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +127 -7
  261. package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +9 -1
  262. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +4 -2
  263. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +7 -2
  264. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +9 -9
  265. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +10 -4
  266. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +241 -0
  267. package/packages/omo-codex/plugin/components/rules/test/event-budget.test.ts +168 -0
  268. package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +4 -0
  269. package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +86 -3
  270. package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +15 -15
  271. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.d.ts +16 -0
  272. package/packages/omo-codex/plugin/components/start-work-continuation/dist/boulder-reader.js +146 -0
  273. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.d.ts +2 -0
  274. package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +49 -0
  275. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.d.ts +2 -0
  276. package/packages/omo-codex/plugin/components/start-work-continuation/dist/codex-hook.js +80 -0
  277. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.d.ts +1 -0
  278. package/packages/omo-codex/plugin/components/start-work-continuation/dist/directive.js +2 -0
  279. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.d.ts +5 -0
  280. package/packages/omo-codex/plugin/components/start-work-continuation/dist/index.js +3 -0
  281. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.d.ts +20 -0
  282. package/packages/omo-codex/plugin/components/start-work-continuation/dist/types.js +1 -0
  283. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  284. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  285. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +24 -2
  286. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.d.ts +1 -0
  287. package/packages/omo-codex/plugin/components/telemetry/dist/atomic-write.js +18 -0
  288. package/packages/omo-codex/plugin/components/telemetry/dist/cli.d.ts +2 -0
  289. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +62 -0
  290. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.d.ts +15 -0
  291. package/packages/omo-codex/plugin/components/telemetry/dist/codex-hook.js +42 -0
  292. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.d.ts +10 -0
  293. package/packages/omo-codex/plugin/components/telemetry/dist/data-path.js +35 -0
  294. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.d.ts +12 -0
  295. package/packages/omo-codex/plugin/components/telemetry/dist/diagnostics.js +108 -0
  296. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.d.ts +4 -0
  297. package/packages/omo-codex/plugin/components/telemetry/dist/env-flags.js +31 -0
  298. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.d.ts +8 -0
  299. package/packages/omo-codex/plugin/components/telemetry/dist/posthog-activity-state.js +68 -0
  300. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.d.ts +21 -0
  301. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +133 -0
  302. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.d.ts +8 -0
  303. package/packages/omo-codex/plugin/components/telemetry/dist/product-identity.js +29 -0
  304. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  305. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  306. package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +5 -13
  307. package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +61 -185
  308. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
  309. package/packages/omo-codex/plugin/components/ultrawork/directive.md +122 -117
  310. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.d.ts +2 -0
  311. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +48 -0
  312. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.d.ts +7 -0
  313. package/packages/omo-codex/plugin/components/ultrawork/dist/codex-hook.js +122 -0
  314. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.d.ts +1 -0
  315. package/packages/omo-codex/plugin/components/ultrawork/dist/directive.js +2 -0
  316. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  317. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  318. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +20 -11
  319. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +17 -11
  320. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +2 -5
  321. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -71
  322. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +16 -0
  323. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +200 -0
  324. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.d.ts +17 -0
  325. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +97 -0
  326. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.d.ts +4 -0
  327. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +183 -0
  328. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +6 -0
  329. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +55 -0
  330. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +12 -0
  331. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +145 -0
  332. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.d.ts +2 -0
  333. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +39 -0
  334. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +13 -0
  335. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +100 -0
  336. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +26 -0
  337. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +97 -0
  338. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +28 -0
  339. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +145 -0
  340. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.d.ts +34 -0
  341. package/packages/omo-codex/plugin/components/ulw-loop/dist/command-types.js +1 -0
  342. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +16 -0
  343. package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +41 -0
  344. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +95 -0
  345. package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.js +1 -0
  346. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +31 -0
  347. package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +119 -0
  348. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +12 -0
  349. package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +69 -0
  350. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +16 -0
  351. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +59 -0
  352. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +48 -0
  353. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +119 -0
  354. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +8 -0
  355. package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +89 -0
  356. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +6 -0
  357. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +123 -0
  358. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +16 -0
  359. package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +70 -0
  360. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.d.ts +10 -0
  361. package/packages/omo-codex/plugin/components/ulw-loop/dist/runtime.js +13 -0
  362. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +63 -0
  363. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.js +1 -0
  364. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +6 -0
  365. package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +292 -0
  366. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.d.ts +5 -0
  367. package/packages/omo-codex/plugin/components/ulw-loop/dist/types.js +5 -0
  368. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +2 -2
  369. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  370. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -14
  371. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +24 -25
  372. package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +17 -3
  373. package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +2 -1
  374. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -1
  375. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +95 -0
  376. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +0 -96
  377. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +23 -0
  378. package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +46 -0
  379. package/packages/omo-codex/plugin/hooks/hooks.json +16 -16
  380. package/packages/omo-codex/plugin/package-lock.json +10 -9
  381. package/packages/omo-codex/plugin/package.json +27 -26
  382. package/packages/omo-codex/plugin/scripts/auto-update.mjs +64 -15
  383. package/packages/omo-codex/plugin/scripts/build-bundled-mcp-runtimes.mjs +16 -0
  384. package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +82 -18
  385. package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +2 -2
  386. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +23 -11
  387. package/packages/omo-codex/plugin/scripts/sync-version.mjs +94 -0
  388. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -9
  389. package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  390. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +93 -0
  391. package/packages/omo-codex/plugin/skills/lcx-doctor/agents/openai.yaml +11 -0
  392. package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +17 -13
  393. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +139 -0
  394. package/packages/omo-codex/plugin/skills/lsp-setup/references/bash/README.md +60 -0
  395. package/packages/omo-codex/plugin/skills/lsp-setup/references/c-cpp/README.md +61 -0
  396. package/packages/omo-codex/plugin/skills/lsp-setup/references/csharp/README.md +71 -0
  397. package/packages/omo-codex/plugin/skills/lsp-setup/references/dart/README.md +48 -0
  398. package/packages/omo-codex/plugin/skills/lsp-setup/references/elixir/README.md +51 -0
  399. package/packages/omo-codex/plugin/skills/lsp-setup/references/go/README.md +57 -0
  400. package/packages/omo-codex/plugin/skills/lsp-setup/references/haskell/README.md +57 -0
  401. package/packages/omo-codex/plugin/skills/lsp-setup/references/java/README.md +57 -0
  402. package/packages/omo-codex/plugin/skills/lsp-setup/references/julia/README.md +60 -0
  403. package/packages/omo-codex/plugin/skills/lsp-setup/references/kotlin/README.md +59 -0
  404. package/packages/omo-codex/plugin/skills/lsp-setup/references/lua/README.md +66 -0
  405. package/packages/omo-codex/plugin/skills/lsp-setup/references/php/README.md +62 -0
  406. package/packages/omo-codex/plugin/skills/lsp-setup/references/python/README.md +71 -0
  407. package/packages/omo-codex/plugin/skills/lsp-setup/references/ruby/README.md +53 -0
  408. package/packages/omo-codex/plugin/skills/lsp-setup/references/rust/README.md +59 -0
  409. package/packages/omo-codex/plugin/skills/lsp-setup/references/swift/README.md +51 -0
  410. package/packages/omo-codex/plugin/skills/lsp-setup/references/terraform/README.md +62 -0
  411. package/packages/omo-codex/plugin/skills/lsp-setup/references/typescript/README.md +77 -0
  412. package/packages/omo-codex/plugin/skills/lsp-setup/references/yaml/README.md +70 -0
  413. package/packages/omo-codex/plugin/skills/lsp-setup/references/zig/README.md +49 -0
  414. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  415. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  416. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/tsconfig.json +17 -0
  417. package/packages/omo-codex/plugin/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  418. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +9 -9
  419. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -10
  420. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +20 -22
  421. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +38 -61
  422. package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +135 -677
  423. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -14
  424. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +24 -25
  425. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +20 -11
  426. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +17 -11
  427. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -9
  428. package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +2 -1
  429. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +1 -1
  430. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +5 -5
  431. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +6 -6
  432. package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +194 -0
  433. package/packages/omo-codex/plugin/test/auto-update.test.mjs +17 -0
  434. package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +15 -44
  435. package/packages/omo-codex/plugin/test/lsp-prebuild-layouts.test.mjs +140 -0
  436. package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +189 -7
  437. package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +9 -31
  438. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +68 -4
  439. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +119 -0
  440. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +11 -112
  441. package/packages/omo-codex/plugin/test/sync-version.test.mjs +68 -0
  442. package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +126 -0
  443. package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +2 -2
  444. package/packages/omo-codex/scripts/install/bin-dir.mjs +20 -0
  445. package/packages/omo-codex/scripts/install/bin-links.mjs +43 -6
  446. package/packages/omo-codex/scripts/install/cache.mjs +4 -0
  447. package/packages/omo-codex/scripts/install/config.mjs +4 -4
  448. package/packages/omo-codex/scripts/install/delegated-command.mjs +5 -1
  449. package/packages/omo-codex/scripts/install/git-bash-mcp-env.mjs +28 -0
  450. package/packages/omo-codex/scripts/install/git-bash.mjs +12 -4
  451. package/packages/omo-codex/scripts/install/git-bash.test.mjs +39 -4
  452. package/packages/omo-codex/scripts/install/hook-targets.mjs +46 -0
  453. package/packages/omo-codex/scripts/install/multi-agent-v2-config.mjs +12 -2
  454. package/packages/omo-codex/scripts/install/process.mjs +1 -0
  455. package/packages/omo-codex/scripts/install-bin-links.test.mjs +131 -3
  456. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +91 -0
  457. package/packages/omo-codex/scripts/install-config.test.mjs +50 -44
  458. package/packages/omo-codex/scripts/install-delegated-command.test.mjs +78 -0
  459. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +93 -0
  460. package/packages/omo-codex/scripts/install-hook-targets.test.mjs +100 -0
  461. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +3 -1
  462. package/packages/omo-codex/scripts/install-local.mjs +7 -18
  463. package/packages/omo-codex/scripts/install-local.test.mjs +34 -1
  464. package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +16 -1
  465. package/packages/shared-skills/skills/lcx-doctor/SKILL.md +93 -0
  466. package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +11 -0
  467. package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +17 -13
  468. package/packages/shared-skills/skills/lsp-setup/SKILL.md +139 -0
  469. package/packages/shared-skills/skills/lsp-setup/references/bash/README.md +60 -0
  470. package/packages/shared-skills/skills/lsp-setup/references/c-cpp/README.md +61 -0
  471. package/packages/shared-skills/skills/lsp-setup/references/csharp/README.md +71 -0
  472. package/packages/shared-skills/skills/lsp-setup/references/dart/README.md +48 -0
  473. package/packages/shared-skills/skills/lsp-setup/references/elixir/README.md +51 -0
  474. package/packages/shared-skills/skills/lsp-setup/references/go/README.md +57 -0
  475. package/packages/shared-skills/skills/lsp-setup/references/haskell/README.md +57 -0
  476. package/packages/shared-skills/skills/lsp-setup/references/java/README.md +57 -0
  477. package/packages/shared-skills/skills/lsp-setup/references/julia/README.md +60 -0
  478. package/packages/shared-skills/skills/lsp-setup/references/kotlin/README.md +59 -0
  479. package/packages/shared-skills/skills/lsp-setup/references/lua/README.md +66 -0
  480. package/packages/shared-skills/skills/lsp-setup/references/php/README.md +62 -0
  481. package/packages/shared-skills/skills/lsp-setup/references/python/README.md +71 -0
  482. package/packages/shared-skills/skills/lsp-setup/references/ruby/README.md +53 -0
  483. package/packages/shared-skills/skills/lsp-setup/references/rust/README.md +59 -0
  484. package/packages/shared-skills/skills/lsp-setup/references/swift/README.md +51 -0
  485. package/packages/shared-skills/skills/lsp-setup/references/terraform/README.md +62 -0
  486. package/packages/shared-skills/skills/lsp-setup/references/typescript/README.md +77 -0
  487. package/packages/shared-skills/skills/lsp-setup/references/yaml/README.md +70 -0
  488. package/packages/shared-skills/skills/lsp-setup/references/zig/README.md +49 -0
  489. package/packages/shared-skills/skills/lsp-setup/scripts/detect-lsp.ts +210 -0
  490. package/packages/shared-skills/skills/lsp-setup/scripts/lsp-server-table.ts +177 -0
  491. package/packages/shared-skills/skills/lsp-setup/scripts/tsconfig.json +17 -0
  492. package/packages/shared-skills/skills/lsp-setup/scripts/verify-lsp.ts +147 -0
  493. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  494. package/packages/shared-skills/skills/review-work/SKILL.md +10 -14
  495. package/packages/shared-skills/skills/start-work/SKILL.md +30 -59
  496. package/packages/shared-skills/skills/ultraresearch/SKILL.md +126 -667
  497. package/dist/hooks/anthropic-effort/hook.d.ts +0 -26
  498. package/dist/hooks/anthropic-effort/index.d.ts +0 -1
  499. package/dist/hooks/keyword-detector/analyze/default.d.ts +0 -12
  500. package/dist/hooks/keyword-detector/analyze/index.d.ts +0 -1
  501. package/dist/hooks/keyword-detector/search/default.d.ts +0 -12
  502. package/dist/hooks/keyword-detector/search/index.d.ts +0 -1
  503. package/dist/hooks/thinking-block-validator/hook.d.ts +0 -12
  504. package/dist/hooks/thinking-block-validator/index.d.ts +0 -1
  505. package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +0 -18
  506. package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +0 -29
  507. package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +0 -151
@@ -9,12 +9,12 @@ metadata:
9
9
 
10
10
  Use this skill when the user asks for `ulw-loop`, `ulw`, durable goal execution, evidence-led work, manual QA, or checkpointed long-running delivery.
11
11
 
12
- This Codex skill is intentionally compact to avoid adding a large operating manual to an already-full conversation. The full workflow lives in `references/full-workflow.md`. Read only the sections needed for the current phase, then execute them exactly.
12
+ This skill is intentionally compact. The full workflow lives in `references/full-workflow.md`. Read only the sections needed for the current phase, then execute them exactly.
13
13
 
14
14
  ## Required First Steps
15
15
 
16
16
  1. Open `references/full-workflow.md`.
17
- 2. Read through **Bootstrap**, **Execution Loop**, and the **Manual-QA channels** table before running any ULW command or recording evidence.
17
+ 2. Read through **Bootstrap** (including its tier triage), **Execution Loop**, and the **Manual-QA channels** table before running any ULW command or recording evidence.
18
18
  3. If the task has code edits, tests, QA, or commit work, follow the full workflow's delegation and evidence rules. Tests alone never prove done.
19
19
 
20
20
  ## Non-Negotiables
@@ -22,15 +22,15 @@ This Codex skill is intentionally compact to avoid adding a large operating manu
22
22
  - Use the ulw-loop CLI state under `.omo/ulw-loop`; do not hand-edit goal state.
23
23
  - After any compaction or context loss, re-read brief + goals + ledger FIRST (`omo sparkshell cat .omo/ulw-loop/ledger.jsonl` or read directly) plus `omo ulw-loop status --json`, then resume; never re-plan from scratch.
24
24
  - If `omo ulw-loop create-goals` says the existing aggregate is already complete, start unrelated new work with a fresh `--session-id <new-id>` instead of steering or forcing the completed default state. Use `--force` only to intentionally overwrite completed evidence.
25
- - Every success criterion needs observable evidence from a real channel: tmux, HTTP, browser, or computer-use.
25
+ - Every success criterion needs observable evidence from a real surface: a channel (tmux, HTTP, browser, computer-use) or, for CLI- or data-shaped criteria, an auxiliary surface (CLI stdout, DB diff, parsed config dump).
26
26
  - Record evidence through the CLI only after cleanup receipts are available.
27
27
  - Delegate code edits, test writes, fixes, and QA execution to right-sized Codex subagents when the workflow requires it.
28
- - Every `spawn_agent` message starts with `TASK:`, then names `DELIVERABLE`, `SCOPE`, and `VERIFY`; put role and specialty instructions inside `message` because the Codex tool schema only accepts `task_name`, `message`, and `fork_turns`; prefer `fork_turns: "none"` unless full history is truly required.
29
- - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short wait_agent cycles. Never use a single long blocking wait for them.
28
+ - Every `multi_agent_v1.spawn_agent` message starts with `TASK:`, then names `DELIVERABLE`, `SCOPE`, and `VERIFY`; put role and specialty instructions inside `message`; use `fork_context: false` unless full history is truly required.
29
+ - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short `multi_agent_v1.wait_agent` cycles. Never use a single long blocking wait for them.
30
30
  - For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long reading, testing, or review passes, and `BLOCKED: <reason>` only when it cannot progress.
31
- - While any child is active, keep the parent visibly alive with brief status updates that include active subagent count, agent names, latest `WORKING:` phase, and whether the parent is waiting for mailbox updates.
32
- - Track spawned agent names locally. Use `wait_agent` for mailbox signals, not proof of completion. A timeout only means no new mailbox update arrived; after a timeout, run a single `list_agents` check for the named child when you need reassurance. If it is running or its latest message is `WORKING:`, treat it as alive.
33
- - Do not use `list_agents` as a polling loop or status feed; it can replay large payloads. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running. Then record inconclusive and respawn a smaller `fork_turns: "none"` task with the missing deliverable.
31
+ - Track spawned agent names locally. Use `multi_agent_v1.wait_agent` for mailbox signals, not proof of completion. A timeout only means no new mailbox update arrived. Treat a running child as alive.
32
+ - While children run, surface the active subagent count, agent names, and latest `WORKING:` phase.
33
+ - Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running. Then record inconclusive and respawn a smaller `fork_context: false` task with the missing deliverable.
34
34
  - Use `git-master` for git-tracked edits: inspect recent and touched-path commit history, then commit each verified work unit atomically in the repository's observed language, scope, and message style with only that unit's files staged.
35
35
 
36
36
  ## Codex Tool Mapping
@@ -39,11 +39,11 @@ The full workflow may mention OpenCode-style orchestration examples. In Codex, t
39
39
 
40
40
  | Workflow intent | Codex tool |
41
41
  | --- | --- |
42
- | Plan agent | `spawn_agent({"task_name":"...","message":"TASK: act as a planning agent. ...","fork_turns":"none"})` |
43
- | Search/read-only worker | `spawn_agent({"task_name":"...","message":"TASK: act as an explorer. ...","fork_turns":"none"})` |
44
- | Implementation or QA worker | `spawn_agent({"task_name":"...","message":"TASK: act as an implementation or QA worker. ...","fork_turns":"none"})` |
45
- | Final verification reviewer | `spawn_agent({"task_name":"...","message":"TASK: act as a rigorous reviewer. ...","fork_turns":"none"})` |
46
- | Wait for background result | `wait_agent(...)` |
47
- | Clean up finished worker | `close_agent(...)` |
42
+ | Plan agent | `multi_agent_v1.spawn_agent({"message":"TASK: act as a planning agent. ...","fork_context":false})` |
43
+ | Search/read-only worker | `multi_agent_v1.spawn_agent({"message":"TASK: act as an explorer. ...","fork_context":false})` |
44
+ | Implementation or QA worker | `multi_agent_v1.spawn_agent({"message":"TASK: act as an implementation or QA worker. ...","fork_context":false})` |
45
+ | Final verification reviewer | `multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","fork_context":false})` |
46
+ | Wait for background result | `multi_agent_v1.wait_agent(...)` |
47
+ | Clean up finished worker | `multi_agent_v1.close_agent(...)` |
48
48
 
49
49
  When translating `load_skills=[...]`, include the requested skill names in the spawned agent's `message`.
@@ -15,20 +15,20 @@ Prove EVERY success criterion with captured observable evidence from a real-usag
15
15
  TESTS ALONE NEVER PROVE DONE. A green test suite is supporting evidence, not completion proof.
16
16
  Audit each pass, fail, block, steering change, and checkpoint in `.omo/ulw-loop/ledger.jsonl`.
17
17
 
18
- ## Manual-QA channels (PICK ONE PER CRITERION — ACTUALLY RUN IT)
19
- For every criterion, build a real-usage scenario through ONE of these four channels and run it yourself before recording PASS. The full test suite being green is NEVER verification on its own.
18
+ ## Manual-QA channels
19
+ Run each criterion's real-surface proof yourself through the channel that faithfully exercises it; capture the artifact before recording PASS.
20
20
 
21
21
  1. **HTTP call** — hit the live endpoint with `curl -i` (or a Playwright APIRequestContext); capture status line + headers + body.
22
22
  2. **tmux** — `tmux new-session -d -s ulw-qa-<criterion>`, drive with `send-keys`, dump via `tmux capture-pane -pS -E -`; transcript is the artifact.
23
23
  3. **Browser use** — use Chrome to drive the REAL page; if Chrome is not available, download and use agent-browser (https://github.com/vercel-labs/agent-browser). Capture action log + screenshot path. Never downgrade to a non-browser surface for a browser-facing criterion.
24
24
  4. **Computer use** — when the surface is a desktop/GUI app rather than a page, drive it via OS-level automation (a computer-use agent, AppleScript, xdotool, etc.) against the running app; capture action log + screenshot. Use this for any non-browser GUI criterion.
25
25
 
26
- Auxiliary surfaces (pure CLI stdout / DB state diff / parsed config dump) satisfy CLI- or data-shaped criteria but NEVER replace a channel scenario for user-facing behavior. `--dry-run`, printing the command, "should respond", and "looks correct" never count.
26
+ Auxiliary surfaces (CLI stdout / DB state diff / parsed config dump) are first-class evidence for CLI- or data-shaped criteria; use a channel scenario when the behavior is user-facing. `--dry-run`, printing the command, "should respond", and "looks correct" never count.
27
27
 
28
28
  ## Delegation model (ATLAS-STYLE — YOU CONDUCT, WORKERS PLAY)
29
- You read, search, plan, integrate, and QA. You DELEGATE every code edit, test write, bug fix, and QA execution to a right-sized `spawn_agent` worker, then verify what comes back. Fan out independent tasks in PARALLEL in a single response; serialize only on a NAMED dependency (one task consumes another's output or edits the same file).
29
+ You read, search, plan, integrate, and QA. You DELEGATE every code edit, test write, bug fix, and QA execution to a right-sized `multi_agent_v1.spawn_agent` worker, then verify what comes back. Fan out independent tasks in PARALLEL in a single response; serialize only on a NAMED dependency (one task consumes another's output or edits the same file).
30
30
 
31
- Size each worker to the task. Put the intended role, rigor level, and specialty inside the worker `message`; the Codex `spawn_agent` schema only accepts `task_name`, `message`, and `fork_turns`.
31
+ Size each worker to the task. Put the intended role, rigor level, and specialty inside the worker `message`.
32
32
 
33
33
  | Task shape | Message instruction |
34
34
  |---|---|
@@ -42,16 +42,16 @@ Size each worker to the task. Put the intended role, rigor level, and specialty
42
42
 
43
43
  For reviewer work, use a self-contained reviewer assignment, tight scope, and explicit verification in `message`. Never spawn a context-only child for review.
44
44
 
45
- Every worker message MUST carry: goal + exact files in scope; the baseline characterization test pinning current behavior when the task touches existing code, then the failing test / reproduction required before production code; constraints + project rules; the verification commands to run; the ONE Manual-QA channel and the exact evidence artifact to capture; for git-tracked edits, require `git-master` plus repository-wide and touched-path commit history inspection before commit. Workers have NO interview context — be exhaustive, and forward accumulated learnings to every next worker.
45
+ Every worker message MUST carry: goal + exact files in scope; the PIN + failing-first proof required before production code (Per-Criterion Cycle step 3); constraints + project rules; the verification commands to run; the ONE Manual-QA channel and the exact evidence artifact to capture; for git-tracked edits, require `git-master` plus repository-wide and touched-path commit history inspection before commit. Workers have NO interview context — be exhaustive, and forward accumulated learnings to every next worker.
46
46
 
47
47
  Codex subagent reliability:
48
- - Start every `spawn_agent` message with `TASK: <imperative assignment>`, then name `DELIVERABLE`, `SCOPE`, and `VERIFY`. State that it is an executable assignment, not a context handoff.
49
- - Prefer `fork_turns: "none"` unless full history is truly required; paste only the context the child needs. Full-history forks can make the child continue old parent context instead of the delegated task.
50
- - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short wait_agent cycles. Never use a single long blocking wait for them.
48
+ - Start every `multi_agent_v1.spawn_agent` message with `TASK: <imperative assignment>`, then name `DELIVERABLE`, `SCOPE`, and `VERIFY`. State that it is an executable assignment, not a context handoff.
49
+ - Use `fork_context: false` unless full history is truly required; paste only the context the child needs. Full-history forks can make the child continue old parent context instead of the delegated task.
50
+ - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short `multi_agent_v1.wait_agent` cycles. Never use a single long blocking wait for them.
51
51
  - For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long reading, testing, or review passes, and `BLOCKED: <reason>` only when it cannot progress.
52
52
  - While any child is active, keep the parent visibly alive with active subagent count, agent names, latest `WORKING:` phase, and whether the parent is waiting for mailbox updates.
53
- - Track spawned agent names locally. Use `wait_agent` for mailbox signals, not proof of completion. A timeout only means no new mailbox update arrived; after a timeout, run a single `list_agents` check for the named child when you need reassurance. If it is running or its latest message is `WORKING:`, treat it as alive. Do not use `list_agents` as a polling loop or status feed; it can replay large payloads.
54
- - Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running. Then send `TASK STILL ACTIVE: return <deliverable> or BLOCKED: <reason>` when a targeted followup can still recover the lane; otherwise record inconclusive, do not count it as pass/review approval, close if safe, and respawn a smaller `fork_turns: "none"` task with the missing deliverable.
53
+ - Track spawned agent names locally. Use `multi_agent_v1.wait_agent` for mailbox signals, not proof of completion. A timeout only means no new mailbox update arrived. Treat a running child as alive.
54
+ - Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running. Then send `TASK STILL ACTIVE: return <deliverable> or BLOCKED: <reason>` when a targeted followup can still recover the lane; otherwise record inconclusive, do not count it as pass/review approval, close if safe, and respawn a smaller `fork_context: false` task with the missing deliverable.
55
55
 
56
56
  ## Artifacts
57
57
  - `.omo/ulw-loop/brief.md`: original brief and durable constraints.
@@ -117,16 +117,14 @@ Write state through the CLI path. Do not hand-edit state files.
117
117
 
118
118
  ### 2. Refine success criteria + a Prometheus-grade QA and parallelism plan per goal
119
119
  Gather context BEFORE planning — fire parallel `explorer` / `librarian` workers plus your own read-only tools; never plan blind.
120
- First survey the skills available in this system: read the description of every loosely-relevant skill, decide deliberately which ones this work will use, and prefer using as many genuinely-applicable skills as apply rather than working raw. Then size the scope: count distinct surfaces, files, and steps. For any non-trivial goal (2+ steps, multi-file, unclear scope, or an architecture decision) spawn the `plan` agent with the gathered context and let IT decide the wave ordering and parallel grouping; follow that order and grouping exactly and run the verification it specifies. Only a genuinely trivial single-step goal may skip the plan agent.
121
- Define pass/fail acceptance criteria before launching execution lanes. Include the command, artifact, or manual check that will prove success.
122
- Each goal MUST carry 3+ `successCriteria` covering happy path, edge, regression, and adversarial risk.
123
- For each criterion set, concretely and upfront: `id`, `scenario` (the exact tool — curl / tmux / playwright / computer-use — plus exact steps with specific inputs and a binary pass/fail), `expectedEvidence` (the exact artifact path, e.g. `.omo/ulw-loop/evidence/<goal>-<criterion>.<ext>`), adversarial classes, stop condition, and the Manual-QA channel (HTTP call / tmux / browser use / computer use) that will exercise it. Vague QA ("verify it works") is a rejected criterion — revise it before execution.
124
- Apply ultraqa classes where relevant: malformed input, repeated interruptions, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output.
120
+ First survey the skills available in this system: read the description of every loosely-relevant skill, decide deliberately which ones this work will use, and prefer using as many genuinely-applicable skills as apply rather than working raw.
121
+ Then run tier triage per goal and record it with an `annotate_ledger` steering entry. Default is LIGHT — a narrow change inside existing layers. Take HEAVY only on a fact you can point to: a new module / abstraction / domain model; auth, security, or session; an external integration; a DB schema or migration; concurrency, transaction boundaries, or cache invalidation; a cross-domain refactor; or the user signaled care or demanded review. When unsure, take HEAVY; upgrade the moment a HEAVY fact surfaces and never downgrade mid-run.
122
+ HEAVY goals: spawn the `plan` agent with the gathered context, follow its wave ordering and parallel grouping exactly, and run the verification it specifies; carry 3+ successCriteria covering happy path, edge, regression, and adversarial risk. LIGHT goals: plan directly; carry 1-2 successCriteria (happy path + the riskiest edge) with one real-surface proof of the deliverable.
123
+ For each criterion set, concretely and upfront: `id`, `scenario` (the exact tool — curl / tmux / playwright / computer-use — plus exact steps with specific inputs and a binary pass/fail), `expectedEvidence` (the exact artifact path, e.g. `.omo/ulw-loop/evidence/<goal>-<criterion>.<ext>`), adversarial classes, stop condition, and the Manual-QA channel that will exercise it. Vague QA ("verify it works") is a rejected criterion — revise it before execution.
124
+ A criterion's adversarial classes are the ultraqa classes a fact about the change triggers: malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions. Record untriggered classes as not-applicable in one line.
125
125
  Use evidence verbs from the channel table (tmux transcript, curl status+body, browser screenshot, computer-use action log, CLI stdout, DB diff, parsed config dump) — not vibes.
126
- "Tests pass" is supporting signal, NEVER completion proof. Every criterion needs its own channel scenario, built fresh and exercised every time.
127
126
 
128
- **Plan for maximum parallelism.** Decompose each goal's criteria into atomic tasks (Implementation + its Test = ONE task, never split) and group them into dependency waves. Target 5–8 tasks per wave; <3 per wave (except the final wave) means under-splitting — extract shared prerequisites into Wave 1. For each task record its wave, what it blocks, what blocks it, the worker tier from the Delegation table, and its QA scenario + evidence path. Build a dependency matrix (Task | Depends on | Blocks | Can parallelize with) and name the critical path. Anything not on a real dependency edge MUST share a wave and dispatch together.
129
- Record manual QA notes when behavior is user-visible.
127
+ **Plan for maximum parallelism (HEAVY goals).** Decompose each goal's criteria into atomic tasks (Implementation + its Test = ONE task, never split) and group them into dependency waves. Target 5–8 tasks per wave; <3 per wave (except the final wave) means under-splitting — extract shared prerequisites into Wave 1. For each task record its wave, what it blocks, what blocks it, the worker tier from the Delegation table, and its QA scenario + evidence path. Build a dependency matrix (Task | Depends on | Blocks | Can parallelize with) and name the critical path. Anything not on a real dependency edge MUST share a wave and dispatch together.
130
128
  Revise any criterion that lacks observable `expectedEvidence` or a named channel before execution.
131
129
 
132
130
  ### 3. Inspect state
@@ -152,11 +150,11 @@ Loop per goal. Cap at 5 cycles per goal. Cap identical same-criterion failures a
152
150
  ### Per-Criterion Cycle
153
151
  1. PLAN: read `criterion.scenario`, `criterion.expectedEvidence`, prior ledger entries, and safety bounds. Identify which tasks in the current wave are independent.
154
152
  2. Register atomic todos via `update_plan` — one ultra-granular step per action, `path: <action> for <criterion> - verify by <check>`. Call `update_plan` on every transition (start → `in_progress`, finish → `completed`); exactly one `in_progress`, mark completed immediately, never batch, never let the rendered plan lag behind reality.
155
- 3. DELEGATE-IN-PARALLEL: dispatch every independent task in the wave at once via right-sized `spawn_agent` workers (Delegation table). Each worker does strict TDD on its task: when the task touches EXISTING behavior, PIN it FIRST — write a characterization test that asserts the current observable behavior and PASSES on the unchanged code, so any later regression fails loudly. Then RED (the new failing assertion must fail for the RIGHT reason no syntax/import error), then the SMALLEST GREEN change; before GREEN work that depends on external review, PR, issue, or branch state, refresh current branch/PR/issue state, preserve existing ordering/policy, and separate compatibility detection from policy changes unless the goal explicitly asks to change policy. A GREEN needing >~20 lines means the test was too coarse — instruct a split. The baseline-pin scenario must be as rigorous and specific as the new-behavior scenario: exact inputs, exact observable, exact assertion. Serialize only on a NAMED dependency.
153
+ 3. DELEGATE-IN-PARALLEL: dispatch every independent task in the wave at once via right-sized `multi_agent_v1.spawn_agent` workers (Delegation table). Each worker captures evidence failing-first: when the task touches EXISTING behavior, PIN it FIRST — a characterization test that asserts the current observable behavior and PASSES on the unchanged code, as rigorous as the new-behavior scenario (exact inputs, exact observable, exact assertion). Then RED through the cheapest faithful channel — a unit test where a seam exists, an integration/e2e test where the behavior lives in wiring, or the criterion's scenario captured failing when no test seam exists — failing for the RIGHT reason (no syntax/import error). A test that mirrors its implementation (mock-call assertions, pinned constants, cannot fail under plausible regression) is not evidence; use the scenario as the failing proof instead. Then the SMALLEST GREEN change; before GREEN work that depends on external review, PR, issue, or branch state, refresh current branch/PR/issue state, preserve existing ordering/policy, and separate compatibility detection from policy changes unless the goal explicitly asks to change policy. A GREEN far larger than the criterion implies means the proof was too coarse — instruct a split. Serialize only on a NAMED dependency.
156
154
  4. INTEGRATE + CRITICAL SELF-QA + GIT CHECKPOINT (EVERY WORKER RETURN): do NOT trust the worker's report. Read the diff yourself, re-run its tests, and run LSP diagnostics on the changed files. Treat "done" as a claim to disprove. If the diff drifts, the test is hollow, or evidence is missing, RESPAWN the worker with the specific failure context. Once the work unit is verified, use `git-master` before staging: inspect recent repository commits and touched-path history to infer commit language, Conventional Commit scope, message shape, and unit size. Stage only that unit's files and commit in the observed style; do not carry verified work forward into a later omnibus commit. If no git-tracked files changed or committing is unsafe, record the no-commit reason as evidence. Forward every finding/learning to subsequent workers.
157
- 5. EXECUTE-AS-SCENARIO: ACTUALLY run the Manual-QA channel scenario the criterion named (HTTP call / tmux / browser use / computer use — see the channel table above). Run it yourself for the orchestrator check; for heavier flows dispatch a dedicated QA worker (`worker`, `gpt-5.5`, `high`) whose ONLY job is to drive the channel and write the artifact to the named evidence path. The unit suite being green is NEVER substitute. If the scenario FAILS, respawn the implementing worker with the captured failure — do not hand-patch around it.
155
+ 5. EXECUTE-AS-SCENARIO: ACTUALLY run the Manual-QA scenario the criterion named (channel table above). Run it yourself for the orchestrator check; for heavier flows dispatch a dedicated QA worker (`worker`, `gpt-5.5`, `high`) whose ONLY job is to drive the channel and write the artifact to the named evidence path. If the scenario FAILS, respawn the implementing worker with the captured failure — do not hand-patch around it.
158
156
  6. CAPTURE: collect the observable artifact path: transcript, stdout, screenshot, assertion, status+body, diff, or parsed dump. No artifact written at the evidence path — not done; record BLOCKED and respawn QA.
159
- 7. CLEAN (PAIRED, NEVER SKIP): tear down every runtime artifact step 5 spawned BEFORE recording — server PIDs (`kill`, verify `kill -0` fails), `tmux` sessions (`tmux kill-session -t ulw-qa-<criterion>`; confirm `tmux ls`), browser / Playwright contexts (`.close()`), containers (`docker rm -f`), bound ports (`lsof -i :<port>` empty), temp sockets / files / dirs (`rm -rf` the `mktemp` paths), QA-only env vars, AND `close_agent` on every finished worker. Register each teardown as its own todo the moment the QA spawns the resource (scripts, tmux assets, browsers / agent-browser sessions, PIDs, ports) so none is forgotten. Embed a one-line cleanup receipt in the evidence string, e.g. `cleanup: killed 12345; tmux kill-session ulw-qa-foo; rm -rf /tmp/ulw.aB12cD; close_agent w-3`. Missing receipt → record BLOCKED, not PASS.
157
+ 7. CLEAN (PAIRED, NEVER SKIP): tear down every runtime artifact step 5 spawned BEFORE recording — server PIDs (`kill`, verify `kill -0` fails), `tmux` sessions (`tmux kill-session -t ulw-qa-<criterion>`; confirm `tmux ls`), browser / Playwright contexts (`.close()`), containers (`docker rm -f`), bound ports (`lsof -i :<port>` empty), temp sockets / files / dirs (`rm -rf` the `mktemp` paths), QA-only env vars, AND `multi_agent_v1.close_agent` on every finished worker. Register each teardown as its own todo the moment the QA spawns the resource (scripts, tmux assets, browsers / agent-browser sessions, PIDs, ports) so none is forgotten. Embed a one-line cleanup receipt in the evidence string, e.g. `cleanup: killed 12345; tmux kill-session ulw-qa-foo; rm -rf /tmp/ulw.aB12cD; multi_agent_v1.close_agent w-3`. Missing receipt → record BLOCKED, not PASS.
160
158
  8. RECORD exactly one result:
161
159
  - PASS: `omo ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status pass --evidence "<observable> | <cleanup receipt>" --json`
162
160
  - FAIL: `omo ulw-loop record-evidence --goal-id <id> --criterion-id <id> --status fail --evidence "<observable> | <cleanup receipt>" --notes "<diagnosis>" --json`
@@ -178,7 +176,7 @@ Trigger only when one goal remains and all its criteria are passing.
178
176
  1. Run targeted verification for changed behavior.
179
177
  2. Run `ai-slop-cleaner` on changed files. If no relevant edits exist, record a passed no-op cleaner report.
180
178
  3. Rerun verification after cleanup.
181
- 4. Judge the change size. Spawn a rigorous reviewer with `spawn_agent({"task_name":"final_verification_review","message":"TASK: act as a rigorous final verification reviewer. DELIVERABLE: approve or cite blockers. SCOPE: <changed files and goal>. VERIFY: inspect diff and verification evidence.","fork_turns":"none"})` only when the work is large or risky (multi-file, cross-cutting, new architecture, security/data surfaces, or you are unsure it is sound); for a small, local, low-risk change, do the review yourself and record `codeReview` with `evidence` starting `UNCONDITIONAL APPROVAL` plus a one-line justification of why the change was small enough to self-review.
179
+ 4. HEAVY tier or any goal you are unsure is sound — spawns a rigorous reviewer with `multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous final verification reviewer. DELIVERABLE: approve or cite blockers. SCOPE: <changed files and goal>. VERIFY: inspect diff and verification evidence.","fork_context":false})`. LIGHT tier: review the diff yourself and record `codeReview` with `evidence` starting `UNCONDITIONAL APPROVAL` plus a one-line justification of why the tier held.
182
180
  5. Clean review means `codeReview.recommendation == "APPROVE"` and `codeReview.architectStatus == "CLEAR"`.
183
181
  6. If review is non-clean, run `omo ulw-loop record-review-blockers --goal-id <id> --title "<...>" --objective "<...>" --evidence "<review findings>" --codex-goal-json <snapshot> --json`.
184
182
  7. If clean, checkpoint final completion:
@@ -194,6 +192,7 @@ omo ulw-loop checkpoint --goal-id <id> --status complete --evidence "<e2e eviden
194
192
  "criteriaCoverage": { "totalCriteria": N, "passCount": N, "adversarialClassesCovered": ["malformed_input", "..."] }
195
193
  }
196
194
  ```
195
+ A LIGHT goal with no triggered adversarial class records `"adversarialClassesCovered": ["none-applicable: <reason>"]`.
197
196
 
198
197
  ## Dynamic Steering
199
198
  Use steering only for structured evidence-backed mutation. Reject natural-language steering requests.
@@ -221,11 +220,11 @@ Structured prompt directives accepted: `OMO_ULW_LOOP_STEER: { ... }`, `omo.ulw-l
221
220
  7. Per-story Codex goal mode is opt-in only with `--codex-goal-mode per-story`; default is aggregate.
222
221
  8. Structured steering directives mutate state through validation; normal prose does not.
223
222
  9. Evidence MUST be observable from the real surface: tmux transcript, curl status+body, browser/Playwright assertion, CLI stdout, DB state diff, parsed config dump.
224
- 10. Apply ultraqa's 9 adversarial classes where relevant per goal: malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung commands, flaky tests, misleading success output, repeated interruptions.
223
+ 10. Probe the adversarial classes each criterion's trigger facts name (list in Bootstrap step 2); record untriggered classes as not-applicable in one line.
225
224
  11. After completing an aggregate ulw-loop run, clear the Codex goal manually with `/goal clear` before starting another in the same session.
226
225
  12. The shell command emits a model-facing handoff; only the Codex agent calls `get_goal`, `create_goal`, or `update_goal` tools.
227
226
  13. NEVER record `--status pass` while a QA-spawned process, `tmux` session, browser context, bound port, container, or temp file / dir is still alive, or while any worker is still open. The evidence string MUST include the cleanup receipt. Leftover runtime state = BLOCKED, not PASS.
228
- 14. DELEGATE all code edits, test writes, fixes, and QA execution to right-sized `spawn_agent` workers (Delegation table); you read, search, plan, integrate, and QA. NEVER record `--status pass` from a worker's self-report — only from evidence you re-verified yourself. Dispatch independent tasks in parallel; serialize only on a NAMED dependency.
227
+ 14. DELEGATE all code edits, test writes, fixes, and QA execution to right-sized `multi_agent_v1.spawn_agent` workers (Delegation table); you read, search, plan, integrate, and QA. NEVER record `--status pass` from a worker's self-report — only from evidence you re-verified yourself. Dispatch independent tasks in parallel; serialize only on a NAMED dependency.
229
228
  15. Every verified work unit that touched git-tracked files must leave either an atomic `git-master`-style commit hash or explicit no-commit blocker evidence before the next unit starts.
230
229
 
231
230
  ## Stop Rules
@@ -14,7 +14,7 @@ This skill is intentionally compact. The full planning workflow lives in `refere
14
14
  ## Required First Steps
15
15
 
16
16
  1. Open `references/full-workflow.md`.
17
- 2. Read **Phase 0 - Classify**, **Phase 1 - Ground**, and the **Approval gate** before you ask the user anything or draft a plan.
17
+ 2. Read **Phase 0 - Classify**, **Phase 1 - Ground**, **Phase 2 - Interview**, and the **Approval gate** before you ask the user anything or draft a plan.
18
18
  3. Internalize the loop: explore exhaustively, surface the genuine unknowns, ask, then wait for approval before planning.
19
19
 
20
20
  ## The Gate (non-negotiable behavior)
@@ -24,6 +24,15 @@ This skill is intentionally compact. The full planning workflow lives in `refere
24
24
  - **Wait for the user's explicit okay before generating the plan.** Never auto-transition from interview to plan generation. No plan file, no Metis gap-analysis, no execution until the user approves the approach.
25
25
  - **Planner scope only.** Write only `.omo/plans/<slug>.md` and `.omo/drafts/*.md`. Never edit source. If asked to "just do it", decline: you plan; a worker executes.
26
26
 
27
+ ## Interview Discipline (how to ask)
28
+
29
+ Exploration answers facts; the user decides preferences, tradeoffs, and safety. Bring those decisions to the user EARLY and well-formed:
30
+
31
+ - Every question must materially change the plan, confirm a load-bearing assumption, or choose between real tradeoffs. If a read-only search could answer it, asking is a failure.
32
+ - Ask 1-3 narrow questions per turn, each with 2-4 concrete options and your recommended default first, grounded in a file path or finding you cite. A skipped question resolves to that default, recorded in the draft as an assumption.
33
+ - Always ask test strategy (TDD / tests-after / none); agent-executed QA scenarios are included regardless.
34
+ - Record every answer and decision in `.omo/drafts/<slug>.md` immediately; run the Phase 2 clearance check after every turn; never end a turn passively — end with the question or the explicit next step.
35
+
27
36
  ## Dynamic Adversarial Planning
28
37
 
29
38
  For architecture work, no-plan `$start-work` bootstrap, or requests that cite Discord / external repositories, use **dynamic adversarial workflow phases** before writing the final plan:
@@ -44,22 +53,22 @@ Subagent outputs are not success or approval without independent verification.
44
53
 
45
54
  You explore a LOT - fan out parallel read-only research before interviewing - but delegate with Codex discipline:
46
55
 
47
- - Every `spawn_agent` message starts with `TASK:`, then names `DELIVERABLE`, `SCOPE`, and `VERIFY`. Put role and specialty instructions inside `message`; the Codex tool schema only accepts `task_name`, `message`, and `fork_turns`. Prefer `fork_turns: "none"` unless full history is truly required.
48
- - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short wait_agent cycles. Never use a single long blocking wait for them.
56
+ - Every `multi_agent_v1.spawn_agent` message starts with `TASK:`, then names `DELIVERABLE`, `SCOPE`, and `VERIFY`. Put role and specialty instructions inside `message`. Use `fork_context: false` unless full history is truly required.
57
+ - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short `multi_agent_v1.wait_agent` cycles. Never use a single long blocking wait for them.
49
58
  - For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long reading, testing, or review passes, and `BLOCKED: <reason>` only when it cannot progress.
50
59
  - While any child is active, keep yourself visibly alive with active subagent count, agent names, latest `WORKING:` phase, and whether you are waiting for mailbox updates.
51
- - Track spawned agent names locally. Use `wait_agent` for mailbox signals, not proof of completion. A timeout only means no new mailbox update arrived; after a timeout, run a single `list_agents` check for the named child when you need reassurance. If it is running or its latest message is `WORKING:`, treat it as alive.
52
- - Do not use `list_agents` as a polling loop or status feed; it can replay large payloads. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running. Then record the lane inconclusive and respawn a smaller `fork_turns: "none"` task with the missing deliverable.
60
+ - Track spawned agent names locally. Use `multi_agent_v1.wait_agent` for mailbox signals, not proof of completion. A timeout only means no new mailbox update arrived. Treat a running child as alive.
61
+ - Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running. Then record the lane inconclusive and respawn a smaller `fork_context: false` task with the missing deliverable.
53
62
 
54
63
  ## Codex Tool Mapping
55
64
 
56
65
  | Planning intent | Codex tool |
57
66
  | --- | --- |
58
- | Internal codebase research | `spawn_agent({"task_name":"...","message":"TASK: act as an explorer. ...","fork_turns":"none"})` |
59
- | External docs / library research | `spawn_agent({"task_name":"...","message":"TASK: act as a librarian. ...","fork_turns":"none"})` |
60
- | Pre-plan gap analysis (after approval) | `spawn_agent({"task_name":"...","message":"TASK: act as a Metis gap-analysis reviewer. ...","fork_turns":"none"})` |
61
- | High-accuracy plan review (optional) | `spawn_agent({"task_name":"...","message":"TASK: act as a Momus plan reviewer. ...","fork_turns":"none"})` |
62
- | Wait for a research result | `wait_agent(...)` |
63
- | Release a finished subagent | `close_agent(...)` |
67
+ | Internal codebase research | `multi_agent_v1.spawn_agent({"message":"TASK: act as an explorer. ...","fork_context":false})` |
68
+ | External docs / library research | `multi_agent_v1.spawn_agent({"message":"TASK: act as a librarian. ...","fork_context":false})` |
69
+ | Pre-plan gap analysis (after approval) | `multi_agent_v1.spawn_agent({"message":"TASK: act as a Metis gap-analysis reviewer. ...","fork_context":false})` |
70
+ | High-accuracy plan review (optional) | `multi_agent_v1.spawn_agent({"message":"TASK: act as a Momus plan reviewer. ...","fork_context":false})` |
71
+ | Wait for a research result | `multi_agent_v1.wait_agent(...)` |
72
+ | Release a finished subagent | `multi_agent_v1.close_agent(...)` |
64
73
 
65
74
  Name any skills the child needs directly inside its `message`. Your plan goes to `.omo/plans/<slug>.md`; never split one request into multiple plans.
@@ -8,7 +8,7 @@ metadata:
8
8
  ## Role
9
9
  Prometheus, strategic planning consultant inside Codex. You turn a vague or large request into ONE decision-complete work plan a downstream worker can execute with zero further interview. You are a PLANNER, not an implementer: read, search, run read-only analysis, and write only `.omo/plans/<slug>.md` and `.omo/drafts/*.md`. Never edit product code; if asked to "just do it", decline and offer to plan.
10
10
 
11
- GPT-5.x style: outcome-first, evidence-bound, atomic decisions. Explore a lot. Ask little. Never plan blind, and never plan before the user approves.
11
+ GPT-5.x style: outcome-first, evidence-bound, atomic decisions. Explore a lot; ask few, decisive questions. Never plan blind, and never plan before the user approves.
12
12
 
13
13
  ## North star
14
14
  A plan is **decision-complete** when the implementer needs ZERO judgment calls: every decision made, every ambiguity resolved, every pattern referenced with a concrete path.
@@ -22,8 +22,8 @@ Size your interview depth before diving in:
22
22
  ## Phase 1 - Ground (explore exhaustively BEFORE asking)
23
23
  Eliminate unknowns by discovering facts, not by asking the user. Before your first question, fan out parallel read-only research and keep working while it runs.
24
24
 
25
- - `spawn_agent({"task_name":"...","message":"TASK: act as an explorer. ...","fork_turns":"none"})` per internal aspect: existing patterns, conventions, similar implementations, naming/registration, test infrastructure. One agent per aspect.
26
- - `spawn_agent({"task_name":"...","message":"TASK: act as a librarian. ...","fork_turns":"none"})` per external aspect: official docs, API contracts, recommended patterns, pitfalls.
25
+ - `multi_agent_v1.spawn_agent({"message":"TASK: act as an explorer. ...","fork_context":false})` per internal aspect: existing patterns, conventions, similar implementations, naming/registration, test infrastructure. One agent per aspect.
26
+ - `multi_agent_v1.spawn_agent({"message":"TASK: act as a librarian. ...","fork_context":false})` per external aspect: official docs, API contracts, recommended patterns, pitfalls.
27
27
  - While they run, use direct read-only tools (`read`, `rg`, `ast_grep_search`, `lsp_*`) for immediate context. Do not idle.
28
28
 
29
29
  ### Dynamic workflow for architecture and bootstrap planning
@@ -44,11 +44,17 @@ Two kinds of unknowns:
44
44
  Exhaust exploration first. "I could not find it" is true only after you actually looked.
45
45
 
46
46
  ## Phase 2 - Interview (ask only what exploration cannot resolve)
47
- Record everything to `.omo/drafts/<slug>.md` as you go: confirmed requirements, decisions + rationale, research findings, open questions, scope IN / OUT. The draft is your durable memory across turns.
47
+ Record everything to `.omo/drafts/<slug>.md` as you go: confirmed requirements (the user's exact words), decisions + rationale, research findings, open questions, scope IN / OUT. Update it after EVERY meaningful exchange - long interviews outlive your context, and plan generation reads the draft, not your memory.
48
48
 
49
- Ask focused questions ONLY for genuine unknowns surfaced by Phase 1: goal + definition of done, scope boundaries, preference tradeoffs, test strategy (TDD / tests-after / none - agent-executed QA is always included), and hard constraints. Every question must materially change the plan. Never ask what a read-only search would answer.
49
+ Interview focus, informed by Phase 1 findings: goal + definition of done, scope boundaries (IN and explicitly OUT), technical approach ("I found pattern X at `src/path` - follow it?"), test strategy (TDD / tests-after / none - agent-executed QA is always included), and hard constraints.
50
50
 
51
- Keep each turn conversational: 3-6 sentences plus 1-3 questions. Never end a turn passively; end with the specific question or the explicit next step.
51
+ Question rules:
52
+ - Every question must materially change the plan, confirm a load-bearing assumption, or choose between real tradeoffs. Never ask what a read-only search would answer.
53
+ - Ask 1-3 narrow questions per turn, each with 2-4 concrete options and your recommended default first with a one-line rationale. A question the user skips resolves to the recommended default, recorded in the draft as an assumption.
54
+ - Ground each question in evidence: cite the file path or research finding that raised it, so the user decides from facts rather than guesses.
55
+ - Keep each turn conversational: 3-6 sentences plus the questions. Never end a turn passively; end with the specific question or the explicit next step.
56
+
57
+ Clearance check - run after EVERY interview turn: core objective defined? scope IN/OUT explicit? technical approach decided? test strategy confirmed? no critical ambiguity or blocking question left? Any NO -> that unmet item is your next question. All YES -> present the approval brief (see Approval gate) and stop; never jump from interview into writing the plan.
52
58
 
53
59
  ## Approval gate (DO NOT SKIP)
54
60
  When exploration is exhausted and the genuine unknowns are answered, do NOT auto-start planning. Present a short brief instead:
@@ -61,7 +67,7 @@ Then **wait for the user's explicit okay** before generating the plan. No Metis,
61
67
  Narrow `$start-work` bootstrap exception: if `$start-work` invoked this skill because there was no active Boulder work and no selectable plan, the user's `start work` request counts as approval to generate the plan and begin execution. Preserve the normal gate for ordinary `ulw-plan`; ask one focused question only if the objective is missing, destructive, or has a safety/product ambiguity that exploration cannot resolve.
62
68
 
63
69
  ## Phase 3 - Generate the plan (only after approval)
64
- 1. **Metis gap analysis (mandatory):** `spawn_agent({"task_name":"metis_gap_analysis","message":"TASK: act as a Metis gap-analysis reviewer and review this planning session for gaps. DELIVERABLE: contradictions, missing constraints, scope-creep risks, unvalidated assumptions, missing acceptance criteria. VERIFY: each gap names a concrete fix.","fork_turns":"none"})`. Fold the findings in silently.
70
+ 1. **Metis gap analysis (mandatory):** `multi_agent_v1.spawn_agent({"message":"TASK: act as a Metis gap-analysis reviewer and review this planning session for gaps. DELIVERABLE: contradictions, missing constraints, scope-creep risks, unvalidated assumptions, missing acceptance criteria. VERIFY: each gap names a concrete fix.","fork_context":false})`. Fold the findings in silently.
65
71
  2. Write ONE plan to `.omo/plans/<slug>.md` using the template below. No "Phase 1 plan / Phase 2 plan" splits; 50+ todos is fine. Build it incrementally - skeleton first, then append todo batches - so output limits never truncate it; re-read the file to confirm completeness.
66
72
  3. **Self-review:** every todo has references + agent-executable acceptance criteria + QA scenarios; no business-logic assumption without evidence; zero acceptance criteria require a human.
67
73
 
@@ -116,14 +122,14 @@ Critical path: ...
116
122
  ```
117
123
 
118
124
  ## Phase 4 - High-accuracy review (optional)
119
- If the user wants maximum rigor, call `spawn_agent({"task_name":"momus_plan_review","message":"TASK: act as a Momus plan reviewer. DELIVERABLE: review .omo/plans/<slug>.md only. VERIFY: cite every required fix or approve.","fork_turns":"none"})` and pass ONLY the plan path in `message`. Fix every cited issue and resubmit until it approves.
125
+ If the user wants maximum rigor, call `multi_agent_v1.spawn_agent({"message":"TASK: act as a Momus plan reviewer. DELIVERABLE: review .omo/plans/<slug>.md only. VERIFY: cite every required fix or approve.","fork_context":false})` and pass ONLY the plan path in `message`. Fix every cited issue and resubmit until it approves.
120
126
 
121
127
  ## Delegation discipline (Codex)
122
- - Every `spawn_agent` message starts with `TASK:`, then `DELIVERABLE`, `SCOPE`, `VERIFY`. Put role and specialty instructions inside `message`; the Codex tool schema only accepts `task_name`, `message`, and `fork_turns`. Prefer `fork_turns: "none"`.
123
- - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short wait_agent cycles. Never use a single long blocking wait for them.
128
+ - Every `multi_agent_v1.spawn_agent` message starts with `TASK:`, then `DELIVERABLE`, `SCOPE`, `VERIFY`. Put role and specialty instructions inside `message`. Use `fork_context: false` unless full history is truly required.
129
+ - Plan and reviewer agents may run for a long time; spawn them in the background, keep doing independent root work, and poll with short `multi_agent_v1.wait_agent` cycles. Never use a single long blocking wait for them.
124
130
  - For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops.
125
131
  - Keep yourself visibly alive while children run: active subagent count, agent names, latest `WORKING:` phase, and whether you are waiting on mailbox updates.
126
- - Use `wait_agent` for mailbox signals, not proof. A timeout only means no new mailbox update arrived; after a timeout, run a single `list_agents` check for the named child when you need reassurance. If it is running or its latest message is `WORKING:`, treat it as alive. Do not use `list_agents` as a polling loop. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running; then mark the lane inconclusive and respawn a smaller `fork_turns: "none"` task with the missing deliverable. `close_agent` after integrating each result.
132
+ - Use `multi_agent_v1.wait_agent` for mailbox signals, not proof. A timeout only means no new mailbox update arrived. Treat a running child as alive. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running; then mark the lane inconclusive and respawn a smaller `fork_context: false` task with the missing deliverable. `multi_agent_v1.close_agent` after integrating each result.
127
133
 
128
134
  ## Stop rules
129
135
  - Plan file exists, template filled, every todo has references + acceptance + QA + commit, dependency matrix consistent: DONE.
@@ -9,17 +9,17 @@ This skill may include examples copied from the OpenCode harness. In Codex, do n
9
9
 
10
10
  | OpenCode example | Codex tool to use |
11
11
  | --- | --- |
12
- | `call_omo_agent(subagent_type="explore", ...)` | `spawn_agent({"task_name":"...","message":"TASK: act as an explorer. ...","fork_turns":"none"})` |
13
- | `call_omo_agent(subagent_type="librarian", ...)` | `spawn_agent({"task_name":"...","message":"TASK: act as a librarian. ...","fork_turns":"none"})` |
14
- | `task(subagent_type="plan", ...)` | `spawn_agent({"task_name":"...","message":"TASK: act as a planning agent. ...","fork_turns":"none"})` |
15
- | `task(subagent_type="oracle", ...)` for final verification | `spawn_agent({"task_name":"...","message":"TASK: act as a rigorous reviewer. ...","fork_turns":"none"})` |
16
- | `task(category="...", ...)` for implementation or QA | `spawn_agent({"task_name":"...","message":"TASK: act as an implementation or QA worker. ...","fork_turns":"none"})` |
17
- | `background_output(task_id="...")` | `wait_agent(...)` for mailbox signals; after a timeout, run one `list_agents` check for the named child if reassurance is needed |
18
- | `team_*(...)` | Use Codex native subagents plus `send_message`, `followup_task`, `wait_agent`, and `close_agent` |
12
+ | `call_omo_agent(subagent_type="explore", ...)` | `multi_agent_v1.spawn_agent({"message":"TASK: act as an explorer. ...","agent_type":"explorer","fork_context":false})` |
13
+ | `call_omo_agent(subagent_type="librarian", ...)` | `multi_agent_v1.spawn_agent({"message":"TASK: act as a librarian. ...","agent_type":"librarian","fork_context":false})` |
14
+ | `task(subagent_type="plan", ...)` | `multi_agent_v1.spawn_agent({"message":"TASK: act as a planning agent. ...","agent_type":"plan","fork_context":false})` |
15
+ | `task(subagent_type="oracle", ...)` for final verification | `multi_agent_v1.spawn_agent({"message":"TASK: act as a rigorous reviewer. ...","agent_type":"codex-ultrawork-reviewer","fork_context":false})` |
16
+ | `task(category="...", ...)` for implementation or QA | `multi_agent_v1.spawn_agent({"message":"TASK: act as an implementation or QA worker. ...","fork_context":false})` |
17
+ | `background_output(task_id="...")` | `multi_agent_v1.wait_agent(...)` for mailbox signals |
18
+ | `team_*(...)` | Use Codex native subagents via `multi_agent_v1.spawn_agent`, `multi_agent_v1.send_input`, `multi_agent_v1.wait_agent`, and `multi_agent_v1.close_agent` |
19
19
 
20
- Codex full-history forks inherit parent context, so role-specific behavior must be described in a self-contained `message` and usually should use a non-full-history fork mode such as `fork_turns="none"`. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.
20
+ Role-specific behavior must be described in a self-contained `message`. Use `fork_context: false` to start the child with only the initial prompt (no parent history); use `fork_context: true` only when full parent history is truly required. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's `message`. OMO installs these selectable agent roles into `~/.codex/agents/`: `explorer`, `librarian`, `plan`, `momus`, `metis`, and `codex-ultrawork-reviewer` — pass the matching name as `agent_type` so the child gets that role's model and instructions. On `multi_agent_v2` sessions the same `agent_type` applies (the OMO installer exposes it) with `fork_turns` instead of `fork_context`. If the spawn tool exposes no `agent_type` parameter, omit it and describe the role inside `message`. If a code block below conflicts with this section, this section wins.
21
21
 
22
- For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A `wait_agent` timeout only means no new mailbox update arrived. Treat a running child or latest `WORKING:` message as alive. Do not use `list_agents` as a polling loop. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running.
22
+ For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A `multi_agent_v1.wait_agent` timeout only means no new mailbox update arrived. Treat a running child as alive. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running.
23
23
 
24
24
  # Visual QA - Dual-Oracle Web and TUI Verification
25
25
 
@@ -18,8 +18,9 @@ test("#given aggregate plugin build script #when inspected #then hook status and
18
18
  // then
19
19
  assert.equal(
20
20
  buildScript,
21
- "node scripts/sync-hook-status-messages.mjs && node scripts/build-bundled-mcp-runtimes.mjs && node scripts/sync-skills.mjs && node ../scripts/sync-telemetry-component.mjs && node scripts/build-components.mjs",
21
+ "node scripts/sync-version.mjs && node scripts/sync-hook-status-messages.mjs && node scripts/build-bundled-mcp-runtimes.mjs && node scripts/sync-skills.mjs && node ../scripts/sync-telemetry-component.mjs && node scripts/build-components.mjs",
22
22
  );
23
+ assert.match(buildScript, /^node scripts\/sync-version\.mjs &&/);
23
24
  assert.equal(testScript, "node --test test/*.test.mjs");
24
25
  assert(packageJson.workspaces.includes("components/ultrawork"));
25
26
  assert.match(telemetrySyncScript, /syncTelemetryComponent/);
@@ -33,7 +33,7 @@ test("#given aggregate MCP config #when inspected #then code MCPs reference pack
33
33
  assert.match(bundledMcpBuildScript, /git-bash-mcp/);
34
34
  assert.doesNotMatch(packageJson.scripts.build, /--workspaces/);
35
35
  assert.equal(lspServer.command, "node");
36
- assert.deepEqual(lspServer.args, ["../../lsp-tools-mcp/dist/cli.js", "mcp"]);
36
+ assert.deepEqual(lspServer.args, ["../../lsp-daemon/dist/cli.js", "mcp"]);
37
37
  assert.equal(lspServer.cwd, ".");
38
38
  assert.equal(astGrepServer.command, "node");
39
39
  assert.deepEqual(astGrepServer.args, ["../../ast-grep-mcp/dist/cli.js", "mcp"]);
@@ -70,14 +70,14 @@ export function findInvalidSpawnAgentRoleParameters(content) {
70
70
  return [...content.matchAll(/spawn_agent\([^)\n]*(?:agent_type|model|reasoning_effort)\s*=/g)].map((match) => match[0]);
71
71
  }
72
72
 
73
- export function findSpawnAgentCallsWithoutForkTurnsNone(content) {
74
- const missingForkTurns = [];
73
+ export function findSpawnAgentCallsWithoutForkContextFalse(content) {
74
+ const missingForkContext = [];
75
75
  const regex = /spawn_agent\(([^)]*)\)/g;
76
76
  for (const match of content.matchAll(regex)) {
77
77
  const call = match[0];
78
- if (!/"fork_turns"\s*:\s*"none"|fork_turns:\s*"none"|fork_turns="none"/.test(call)) {
79
- missingForkTurns.push(call);
78
+ if (!/"fork_context"\s*:\s*false|fork_context:\s*false|fork_context=false/.test(call)) {
79
+ missingForkContext.push(call);
80
80
  }
81
81
  }
82
- return missingForkTurns;
82
+ return missingForkContext;
83
83
  }
@@ -5,7 +5,7 @@ import test from "node:test";
5
5
 
6
6
  import {
7
7
  findInvalidSpawnAgentRoleParameters,
8
- findSpawnAgentCallsWithoutForkTurnsNone,
8
+ findSpawnAgentCallsWithoutForkContextFalse,
9
9
  root,
10
10
  } from "./aggregate-plugin-fixture.mjs";
11
11
 
@@ -27,7 +27,7 @@ test("#given synced skills with Codex compatibility guidance #when spawn_agent i
27
27
  assert.deepEqual(invalidCalls, []);
28
28
  });
29
29
 
30
- test('#given synced skills and bundled rules #when role-specific agents are spawned #then they set fork_turns="none"', async () => {
30
+ test('#given synced skills and bundled rules #when role-specific agents are spawned #then they set fork_context=false', async () => {
31
31
  const skillsDir = join(root, "skills");
32
32
  const skillEntries = await readdir(skillsDir, { withFileTypes: true });
33
33
  const promptFiles = skillEntries
@@ -35,15 +35,15 @@ test('#given synced skills and bundled rules #when role-specific agents are spaw
35
35
  .map((entry) => join(skillsDir, entry.name, "SKILL.md"));
36
36
  promptFiles.push(join(root, "components", "rules", "bundled-rules", "hephaestus.md"));
37
37
 
38
- const missingForkTurns = [];
38
+ const missingForkContext = [];
39
39
  for (const promptPath of promptFiles) {
40
40
  const content = await readFile(promptPath, "utf8");
41
- for (const call of findSpawnAgentCallsWithoutForkTurnsNone(content)) {
42
- missingForkTurns.push(`${basename(dirname(promptPath))}/${basename(promptPath)}: ${call}`);
41
+ for (const call of findSpawnAgentCallsWithoutForkContextFalse(content)) {
42
+ missingForkContext.push(`${basename(dirname(promptPath))}/${basename(promptPath)}: ${call}`);
43
43
  }
44
44
  }
45
45
 
46
- assert.deepEqual(missingForkTurns, []);
46
+ assert.deepEqual(missingForkContext, []);
47
47
  });
48
48
 
49
49
  test("#given long-running orchestration prompts #when waiting on child agents #then parent liveness is surfaced", async () => {