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