oh-my-codex 0.20.3 → 0.20.5

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 (661) hide show
  1. package/Cargo.lock +35 -18
  2. package/Cargo.toml +1 -1
  3. package/README.md +2 -2
  4. package/crates/omx-runtime/Cargo.toml +3 -0
  5. package/crates/omx-runtime/src/main.rs +390 -0
  6. package/crates/omx-runtime/tests/execution.rs +264 -0
  7. package/dist/adapt/__tests__/herdr-target.test.d.ts +2 -0
  8. package/dist/adapt/__tests__/herdr-target.test.d.ts.map +1 -0
  9. package/dist/adapt/__tests__/herdr-target.test.js +72 -0
  10. package/dist/adapt/__tests__/herdr-target.test.js.map +1 -0
  11. package/dist/adapt/contracts.d.ts +1 -1
  12. package/dist/adapt/contracts.d.ts.map +1 -1
  13. package/dist/adapt/contracts.js +1 -1
  14. package/dist/adapt/contracts.js.map +1 -1
  15. package/dist/adapt/herdr/__tests__/authority.test.d.ts +2 -0
  16. package/dist/adapt/herdr/__tests__/authority.test.d.ts.map +1 -0
  17. package/dist/adapt/herdr/__tests__/authority.test.js +49 -0
  18. package/dist/adapt/herdr/__tests__/authority.test.js.map +1 -0
  19. package/dist/adapt/herdr/__tests__/bridge.test.d.ts +2 -0
  20. package/dist/adapt/herdr/__tests__/bridge.test.d.ts.map +1 -0
  21. package/dist/adapt/herdr/__tests__/bridge.test.js +176 -0
  22. package/dist/adapt/herdr/__tests__/bridge.test.js.map +1 -0
  23. package/dist/adapt/herdr/__tests__/sanitize.test.d.ts +2 -0
  24. package/dist/adapt/herdr/__tests__/sanitize.test.d.ts.map +1 -0
  25. package/dist/adapt/herdr/__tests__/sanitize.test.js +45 -0
  26. package/dist/adapt/herdr/__tests__/sanitize.test.js.map +1 -0
  27. package/dist/adapt/herdr/__tests__/semantic.test.d.ts +2 -0
  28. package/dist/adapt/herdr/__tests__/semantic.test.d.ts.map +1 -0
  29. package/dist/adapt/herdr/__tests__/semantic.test.js +130 -0
  30. package/dist/adapt/herdr/__tests__/semantic.test.js.map +1 -0
  31. package/dist/adapt/herdr/__tests__/seq-store.test.d.ts +2 -0
  32. package/dist/adapt/herdr/__tests__/seq-store.test.d.ts.map +1 -0
  33. package/dist/adapt/herdr/__tests__/seq-store.test.js +54 -0
  34. package/dist/adapt/herdr/__tests__/seq-store.test.js.map +1 -0
  35. package/dist/adapt/herdr/__tests__/socket-live.test.d.ts +2 -0
  36. package/dist/adapt/herdr/__tests__/socket-live.test.d.ts.map +1 -0
  37. package/dist/adapt/herdr/__tests__/socket-live.test.js +104 -0
  38. package/dist/adapt/herdr/__tests__/socket-live.test.js.map +1 -0
  39. package/dist/adapt/herdr/__tests__/team-map.test.d.ts +2 -0
  40. package/dist/adapt/herdr/__tests__/team-map.test.d.ts.map +1 -0
  41. package/dist/adapt/herdr/__tests__/team-map.test.js +46 -0
  42. package/dist/adapt/herdr/__tests__/team-map.test.js.map +1 -0
  43. package/dist/adapt/herdr/__tests__/transport.test.d.ts +2 -0
  44. package/dist/adapt/herdr/__tests__/transport.test.d.ts.map +1 -0
  45. package/dist/adapt/herdr/__tests__/transport.test.js +160 -0
  46. package/dist/adapt/herdr/__tests__/transport.test.js.map +1 -0
  47. package/dist/adapt/herdr/__tests__/wiring.test.d.ts +2 -0
  48. package/dist/adapt/herdr/__tests__/wiring.test.d.ts.map +1 -0
  49. package/dist/adapt/herdr/__tests__/wiring.test.js +118 -0
  50. package/dist/adapt/herdr/__tests__/wiring.test.js.map +1 -0
  51. package/dist/adapt/herdr/authority.d.ts +34 -0
  52. package/dist/adapt/herdr/authority.d.ts.map +1 -0
  53. package/dist/adapt/herdr/authority.js +71 -0
  54. package/dist/adapt/herdr/authority.js.map +1 -0
  55. package/dist/adapt/herdr/bridge.d.ts +84 -0
  56. package/dist/adapt/herdr/bridge.d.ts.map +1 -0
  57. package/dist/adapt/herdr/bridge.js +222 -0
  58. package/dist/adapt/herdr/bridge.js.map +1 -0
  59. package/dist/adapt/herdr/sanitize.d.ts +20 -0
  60. package/dist/adapt/herdr/sanitize.d.ts.map +1 -0
  61. package/dist/adapt/herdr/sanitize.js +70 -0
  62. package/dist/adapt/herdr/sanitize.js.map +1 -0
  63. package/dist/adapt/herdr/semantic.d.ts +67 -0
  64. package/dist/adapt/herdr/semantic.d.ts.map +1 -0
  65. package/dist/adapt/herdr/semantic.js +170 -0
  66. package/dist/adapt/herdr/semantic.js.map +1 -0
  67. package/dist/adapt/herdr/seq-store.d.ts +32 -0
  68. package/dist/adapt/herdr/seq-store.d.ts.map +1 -0
  69. package/dist/adapt/herdr/seq-store.js +126 -0
  70. package/dist/adapt/herdr/seq-store.js.map +1 -0
  71. package/dist/adapt/herdr/team-map.d.ts +30 -0
  72. package/dist/adapt/herdr/team-map.d.ts.map +1 -0
  73. package/dist/adapt/herdr/team-map.js +37 -0
  74. package/dist/adapt/herdr/team-map.js.map +1 -0
  75. package/dist/adapt/herdr/transport.d.ts +115 -0
  76. package/dist/adapt/herdr/transport.d.ts.map +1 -0
  77. package/dist/adapt/herdr/transport.js +260 -0
  78. package/dist/adapt/herdr/transport.js.map +1 -0
  79. package/dist/adapt/herdr/wiring.d.ts +24 -0
  80. package/dist/adapt/herdr/wiring.d.ts.map +1 -0
  81. package/dist/adapt/herdr/wiring.js +62 -0
  82. package/dist/adapt/herdr/wiring.js.map +1 -0
  83. package/dist/adapt/herdr.d.ts +19 -0
  84. package/dist/adapt/herdr.d.ts.map +1 -0
  85. package/dist/adapt/herdr.js +115 -0
  86. package/dist/adapt/herdr.js.map +1 -0
  87. package/dist/adapt/index.d.ts +4 -0
  88. package/dist/adapt/index.d.ts.map +1 -1
  89. package/dist/adapt/index.js +48 -0
  90. package/dist/adapt/index.js.map +1 -1
  91. package/dist/adapt/registry.d.ts.map +1 -1
  92. package/dist/adapt/registry.js +11 -0
  93. package/dist/adapt/registry.js.map +1 -1
  94. package/dist/auth/__tests__/hotswap.test.js +60 -1
  95. package/dist/auth/__tests__/hotswap.test.js.map +1 -1
  96. package/dist/auth/__tests__/storage.test.js +33 -1
  97. package/dist/auth/__tests__/storage.test.js.map +1 -1
  98. package/dist/auth/hotswap.d.ts +16 -2
  99. package/dist/auth/hotswap.d.ts.map +1 -1
  100. package/dist/auth/hotswap.js +22 -7
  101. package/dist/auth/hotswap.js.map +1 -1
  102. package/dist/auth/storage.js +1 -1
  103. package/dist/auth/storage.js.map +1 -1
  104. package/dist/autopilot/__tests__/ralplan-gate.test.js +86 -1333
  105. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
  106. package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
  107. package/dist/autopilot/ralplan-gate.js +7 -6
  108. package/dist/autopilot/ralplan-gate.js.map +1 -1
  109. package/dist/cli/__tests__/agents-init.test.js +4 -23
  110. package/dist/cli/__tests__/agents-init.test.js.map +1 -1
  111. package/dist/cli/__tests__/api.test.js +61 -24
  112. package/dist/cli/__tests__/api.test.js.map +1 -1
  113. package/dist/cli/__tests__/auth.test.js +3 -1
  114. package/dist/cli/__tests__/auth.test.js.map +1 -1
  115. package/dist/cli/__tests__/codex-feature-probe.test.js +66 -1
  116. package/dist/cli/__tests__/codex-feature-probe.test.js.map +1 -1
  117. package/dist/cli/__tests__/codex-plugin-layout.test.js +70 -2
  118. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  119. package/dist/cli/__tests__/detached-leader-teardown.test.d.ts +2 -0
  120. package/dist/cli/__tests__/detached-leader-teardown.test.d.ts.map +1 -0
  121. package/dist/cli/__tests__/detached-leader-teardown.test.js +473 -0
  122. package/dist/cli/__tests__/detached-leader-teardown.test.js.map +1 -0
  123. package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts +2 -0
  124. package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts.map +1 -0
  125. package/dist/cli/__tests__/doctor-process-identity-readiness.test.js +103 -0
  126. package/dist/cli/__tests__/doctor-process-identity-readiness.test.js.map +1 -0
  127. package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts +2 -0
  128. package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts.map +1 -0
  129. package/dist/cli/__tests__/doctor-state-root-binding.test.js +139 -0
  130. package/dist/cli/__tests__/doctor-state-root-binding.test.js.map +1 -0
  131. package/dist/cli/__tests__/doctor-warning-copy.test.js +35 -3
  132. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  133. package/dist/cli/__tests__/exec.test.js +75 -0
  134. package/dist/cli/__tests__/exec.test.js.map +1 -1
  135. package/dist/cli/__tests__/index.test.js +621 -460
  136. package/dist/cli/__tests__/index.test.js.map +1 -1
  137. package/dist/cli/__tests__/launch-fallback.test.js +1020 -143
  138. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  139. package/dist/cli/__tests__/mcp-parity.test.js +4 -3
  140. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  141. package/dist/cli/__tests__/native-assets.test.js +398 -16
  142. package/dist/cli/__tests__/native-assets.test.js.map +1 -1
  143. package/dist/cli/__tests__/native-hook-claim-journal.test.js +53 -5
  144. package/dist/cli/__tests__/native-hook-claim-journal.test.js.map +1 -1
  145. package/dist/cli/__tests__/ralph.test.js +2 -2
  146. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  147. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js +57 -57
  148. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js.map +1 -1
  149. package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts +2 -0
  150. package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts.map +1 -0
  151. package/dist/cli/__tests__/ralplan-child-binding-3212.test.js +56 -0
  152. package/dist/cli/__tests__/ralplan-child-binding-3212.test.js.map +1 -0
  153. package/dist/cli/__tests__/ralplan.test.js +84 -12
  154. package/dist/cli/__tests__/ralplan.test.js.map +1 -1
  155. package/dist/cli/__tests__/session-scoped-runtime.test.js +1118 -43
  156. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  157. package/dist/cli/__tests__/setup-agents-overwrite.test.js +8 -55
  158. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  159. package/dist/cli/__tests__/setup-install-mode.test.js +183 -4
  160. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  161. package/dist/cli/__tests__/sparkshell-cli.test.js +93 -41
  162. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
  163. package/dist/cli/__tests__/team.test.js +45 -1
  164. package/dist/cli/__tests__/team.test.js.map +1 -1
  165. package/dist/cli/__tests__/ultragoal.test.js +117 -2
  166. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  167. package/dist/cli/__tests__/uninstall.test.js +50 -5
  168. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  169. package/dist/cli/__tests__/update.test.js +669 -177
  170. package/dist/cli/__tests__/update.test.js.map +1 -1
  171. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +32 -2
  172. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
  173. package/dist/cli/api.d.ts.map +1 -1
  174. package/dist/cli/api.js +9 -10
  175. package/dist/cli/api.js.map +1 -1
  176. package/dist/cli/codex-feature-probe.d.ts +16 -0
  177. package/dist/cli/codex-feature-probe.d.ts.map +1 -1
  178. package/dist/cli/codex-feature-probe.js +44 -0
  179. package/dist/cli/codex-feature-probe.js.map +1 -1
  180. package/dist/cli/codex-home.d.ts.map +1 -1
  181. package/dist/cli/codex-home.js +7 -4
  182. package/dist/cli/codex-home.js.map +1 -1
  183. package/dist/cli/doctor.d.ts +17 -0
  184. package/dist/cli/doctor.d.ts.map +1 -1
  185. package/dist/cli/doctor.js +277 -3
  186. package/dist/cli/doctor.js.map +1 -1
  187. package/dist/cli/index.d.ts +231 -12
  188. package/dist/cli/index.d.ts.map +1 -1
  189. package/dist/cli/index.js +2298 -735
  190. package/dist/cli/index.js.map +1 -1
  191. package/dist/cli/native-assets.d.ts +25 -0
  192. package/dist/cli/native-assets.d.ts.map +1 -1
  193. package/dist/cli/native-assets.js +448 -51
  194. package/dist/cli/native-assets.js.map +1 -1
  195. package/dist/cli/native-hook-claim-journal.d.ts +8 -4
  196. package/dist/cli/native-hook-claim-journal.d.ts.map +1 -1
  197. package/dist/cli/native-hook-claim-journal.js +30 -8
  198. package/dist/cli/native-hook-claim-journal.js.map +1 -1
  199. package/dist/cli/package-manager-ownership.d.ts +63 -0
  200. package/dist/cli/package-manager-ownership.d.ts.map +1 -0
  201. package/dist/cli/package-manager-ownership.js +323 -0
  202. package/dist/cli/package-manager-ownership.js.map +1 -0
  203. package/dist/cli/ralph.js +2 -2
  204. package/dist/cli/ralph.js.map +1 -1
  205. package/dist/cli/ralplan.d.ts +4 -2
  206. package/dist/cli/ralplan.d.ts.map +1 -1
  207. package/dist/cli/ralplan.js +76 -34
  208. package/dist/cli/ralplan.js.map +1 -1
  209. package/dist/cli/setup-preferences.d.ts +15 -0
  210. package/dist/cli/setup-preferences.d.ts.map +1 -1
  211. package/dist/cli/setup-preferences.js +27 -1
  212. package/dist/cli/setup-preferences.js.map +1 -1
  213. package/dist/cli/setup.d.ts +3 -0
  214. package/dist/cli/setup.d.ts.map +1 -1
  215. package/dist/cli/setup.js +55 -32
  216. package/dist/cli/setup.js.map +1 -1
  217. package/dist/cli/sparkshell.d.ts.map +1 -1
  218. package/dist/cli/sparkshell.js +52 -9
  219. package/dist/cli/sparkshell.js.map +1 -1
  220. package/dist/cli/ultragoal.d.ts.map +1 -1
  221. package/dist/cli/ultragoal.js +2 -2
  222. package/dist/cli/ultragoal.js.map +1 -1
  223. package/dist/cli/uninstall.d.ts.map +1 -1
  224. package/dist/cli/uninstall.js +27 -28
  225. package/dist/cli/uninstall.js.map +1 -1
  226. package/dist/cli/update-worker.d.ts +2 -0
  227. package/dist/cli/update-worker.d.ts.map +1 -0
  228. package/dist/cli/update-worker.js +142 -0
  229. package/dist/cli/update-worker.js.map +1 -0
  230. package/dist/cli/update.d.ts +14 -22
  231. package/dist/cli/update.d.ts.map +1 -1
  232. package/dist/cli/update.js +192 -241
  233. package/dist/cli/update.js.map +1 -1
  234. package/dist/config/__tests__/generator-idempotent.test.js +173 -29
  235. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  236. package/dist/config/__tests__/generator-notify.test.js +3 -1
  237. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  238. package/dist/config/generator.d.ts +25 -3
  239. package/dist/config/generator.d.ts.map +1 -1
  240. package/dist/config/generator.js +113 -35
  241. package/dist/config/generator.js.map +1 -1
  242. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +25 -0
  243. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
  244. package/dist/goal-workflows/codex-goal-snapshot.d.ts +1 -1
  245. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  246. package/dist/goal-workflows/codex-goal-snapshot.js +2 -0
  247. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  248. package/dist/hooks/__tests__/agents-overlay.test.js +3 -1
  249. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  250. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +27 -4
  251. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  252. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts +2 -0
  253. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts.map +1 -0
  254. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js +172 -0
  255. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js.map +1 -0
  256. package/dist/hooks/__tests__/keyword-detector.test.js +172 -33
  257. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  258. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +173 -11
  259. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  260. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +1 -0
  261. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  262. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +65 -17
  263. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  264. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +27 -0
  265. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
  266. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +10 -118
  267. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
  268. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +7 -0
  269. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  270. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +2 -2
  271. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  272. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +4 -1
  273. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  274. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +2 -1
  275. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -1
  276. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +1 -0
  277. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  278. package/dist/hooks/__tests__/prompt-guidance-contract.test.js +9 -0
  279. package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -1
  280. package/dist/hooks/__tests__/session.test.js +2976 -557
  281. package/dist/hooks/__tests__/session.test.js.map +1 -1
  282. package/dist/hooks/agents-overlay.js +1 -1
  283. package/dist/hooks/agents-overlay.js.map +1 -1
  284. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +108 -2
  285. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
  286. package/dist/hooks/extensibility/__tests__/sdk.test.js +151 -1
  287. package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -1
  288. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  289. package/dist/hooks/extensibility/dispatcher.js +20 -3
  290. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  291. package/dist/hooks/extensibility/plugin-runner.js +1 -0
  292. package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
  293. package/dist/hooks/extensibility/runtime.d.ts.map +1 -1
  294. package/dist/hooks/extensibility/runtime.js.map +1 -1
  295. package/dist/hooks/extensibility/sdk/paths.d.ts +1 -1
  296. package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
  297. package/dist/hooks/extensibility/sdk/paths.js +2 -2
  298. package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
  299. package/dist/hooks/extensibility/sdk/runtime-state.d.ts +1 -1
  300. package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -1
  301. package/dist/hooks/extensibility/sdk/runtime-state.js +55 -15
  302. package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -1
  303. package/dist/hooks/extensibility/sdk.d.ts +1 -0
  304. package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
  305. package/dist/hooks/extensibility/sdk.js +1 -1
  306. package/dist/hooks/extensibility/sdk.js.map +1 -1
  307. package/dist/hooks/extensibility/types.d.ts +7 -0
  308. package/dist/hooks/extensibility/types.d.ts.map +1 -1
  309. package/dist/hooks/keyword-detector.d.ts +10 -3
  310. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  311. package/dist/hooks/keyword-detector.js +116 -20
  312. package/dist/hooks/keyword-detector.js.map +1 -1
  313. package/dist/hooks/session.d.ts +180 -14
  314. package/dist/hooks/session.d.ts.map +1 -1
  315. package/dist/hooks/session.js +1402 -281
  316. package/dist/hooks/session.js.map +1 -1
  317. package/dist/hud/__tests__/hud-tmux-injection.test.js +6 -6
  318. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  319. package/dist/hud/__tests__/index.test.js +26 -16
  320. package/dist/hud/__tests__/index.test.js.map +1 -1
  321. package/dist/hud/__tests__/reconcile.test.js +83 -78
  322. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  323. package/dist/hud/__tests__/state.test.js +36 -31
  324. package/dist/hud/__tests__/state.test.js.map +1 -1
  325. package/dist/hud/__tests__/tmux.test.js +155 -198
  326. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  327. package/dist/hud/tmux.d.ts +42 -4
  328. package/dist/hud/tmux.d.ts.map +1 -1
  329. package/dist/hud/tmux.js +1017 -139
  330. package/dist/hud/tmux.js.map +1 -1
  331. package/dist/leader/__tests__/contract.test.js +71 -34
  332. package/dist/leader/__tests__/contract.test.js.map +1 -1
  333. package/dist/leader/contract.d.ts +1 -6
  334. package/dist/leader/contract.d.ts.map +1 -1
  335. package/dist/leader/contract.js +25 -24
  336. package/dist/leader/contract.js.map +1 -1
  337. package/dist/mcp/__tests__/hermes-bridge.test.js +17 -0
  338. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
  339. package/dist/mcp/__tests__/server-lifecycle.test.js +4 -4
  340. package/dist/mcp/__tests__/state-paths.test.js +735 -4
  341. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  342. package/dist/mcp/__tests__/state-server.test.js +1 -1
  343. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  344. package/dist/mcp/__tests__/trace-server.test.js +2 -2
  345. package/dist/mcp/__tests__/trace-server.test.js.map +1 -1
  346. package/dist/mcp/hermes-bridge.d.ts.map +1 -1
  347. package/dist/mcp/hermes-bridge.js +2 -2
  348. package/dist/mcp/hermes-bridge.js.map +1 -1
  349. package/dist/mcp/state-paths.d.ts +78 -4
  350. package/dist/mcp/state-paths.d.ts.map +1 -1
  351. package/dist/mcp/state-paths.js +543 -40
  352. package/dist/mcp/state-paths.js.map +1 -1
  353. package/dist/mcp/state-server.d.ts +4 -4
  354. package/dist/mcp/state-server.d.ts.map +1 -1
  355. package/dist/modes/__tests__/base-autopilot-gates.test.js +36 -7
  356. package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -1
  357. package/dist/modes/__tests__/base-multi-state-compat.test.js +1 -1
  358. package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -1
  359. package/dist/modes/__tests__/base-session-scope.test.js +17 -8
  360. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  361. package/dist/modes/base.d.ts +5 -5
  362. package/dist/modes/base.d.ts.map +1 -1
  363. package/dist/modes/base.js +76 -21
  364. package/dist/modes/base.js.map +1 -1
  365. package/dist/native-assets/archive.d.ts +17 -0
  366. package/dist/native-assets/archive.d.ts.map +1 -0
  367. package/dist/native-assets/archive.js +238 -0
  368. package/dist/native-assets/archive.js.map +1 -0
  369. package/dist/native-assets/policy.d.ts +42 -0
  370. package/dist/native-assets/policy.d.ts.map +1 -0
  371. package/dist/native-assets/policy.js +155 -0
  372. package/dist/native-assets/policy.js.map +1 -0
  373. package/dist/pipeline/__tests__/orchestrator.test.js +162 -40
  374. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  375. package/dist/pipeline/__tests__/stages.test.js +66 -149
  376. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  377. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  378. package/dist/pipeline/orchestrator.js +124 -18
  379. package/dist/pipeline/orchestrator.js.map +1 -1
  380. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  381. package/dist/pipeline/stages/ralplan.js +36 -8
  382. package/dist/pipeline/stages/ralplan.js.map +1 -1
  383. package/dist/ralplan/__tests__/consensus-gate.test.js +70 -1437
  384. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  385. package/dist/ralplan/__tests__/documented-leader-preflight.test.js +328 -39
  386. package/dist/ralplan/__tests__/documented-leader-preflight.test.js.map +1 -1
  387. package/dist/ralplan/__tests__/runtime.test.js +82 -102
  388. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  389. package/dist/ralplan/consensus-gate.d.ts +9 -1
  390. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  391. package/dist/ralplan/consensus-gate.js +40 -304
  392. package/dist/ralplan/consensus-gate.js.map +1 -1
  393. package/dist/ralplan/documented-leader-preflight.d.ts +15 -8
  394. package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -1
  395. package/dist/ralplan/documented-leader-preflight.js +356 -54
  396. package/dist/ralplan/documented-leader-preflight.js.map +1 -1
  397. package/dist/ralplan/runtime.d.ts +1 -1
  398. package/dist/ralplan/runtime.d.ts.map +1 -1
  399. package/dist/ralplan/runtime.js +68 -173
  400. package/dist/ralplan/runtime.js.map +1 -1
  401. package/dist/runtime/run-state.d.ts +5 -1
  402. package/dist/runtime/run-state.d.ts.map +1 -1
  403. package/dist/runtime/run-state.js +15 -8
  404. package/dist/runtime/run-state.js.map +1 -1
  405. package/dist/scripts/__tests__/codex-native-hook.test.js +14071 -8859
  406. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  407. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts +2 -0
  408. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts.map +1 -0
  409. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js +225 -0
  410. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js.map +1 -0
  411. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts +2 -0
  412. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts.map +1 -0
  413. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js +188 -0
  414. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js.map +1 -0
  415. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts +2 -0
  416. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts.map +1 -0
  417. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js +259 -0
  418. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js.map +1 -0
  419. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts +2 -0
  420. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts.map +1 -0
  421. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js +491 -0
  422. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js.map +1 -0
  423. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts +2 -0
  424. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts.map +1 -0
  425. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js +708 -0
  426. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js.map +1 -0
  427. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts +2 -0
  428. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts.map +1 -0
  429. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js +208 -0
  430. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js.map +1 -0
  431. package/dist/scripts/__tests__/notify-state-io.test.js +26 -0
  432. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
  433. package/dist/scripts/__tests__/notify-tmux-injection.test.js +23 -1
  434. package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -1
  435. package/dist/scripts/__tests__/postinstall.test.js +19 -1
  436. package/dist/scripts/__tests__/postinstall.test.js.map +1 -1
  437. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js +25 -8
  438. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js.map +1 -1
  439. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js +60 -25
  440. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js.map +1 -1
  441. package/dist/scripts/__tests__/smoke-packed-install.test.js +155 -16
  442. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
  443. package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts +2 -0
  444. package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts.map +1 -0
  445. package/dist/scripts/__tests__/verify-native-release-assets.test.js +235 -0
  446. package/dist/scripts/__tests__/verify-native-release-assets.test.js.map +1 -0
  447. package/dist/scripts/codex-native-hook.d.ts +50 -1
  448. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  449. package/dist/scripts/codex-native-hook.js +3559 -451
  450. package/dist/scripts/codex-native-hook.js.map +1 -1
  451. package/dist/scripts/codex-native-pre-post.d.ts +9 -0
  452. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  453. package/dist/scripts/codex-native-pre-post.js +35 -12
  454. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  455. package/dist/scripts/generate-native-release-manifest.js +80 -51
  456. package/dist/scripts/generate-native-release-manifest.js.map +1 -1
  457. package/dist/scripts/notify-fallback-watcher.js +28 -39
  458. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  459. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  460. package/dist/scripts/notify-hook/state-io.js +5 -0
  461. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  462. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  463. package/dist/scripts/notify-hook/team-leader-nudge.js +32 -3
  464. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  465. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
  466. package/dist/scripts/notify-hook/team-worker-stop.js +23 -3
  467. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  468. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
  469. package/dist/scripts/notify-hook/team-worker.js +45 -5
  470. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  471. package/dist/scripts/notify-hook/tmux-injection.d.ts +1 -0
  472. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  473. package/dist/scripts/notify-hook/tmux-injection.js +4 -1
  474. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  475. package/dist/scripts/notify-hook.js +78 -82
  476. package/dist/scripts/notify-hook.js.map +1 -1
  477. package/dist/scripts/postinstall-advisory.d.ts +14 -0
  478. package/dist/scripts/postinstall-advisory.d.ts.map +1 -0
  479. package/dist/scripts/postinstall-advisory.js +49 -0
  480. package/dist/scripts/postinstall-advisory.js.map +1 -0
  481. package/dist/scripts/postinstall.d.ts +1 -1
  482. package/dist/scripts/postinstall.d.ts.map +1 -1
  483. package/dist/scripts/postinstall.js +1 -1
  484. package/dist/scripts/postinstall.js.map +1 -1
  485. package/dist/scripts/smoke-packed-install.d.ts +32 -1
  486. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  487. package/dist/scripts/smoke-packed-install.js +413 -60
  488. package/dist/scripts/smoke-packed-install.js.map +1 -1
  489. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  490. package/dist/scripts/sync-plugin-mirror.js +16 -1
  491. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  492. package/dist/scripts/verify-native-release-assets.js +37 -23
  493. package/dist/scripts/verify-native-release-assets.js.map +1 -1
  494. package/dist/state/__tests__/mode-state-context.test.js +12 -5
  495. package/dist/state/__tests__/mode-state-context.test.js.map +1 -1
  496. package/dist/state/__tests__/operations.test.js +460 -850
  497. package/dist/state/__tests__/operations.test.js.map +1 -1
  498. package/dist/state/__tests__/skill-active.test.js +400 -2
  499. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  500. package/dist/state/mode-state-context.d.ts +3 -0
  501. package/dist/state/mode-state-context.d.ts.map +1 -1
  502. package/dist/state/mode-state-context.js +27 -13
  503. package/dist/state/mode-state-context.js.map +1 -1
  504. package/dist/state/operations.d.ts +3 -0
  505. package/dist/state/operations.d.ts.map +1 -1
  506. package/dist/state/operations.js +144 -40
  507. package/dist/state/operations.js.map +1 -1
  508. package/dist/state/skill-active.d.ts +18 -1
  509. package/dist/state/skill-active.d.ts.map +1 -1
  510. package/dist/state/skill-active.js +420 -23
  511. package/dist/state/skill-active.js.map +1 -1
  512. package/dist/state/workflow-transition-reconcile.d.ts +3 -0
  513. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  514. package/dist/state/workflow-transition-reconcile.js +10 -4
  515. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  516. package/dist/state/workflow-transition.d.ts.map +1 -1
  517. package/dist/state/workflow-transition.js +3 -1
  518. package/dist/state/workflow-transition.js.map +1 -1
  519. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js +27 -0
  520. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js.map +1 -1
  521. package/dist/subagents/__tests__/tracker.test.js +837 -1048
  522. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  523. package/dist/subagents/tracker.d.ts +64 -60
  524. package/dist/subagents/tracker.d.ts.map +1 -1
  525. package/dist/subagents/tracker.js +809 -358
  526. package/dist/subagents/tracker.js.map +1 -1
  527. package/dist/team/__tests__/delivery-e2e-smoke.test.js +6 -7
  528. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
  529. package/dist/team/__tests__/mcp-comm.test.js +104 -3
  530. package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
  531. package/dist/team/__tests__/notice-ledger.test.d.ts +2 -0
  532. package/dist/team/__tests__/notice-ledger.test.d.ts.map +1 -0
  533. package/dist/team/__tests__/notice-ledger.test.js +131 -0
  534. package/dist/team/__tests__/notice-ledger.test.js.map +1 -0
  535. package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts +2 -0
  536. package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts.map +1 -0
  537. package/dist/team/__tests__/pane-teardown-residue-e2e.test.js +410 -0
  538. package/dist/team/__tests__/pane-teardown-residue-e2e.test.js.map +1 -0
  539. package/dist/team/__tests__/phase-controller.test.js +20 -0
  540. package/dist/team/__tests__/phase-controller.test.js.map +1 -1
  541. package/dist/team/__tests__/runtime.test.js +725 -59
  542. package/dist/team/__tests__/runtime.test.js.map +1 -1
  543. package/dist/team/__tests__/scaling.test.js +222 -237
  544. package/dist/team/__tests__/scaling.test.js.map +1 -1
  545. package/dist/team/__tests__/state-root.test.js +117 -2
  546. package/dist/team/__tests__/state-root.test.js.map +1 -1
  547. package/dist/team/__tests__/tmux-session.test.js +887 -92
  548. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  549. package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts +2 -0
  550. package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts.map +1 -0
  551. package/dist/team/__tests__/tmux-source-authority-realtmux.test.js +149 -0
  552. package/dist/team/__tests__/tmux-source-authority-realtmux.test.js.map +1 -0
  553. package/dist/team/__tests__/tmux-test-fixture.d.ts +69 -0
  554. package/dist/team/__tests__/tmux-test-fixture.d.ts.map +1 -1
  555. package/dist/team/__tests__/tmux-test-fixture.js +242 -15
  556. package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
  557. package/dist/team/__tests__/tmux-test-fixture.test.js +177 -1
  558. package/dist/team/__tests__/tmux-test-fixture.test.js.map +1 -1
  559. package/dist/team/__tests__/worker-runtime-identity.test.js +45 -72
  560. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  561. package/dist/team/notice-ledger.d.ts +54 -0
  562. package/dist/team/notice-ledger.d.ts.map +1 -0
  563. package/dist/team/notice-ledger.js +259 -0
  564. package/dist/team/notice-ledger.js.map +1 -0
  565. package/dist/team/phase-controller.d.ts.map +1 -1
  566. package/dist/team/phase-controller.js +2 -0
  567. package/dist/team/phase-controller.js.map +1 -1
  568. package/dist/team/runtime.d.ts +3 -1
  569. package/dist/team/runtime.d.ts.map +1 -1
  570. package/dist/team/runtime.js +314 -142
  571. package/dist/team/runtime.js.map +1 -1
  572. package/dist/team/scaling.d.ts.map +1 -1
  573. package/dist/team/scaling.js +161 -91
  574. package/dist/team/scaling.js.map +1 -1
  575. package/dist/team/state/monitor.d.ts +10 -0
  576. package/dist/team/state/monitor.d.ts.map +1 -1
  577. package/dist/team/state/monitor.js +13 -0
  578. package/dist/team/state/monitor.js.map +1 -1
  579. package/dist/team/state/types.d.ts +15 -0
  580. package/dist/team/state/types.d.ts.map +1 -1
  581. package/dist/team/state/types.js.map +1 -1
  582. package/dist/team/state-root.d.ts +12 -0
  583. package/dist/team/state-root.d.ts.map +1 -1
  584. package/dist/team/state-root.js +177 -0
  585. package/dist/team/state-root.js.map +1 -1
  586. package/dist/team/state.d.ts +18 -0
  587. package/dist/team/state.d.ts.map +1 -1
  588. package/dist/team/state.js +36 -0
  589. package/dist/team/state.js.map +1 -1
  590. package/dist/team/tmux-session.d.ts +40 -4
  591. package/dist/team/tmux-session.d.ts.map +1 -1
  592. package/dist/team/tmux-session.js +513 -166
  593. package/dist/team/tmux-session.js.map +1 -1
  594. package/dist/ultragoal/__tests__/artifacts.test.js +950 -2
  595. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  596. package/dist/ultragoal/__tests__/docs-contract.test.js +1 -0
  597. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  598. package/dist/ultragoal/artifacts.d.ts +35 -1
  599. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  600. package/dist/ultragoal/artifacts.js +232 -46
  601. package/dist/ultragoal/artifacts.js.map +1 -1
  602. package/dist/utils/__tests__/file-durability.test.js +58 -1
  603. package/dist/utils/__tests__/file-durability.test.js.map +1 -1
  604. package/dist/utils/__tests__/paths.test.js +21 -1
  605. package/dist/utils/__tests__/paths.test.js.map +1 -1
  606. package/dist/utils/file-durability.d.ts +10 -0
  607. package/dist/utils/file-durability.d.ts.map +1 -1
  608. package/dist/utils/file-durability.js +34 -4
  609. package/dist/utils/file-durability.js.map +1 -1
  610. package/dist/utils/paths.d.ts.map +1 -1
  611. package/dist/utils/paths.js +14 -6
  612. package/dist/utils/paths.js.map +1 -1
  613. package/dist/verification/__tests__/ci-rust-gates.test.js +49 -4
  614. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  615. package/dist/verification/__tests__/explore-harness-release-workflow.test.js +60 -0
  616. package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
  617. package/dist/verification/__tests__/native-release-manifest.test.js +157 -4
  618. package/dist/verification/__tests__/native-release-manifest.test.js.map +1 -1
  619. package/package.json +13 -5
  620. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  621. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +81 -17
  622. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +13 -5
  623. package/plugins/oh-my-codex/skills/cancel/SKILL.md +30 -85
  624. package/plugins/oh-my-codex/skills/ralph/SKILL.md +5 -5
  625. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +15 -17
  626. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +3 -2
  627. package/skills/autopilot/SKILL.md +13 -5
  628. package/skills/cancel/SKILL.md +30 -85
  629. package/skills/ralph/SKILL.md +5 -5
  630. package/skills/ralplan/SKILL.md +15 -17
  631. package/skills/ultragoal/SKILL.md +3 -2
  632. package/src/scripts/__tests__/codex-native-hook.test.ts +6091 -540
  633. package/src/scripts/__tests__/issue-3293-callsite-parity.test.ts +187 -0
  634. package/src/scripts/__tests__/issue-3293-cancel-transaction.test.ts +189 -0
  635. package/src/scripts/__tests__/issue-3293-hook-owned-cancel.test.ts +187 -0
  636. package/src/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.ts +591 -0
  637. package/src/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.ts +701 -0
  638. package/src/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.ts +211 -0
  639. package/src/scripts/__tests__/notify-state-io.test.ts +29 -0
  640. package/src/scripts/__tests__/notify-tmux-injection.test.ts +26 -1
  641. package/src/scripts/__tests__/postinstall.test.ts +23 -1
  642. package/src/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.ts +27 -8
  643. package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +61 -27
  644. package/src/scripts/__tests__/smoke-packed-install.test.ts +209 -18
  645. package/src/scripts/__tests__/verify-native-release-assets.test.ts +240 -0
  646. package/src/scripts/codex-native-hook.ts +3638 -475
  647. package/src/scripts/codex-native-pre-post.ts +43 -12
  648. package/src/scripts/generate-native-release-manifest.ts +83 -79
  649. package/src/scripts/notify-fallback-watcher.ts +38 -38
  650. package/src/scripts/notify-hook/state-io.ts +11 -0
  651. package/src/scripts/notify-hook/team-leader-nudge.ts +32 -4
  652. package/src/scripts/notify-hook/team-worker-stop.ts +23 -4
  653. package/src/scripts/notify-hook/team-worker.ts +43 -5
  654. package/src/scripts/notify-hook/tmux-injection.ts +5 -1
  655. package/src/scripts/notify-hook.ts +83 -82
  656. package/src/scripts/postinstall-advisory.ts +67 -0
  657. package/src/scripts/postinstall.ts +1 -1
  658. package/src/scripts/smoke-packed-install.ts +446 -59
  659. package/src/scripts/sync-plugin-mirror.ts +17 -1
  660. package/src/scripts/verify-native-release-assets.ts +39 -31
  661. package/templates/AGENTS.md +1 -0
@@ -1,1455 +1,88 @@
1
+ import { describe, it } from 'node:test';
1
2
  import assert from 'node:assert/strict';
2
- import { describe, it, mock } from 'node:test';
3
- import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
- import fs from 'node:fs';
5
- import { syncBuiltinESMExports } from 'node:module';
6
- import { join } from 'node:path';
7
- import { tmpdir } from 'node:os';
8
- import { getBaseStateDir } from '../../state/paths.js';
9
- import { writeRoleRoutingMarker } from '../../subagents/role-routing-marker.js';
10
- import { subagentTrackingPath } from '../../subagents/tracker.js';
11
- import { buildRalplanConsensusGateForCwd, buildRalplanConsensusGateFromSources } from '../consensus-gate.js';
12
- function trackerBackedConsensus(sessionId, provenanceKind, overrides = {}) {
3
+ import { buildRalplanConsensusGateFromSources } from '../consensus-gate.js';
4
+ const nativeLifecycleReviews = {
5
+ ralplan_consensus_gate: {
6
+ complete: true,
7
+ sequence: ['architect-review', 'critic-review'],
8
+ ralplan_architect_review: {
9
+ agent_role: 'architect',
10
+ verdict: 'approve',
11
+ provenance_kind: 'native_subagent',
12
+ thread_id: 'architect-thread',
13
+ sequence_index: 1,
14
+ },
15
+ ralplan_critic_review: {
16
+ agent_role: 'critic',
17
+ verdict: 'approve',
18
+ provenance_kind: 'native_subagent',
19
+ thread_id: 'critic-thread',
20
+ sequence_index: 2,
21
+ },
22
+ },
23
+ };
24
+ function withReviews(architect, critic) {
13
25
  return {
14
26
  ralplan_consensus_gate: {
15
27
  complete: true,
16
28
  sequence: ['architect-review', 'critic-review'],
17
- ralplan_architect_review: {
18
- agent_role: 'architect',
19
- provenance_kind: provenanceKind,
20
- verdict: 'approve',
21
- session_id: sessionId,
22
- thread_id: 'thread-architect',
23
- tracker_path: '.omx/state/subagent-tracking.json',
24
- completed_at: '2026-07-13T10:00:00.000Z',
25
- ...overrides.architect,
26
- },
27
- ralplan_critic_review: {
28
- agent_role: 'critic',
29
- provenance_kind: provenanceKind,
30
- verdict: 'approve',
31
- session_id: sessionId,
32
- thread_id: 'thread-critic',
33
- tracker_path: '.omx/state/subagent-tracking.json',
34
- completed_at: '2026-07-13T10:05:00.000Z',
35
- ...overrides.critic,
36
- },
29
+ ralplan_architect_review: architect,
30
+ ralplan_critic_review: critic,
37
31
  },
38
32
  };
39
33
  }
40
- function adaptedConsensus(sessionId, overrides = {}) {
41
- return trackerBackedConsensus(sessionId, 'omx_adapted', overrides);
42
- }
43
- function nativeConsensus(sessionId, overrides = {}) {
44
- return trackerBackedConsensus(sessionId, 'native_subagent', overrides);
45
- }
46
- async function writeTrackerBackedSubagentTracking(cwd, sessionId, provenanceKind, options = {}) {
47
- const trackingPath = subagentTrackingPath(cwd);
48
- const architectCompletedAt = options.architectCompletedAt ?? '2026-07-13T10:00:00.000Z';
49
- const criticFirstSeenAt = options.criticFirstSeenAt === undefined
50
- ? '2026-07-13T10:05:00.000Z'
51
- : options.criticFirstSeenAt;
52
- const criticCompletedAt = options.criticCompletedAt ?? '2026-07-13T10:10:00.000Z';
53
- await mkdir(join(trackingPath, '..'), { recursive: true });
54
- await writeFile(trackingPath, JSON.stringify({
55
- schemaVersion: 1,
56
- sessions: {
57
- [sessionId]: {
58
- session_id: sessionId,
59
- leader_thread_id: 'thread-leader',
60
- updated_at: architectCompletedAt,
61
- threads: {
62
- 'thread-leader': {
63
- thread_id: 'thread-leader',
64
- kind: 'leader',
65
- first_seen_at: architectCompletedAt,
66
- last_seen_at: architectCompletedAt,
67
- turn_count: 1,
68
- },
69
- 'thread-architect': {
70
- thread_id: 'thread-architect',
71
- kind: 'subagent',
72
- first_seen_at: architectCompletedAt,
73
- last_seen_at: architectCompletedAt,
74
- completed_at: architectCompletedAt,
75
- turn_count: 1,
76
- role: options.architectRole ?? 'architect',
77
- provenance_kind: provenanceKind,
78
- },
79
- 'thread-critic': {
80
- thread_id: 'thread-critic',
81
- kind: 'subagent',
82
- ...(criticFirstSeenAt === null ? {} : { first_seen_at: criticFirstSeenAt }),
83
- last_seen_at: criticCompletedAt,
84
- completed_at: criticCompletedAt,
85
- turn_count: 1,
86
- role: options.criticRole ?? 'critic',
87
- provenance_kind: provenanceKind,
88
- },
89
- },
90
- },
91
- },
92
- pending_role_intents: [],
93
- }, null, 2));
94
- if (provenanceKind !== 'omx_adapted' || options.writeRoleRoutingMarker === false)
95
- return;
96
- writeRoleRoutingMarker(getBaseStateDir(cwd), {
97
- schema_version: 1,
98
- cwd,
99
- session_id: sessionId,
100
- parent_thread_id: 'thread-leader',
101
- observed_at: architectCompletedAt,
102
- expires_at: new Date(Date.now() + 60_000).toISOString(),
103
- evidence: 'OMX adapted role intent consumed for native child SessionStart',
104
- });
105
- }
106
- async function writeAdaptedSubagentTracking(cwd, sessionId, options = {}) {
107
- await writeTrackerBackedSubagentTracking(cwd, sessionId, 'omx_adapted', options);
108
- }
109
- async function writeNativeSubagentTracking(cwd, sessionId, options = {}) {
110
- await writeTrackerBackedSubagentTracking(cwd, sessionId, 'native_subagent', options);
111
- }
112
- describe('ralplan consensus gate state roots', () => {
113
- it('rejects invalid complete consensus even when it appears after a valid source', () => {
114
- const validConsensus = {
115
- ralplan_consensus_gate: {
116
- complete: true,
117
- sequence: ['architect-review', 'critic-review'],
118
- ralplan_architect_review: {
119
- agent_role: 'architect',
120
- verdict: 'approve',
121
- completed_at: '2026-06-12T10:00:00.000Z',
122
- },
123
- ralplan_critic_review: {
124
- agent_role: 'critic',
125
- verdict: 'approve',
126
- completed_at: '2026-06-12T10:05:00.000Z',
127
- },
128
- },
129
- };
130
- const invalidConsensus = {
131
- ralplan_consensus_gate: {
132
- complete: true,
133
- sequence: ['architect-review', 'critic-review'],
134
- ralplan_architect_review: {
135
- agent_role: 'architect',
136
- verdict: 'iterate',
137
- completed_at: '2026-06-12T10:10:00.000Z',
138
- },
139
- ralplan_critic_review: {
140
- agent_role: 'critic',
141
- verdict: 'approve',
142
- completed_at: '2026-06-12T10:15:00.000Z',
143
- },
144
- },
145
- };
146
- const gate = buildRalplanConsensusGateFromSources([
147
- { source: 'older-valid-source', value: validConsensus },
148
- { source: 'later-invalid-source', value: invalidConsensus },
149
- ]);
34
+ describe('ralplan consensus gate', () => {
35
+ it('fails closed when locally supplied lifecycle evidence claims consensus', () => {
36
+ const gate = buildRalplanConsensusGateFromSources([{
37
+ source: 'same-user-state',
38
+ value: { ...nativeLifecycleReviews, official_host_consensus_receipt: { issuer: 'same-user', approved: true } },
39
+ }]);
150
40
  assert.equal(gate.complete, false);
151
- assert.equal(gate.source, 'later-invalid-source');
152
- assert.equal(gate.blockedReason, 'non_approving_ralplan_consensus_review');
153
- assert.match(gate.blockedDetails?.join(' ') ?? '', /architect.*verdict=iterate/i);
154
- });
155
- it('requires strict direct Architect-before-Critic order evidence', () => {
156
- const buildGate = (form, architectOrder, criticOrder) => {
157
- const architectReview = {
158
- agent_role: 'architect',
159
- verdict: 'approve',
160
- ...(architectOrder ? { completed_at: architectOrder } : {}),
161
- };
162
- const criticReview = {
163
- agent_role: 'critic',
164
- verdict: 'approve',
165
- ...(criticOrder ? { completed_at: criticOrder } : {}),
166
- };
167
- return buildRalplanConsensusGateFromSources([{
168
- source: `direct-order-${form}`,
169
- value: form === 'explicit'
170
- ? {
171
- ralplan_consensus_gate: {
172
- complete: true,
173
- sequence: ['architect-review', 'critic-review'],
174
- ralplan_architect_review: architectReview,
175
- ralplan_critic_review: criticReview,
176
- },
177
- }
178
- : {
179
- sequence: ['architect-review', 'critic-review'],
180
- ralplan_architect_review: architectReview,
181
- ralplan_critic_review: criticReview,
182
- },
183
- }]);
184
- };
185
- for (const form of ['explicit', 'fallback']) {
186
- const valid = buildGate(form, '2026-06-12T10:00:00.000Z', '2026-06-12T10:05:00.000Z');
187
- assert.equal(valid.complete, true);
188
- for (const gate of [
189
- buildGate(form, '2026-06-12T10:00:00.000Z', '2026-06-12T10:00:00.000Z'),
190
- buildGate(form, '2026-06-12T10:05:00.000Z', '2026-06-12T10:00:00.000Z'),
191
- buildGate(form, undefined, '2026-06-12T10:05:00.000Z'),
192
- buildGate(form, '2026-06-12T10:00:00.000Z', undefined),
193
- ]) {
194
- assert.equal(gate.complete, false);
195
- assert.equal(gate.blockedReason, form === 'explicit'
196
- ? 'non_approving_ralplan_consensus_review'
197
- : 'missing_sequential_architect_then_critic_approval');
198
- if (form === 'explicit') {
199
- assert.match(gate.blockedDetails?.join(' ') ?? '', /direct review order is not proven strictly architect-before-critic/i);
200
- }
201
- }
202
- }
41
+ assert.equal(gate.blockedReason, 'documented_host_consensus_receipt_unavailable');
42
+ assert.deepEqual(gate.blockedDetails, ['official host consensus receipt verifier is unavailable']);
203
43
  });
204
- it('uses sequence order authoritatively and rejects contradictory timestamps', () => {
205
- const buildGate = (architectSequence, criticSequence, architectCompletedAt, criticCompletedAt) => buildRalplanConsensusGateFromSources([{
206
- source: 'sequence-order',
207
- value: {
208
- ralplan_consensus_gate: {
209
- complete: true,
210
- sequence: ['architect-review', 'critic-review'],
211
- ralplan_architect_review: {
212
- agent_role: 'architect',
213
- verdict: 'approve',
214
- ...(architectSequence === undefined ? {} : { sequence_index: architectSequence }),
215
- ...(architectCompletedAt ? { completed_at: architectCompletedAt } : {}),
216
- },
217
- ralplan_critic_review: {
218
- agent_role: 'critic',
219
- verdict: 'approve',
220
- ...(criticSequence === undefined ? {} : { sequence_index: criticSequence }),
221
- ...(criticCompletedAt ? { completed_at: criticCompletedAt } : {}),
222
- },
223
- },
224
- },
44
+ it('retains typed Architect and Critic lifecycle routing for diagnostics', () => {
45
+ const gate = buildRalplanConsensusGateFromSources([{
46
+ source: 'same-user-state',
47
+ value: nativeLifecycleReviews,
225
48
  }]);
226
- assert.equal(buildGate(1, 2).complete, true);
227
- assert.equal(buildGate(2, 1).complete, false);
228
- assert.equal(buildGate(1, 1).complete, false);
229
- assert.equal(buildGate(1, undefined).complete, false);
230
- assert.equal(buildGate(undefined, 2).complete, false);
231
- assert.equal(buildGate(1, 2, '2026-06-12T10:05:00.000Z', '2026-06-12T10:00:00.000Z').complete, false);
232
- assert.equal(buildGate(2, 1, '2026-06-12T10:00:00.000Z', '2026-06-12T10:05:00.000Z').complete, false);
49
+ assert.equal(gate.source, 'same-user-state');
50
+ assert.equal(gate.ralplan_architect_review?.agent_role, 'architect');
51
+ assert.equal(gate.ralplan_architect_review?.sequence_index, 1);
52
+ assert.equal(gate.ralplan_critic_review?.agent_role, 'critic');
53
+ assert.equal(gate.ralplan_critic_review?.sequence_index, 2);
233
54
  });
234
- it('does not compare timestamp and sequence freshness domains', () => {
235
- const timestampConsensus = {
236
- ralplan_consensus_gate: {
237
- complete: true,
238
- sequence: ['architect-review', 'critic-review'],
239
- ralplan_architect_review: {
240
- agent_role: 'architect',
241
- verdict: 'approve',
242
- completed_at: '2026-06-12T10:00:00.000Z',
243
- },
244
- ralplan_critic_review: {
245
- agent_role: 'critic',
246
- verdict: 'approve',
247
- completed_at: '2026-06-12T10:05:00.000Z',
248
- },
249
- },
250
- };
251
- const sequenceConsensus = {
252
- ralplan_consensus_gate: {
253
- complete: true,
254
- sequence: ['architect-review', 'critic-review'],
255
- ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', sequence_index: 3 },
256
- ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', sequence_index: 4 },
257
- },
258
- };
259
- const timestampFirst = buildRalplanConsensusGateFromSources([
260
- { source: 'timestamp-first', value: timestampConsensus },
261
- { source: 'sequence-second', value: sequenceConsensus },
262
- ]);
263
- assert.equal(timestampFirst.source, 'timestamp-first');
264
- const sequenceFirst = buildRalplanConsensusGateFromSources([
265
- { source: 'sequence-first', value: sequenceConsensus },
266
- { source: 'timestamp-second', value: timestampConsensus },
267
- ]);
268
- assert.equal(sequenceFirst.source, 'sequence-first');
269
- });
270
- it('rejects malformed complete consensus even when it appears after a valid source', () => {
271
- const validConsensus = {
272
- ralplan_consensus_gate: {
273
- complete: true,
274
- sequence: ['architect-review', 'critic-review'],
275
- ralplan_architect_review: {
276
- agent_role: 'architect',
277
- verdict: 'approve',
278
- completed_at: '2026-06-12T10:00:00.000Z',
279
- },
280
- ralplan_critic_review: {
281
- agent_role: 'critic',
282
- verdict: 'approve',
283
- completed_at: '2026-06-12T10:05:00.000Z',
284
- },
285
- },
286
- };
287
- const malformedConsensus = {
288
- ralplan_consensus_gate: {
289
- complete: true,
290
- sequence: ['critic-review', 'architect-review'],
291
- ralplan_architect_review: {
292
- agent_role: 'architect',
293
- verdict: 'approve',
294
- completed_at: '2026-06-12T10:10:00.000Z',
295
- },
296
- ralplan_critic_review: {
297
- agent_role: 'critic',
298
- verdict: 'approve',
299
- completed_at: '2026-06-12T10:15:00.000Z',
300
- },
301
- },
302
- };
55
+ it('retains newer invalid lifecycle diagnostics ahead of older native lifecycle evidence', () => {
303
56
  const gate = buildRalplanConsensusGateFromSources([
304
- { source: 'older-valid-source', value: validConsensus },
305
- { source: 'later-malformed-source', value: malformedConsensus },
57
+ { source: 'older-native', value: nativeLifecycleReviews },
58
+ { source: 'newer-invalid', value: withReviews({ ...nativeLifecycleReviews.ralplan_consensus_gate.ralplan_architect_review, sequence_index: 4 }, { ...nativeLifecycleReviews.ralplan_consensus_gate.ralplan_critic_review, sequence_index: 3 }) },
306
59
  ]);
307
60
  assert.equal(gate.complete, false);
308
- assert.equal(gate.source, 'later-malformed-source');
309
- assert.equal(gate.blockedReason, 'non_approving_ralplan_consensus_review');
310
- assert.match(gate.blockedDetails?.join(' ') ?? '', /sequence is not architect-review then critic-review/i);
311
- });
312
- it('lets fresh ordered direct consensus displace stale no-order invalid direct consensus', () => {
313
- const gate = buildRalplanConsensusGateFromSources([
314
- {
315
- source: 'stale-invalid-no-order',
316
- value: {
317
- ralplan_consensus_gate: {
318
- complete: true,
319
- sequence: ['architect-review', 'critic-review'],
320
- ralplan_architect_review: {
321
- agent_role: 'architect',
322
- verdict: 'iterate',
323
- },
324
- ralplan_critic_review: {
325
- agent_role: 'critic',
326
- verdict: 'approve',
327
- },
328
- },
329
- },
330
- },
331
- {
332
- source: 'fresh-valid-with-order',
333
- value: {
334
- ralplan_consensus_gate: {
335
- complete: true,
336
- sequence: ['architect-review', 'critic-review'],
337
- ralplan_architect_review: {
338
- agent_role: 'architect',
339
- verdict: 'approve',
340
- completed_at: '2026-06-12T10:00:00.000Z',
341
- },
342
- ralplan_critic_review: {
343
- agent_role: 'critic',
344
- verdict: 'approve',
345
- completed_at: '2026-06-12T10:05:00.000Z',
346
- },
347
- },
348
- },
349
- },
350
- ]);
351
- assert.equal(gate.complete, true);
352
- assert.equal(gate.source, 'fresh-valid-with-order');
353
- assert.equal(gate.blockedReason, null);
354
- });
355
- it('ignores ambient root consensus unless the ambient session is bound to this cwd', async () => {
356
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-local-'));
357
- const ambientRoot = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-ambient-'));
358
- const previousOmxRoot = process.env.OMX_ROOT;
359
- const previousOmxStateRoot = process.env.OMX_STATE_ROOT;
360
- const previousOmxTeamStateRoot = process.env.OMX_TEAM_STATE_ROOT;
361
- try {
362
- process.env.OMX_ROOT = ambientRoot;
363
- delete process.env.OMX_STATE_ROOT;
364
- delete process.env.OMX_TEAM_STATE_ROOT;
365
- const ambientStateDir = getBaseStateDir(cwd);
366
- await mkdir(ambientStateDir, { recursive: true });
367
- await writeFile(join(ambientStateDir, 'ralplan-state.json'), JSON.stringify({
368
- ralplan_consensus_gate: {
369
- complete: true,
370
- sequence: ['architect-review', 'critic-review'],
371
- ralplan_architect_review: { agent_role: 'architect', verdict: 'approve' },
372
- ralplan_critic_review: { agent_role: 'critic', verdict: 'approve' },
373
- },
374
- }, null, 2));
375
- const gate = buildRalplanConsensusGateForCwd(cwd);
376
- assert.equal(gate.complete, false);
377
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
378
- }
379
- finally {
380
- if (typeof previousOmxRoot === 'string')
381
- process.env.OMX_ROOT = previousOmxRoot;
382
- else
383
- delete process.env.OMX_ROOT;
384
- if (typeof previousOmxStateRoot === 'string')
385
- process.env.OMX_STATE_ROOT = previousOmxStateRoot;
386
- else
387
- delete process.env.OMX_STATE_ROOT;
388
- if (typeof previousOmxTeamStateRoot === 'string')
389
- process.env.OMX_TEAM_STATE_ROOT = previousOmxTeamStateRoot;
390
- else
391
- delete process.env.OMX_TEAM_STATE_ROOT;
392
- await rm(cwd, { recursive: true, force: true });
393
- await rm(ambientRoot, { recursive: true, force: true });
394
- }
395
- });
396
- it('reads tracker-backed consensus evidence from OMX_STATE_ROOT instead of cwd/.omx/state', async () => {
397
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-cwd-'));
398
- const boxedRoot = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-state-root-'));
399
- const previousOmxRoot = process.env.OMX_ROOT;
400
- const previousOmxStateRoot = process.env.OMX_STATE_ROOT;
401
- const previousOmxTeamStateRoot = process.env.OMX_TEAM_STATE_ROOT;
402
- const sessionId = 'sess-boxed-consensus';
403
- try {
404
- delete process.env.OMX_ROOT;
405
- delete process.env.OMX_TEAM_STATE_ROOT;
406
- process.env.OMX_STATE_ROOT = boxedRoot;
407
- const baseStateDir = getBaseStateDir(cwd);
408
- const sessionDir = join(baseStateDir, 'sessions', sessionId);
409
- await mkdir(sessionDir, { recursive: true });
410
- await writeFile(join(baseStateDir, 'session.json'), JSON.stringify({
411
- session_id: sessionId,
412
- native_session_id: 'thread-leader',
413
- cwd,
414
- }, null, 2));
415
- await writeFile(subagentTrackingPath(cwd), JSON.stringify({
416
- schemaVersion: 1,
417
- sessions: {
418
- [sessionId]: {
419
- session_id: sessionId,
420
- leader_thread_id: 'thread-leader',
421
- updated_at: '2026-06-11T16:30:00.000Z',
422
- threads: {
423
- 'thread-leader': {
424
- thread_id: 'thread-leader',
425
- kind: 'leader',
426
- first_seen_at: '2026-06-11T16:29:00.000Z',
427
- last_seen_at: '2026-06-11T16:29:00.000Z',
428
- turn_count: 1,
429
- },
430
- 'thread-architect': {
431
- thread_id: 'thread-architect',
432
- kind: 'subagent',
433
- first_seen_at: '2026-06-11T16:29:30.000Z',
434
- last_seen_at: '2026-06-11T16:29:30.000Z',
435
- completed_at: '2026-06-11T16:29:30.000Z',
436
- turn_count: 1,
437
- role: 'architect',
438
- },
439
- 'thread-critic': {
440
- thread_id: 'thread-critic',
441
- kind: 'subagent',
442
- first_seen_at: '2026-06-11T16:30:00.000Z',
443
- last_seen_at: '2026-06-11T16:30:00.000Z',
444
- completed_at: '2026-06-11T16:30:00.000Z',
445
- turn_count: 1,
446
- role: 'critic',
447
- },
448
- },
449
- },
450
- },
451
- }, null, 2));
452
- await writeFile(join(sessionDir, 'autopilot-state.json'), JSON.stringify({
453
- current_phase: 'ralplan',
454
- handoff_artifacts: {
455
- ralplan_consensus_gate: {
456
- complete: true,
457
- sequence: ['architect-review', 'critic-review'],
458
- ralplan_architect_review: {
459
- agent_role: 'architect',
460
- provenance_kind: 'native_subagent',
461
- verdict: 'approve',
462
- session_id: sessionId,
463
- thread_id: 'thread-architect',
464
- artifact_path: '.omx/plans/architect.md',
465
- tracker_path: '.omx/state/subagent-tracking.json',
466
- completed_at: '2026-06-11T16:29:30.000Z',
467
- },
468
- ralplan_critic_review: {
469
- agent_role: 'critic',
470
- provenance_kind: 'native_subagent',
471
- verdict: 'approve',
472
- session_id: sessionId,
473
- thread_id: 'thread-critic',
474
- artifact_path: '.omx/plans/critic.md',
475
- tracker_path: '.omx/state/subagent-tracking.json',
476
- completed_at: '2026-06-11T16:30:00.000Z',
477
- },
478
- },
479
- },
480
- }, null, 2));
481
- const gate = buildRalplanConsensusGateForCwd(cwd, {
482
- sessionId,
483
- requireNativeSubagents: true,
484
- });
485
- assert.equal(gate.complete, true);
486
- assert.equal(gate.blockedReason, null);
487
- assert.match(String(gate.source), new RegExp(`${boxedRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`));
488
- }
489
- finally {
490
- if (typeof previousOmxRoot === 'string')
491
- process.env.OMX_ROOT = previousOmxRoot;
492
- else
493
- delete process.env.OMX_ROOT;
494
- if (typeof previousOmxStateRoot === 'string')
495
- process.env.OMX_STATE_ROOT = previousOmxStateRoot;
496
- else
497
- delete process.env.OMX_STATE_ROOT;
498
- if (typeof previousOmxTeamStateRoot === 'string')
499
- process.env.OMX_TEAM_STATE_ROOT = previousOmxTeamStateRoot;
500
- else
501
- delete process.env.OMX_TEAM_STATE_ROOT;
502
- await rm(cwd, { recursive: true, force: true });
503
- await rm(boxedRoot, { recursive: true, force: true });
504
- }
505
- });
506
- it('accepts ordered native reviews when runtime tracker lags but workspace tracker has completion evidence', async () => {
507
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-runtime-lag-'));
508
- const boxedRoot = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-runtime-root-'));
509
- const previousOmxRoot = process.env.OMX_ROOT;
510
- const previousOmxStateRoot = process.env.OMX_STATE_ROOT;
511
- const previousOmxTeamStateRoot = process.env.OMX_TEAM_STATE_ROOT;
512
- const sessionId = 'sess-runtime-lag-consensus';
513
- try {
514
- delete process.env.OMX_ROOT;
515
- delete process.env.OMX_TEAM_STATE_ROOT;
516
- process.env.OMX_STATE_ROOT = boxedRoot;
517
- const runtimeStateDir = getBaseStateDir(cwd);
518
- const runtimeSessionDir = join(runtimeStateDir, 'sessions', sessionId);
519
- const workspaceStateDir = join(cwd, '.omx', 'state');
520
- const workspaceSessionDir = join(workspaceStateDir, 'sessions', sessionId);
521
- await mkdir(runtimeSessionDir, { recursive: true });
522
- await mkdir(workspaceSessionDir, { recursive: true });
523
- await writeFile(join(runtimeStateDir, 'session.json'), JSON.stringify({
524
- session_id: sessionId,
525
- native_session_id: 'thread-leader',
526
- cwd,
527
- }, null, 2));
528
- const laggingTracker = {
529
- schemaVersion: 1,
530
- sessions: {
531
- [sessionId]: {
532
- session_id: sessionId,
533
- leader_thread_id: 'thread-leader',
534
- updated_at: '2026-07-07T04:31:00.000Z',
535
- threads: {
536
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-07-07T04:29:00.000Z', last_seen_at: '2026-07-07T04:29:00.000Z', turn_count: 1 },
537
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-07-07T04:30:00.000Z', last_seen_at: '2026-07-07T04:30:00.000Z', turn_count: 1, role: 'architect' },
538
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-07-07T04:31:00.000Z', last_seen_at: '2026-07-07T04:31:00.000Z', turn_count: 1, role: 'critic' },
539
- },
540
- },
541
- },
542
- };
543
- const completedTracker = {
544
- schemaVersion: 1,
545
- sessions: {
546
- [sessionId]: {
547
- session_id: sessionId,
548
- leader_thread_id: 'thread-leader',
549
- updated_at: '2026-07-07T04:33:00.000Z',
550
- threads: {
551
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-07-07T04:29:00.000Z', last_seen_at: '2026-07-07T04:29:00.000Z', turn_count: 1 },
552
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-07-07T04:30:00.000Z', last_seen_at: '2026-07-07T04:30:00.000Z', completed_at: '2026-07-07T04:30:00.000Z', turn_count: 1, role: 'architect' },
553
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-07-07T04:31:00.000Z', last_seen_at: '2026-07-07T04:31:00.000Z', completed_at: '2026-07-07T04:31:00.000Z', turn_count: 1, role: 'critic' },
554
- },
555
- },
556
- },
557
- };
558
- await writeFile(subagentTrackingPath(cwd), JSON.stringify(laggingTracker, null, 2));
559
- await writeFile(join(workspaceStateDir, 'subagent-tracking.json'), JSON.stringify(completedTracker, null, 2));
560
- await writeFile(join(runtimeSessionDir, 'ralplan-state.json'), JSON.stringify({
561
- active: false,
562
- current_phase: 'complete',
563
- planning_complete: true,
564
- latest_plan_path: '.omx/plans/prd-clickstack-otel-consumer-20260707T043000Z.md',
565
- ralplan_consensus_gate: {
566
- complete: true,
567
- sequence: ['architect-review', 'critic-review'],
568
- ralplan_architect_review: {
569
- agent_role: 'architect',
570
- provenance_kind: 'native_subagent',
571
- verdict: 'approve',
572
- session_id: sessionId,
573
- thread_id: 'thread-architect',
574
- tracker_path: '.omx/state/subagent-tracking.json',
575
- completed_at: '2026-07-07T04:30:00.000Z',
576
- },
577
- ralplan_critic_review: {
578
- agent_role: 'critic',
579
- provenance_kind: 'native_subagent',
580
- verdict: 'approve',
581
- session_id: sessionId,
582
- thread_id: 'thread-critic',
583
- tracker_path: '.omx/state/subagent-tracking.json',
584
- completed_at: '2026-07-07T04:31:00.000Z',
585
- },
586
- },
587
- }, null, 2));
588
- const gate = buildRalplanConsensusGateForCwd(cwd, {
589
- sessionId,
590
- requireNativeSubagents: true,
591
- });
592
- assert.equal(gate.complete, true);
593
- assert.equal(gate.blockedReason, null);
594
- }
595
- finally {
596
- if (typeof previousOmxRoot === 'string')
597
- process.env.OMX_ROOT = previousOmxRoot;
598
- else
599
- delete process.env.OMX_ROOT;
600
- if (typeof previousOmxStateRoot === 'string')
601
- process.env.OMX_STATE_ROOT = previousOmxStateRoot;
602
- else
603
- delete process.env.OMX_STATE_ROOT;
604
- if (typeof previousOmxTeamStateRoot === 'string')
605
- process.env.OMX_TEAM_STATE_ROOT = previousOmxTeamStateRoot;
606
- else
607
- delete process.env.OMX_TEAM_STATE_ROOT;
608
- await rm(cwd, { recursive: true, force: true });
609
- await rm(boxedRoot, { recursive: true, force: true });
610
- }
611
- });
612
- it('rejects runtime tracker lag when workspace tracker also lacks completion evidence', async () => {
613
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-runtime-lag-incomplete-'));
614
- const boxedRoot = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-runtime-incomplete-root-'));
615
- const previousOmxRoot = process.env.OMX_ROOT;
616
- const previousOmxStateRoot = process.env.OMX_STATE_ROOT;
617
- const previousOmxTeamStateRoot = process.env.OMX_TEAM_STATE_ROOT;
618
- const sessionId = 'sess-runtime-lag-incomplete-consensus';
619
- try {
620
- delete process.env.OMX_ROOT;
621
- delete process.env.OMX_TEAM_STATE_ROOT;
622
- process.env.OMX_STATE_ROOT = boxedRoot;
623
- const runtimeStateDir = getBaseStateDir(cwd);
624
- const runtimeSessionDir = join(runtimeStateDir, 'sessions', sessionId);
625
- const workspaceStateDir = join(cwd, '.omx', 'state');
626
- await mkdir(runtimeSessionDir, { recursive: true });
627
- await mkdir(workspaceStateDir, { recursive: true });
628
- await writeFile(join(runtimeStateDir, 'session.json'), JSON.stringify({
629
- session_id: sessionId,
630
- native_session_id: 'thread-leader',
631
- cwd,
632
- }, null, 2));
633
- const incompleteTracker = {
634
- schemaVersion: 1,
635
- sessions: {
636
- [sessionId]: {
637
- session_id: sessionId,
638
- leader_thread_id: 'thread-leader',
639
- updated_at: '2026-07-07T04:31:00.000Z',
640
- threads: {
641
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-07-07T04:29:00.000Z', last_seen_at: '2026-07-07T04:29:00.000Z', turn_count: 1 },
642
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-07-07T04:30:00.000Z', last_seen_at: '2026-07-07T04:30:00.000Z', turn_count: 1, role: 'architect' },
643
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-07-07T04:31:00.000Z', last_seen_at: '2026-07-07T04:31:00.000Z', turn_count: 1, role: 'critic' },
644
- },
645
- },
646
- },
647
- };
648
- await writeFile(subagentTrackingPath(cwd), JSON.stringify(incompleteTracker, null, 2));
649
- await writeFile(join(workspaceStateDir, 'subagent-tracking.json'), JSON.stringify(incompleteTracker, null, 2));
650
- await writeFile(join(runtimeSessionDir, 'ralplan-state.json'), JSON.stringify({
651
- ralplan_consensus_gate: {
652
- complete: true,
653
- sequence: ['architect-review', 'critic-review'],
654
- ralplan_architect_review: {
655
- agent_role: 'architect',
656
- provenance_kind: 'native_subagent',
657
- verdict: 'approve',
658
- session_id: sessionId,
659
- thread_id: 'thread-architect',
660
- tracker_path: '.omx/state/subagent-tracking.json',
661
- completed_at: '2026-07-07T04:30:00.000Z',
662
- },
663
- ralplan_critic_review: {
664
- agent_role: 'critic',
665
- provenance_kind: 'native_subagent',
666
- verdict: 'approve',
667
- session_id: sessionId,
668
- thread_id: 'thread-critic',
669
- tracker_path: '.omx/state/subagent-tracking.json',
670
- completed_at: '2026-07-07T04:31:00.000Z',
671
- },
672
- },
673
- }, null, 2));
674
- const gate = buildRalplanConsensusGateForCwd(cwd, {
675
- sessionId,
676
- requireNativeSubagents: true,
677
- });
678
- assert.equal(gate.complete, false);
679
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
680
- assert.match(gate.blockedDetails?.join(' ') ?? '', /thread-architect is not completed/);
681
- }
682
- finally {
683
- if (typeof previousOmxRoot === 'string')
684
- process.env.OMX_ROOT = previousOmxRoot;
685
- else
686
- delete process.env.OMX_ROOT;
687
- if (typeof previousOmxStateRoot === 'string')
688
- process.env.OMX_STATE_ROOT = previousOmxStateRoot;
689
- else
690
- delete process.env.OMX_STATE_ROOT;
691
- if (typeof previousOmxTeamStateRoot === 'string')
692
- process.env.OMX_TEAM_STATE_ROOT = previousOmxTeamStateRoot;
693
- else
694
- delete process.env.OMX_TEAM_STATE_ROOT;
695
- await rm(cwd, { recursive: true, force: true });
696
- await rm(boxedRoot, { recursive: true, force: true });
697
- }
698
- });
699
- it('accepts session-scoped tracker-backed reviews without an explicit sessionId option', async () => {
700
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-discovered-session-'));
701
- const boxedRoot = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-discovered-root-'));
702
- const previousOmxRoot = process.env.OMX_ROOT;
703
- const previousOmxStateRoot = process.env.OMX_STATE_ROOT;
704
- const previousOmxTeamStateRoot = process.env.OMX_TEAM_STATE_ROOT;
705
- const sessionId = 'sess-discovered-consensus';
706
- try {
707
- delete process.env.OMX_ROOT;
708
- delete process.env.OMX_TEAM_STATE_ROOT;
709
- process.env.OMX_STATE_ROOT = boxedRoot;
710
- const baseStateDir = getBaseStateDir(cwd);
711
- const sessionDir = join(baseStateDir, 'sessions', sessionId);
712
- await mkdir(sessionDir, { recursive: true });
713
- await writeFile(join(baseStateDir, 'session.json'), JSON.stringify({
714
- session_id: sessionId,
715
- native_session_id: 'thread-leader',
716
- cwd,
717
- }, null, 2));
718
- await writeFile(subagentTrackingPath(cwd), JSON.stringify({
719
- schemaVersion: 1,
720
- sessions: {
721
- [sessionId]: {
722
- session_id: sessionId,
723
- leader_thread_id: 'thread-leader',
724
- updated_at: '2026-06-12T10:03:00.000Z',
725
- threads: {
726
- 'thread-leader': {
727
- thread_id: 'thread-leader',
728
- kind: 'leader',
729
- first_seen_at: '2026-06-12T09:59:00.000Z',
730
- last_seen_at: '2026-06-12T09:59:00.000Z',
731
- turn_count: 1,
732
- },
733
- 'thread-architect': {
734
- thread_id: 'thread-architect',
735
- kind: 'subagent',
736
- first_seen_at: '2026-06-12T10:02:00.000Z',
737
- last_seen_at: '2026-06-12T10:02:00.000Z',
738
- completed_at: '2026-06-12T10:02:00.000Z',
739
- turn_count: 1,
740
- role: 'architect',
741
- },
742
- 'thread-critic': {
743
- thread_id: 'thread-critic',
744
- kind: 'subagent',
745
- first_seen_at: '2026-06-12T10:03:00.000Z',
746
- last_seen_at: '2026-06-12T10:03:00.000Z',
747
- completed_at: '2026-06-12T10:03:00.000Z',
748
- turn_count: 1,
749
- role: 'critic',
750
- },
751
- },
752
- },
753
- },
754
- }, null, 2));
755
- await writeFile(join(sessionDir, 'ralplan-state.json'), JSON.stringify({
756
- ralplan_consensus_gate: {
757
- complete: true,
758
- sequence: ['architect-review', 'critic-review'],
759
- ralplan_architect_review: {
760
- agent_role: 'architect',
761
- provenance_kind: 'native_subagent',
762
- verdict: 'approve',
763
- thread_id: 'thread-architect',
764
- completed_at: '2026-06-12T10:02:00.000Z',
765
- },
766
- ralplan_critic_review: {
767
- agent_role: 'critic',
768
- provenance_kind: 'native_subagent',
769
- verdict: 'approve',
770
- thread_id: 'thread-critic',
771
- completed_at: '2026-06-12T10:03:00.000Z',
772
- },
773
- },
774
- }, null, 2));
775
- const gate = buildRalplanConsensusGateForCwd(cwd, {
776
- requireNativeSubagents: true,
777
- });
778
- assert.equal(gate.complete, true);
779
- assert.equal(gate.blockedReason, null);
780
- assert.match(String(gate.source), new RegExp(`${sessionId}/ralplan-state\\.json$`));
781
- }
782
- finally {
783
- if (typeof previousOmxRoot === 'string')
784
- process.env.OMX_ROOT = previousOmxRoot;
785
- else
786
- delete process.env.OMX_ROOT;
787
- if (typeof previousOmxStateRoot === 'string')
788
- process.env.OMX_STATE_ROOT = previousOmxStateRoot;
789
- else
790
- delete process.env.OMX_STATE_ROOT;
791
- if (typeof previousOmxTeamStateRoot === 'string')
792
- process.env.OMX_TEAM_STATE_ROOT = previousOmxTeamStateRoot;
793
- else
794
- delete process.env.OMX_TEAM_STATE_ROOT;
795
- await rm(cwd, { recursive: true, force: true });
796
- await rm(boxedRoot, { recursive: true, force: true });
797
- }
798
- });
799
- it('rejects stale top-level handoff consensus during a return-to-ralplan cycle', async () => {
800
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-stale-'));
801
- try {
802
- const gate = buildRalplanConsensusGateForCwd(cwd, {
803
- artifacts: {
804
- current_phase: 'ralplan',
805
- return_to_ralplan_reason: 'Code review requested changes.',
806
- handoff_artifacts: {
807
- ralplan_consensus_gate: {
808
- complete: true,
809
- sequence: ['architect-review', 'critic-review'],
810
- ralplan_architect_review: {
811
- agent_role: 'architect',
812
- verdict: 'approve',
813
- completed_at: '2026-06-11T16:00:00.000Z',
814
- },
815
- ralplan_critic_review: {
816
- agent_role: 'critic',
817
- verdict: 'approve',
818
- completed_at: '2026-06-11T16:05:00.000Z',
819
- },
820
- },
821
- },
822
- },
823
- });
824
- assert.equal(gate.complete, false);
825
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
826
- }
827
- finally {
828
- await rm(cwd, { recursive: true, force: true });
829
- }
830
- });
831
- it('rejects stale local ralplan state consensus during a return-to-ralplan cycle', async () => {
832
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-stale-local-state-'));
833
- try {
834
- const stateDir = join(cwd, '.omx', 'state');
835
- await mkdir(stateDir, { recursive: true });
836
- await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
837
- current_phase: 'complete',
838
- ralplan_consensus_gate: {
839
- complete: true,
840
- sequence: ['architect-review', 'critic-review'],
841
- ralplan_architect_review: {
842
- agent_role: 'architect',
843
- verdict: 'approve',
844
- completed_at: '2026-06-11T16:00:00.000Z',
845
- },
846
- ralplan_critic_review: {
847
- agent_role: 'critic',
848
- verdict: 'approve',
849
- completed_at: '2026-06-11T16:05:00.000Z',
850
- },
851
- },
852
- }, null, 2));
853
- const gate = buildRalplanConsensusGateForCwd(cwd, {
854
- artifacts: {
855
- current_phase: 'ralplan',
856
- return_to_ralplan_reason: 'Code review requested changes.',
857
- review_cycle: 1,
858
- },
859
- });
860
- assert.equal(gate.complete, false);
861
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
862
- }
863
- finally {
864
- await rm(cwd, { recursive: true, force: true });
865
- }
866
- });
867
- it('ignores stale invalid local ralplan state consensus during a return-to-ralplan cycle', async () => {
868
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-stale-invalid-local-state-'));
869
- try {
870
- const stateDir = join(cwd, '.omx', 'state');
871
- await mkdir(stateDir, { recursive: true });
872
- await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
873
- current_phase: 'complete',
874
- ralplan_consensus_gate: {
875
- complete: true,
876
- sequence: ['architect-review', 'critic-review'],
877
- ralplan_architect_review: {
878
- agent_role: 'architect',
879
- verdict: 'iterate',
880
- completed_at: '2026-06-11T16:00:00.000Z',
881
- },
882
- ralplan_critic_review: {
883
- agent_role: 'critic',
884
- verdict: 'approve',
885
- completed_at: '2026-06-11T16:05:00.000Z',
886
- },
887
- },
888
- }, null, 2));
889
- const gate = buildRalplanConsensusGateForCwd(cwd, {
890
- artifacts: {
891
- current_phase: 'ralplan',
892
- return_to_ralplan_reason: 'Code review requested changes.',
893
- review_cycle: 1,
894
- },
895
- });
896
- assert.equal(gate.complete, false);
897
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
898
- assert.equal(gate.source, null);
899
- }
900
- finally {
901
- await rm(cwd, { recursive: true, force: true });
902
- }
903
- });
904
- it('preserves ordered invalid direct consensus in a return-to-ralplan cycle without review_cycle', async () => {
905
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-ordered-invalid-return-'));
906
- try {
907
- const gate = buildRalplanConsensusGateForCwd(cwd, {
908
- artifacts: {
909
- current_phase: 'ralplan',
910
- return_to_ralplan_reason: 'Code review requested changes.',
911
- ralplan_consensus_gate: {
912
- complete: true,
913
- sequence: ['architect-review', 'critic-review'],
914
- ralplan_architect_review: {
915
- agent_role: 'architect',
916
- verdict: 'iterate',
917
- completed_at: '2026-06-12T10:00:00.000Z',
918
- },
919
- ralplan_critic_review: {
920
- agent_role: 'critic',
921
- verdict: 'approve',
922
- completed_at: '2026-06-12T10:05:00.000Z',
923
- },
924
- },
925
- },
926
- });
927
- assert.equal(gate.complete, false);
928
- assert.equal(gate.source, 'stage-context-artifacts');
929
- assert.equal(gate.blockedReason, 'non_approving_ralplan_consensus_review');
930
- assert.match(gate.blockedDetails?.join(' ') ?? '', /architect.*verdict=iterate/i);
931
- }
932
- finally {
933
- await rm(cwd, { recursive: true, force: true });
934
- }
935
- });
936
- it('rejects local nested handoff consensus when only the local container review_cycle advances', async () => {
937
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-local-container-only-'));
938
- try {
939
- const stateDir = join(cwd, '.omx', 'state');
940
- await mkdir(stateDir, { recursive: true });
941
- await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
942
- current_phase: 'complete',
943
- review_cycle: 2,
944
- handoff_artifacts: {
945
- ralplan_consensus_gate: {
946
- complete: true,
947
- sequence: ['architect-review', 'critic-review'],
948
- ralplan_architect_review: {
949
- agent_role: 'architect',
950
- verdict: 'approve',
951
- completed_at: '2026-06-12T10:00:00.000Z',
952
- },
953
- ralplan_critic_review: {
954
- agent_role: 'critic',
955
- verdict: 'approve',
956
- completed_at: '2026-06-12T10:05:00.000Z',
957
- },
958
- },
959
- },
960
- }, null, 2));
961
- const gate = buildRalplanConsensusGateForCwd(cwd, {
962
- artifacts: {
963
- current_phase: 'ralplan',
964
- return_to_ralplan_reason: 'Code review requested changes.',
965
- review_cycle: 1,
966
- },
967
- });
968
- assert.equal(gate.complete, false);
969
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
970
- }
971
- finally {
972
- await rm(cwd, { recursive: true, force: true });
973
- }
974
- });
975
- it('accepts local nested handoff consensus when both reviews carry the advanced review_cycle', async () => {
976
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-local-review-fresh-'));
977
- try {
978
- const stateDir = join(cwd, '.omx', 'state');
979
- await mkdir(stateDir, { recursive: true });
980
- await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
981
- current_phase: 'complete',
982
- review_cycle: 2,
983
- handoff_artifacts: {
984
- ralplan_consensus_gate: {
985
- complete: true,
986
- sequence: ['architect-review', 'critic-review'],
987
- ralplan_architect_review: {
988
- agent_role: 'architect',
989
- verdict: 'approve',
990
- review_cycle: 2,
991
- completed_at: '2026-06-12T10:00:00.000Z',
992
- },
993
- ralplan_critic_review: {
994
- agent_role: 'critic',
995
- verdict: 'approve',
996
- review_cycle: 2,
997
- completed_at: '2026-06-12T10:05:00.000Z',
998
- },
999
- },
1000
- },
1001
- }, null, 2));
1002
- const gate = buildRalplanConsensusGateForCwd(cwd, {
1003
- artifacts: {
1004
- current_phase: 'ralplan',
1005
- return_to_ralplan_reason: 'Code review requested changes.',
1006
- review_cycle: 1,
1007
- },
1008
- });
1009
- assert.equal(gate.complete, true);
1010
- assert.equal(gate.blockedReason, null);
1011
- }
1012
- finally {
1013
- await rm(cwd, { recursive: true, force: true });
1014
- }
1015
- });
1016
- it('rejects local state.handoff_artifacts consensus when only the local container review_cycle advances', async () => {
1017
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-local-state-container-only-'));
1018
- try {
1019
- const stateDir = join(cwd, '.omx', 'state');
1020
- await mkdir(stateDir, { recursive: true });
1021
- await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
1022
- current_phase: 'complete',
1023
- review_cycle: 2,
1024
- state: {
1025
- handoff_artifacts: {
1026
- ralplan_consensus_gate: {
1027
- complete: true,
1028
- sequence: ['architect-review', 'critic-review'],
1029
- ralplan_architect_review: {
1030
- agent_role: 'architect',
1031
- verdict: 'approve',
1032
- completed_at: '2026-06-12T10:00:00.000Z',
1033
- },
1034
- ralplan_critic_review: {
1035
- agent_role: 'critic',
1036
- verdict: 'approve',
1037
- completed_at: '2026-06-12T10:05:00.000Z',
1038
- },
1039
- },
1040
- },
1041
- },
1042
- }, null, 2));
1043
- const gate = buildRalplanConsensusGateForCwd(cwd, {
1044
- artifacts: {
1045
- current_phase: 'ralplan',
1046
- return_to_ralplan_reason: 'Code review requested changes.',
1047
- review_cycle: 1,
1048
- },
1049
- });
1050
- assert.equal(gate.complete, false);
1051
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
1052
- }
1053
- finally {
1054
- await rm(cwd, { recursive: true, force: true });
1055
- }
1056
- });
1057
- it('accepts local state.handoff_artifacts consensus when nested state and both reviews carry the advanced review_cycle', async () => {
1058
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-local-state-review-fresh-'));
1059
- try {
1060
- const stateDir = join(cwd, '.omx', 'state');
1061
- await mkdir(stateDir, { recursive: true });
1062
- await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
1063
- current_phase: 'complete',
1064
- state: {
1065
- current_phase: 'ralplan',
1066
- return_to_ralplan_reason: 'Code review requested changes.',
1067
- review_cycle: 1,
1068
- handoff_artifacts: {
1069
- review_cycle: 2,
1070
- ralplan_consensus_gate: {
1071
- complete: true,
1072
- sequence: ['architect-review', 'critic-review'],
1073
- ralplan_architect_review: {
1074
- agent_role: 'architect',
1075
- verdict: 'approve',
1076
- review_cycle: 2,
1077
- completed_at: '2026-06-12T10:00:00.000Z',
1078
- },
1079
- ralplan_critic_review: {
1080
- agent_role: 'critic',
1081
- verdict: 'approve',
1082
- review_cycle: 2,
1083
- completed_at: '2026-06-12T10:05:00.000Z',
1084
- },
1085
- },
1086
- },
1087
- },
1088
- }, null, 2));
1089
- const gate = buildRalplanConsensusGateForCwd(cwd, {
1090
- artifacts: {
1091
- current_phase: 'ralplan',
1092
- return_to_ralplan_reason: 'Code review requested changes.',
1093
- review_cycle: 1,
1094
- },
1095
- });
1096
- assert.equal(gate.complete, true);
1097
- assert.equal(gate.blockedReason, null);
1098
- }
1099
- finally {
1100
- await rm(cwd, { recursive: true, force: true });
1101
- }
1102
- });
1103
- it('rejects stale review history consensus during a return-to-ralplan cycle', async () => {
1104
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-stale-history-'));
1105
- try {
1106
- const gate = buildRalplanConsensusGateForCwd(cwd, {
1107
- artifacts: {
1108
- current_phase: 'ralplan',
1109
- return_to_ralplan_reason: 'Code review requested changes.',
1110
- review_history: [{
1111
- ralplan_architect_review: {
1112
- agent_role: 'architect',
1113
- verdict: 'approve',
1114
- completed_at: '2026-06-11T16:00:00.000Z',
1115
- },
1116
- ralplan_critic_review: {
1117
- agent_role: 'critic',
1118
- verdict: 'approve',
1119
- completed_at: '2026-06-11T16:05:00.000Z',
1120
- },
1121
- }],
1122
- },
1123
- });
1124
- assert.equal(gate.complete, false);
1125
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
1126
- }
1127
- finally {
1128
- await rm(cwd, { recursive: true, force: true });
1129
- }
1130
- });
1131
- it('rejects stale review array consensus during a return-to-ralplan cycle', async () => {
1132
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-stale-arrays-'));
1133
- try {
1134
- const gate = buildRalplanConsensusGateForCwd(cwd, {
1135
- artifacts: {
1136
- current_phase: 'ralplan',
1137
- return_to_ralplan_reason: 'Code review requested changes.',
1138
- architectReviews: [{
1139
- agent_role: 'architect',
1140
- verdict: 'approve',
1141
- completed_at: '2026-06-11T16:00:00.000Z',
1142
- }],
1143
- criticReviews: [{
1144
- agent_role: 'critic',
1145
- verdict: 'approve',
1146
- completed_at: '2026-06-11T16:05:00.000Z',
1147
- }],
1148
- },
1149
- });
1150
- assert.equal(gate.complete, false);
1151
- assert.equal(gate.blockedReason, 'missing_sequential_architect_then_critic_approval');
1152
- }
1153
- finally {
1154
- await rm(cwd, { recursive: true, force: true });
1155
- }
1156
- });
1157
- it('accepts tracker-backed native Architect and Critic lanes with exact ledger role identities and strict order', async () => {
1158
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-native-ok-'));
1159
- const sessionId = 'sess-native-consensus-ok';
1160
- try {
1161
- await writeNativeSubagentTracking(cwd, sessionId);
1162
- const consensus = nativeConsensus(sessionId);
1163
- const reviews = consensus.ralplan_consensus_gate;
1164
- delete reviews.ralplan_architect_review.completed_at;
1165
- delete reviews.ralplan_critic_review.completed_at;
1166
- const gate = buildRalplanConsensusGateFromSources([{
1167
- source: 'native-consensus',
1168
- value: consensus,
1169
- }], { cwd, sessionId });
1170
- assert.equal(gate.complete, true);
1171
- assert.equal(gate.blockedReason, null);
1172
- }
1173
- finally {
1174
- await rm(cwd, { recursive: true, force: true });
1175
- }
1176
- });
1177
- it('uses native mode as the role identity and permits truly roleless legacy native lanes', async () => {
1178
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-native-mode-'));
1179
- const sessionId = 'sess-native-consensus-mode';
1180
- try {
1181
- await writeNativeSubagentTracking(cwd, sessionId);
1182
- const trackingPath = subagentTrackingPath(cwd);
1183
- const tracking = JSON.parse(await readFile(trackingPath, 'utf-8'));
1184
- const threads = tracking.sessions[sessionId].threads;
1185
- for (const [threadId, mode] of [['thread-architect', 'architect'], ['thread-critic', 'critic']]) {
1186
- delete threads[threadId].role;
1187
- threads[threadId].mode = mode;
1188
- }
1189
- await writeFile(trackingPath, JSON.stringify(tracking, null, 2));
1190
- const modeIdentityGate = buildRalplanConsensusGateFromSources([{
1191
- source: 'native-mode-identity',
1192
- value: nativeConsensus(sessionId),
1193
- }], { cwd, sessionId });
1194
- assert.equal(modeIdentityGate.complete, true);
1195
- threads['thread-architect'].mode = 'planner';
1196
- await writeFile(trackingPath, JSON.stringify(tracking, null, 2));
1197
- const mismatchedModeGate = buildRalplanConsensusGateFromSources([{
1198
- source: 'native-mode-mismatch',
1199
- value: nativeConsensus(sessionId),
1200
- }], { cwd, sessionId });
1201
- assert.equal(mismatchedModeGate.complete, false);
1202
- assert.match(mismatchedModeGate.blockedDetails?.join(' ') ?? '', /thread-architect has mode=planner, expected architect/);
1203
- delete threads['thread-architect'].mode;
1204
- delete threads['thread-critic'].mode;
1205
- await writeFile(trackingPath, JSON.stringify(tracking, null, 2));
1206
- const rolelessLegacyGate = buildRalplanConsensusGateFromSources([{
1207
- source: 'native-roleless-legacy',
1208
- value: nativeConsensus(sessionId),
1209
- }], { cwd, sessionId });
1210
- assert.equal(rolelessLegacyGate.complete, true);
1211
- }
1212
- finally {
1213
- await rm(cwd, { recursive: true, force: true });
1214
- }
1215
- });
1216
- it('reads a tracker candidate once before evaluating native pair and individual evidence', async () => {
1217
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-native-read-once-'));
1218
- const sessionId = 'sess-native-consensus-read-once';
1219
- try {
1220
- await writeNativeSubagentTracking(cwd, sessionId);
1221
- const trackerPath = subagentTrackingPath(cwd);
1222
- const originalReadFileSync = fs.readFileSync;
1223
- let trackerReadCount = 0;
1224
- const readFileSync = mock.method(fs, 'readFileSync', ((...args) => {
1225
- if (args[0] === trackerPath)
1226
- trackerReadCount += 1;
1227
- return Reflect.apply(originalReadFileSync, fs, args);
1228
- }));
1229
- syncBuiltinESMExports();
1230
- try {
1231
- const gate = buildRalplanConsensusGateFromSources([
1232
- { source: 'native-read-once-first', value: nativeConsensus(sessionId) },
1233
- { source: 'native-read-once-second', value: nativeConsensus(sessionId) },
1234
- ], { cwd, sessionId });
1235
- assert.equal(gate.complete, true);
1236
- assert.equal(trackerReadCount, 1);
61
+ assert.equal(gate.source, 'newer-invalid');
62
+ assert.equal(gate.ralplan_architect_review?.sequence_index, 4);
63
+ assert.equal(gate.ralplan_critic_review?.sequence_index, 3);
64
+ });
65
+ for (const [name, value] of [
66
+ ['adapted provenance', withReviews({ ...nativeLifecycleReviews.ralplan_consensus_gate.ralplan_architect_review, provenance_kind: 'omx_adapted' }, nativeLifecycleReviews.ralplan_consensus_gate.ralplan_critic_review)],
67
+ ['roleless review', withReviews({ ...nativeLifecycleReviews.ralplan_consensus_gate.ralplan_architect_review, agent_role: undefined }, nativeLifecycleReviews.ralplan_consensus_gate.ralplan_critic_review)],
68
+ ['same thread', withReviews(nativeLifecycleReviews.ralplan_consensus_gate.ralplan_architect_review, { ...nativeLifecycleReviews.ralplan_consensus_gate.ralplan_critic_review, thread_id: 'architect-thread' })],
69
+ ['reversed order', withReviews({ ...nativeLifecycleReviews.ralplan_consensus_gate.ralplan_architect_review, sequence_index: 2 }, { ...nativeLifecycleReviews.ralplan_consensus_gate.ralplan_critic_review, sequence_index: 1 })],
70
+ ['history evidence', {
71
+ review_history: [{
72
+ architect_review: nativeLifecycleReviews.ralplan_consensus_gate.ralplan_architect_review,
73
+ critic_review: nativeLifecycleReviews.ralplan_consensus_gate.ralplan_critic_review,
74
+ }],
75
+ }],
76
+ ]) {
77
+ it(`keeps ${name} inert unless it is an ordered native lifecycle pair`, () => {
78
+ const gate = buildRalplanConsensusGateFromSources([{ source: name, value }]);
79
+ assert.equal(gate.complete, false);
80
+ assert.equal(gate.source, name);
81
+ if (name !== 'history evidence') {
82
+ assert.ok(gate.ralplan_architect_review);
83
+ assert.ok(gate.ralplan_critic_review);
1237
84
  }
1238
- finally {
1239
- readFileSync.mock.restore();
1240
- syncBuiltinESMExports();
1241
- }
1242
- }
1243
- finally {
1244
- await rm(cwd, { recursive: true, force: true });
1245
- }
1246
- });
1247
- it('rejects a native lane when the ledger role does not match its review role', async () => {
1248
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-native-role-'));
1249
- const sessionId = 'sess-native-consensus-role';
1250
- try {
1251
- await writeNativeSubagentTracking(cwd, sessionId, { architectRole: 'planner' });
1252
- const gate = buildRalplanConsensusGateFromSources([{
1253
- source: 'native-role-mismatch',
1254
- value: nativeConsensus(sessionId),
1255
- }], { cwd, sessionId });
1256
- assert.equal(gate.complete, false);
1257
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1258
- assert.match(gate.blockedDetails?.join(' ') ?? '', /thread-architect has role=planner, expected architect/);
1259
- }
1260
- finally {
1261
- await rm(cwd, { recursive: true, force: true });
1262
- }
1263
- });
1264
- it('rejects a native lane when strict tracker order is missing or reversed', async () => {
1265
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-native-order-'));
1266
- const missingSessionId = 'sess-native-consensus-missing-order';
1267
- const reversedSessionId = 'sess-native-consensus-reversed-order';
1268
- try {
1269
- await writeNativeSubagentTracking(cwd, missingSessionId, { criticFirstSeenAt: null });
1270
- const missingOrderGate = buildRalplanConsensusGateFromSources([{
1271
- source: 'native-missing-order',
1272
- value: nativeConsensus(missingSessionId),
1273
- }], { cwd, sessionId: missingSessionId });
1274
- assert.equal(missingOrderGate.complete, false);
1275
- assert.match(missingOrderGate.blockedDetails?.join(' ') ?? '', /tracker review order is missing.*critic first_seen_at/i);
1276
- await writeNativeSubagentTracking(cwd, reversedSessionId, {
1277
- architectCompletedAt: '2026-07-13T10:10:00.000Z',
1278
- criticFirstSeenAt: '2026-07-13T10:05:00.000Z',
1279
- criticCompletedAt: '2026-07-13T10:15:00.000Z',
1280
- });
1281
- const reversedOrderGate = buildRalplanConsensusGateFromSources([{
1282
- source: 'native-reversed-order',
1283
- value: nativeConsensus(reversedSessionId),
1284
- }], { cwd, sessionId: reversedSessionId });
1285
- assert.equal(reversedOrderGate.complete, false);
1286
- assert.match(reversedOrderGate.blockedDetails?.join(' ') ?? '', /tracker review order is reversed/i);
1287
- }
1288
- finally {
1289
- await rm(cwd, { recursive: true, force: true });
1290
- }
1291
- });
1292
- it('does not combine pair and individual native evidence from different tracker snapshots', async () => {
1293
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-native-snapshot-'));
1294
- const boxedRoot = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-native-snapshot-root-'));
1295
- const previousOmxStateRoot = process.env.OMX_STATE_ROOT;
1296
- const sessionId = 'sess-native-consensus-snapshot';
1297
- try {
1298
- process.env.OMX_STATE_ROOT = boxedRoot;
1299
- await writeNativeSubagentTracking(cwd, sessionId, { criticRole: 'planner' });
1300
- delete process.env.OMX_STATE_ROOT;
1301
- await writeNativeSubagentTracking(cwd, sessionId, { architectRole: 'planner' });
1302
- process.env.OMX_STATE_ROOT = boxedRoot;
1303
- const gate = buildRalplanConsensusGateFromSources([{
1304
- source: 'native-snapshot-mismatch',
1305
- value: nativeConsensus(sessionId),
1306
- }], { cwd, sessionId });
1307
- assert.equal(gate.complete, false);
1308
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1309
- }
1310
- finally {
1311
- if (previousOmxStateRoot === undefined)
1312
- delete process.env.OMX_STATE_ROOT;
1313
- else
1314
- process.env.OMX_STATE_ROOT = previousOmxStateRoot;
1315
- await rm(cwd, { recursive: true, force: true });
1316
- await rm(boxedRoot, { recursive: true, force: true });
1317
- }
1318
- });
1319
- it('rejects tracker-backed OMX-adapted Architect and Critic lanes even with valid legacy marker evidence', async () => {
1320
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-adapted-ok-'));
1321
- const sessionId = 'sess-adapted-consensus-ok';
1322
- try {
1323
- await writeAdaptedSubagentTracking(cwd, sessionId);
1324
- const consensus = adaptedConsensus(sessionId);
1325
- const reviews = consensus.ralplan_consensus_gate;
1326
- delete reviews.ralplan_architect_review.completed_at;
1327
- delete reviews.ralplan_critic_review.completed_at;
1328
- const gate = buildRalplanConsensusGateFromSources([{
1329
- source: 'adapted-consensus',
1330
- value: consensus,
1331
- }], { cwd, sessionId });
1332
- assert.equal(gate.complete, false);
1333
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1334
- assert.match(gate.blockedDetails?.join(' ') ?? '', /unsupported omx_adapted provenance/);
1335
- }
1336
- finally {
1337
- await rm(cwd, { recursive: true, force: true });
1338
- }
1339
- });
1340
- it('rejects an OMX-adapted lane when tracker order evidence is missing', async () => {
1341
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-adapted-no-order-'));
1342
- const sessionId = 'sess-adapted-consensus-no-order';
1343
- try {
1344
- await writeAdaptedSubagentTracking(cwd, sessionId, { criticFirstSeenAt: null });
1345
- const gate = buildRalplanConsensusGateFromSources([{
1346
- source: 'adapted-missing-order',
1347
- value: adaptedConsensus(sessionId),
1348
- }], { cwd, sessionId });
1349
- assert.equal(gate.complete, false);
1350
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1351
- assert.match(gate.blockedDetails?.join(' ') ?? '', /unsupported omx_adapted provenance/);
1352
- }
1353
- finally {
1354
- await rm(cwd, { recursive: true, force: true });
1355
- }
1356
- });
1357
- it('rejects forged OMX-adapted artifact timestamps when tracker ledger order is reversed', async () => {
1358
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-adapted-reversed-order-'));
1359
- const sessionId = 'sess-adapted-consensus-reversed-order';
1360
- try {
1361
- await writeAdaptedSubagentTracking(cwd, sessionId, {
1362
- architectCompletedAt: '2026-07-13T10:10:00.000Z',
1363
- criticFirstSeenAt: '2026-07-13T10:05:00.000Z',
1364
- criticCompletedAt: '2026-07-13T10:15:00.000Z',
1365
- });
1366
- const gate = buildRalplanConsensusGateFromSources([{
1367
- source: 'adapted-forged-artifact-order',
1368
- value: adaptedConsensus(sessionId, {
1369
- architect: { completed_at: '2026-07-13T09:00:00.000Z' },
1370
- critic: { completed_at: '2026-07-13T09:05:00.000Z' },
1371
- }),
1372
- }], { cwd, sessionId, requireNativeSubagents: true });
1373
- assert.equal(gate.complete, false);
1374
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1375
- assert.match(gate.blockedDetails?.join(' ') ?? '', /unsupported omx_adapted provenance/);
1376
- }
1377
- finally {
1378
- await rm(cwd, { recursive: true, force: true });
1379
- }
1380
- });
1381
- it('rejects an OMX-adapted lane when the ledger role does not match its review role', async () => {
1382
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-adapted-role-'));
1383
- const sessionId = 'sess-adapted-consensus-role';
1384
- try {
1385
- await writeAdaptedSubagentTracking(cwd, sessionId, { architectRole: 'critic' });
1386
- const gate = buildRalplanConsensusGateFromSources([{
1387
- source: 'adapted-role-mismatch',
1388
- value: adaptedConsensus(sessionId),
1389
- }], { cwd, sessionId, requireNativeSubagents: true });
1390
- assert.equal(gate.complete, false);
1391
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1392
- assert.match(gate.blockedDetails?.join(' ') ?? '', /unsupported omx_adapted provenance/);
1393
- }
1394
- finally {
1395
- await rm(cwd, { recursive: true, force: true });
1396
- }
1397
- });
1398
- it('rejects OMX-adapted reviews that reuse one tracker thread', async () => {
1399
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-adapted-reused-thread-'));
1400
- const sessionId = 'sess-adapted-consensus-reused-thread';
1401
- try {
1402
- await writeAdaptedSubagentTracking(cwd, sessionId);
1403
- const gate = buildRalplanConsensusGateFromSources([{
1404
- source: 'adapted-reused-thread',
1405
- value: adaptedConsensus(sessionId, {
1406
- critic: { thread_id: 'thread-architect' },
1407
- }),
1408
- }], { cwd, sessionId, requireNativeSubagents: true });
1409
- assert.equal(gate.complete, false);
1410
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1411
- assert.match(gate.blockedDetails?.join(' ') ?? '', /unsupported omx_adapted provenance/);
1412
- }
1413
- finally {
1414
- await rm(cwd, { recursive: true, force: true });
1415
- }
1416
- });
1417
- it('rejects OMX-adapted lanes without scoped role-routing-unavailable evidence', async () => {
1418
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-adapted-no-marker-'));
1419
- const sessionId = 'sess-adapted-consensus-no-marker';
1420
- try {
1421
- await writeAdaptedSubagentTracking(cwd, sessionId, { writeRoleRoutingMarker: false });
1422
- const gate = buildRalplanConsensusGateFromSources([{
1423
- source: 'adapted-missing-marker',
1424
- value: adaptedConsensus(sessionId),
1425
- }], { cwd, sessionId, requireNativeSubagents: true });
1426
- assert.equal(gate.complete, false);
1427
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1428
- assert.match(gate.blockedDetails?.join(' ') ?? '', /unsupported omx_adapted provenance/);
1429
- }
1430
- finally {
1431
- await rm(cwd, { recursive: true, force: true });
1432
- }
1433
- });
1434
- it('rejects a native-provenance artifact that points to OMX-adapted ledger threads', async () => {
1435
- const cwd = await mkdtemp(join(tmpdir(), 'omx-ralplan-consensus-adapted-native-claim-'));
1436
- const sessionId = 'sess-adapted-consensus-native-claim';
1437
- try {
1438
- await writeAdaptedSubagentTracking(cwd, sessionId);
1439
- const gate = buildRalplanConsensusGateFromSources([{
1440
- source: 'adapted-native-claim',
1441
- value: adaptedConsensus(sessionId, {
1442
- architect: { provenance_kind: 'native_subagent' },
1443
- critic: { provenance_kind: 'native_subagent' },
1444
- }),
1445
- }], { cwd, sessionId, requireNativeSubagents: true });
1446
- assert.equal(gate.complete, false);
1447
- assert.equal(gate.blockedReason, 'native_subagent_consensus_evidence_missing');
1448
- assert.match(gate.blockedDetails?.join(' ') ?? '', /conflicting with native_subagent review provenance/);
1449
- }
1450
- finally {
1451
- await rm(cwd, { recursive: true, force: true });
1452
- }
1453
- });
85
+ });
86
+ }
1454
87
  });
1455
88
  //# sourceMappingURL=consensus-gate.test.js.map