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,1361 +1,114 @@
1
- import assert from 'node:assert/strict';
2
1
  import { describe, it } from 'node:test';
3
- import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
4
- import { join } from 'node:path';
5
- import { tmpdir } from 'node:os';
6
- import { subagentTrackingPath } from '../../subagents/tracker.js';
2
+ import assert from 'node:assert/strict';
7
3
  import { buildAutopilotRalplanUltragoalGateError, canAdvanceAutopilotRalplanToUltragoal, } from '../ralplan-gate.js';
8
4
  import { buildRalplanConsensusGateFromSources } from '../../ralplan/consensus-gate.js';
5
+ const approvingLocalConsensus = {
6
+ complete: true,
7
+ sequence: ['architect-review', 'critic-review'],
8
+ ralplan_architect_review: {
9
+ agent_role: 'architect',
10
+ verdict: 'approve',
11
+ completed_at: '2026-06-12T10:02:00.000Z',
12
+ thread_id: 'architect-local-lifecycle',
13
+ provenance_kind: 'native_subagent',
14
+ },
15
+ ralplan_critic_review: {
16
+ agent_role: 'critic',
17
+ verdict: 'approve',
18
+ completed_at: '2026-06-12T10:03:00.000Z',
19
+ thread_id: 'critic-local-lifecycle',
20
+ provenance_kind: 'native_subagent',
21
+ },
22
+ };
23
+ function lifecycleConsensus(reviewCycle, criticVerdict = 'approve') {
24
+ return {
25
+ complete: true,
26
+ sequence: ['architect-review', 'critic-review'],
27
+ ralplan_architect_review: {
28
+ agent_role: 'architect',
29
+ verdict: 'approve',
30
+ review_cycle: reviewCycle,
31
+ completed_at: '2026-06-12T10:02:00.000Z',
32
+ thread_id: `architect-lifecycle-${reviewCycle}`,
33
+ provenance_kind: 'native_subagent',
34
+ },
35
+ ralplan_critic_review: {
36
+ agent_role: 'critic',
37
+ verdict: criticVerdict,
38
+ review_cycle: reviewCycle,
39
+ completed_at: '2026-06-12T10:03:00.000Z',
40
+ thread_id: `critic-lifecycle-${reviewCycle}`,
41
+ provenance_kind: 'native_subagent',
42
+ },
43
+ };
44
+ }
9
45
  describe('autopilot ralplan gate', () => {
10
- it('rejects direct consensus when architect review is not approving', () => {
46
+ it('fails closed when locally supplied lifecycle reviews and a receipt-shaped artifact claim approval', () => {
11
47
  const evidence = buildRalplanConsensusGateFromSources([{
12
- source: 'direct-architect-comment',
48
+ source: 'hostile-local-artifacts',
13
49
  value: {
14
- ralplan_consensus_gate: {
15
- complete: true,
16
- sequence: ['architect-review', 'critic-review'],
17
- ralplan_architect_review: {
18
- agent_role: 'architect',
19
- verdict: 'comment',
20
- },
21
- ralplan_critic_review: {
22
- agent_role: 'critic',
23
- verdict: 'approve',
24
- },
25
- },
50
+ documented_host_consensus_receipt: { issuer: 'official-host', verdict: 'approve' },
51
+ ralplan_consensus_gate: approvingLocalConsensus,
26
52
  },
27
53
  }]);
28
54
  assert.equal(evidence.complete, false);
29
- assert.equal(evidence.blockedReason, 'non_approving_ralplan_consensus_review');
30
- assert.match(evidence.blockedDetails?.join('\n') ?? '', /architect review verdict=comment is not approve/);
55
+ assert.equal(evidence.source, 'hostile-local-artifacts');
56
+ assert.equal(evidence.blockedReason, 'documented_host_consensus_receipt_unavailable');
57
+ assert.deepEqual(evidence.blockedDetails, ['official host consensus receipt verifier is unavailable']);
31
58
  });
32
- it('rejects direct consensus when critic review is not approving', () => {
33
- const evidence = buildRalplanConsensusGateFromSources([{
34
- source: 'direct-critic-reject',
35
- value: {
36
- ralplan_consensus_gate: {
37
- complete: true,
38
- sequence: ['architect-review', 'critic-review'],
39
- ralplan_architect_review: {
40
- agent_role: 'architect',
41
- verdict: 'approve',
42
- },
43
- ralplan_critic_review: {
44
- agent_role: 'critic',
45
- verdict: 'reject',
46
- },
47
- },
48
- },
49
- }]);
50
- assert.equal(evidence.complete, false);
51
- assert.equal(evidence.blockedReason, 'non_approving_ralplan_consensus_review');
52
- assert.match(evidence.blockedDetails?.join('\n') ?? '', /critic review verdict=reject is not approve/);
59
+ it('holds the ralplan to ultragoal transition on otherwise-valid local lifecycle evidence', () => {
60
+ const decision = canAdvanceAutopilotRalplanToUltragoal({
61
+ cwd: process.cwd(),
62
+ sessionId: 'hostile-local-consensus',
63
+ currentState: {
64
+ current_phase: 'ralplan',
65
+ handoff_artifacts: { ralplan_consensus_gate: approvingLocalConsensus },
66
+ },
67
+ });
68
+ assert.equal(decision.allowed, false);
69
+ assert.equal(decision.reason, 'documented_host_consensus_receipt_unavailable');
70
+ assert.match(buildAutopilotRalplanUltragoalGateError(decision), /official host consensus receipt verifier is unavailable/i);
53
71
  });
54
- it('accepts direct consensus when architect and critic reviews approve in order', () => {
72
+ it('retains the fail-closed diagnostic for malformed local lifecycle evidence', () => {
55
73
  const evidence = buildRalplanConsensusGateFromSources([{
56
- source: 'direct-approval',
74
+ source: 'malformed-local-lifecycle',
57
75
  value: {
58
76
  ralplan_consensus_gate: {
59
77
  complete: true,
60
- sequence: ['architect-review', 'critic-review'],
61
- ralplan_architect_review: {
62
- agent_role: 'architect',
63
- verdict: 'approve',
64
- completed_at: '2026-06-12T10:02:00.000Z',
65
- },
66
- ralplan_critic_review: {
67
- agent_role: 'critic',
68
- verdict: 'approve',
69
- completed_at: '2026-06-12T10:03:00.000Z',
70
- },
78
+ sequence: ['critic-review', 'architect-review'],
79
+ ralplan_architect_review: { agent_role: 'critic', verdict: 'approve' },
80
+ ralplan_critic_review: { agent_role: 'architect', verdict: 'iterate' },
71
81
  },
72
82
  },
73
83
  }]);
74
- assert.equal(evidence.complete, true);
75
- assert.equal(evidence.blockedReason, null);
76
- assert.equal(evidence.source, 'direct-approval');
84
+ assert.equal(evidence.complete, false);
85
+ assert.equal(evidence.blockedReason, 'documented_host_consensus_receipt_unavailable');
77
86
  });
78
- it('rejects missing tracker-backed native evidence by default for autopilot ralplan to ultragoal', () => {
87
+ it('retains current-state lifecycle diagnostics when next state has no consensus source', () => {
79
88
  const decision = canAdvanceAutopilotRalplanToUltragoal({
80
89
  cwd: process.cwd(),
81
- sessionId: 'sess-default-native-required',
82
- nextState: {
83
- active: true,
84
- mode: 'autopilot',
85
- current_phase: 'ultragoal',
86
- ralplan_consensus_gate: {
87
- complete: true,
88
- sequence: ['architect-review', 'critic-review'],
89
- ralplan_architect_review: {
90
- agent_role: 'architect',
91
- provenance_kind: 'codex_exec',
92
- verdict: 'approve',
93
- session_id: 'sess-default-native-required',
94
- thread_id: 'exec-architect',
95
- completed_at: '2026-06-12T10:02:00.000Z',
96
- },
97
- ralplan_critic_review: {
98
- agent_role: 'critic',
99
- provenance_kind: 'codex_exec',
100
- verdict: 'approve',
101
- session_id: 'sess-default-native-required',
102
- thread_id: 'exec-critic',
103
- completed_at: '2026-06-12T10:03:00.000Z',
104
- },
105
- },
106
- },
90
+ currentState: { ralplan_consensus_gate: lifecycleConsensus(1) },
91
+ nextState: { current_phase: 'ultragoal' },
107
92
  });
108
93
  assert.equal(decision.allowed, false);
109
- assert.match(decision.reason, /tracker-backed native architect and critic lanes/);
110
- });
111
- it('accepts fresh valid consensus before stale invalid consensus', () => {
112
- const evidence = buildRalplanConsensusGateFromSources([
113
- {
114
- source: 'fresh-valid',
115
- value: {
116
- ralplan_consensus_gate: {
117
- complete: true,
118
- sequence: ['architect-review', 'critic-review'],
119
- ralplan_architect_review: {
120
- agent_role: 'architect',
121
- verdict: 'approve',
122
- completed_at: '2026-06-12T10:02:00.000Z',
123
- },
124
- ralplan_critic_review: {
125
- agent_role: 'critic',
126
- verdict: 'approve',
127
- completed_at: '2026-06-12T10:03:00.000Z',
128
- },
129
- },
130
- },
131
- },
132
- {
133
- source: 'stale-invalid',
134
- value: {
135
- ralplan_consensus_gate: {
136
- complete: true,
137
- sequence: ['architect-review', 'critic-review'],
138
- ralplan_architect_review: {
139
- agent_role: 'architect',
140
- verdict: 'iterate',
141
- completed_at: '2026-06-12T09:58:00.000Z',
142
- },
143
- ralplan_critic_review: {
144
- agent_role: 'critic',
145
- verdict: 'approve',
146
- completed_at: '2026-06-12T09:59:00.000Z',
147
- },
148
- },
149
- },
150
- },
151
- ]);
152
- assert.equal(evidence.complete, true);
153
- assert.equal(evidence.blockedReason, null);
154
- assert.equal(evidence.source, 'fresh-valid');
155
- });
156
- it('rejects invalid next-state complete consensus before falling back to older valid current state', async () => {
157
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-next-invalid-terminal-'));
158
- const sessionId = 'sess-autopilot-next-invalid-terminal';
159
- const trackingPath = subagentTrackingPath(cwd);
160
- try {
161
- await mkdir(join(trackingPath, '..'), { recursive: true });
162
- await writeFile(trackingPath, JSON.stringify({
163
- schemaVersion: 1,
164
- sessions: {
165
- [sessionId]: {
166
- session_id: sessionId,
167
- leader_thread_id: 'thread-leader',
168
- updated_at: '2026-06-12T10:00:00.000Z',
169
- threads: {
170
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
171
- 'thread-architect-old': { thread_id: 'thread-architect-old', kind: 'subagent', first_seen_at: '2026-06-12T09:59:30.000Z', last_seen_at: '2026-06-12T09:59:30.000Z', completed_at: '2026-06-12T09:59:30.000Z', turn_count: 1 },
172
- 'thread-critic-old': { thread_id: 'thread-critic-old', kind: 'subagent', first_seen_at: '2026-06-12T10:00:00.000Z', last_seen_at: '2026-06-12T10:00:00.000Z', completed_at: '2026-06-12T10:00:00.000Z', turn_count: 1 },
173
- },
174
- },
175
- },
176
- }, null, 2));
177
- const nextState = {
178
- current_phase: 'ralplan',
179
- return_to_ralplan_reason: 'Code review requested a plan update.',
180
- handoff_artifacts: {
181
- ralplan_consensus_gate: {
182
- complete: true,
183
- sequence: ['architect-review', 'critic-review'],
184
- ralplan_architect_review: {
185
- agent_role: 'architect',
186
- provenance_kind: 'native_subagent',
187
- verdict: 'iterate',
188
- session_id: sessionId,
189
- thread_id: 'thread-architect-new',
190
- artifact_path: '.omx/artifacts/architect-new.md',
191
- tracker_path: '.omx/state/subagent-tracking.json',
192
- completed_at: '2026-06-12T10:01:00.000Z',
193
- },
194
- ralplan_critic_review: {
195
- agent_role: 'critic',
196
- provenance_kind: 'native_subagent',
197
- verdict: 'approve',
198
- session_id: sessionId,
199
- thread_id: 'thread-critic-new',
200
- artifact_path: '.omx/artifacts/critic-new.md',
201
- tracker_path: '.omx/state/subagent-tracking.json',
202
- completed_at: '2026-06-12T10:02:00.000Z',
203
- },
204
- },
205
- },
206
- };
207
- const currentState = {
208
- current_phase: 'ralplan',
209
- handoff_artifacts: {
210
- ralplan_consensus_gate: {
211
- complete: true,
212
- sequence: ['architect-review', 'critic-review'],
213
- ralplan_architect_review: {
214
- agent_role: 'architect',
215
- provenance_kind: 'native_subagent',
216
- verdict: 'approve',
217
- session_id: sessionId,
218
- thread_id: 'thread-architect-old',
219
- artifact_path: '.omx/artifacts/architect-old.md',
220
- tracker_path: '.omx/state/subagent-tracking.json',
221
- completed_at: '2026-06-12T09:59:30.000Z',
222
- },
223
- ralplan_critic_review: {
224
- agent_role: 'critic',
225
- provenance_kind: 'native_subagent',
226
- verdict: 'approve',
227
- session_id: sessionId,
228
- thread_id: 'thread-critic-old',
229
- artifact_path: '.omx/artifacts/critic-old.md',
230
- tracker_path: '.omx/state/subagent-tracking.json',
231
- completed_at: '2026-06-12T10:00:00.000Z',
232
- },
233
- },
234
- },
235
- };
236
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, nextState, currentState });
237
- assert.equal(decision.allowed, false);
238
- assert.equal(decision.evidence?.source, 'next-autopilot-state:handoff_artifacts');
239
- assert.equal(decision.evidence?.blockedReason, 'non_approving_ralplan_consensus_review');
240
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /architect.*verdict=iterate/i);
241
- }
242
- finally {
243
- await rm(cwd, { recursive: true, force: true });
244
- }
94
+ assert.equal(decision.reason, 'documented_host_consensus_receipt_unavailable');
95
+ assert.equal(decision.evidence?.source, 'current-autopilot-state');
96
+ assert.equal(decision.evidence?.ralplan_architect_review?.review_cycle, 1);
97
+ assert.equal(decision.evidence?.ralplan_critic_review?.review_cycle, 1);
98
+ assert.match(buildAutopilotRalplanUltragoalGateError(decision), /official host consensus receipt verifier is unavailable/i);
245
99
  });
246
- it('rejects ordered invalid next-state direct consensus before older valid current state', async () => {
247
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-next-invalid-direct-'));
248
- const sessionId = 'sess-autopilot-next-invalid-direct';
249
- const trackingPath = subagentTrackingPath(cwd);
250
- try {
251
- await mkdir(join(trackingPath, '..'), { recursive: true });
252
- await writeFile(trackingPath, JSON.stringify({
253
- schemaVersion: 1,
254
- sessions: {
255
- [sessionId]: {
256
- session_id: sessionId,
257
- leader_thread_id: 'thread-leader',
258
- updated_at: '2026-06-12T10:05:00.000Z',
259
- threads: {
260
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
261
- 'thread-architect-old': { thread_id: 'thread-architect-old', kind: 'subagent', first_seen_at: '2026-06-12T09:59:30.000Z', last_seen_at: '2026-06-12T09:59:30.000Z', completed_at: '2026-06-12T09:59:30.000Z', turn_count: 1 },
262
- 'thread-critic-old': { thread_id: 'thread-critic-old', kind: 'subagent', first_seen_at: '2026-06-12T10:00:00.000Z', last_seen_at: '2026-06-12T10:00:00.000Z', completed_at: '2026-06-12T10:00:00.000Z', turn_count: 1 },
263
- },
264
- },
265
- },
266
- }, null, 2));
267
- const nextState = {
268
- current_phase: 'ralplan',
269
- return_to_ralplan_reason: 'Code review requested a plan update.',
270
- ralplan_consensus_gate: {
271
- complete: true,
272
- sequence: ['architect-review', 'critic-review'],
273
- ralplan_architect_review: {
274
- agent_role: 'architect',
275
- provenance_kind: 'native_subagent',
276
- verdict: 'iterate',
277
- session_id: sessionId,
278
- thread_id: 'thread-architect-new',
279
- artifact_path: '.omx/artifacts/architect-new.md',
280
- tracker_path: '.omx/state/subagent-tracking.json',
281
- completed_at: '2026-06-12T10:04:00.000Z',
282
- },
283
- ralplan_critic_review: {
284
- agent_role: 'critic',
285
- provenance_kind: 'native_subagent',
286
- verdict: 'approve',
287
- session_id: sessionId,
288
- thread_id: 'thread-critic-new',
289
- artifact_path: '.omx/artifacts/critic-new.md',
290
- tracker_path: '.omx/state/subagent-tracking.json',
291
- completed_at: '2026-06-12T10:05:00.000Z',
292
- },
293
- },
294
- };
295
- const currentState = {
296
- current_phase: 'ralplan',
297
- handoff_artifacts: {
298
- ralplan_consensus_gate: {
299
- complete: true,
300
- sequence: ['architect-review', 'critic-review'],
301
- ralplan_architect_review: {
302
- agent_role: 'architect',
303
- provenance_kind: 'native_subagent',
304
- verdict: 'approve',
305
- session_id: sessionId,
306
- thread_id: 'thread-architect-old',
307
- artifact_path: '.omx/artifacts/architect-old.md',
308
- tracker_path: '.omx/state/subagent-tracking.json',
309
- completed_at: '2026-06-12T09:59:30.000Z',
310
- },
311
- ralplan_critic_review: {
312
- agent_role: 'critic',
313
- provenance_kind: 'native_subagent',
314
- verdict: 'approve',
315
- session_id: sessionId,
316
- thread_id: 'thread-critic-old',
317
- artifact_path: '.omx/artifacts/critic-old.md',
318
- tracker_path: '.omx/state/subagent-tracking.json',
319
- completed_at: '2026-06-12T10:00:00.000Z',
320
- },
321
- },
322
- },
323
- };
324
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, nextState, currentState });
325
- assert.equal(decision.allowed, false);
326
- assert.equal(decision.evidence?.source, 'next-autopilot-state');
327
- assert.equal(decision.evidence?.blockedReason, 'non_approving_ralplan_consensus_review');
328
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /architect.*verdict=iterate/i);
329
- }
330
- finally {
331
- await rm(cwd, { recursive: true, force: true });
332
- }
333
- });
334
- it('rejects stale nested ralplan handoff consensus when parent state returned to ralplan', async () => {
335
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-stale-nested-'));
336
- const sessionId = 'sess-autopilot-stale-nested';
337
- const trackingPath = subagentTrackingPath(cwd);
338
- try {
339
- await mkdir(join(trackingPath, '..'), { recursive: true });
340
- await writeFile(trackingPath, JSON.stringify({
341
- schemaVersion: 1,
342
- sessions: {
343
- [sessionId]: {
344
- session_id: sessionId,
345
- leader_thread_id: 'thread-leader',
346
- updated_at: '2026-06-12T10:00:00.000Z',
347
- threads: {
348
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
349
- 'thread-architect-stale': { thread_id: 'thread-architect-stale', kind: 'subagent', first_seen_at: '2026-06-12T09:59:30.000Z', last_seen_at: '2026-06-12T09:59:30.000Z', completed_at: '2026-06-12T09:59:30.000Z', turn_count: 1 },
350
- 'thread-critic-stale': { thread_id: 'thread-critic-stale', kind: 'subagent', first_seen_at: '2026-06-12T10:00:00.000Z', last_seen_at: '2026-06-12T10:00:00.000Z', completed_at: '2026-06-12T10:00:00.000Z', turn_count: 1 },
351
- },
352
- },
353
- },
354
- }, null, 2));
355
- const nextState = {
356
- current_phase: 'ralplan',
357
- return_to_ralplan_reason: 'Code review requested a plan update.',
358
- review_cycle: 2,
359
- handoff_artifacts: {
360
- ralplan: {
361
- review_cycle: 2,
362
- ralplanConsensusGate: {
363
- complete: true,
364
- sequence: ['architect-review', 'critic-review'],
365
- ralplan_architect_review: {
366
- agent_role: 'architect',
367
- provenance_kind: 'native_subagent',
368
- verdict: 'approve',
369
- session_id: sessionId,
370
- thread_id: 'thread-architect-stale',
371
- artifact_path: '.omx/artifacts/architect-stale.md',
372
- tracker_path: '.omx/state/subagent-tracking.json',
373
- completed_at: '2026-06-12T09:59:30.000Z',
374
- },
375
- ralplan_critic_review: {
376
- agent_role: 'critic',
377
- provenance_kind: 'native_subagent',
378
- verdict: 'approve',
379
- session_id: sessionId,
380
- thread_id: 'thread-critic-stale',
381
- artifact_path: '.omx/artifacts/critic-stale.md',
382
- tracker_path: '.omx/state/subagent-tracking.json',
383
- completed_at: '2026-06-12T10:00:00.000Z',
384
- },
385
- },
386
- },
387
- },
388
- };
389
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, nextState });
390
- assert.equal(decision.allowed, false);
391
- assert.equal(decision.evidence?.blockedReason, 'missing_sequential_architect_then_critic_approval');
392
- }
393
- finally {
394
- await rm(cwd, { recursive: true, force: true });
395
- }
396
- });
397
- it('rejects stale raw handoff consensus when parent state returned to ralplan', async () => {
398
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-stale-raw-handoff-'));
399
- const sessionId = 'sess-autopilot-stale-raw-handoff';
400
- const trackingPath = subagentTrackingPath(cwd);
401
- try {
402
- await mkdir(join(trackingPath, '..'), { recursive: true });
403
- await writeFile(trackingPath, JSON.stringify({
404
- schemaVersion: 1,
405
- sessions: {
406
- [sessionId]: {
407
- session_id: sessionId,
408
- leader_thread_id: 'thread-leader',
409
- updated_at: '2026-06-12T10:00:00.000Z',
410
- threads: {
411
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
412
- 'thread-architect-stale': { thread_id: 'thread-architect-stale', kind: 'subagent', first_seen_at: '2026-06-12T09:59:30.000Z', last_seen_at: '2026-06-12T09:59:30.000Z', completed_at: '2026-06-12T09:59:30.000Z', turn_count: 1 },
413
- 'thread-critic-stale': { thread_id: 'thread-critic-stale', kind: 'subagent', first_seen_at: '2026-06-12T10:00:00.000Z', last_seen_at: '2026-06-12T10:00:00.000Z', completed_at: '2026-06-12T10:00:00.000Z', turn_count: 1 },
414
- },
415
- },
416
- },
417
- }, null, 2));
418
- const currentState = {
419
- current_phase: 'ralplan',
420
- return_to_ralplan_reason: 'Code review requested a plan update.',
421
- review_cycle: 1,
422
- handoff_artifacts: {
423
- ralplan_consensus_gate: {
424
- complete: true,
425
- sequence: ['architect-review', 'critic-review'],
426
- ralplan_architect_review: {
427
- agent_role: 'architect',
428
- provenance_kind: 'native_subagent',
429
- verdict: 'approve',
430
- session_id: sessionId,
431
- thread_id: 'thread-architect-stale',
432
- artifact_path: '.omx/artifacts/architect-stale.md',
433
- tracker_path: '.omx/state/subagent-tracking.json',
434
- completed_at: '2026-06-12T09:59:30.000Z',
435
- },
436
- ralplan_critic_review: {
437
- agent_role: 'critic',
438
- provenance_kind: 'native_subagent',
439
- verdict: 'approve',
440
- session_id: sessionId,
441
- thread_id: 'thread-critic-stale',
442
- artifact_path: '.omx/artifacts/critic-stale.md',
443
- tracker_path: '.omx/state/subagent-tracking.json',
444
- completed_at: '2026-06-12T10:00:00.000Z',
445
- },
446
- },
447
- },
448
- };
449
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState });
450
- assert.equal(decision.allowed, false);
451
- assert.equal(decision.evidence?.blockedReason, 'missing_sequential_architect_then_critic_approval');
452
- }
453
- finally {
454
- await rm(cwd, { recursive: true, force: true });
455
- }
456
- });
457
- for (const { lane, architectVerdict, criticVerdict } of [
458
- { lane: 'architect', architectVerdict: 'iterate', criticVerdict: 'approve' },
459
- { lane: 'critic', architectVerdict: 'approve', criticVerdict: 'iterate' },
460
- ]) {
461
- it(`rejects complete ralplan consensus when ${lane} review verdict is iterate`, () => {
462
- const state = {
463
- current_phase: 'ralplan',
464
- handoff_artifacts: {
465
- ralplan_consensus_gate: {
466
- complete: true,
467
- sequence: ['architect-review', 'critic-review'],
468
- ralplan_architect_review: {
469
- agent_role: 'architect',
470
- provenance_kind: 'native_subagent',
471
- verdict: architectVerdict,
472
- session_id: 'sess-autopilot-iterate',
473
- thread_id: 'thread-architect',
474
- artifact_path: '.omx/artifacts/architect.md',
475
- tracker_path: '.omx/state/subagent-tracking.json',
476
- completed_at: '2026-05-28T18:34:51.000Z',
477
- },
478
- ralplan_critic_review: {
479
- agent_role: 'critic',
480
- provenance_kind: 'native_subagent',
481
- verdict: criticVerdict,
482
- session_id: 'sess-autopilot-iterate',
483
- thread_id: 'thread-critic',
484
- artifact_path: '.omx/artifacts/critic.md',
485
- tracker_path: '.omx/state/subagent-tracking.json',
486
- completed_at: '2026-05-28T18:35:10.000Z',
487
- },
488
- },
489
- },
490
- };
491
- const decision = canAdvanceAutopilotRalplanToUltragoal({
492
- cwd: process.cwd(),
493
- sessionId: 'sess-autopilot-iterate',
494
- currentState: state,
495
- });
496
- assert.equal(decision.allowed, false);
497
- assert.equal(decision.evidence?.blockedReason, 'non_approving_ralplan_consensus_review');
498
- const error = buildAutopilotRalplanUltragoalGateError(decision);
499
- assert.match(error, /non-approving architect or critic review evidence/i);
500
- assert.doesNotMatch(error, /missing ralplan consensus gate/i);
501
- assert.match(error, new RegExp(`${lane}.*verdict=iterate`, 'i'));
100
+ it('keeps a newer invalid next-state lifecycle record ahead of older current-state reviews', () => {
101
+ const decision = canAdvanceAutopilotRalplanToUltragoal({
102
+ cwd: process.cwd(),
103
+ currentState: { ralplan_consensus_gate: lifecycleConsensus(1) },
104
+ nextState: { ralplan_consensus_gate: lifecycleConsensus(2, 'iterate') },
502
105
  });
503
- }
504
- it('accepts fresh next-state consensus over stale invalid current-state consensus', async () => {
505
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-fresh-next-valid-'));
506
- const sessionId = 'sess-autopilot-fresh-next-valid';
507
- const trackingPath = subagentTrackingPath(cwd);
508
- try {
509
- await mkdir(join(trackingPath, '..'), { recursive: true });
510
- await writeFile(trackingPath, JSON.stringify({
511
- schemaVersion: 1,
512
- sessions: {
513
- [sessionId]: {
514
- session_id: sessionId,
515
- leader_thread_id: 'thread-leader',
516
- updated_at: '2026-06-12T10:03:00.000Z',
517
- threads: {
518
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
519
- 'thread-architect-fresh': { thread_id: 'thread-architect-fresh', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:02:00.000Z', completed_at: '2026-06-12T10:02:00.000Z', turn_count: 1, mode: 'architect' },
520
- 'thread-critic-fresh': { thread_id: 'thread-critic-fresh', kind: 'subagent', first_seen_at: '2026-06-12T10:03:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1, mode: 'critic' },
521
- },
522
- },
523
- },
524
- }, null, 2));
525
- const nextState = {
526
- current_phase: 'ralplan',
527
- review_cycle: 2,
528
- handoff_artifacts: {
529
- ralplan_consensus_gate: {
530
- complete: true,
531
- sequence: ['architect-review', 'critic-review'],
532
- ralplan_architect_review: {
533
- agent_role: 'architect',
534
- provenance_kind: 'native_subagent',
535
- verdict: 'approve',
536
- review_cycle: 2,
537
- session_id: sessionId,
538
- thread_id: 'thread-architect-fresh',
539
- artifact_path: '.omx/artifacts/architect-fresh.md',
540
- tracker_path: '.omx/state/subagent-tracking.json',
541
- completed_at: '2026-06-12T10:02:00.000Z',
542
- },
543
- ralplan_critic_review: {
544
- agent_role: 'critic',
545
- provenance_kind: 'native_subagent',
546
- verdict: 'approve',
547
- review_cycle: 2,
548
- session_id: sessionId,
549
- thread_id: 'thread-critic-fresh',
550
- artifact_path: '.omx/artifacts/critic-fresh.md',
551
- tracker_path: '.omx/state/subagent-tracking.json',
552
- completed_at: '2026-06-12T10:03:00.000Z',
553
- },
554
- },
555
- },
556
- };
557
- const currentState = {
558
- current_phase: 'ralplan',
559
- return_to_ralplan_reason: 'Code review requested a plan update.',
560
- review_cycle: 1,
561
- handoff_artifacts: {
562
- ralplan_consensus_gate: {
563
- complete: true,
564
- sequence: ['architect-review', 'critic-review'],
565
- ralplan_architect_review: {
566
- agent_role: 'architect',
567
- provenance_kind: 'native_subagent',
568
- verdict: 'block',
569
- review_cycle: 1,
570
- session_id: sessionId,
571
- thread_id: 'thread-architect-stale',
572
- artifact_path: '.omx/artifacts/architect-stale.md',
573
- tracker_path: '.omx/state/subagent-tracking.json',
574
- completed_at: '2026-06-12T10:00:00.000Z',
575
- },
576
- ralplan_critic_review: {
577
- agent_role: 'critic',
578
- provenance_kind: 'native_subagent',
579
- verdict: 'approve',
580
- review_cycle: 1,
581
- session_id: sessionId,
582
- thread_id: 'thread-critic-stale',
583
- artifact_path: '.omx/artifacts/critic-stale.md',
584
- tracker_path: '.omx/state/subagent-tracking.json',
585
- completed_at: '2026-06-12T10:01:00.000Z',
586
- },
587
- },
588
- },
589
- };
590
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, nextState, currentState });
591
- assert.equal(decision.allowed, true);
592
- assert.equal(decision.evidence?.source, 'next-autopilot-state');
593
- assert.equal(decision.evidence?.blockedReason, null);
594
- }
595
- finally {
596
- await rm(cwd, { recursive: true, force: true });
597
- }
598
- });
599
- it('accepts tracker-backed native reviews without duplicated session, tracker, or artifact fields', async () => {
600
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-tracker-resolved-'));
601
- const sessionId = 'sess-autopilot-tracker-resolved';
602
- const trackingPath = subagentTrackingPath(cwd);
603
- try {
604
- await mkdir(join(trackingPath, '..'), { recursive: true });
605
- await writeFile(trackingPath, JSON.stringify({
606
- schemaVersion: 1,
607
- sessions: {
608
- [sessionId]: {
609
- session_id: sessionId,
610
- leader_thread_id: 'thread-leader',
611
- updated_at: '2026-06-12T10:03:00.000Z',
612
- threads: {
613
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
614
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:02:00.000Z', completed_at: '2026-06-12T10:02:00.000Z', turn_count: 1, mode: 'architect' },
615
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-06-12T10:03:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1, mode: 'critic' },
616
- },
617
- },
618
- },
619
- }, null, 2));
620
- const state = {
621
- current_phase: 'ralplan',
622
- handoff_artifacts: {
623
- ralplan_consensus_gate: {
624
- complete: true,
625
- sequence: ['architect-review', 'critic-review'],
626
- ralplan_architect_review: {
627
- agent_role: 'architect',
628
- provenance_kind: 'native_subagent',
629
- verdict: 'approve',
630
- thread_id: 'thread-architect',
631
- completed_at: '2026-06-12T10:02:00.000Z',
632
- },
633
- ralplan_critic_review: {
634
- agent_role: 'critic',
635
- provenance_kind: 'native_subagent',
636
- verdict: 'approve',
637
- thread_id: 'thread-critic',
638
- completed_at: '2026-06-12T10:03:00.000Z',
639
- },
640
- },
641
- },
642
- };
643
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
644
- assert.equal(decision.allowed, true);
645
- assert.equal(decision.evidence?.blockedReason, null);
646
- }
647
- finally {
648
- await rm(cwd, { recursive: true, force: true });
649
- }
650
- });
651
- it('rejects unsupported native evidence even with tracker-backed native consensus', async () => {
652
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-unsupported-veto-'));
653
- const sessionId = 'sess-autopilot-unsupported-veto';
654
- const trackingPath = subagentTrackingPath(cwd);
655
- try {
656
- await mkdir(join(trackingPath, '..'), { recursive: true });
657
- await writeFile(trackingPath, JSON.stringify({
658
- schemaVersion: 1,
659
- sessions: {
660
- [sessionId]: {
661
- session_id: sessionId,
662
- leader_thread_id: 'thread-leader',
663
- updated_at: '2026-06-12T10:03:00.000Z',
664
- threads: {
665
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
666
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:02:00.000Z', completed_at: '2026-06-12T10:02:00.000Z', turn_count: 1 },
667
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-06-12T10:03:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1 },
668
- },
669
- },
670
- },
671
- }, null, 2));
672
- const state = {
673
- current_phase: 'ralplan',
674
- handoff_artifacts: {
675
- ralplan: {
676
- native_subagent_support: {
677
- status: 'unsupported',
678
- reason: 'multi_agent_v1_unavailable',
679
- source: 'post_tool_failure',
680
- },
681
- },
682
- ralplan_consensus_gate: {
683
- complete: true,
684
- sequence: ['architect-review', 'critic-review'],
685
- ralplan_architect_review: {
686
- agent_role: 'architect',
687
- provenance_kind: 'native_subagent',
688
- verdict: 'approve',
689
- thread_id: 'thread-architect',
690
- completed_at: '2026-06-12T10:02:00.000Z',
691
- },
692
- ralplan_critic_review: {
693
- agent_role: 'critic',
694
- provenance_kind: 'native_subagent',
695
- verdict: 'approve',
696
- thread_id: 'thread-critic',
697
- completed_at: '2026-06-12T10:03:00.000Z',
698
- },
699
- },
700
- },
701
- };
702
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
703
- assert.equal(decision.allowed, false);
704
- assert.match(decision.reason, /terminalize non-clean/);
705
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /blocked\/cancelled\/failed/);
706
- }
707
- finally {
708
- await rm(cwd, { recursive: true, force: true });
709
- }
710
- });
711
- it('rejects handoff-root unsupported native evidence even with tracker-backed native consensus', async () => {
712
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-unsupported-root-veto-'));
713
- const sessionId = 'sess-autopilot-unsupported-root-veto';
714
- const trackingPath = subagentTrackingPath(cwd);
715
- try {
716
- await mkdir(join(trackingPath, '..'), { recursive: true });
717
- await writeFile(trackingPath, JSON.stringify({
718
- schemaVersion: 1,
719
- sessions: {
720
- [sessionId]: {
721
- session_id: sessionId,
722
- leader_thread_id: 'thread-leader',
723
- updated_at: '2026-06-12T10:03:00.000Z',
724
- threads: {
725
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
726
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:02:00.000Z', completed_at: '2026-06-12T10:02:00.000Z', turn_count: 1 },
727
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-06-12T10:03:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1 },
728
- },
729
- },
730
- },
731
- }, null, 2));
732
- const state = {
733
- current_phase: 'ralplan',
734
- handoff_artifacts: {
735
- native_subagent_support: {
736
- status: 'unsupported',
737
- reason: 'multi_agent_v1_unavailable',
738
- source: 'post_tool_failure',
739
- },
740
- ralplan_consensus_gate: {
741
- complete: true,
742
- sequence: ['architect-review', 'critic-review'],
743
- ralplan_architect_review: {
744
- agent_role: 'architect',
745
- provenance_kind: 'native_subagent',
746
- verdict: 'approve',
747
- thread_id: 'thread-architect',
748
- completed_at: '2026-06-12T10:02:00.000Z',
749
- },
750
- ralplan_critic_review: {
751
- agent_role: 'critic',
752
- provenance_kind: 'native_subagent',
753
- verdict: 'approve',
754
- thread_id: 'thread-critic',
755
- completed_at: '2026-06-12T10:03:00.000Z',
756
- },
757
- },
758
- },
759
- };
760
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
761
- assert.equal(decision.allowed, false);
762
- assert.match(decision.reason, /terminalize non-clean/);
763
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /blocked\/cancelled\/failed/);
764
- }
765
- finally {
766
- await rm(cwd, { recursive: true, force: true });
767
- }
768
- });
769
- it('rejects omitted review session ids when no transition session context exists', async () => {
770
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-no-session-context-'));
771
- const trackingPath = subagentTrackingPath(cwd);
772
- try {
773
- await mkdir(join(trackingPath, '..'), { recursive: true });
774
- await writeFile(trackingPath, JSON.stringify({
775
- schemaVersion: 1,
776
- sessions: {},
777
- }, null, 2));
778
- const state = {
779
- current_phase: 'ralplan',
780
- handoff_artifacts: {
781
- ralplan_consensus_gate: {
782
- complete: true,
783
- sequence: ['architect-review', 'critic-review'],
784
- ralplan_architect_review: {
785
- agent_role: 'architect',
786
- provenance_kind: 'native_subagent',
787
- verdict: 'approve',
788
- thread_id: 'thread-architect',
789
- },
790
- ralplan_critic_review: {
791
- agent_role: 'critic',
792
- provenance_kind: 'native_subagent',
793
- verdict: 'approve',
794
- thread_id: 'thread-critic',
795
- },
796
- },
797
- },
798
- };
799
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, currentState: state });
800
- assert.equal(decision.allowed, false);
801
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /cannot resolve session_id/);
802
- }
803
- finally {
804
- await rm(cwd, { recursive: true, force: true });
805
- }
806
- });
807
- it('rejects architect and critic reviews that reuse the same native tracker thread', async () => {
808
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-duplicate-thread-'));
809
- const sessionId = 'sess-autopilot-duplicate-thread';
810
- const trackingPath = subagentTrackingPath(cwd);
811
- try {
812
- await mkdir(join(trackingPath, '..'), { recursive: true });
813
- await writeFile(trackingPath, JSON.stringify({
814
- schemaVersion: 1,
815
- sessions: {
816
- [sessionId]: {
817
- session_id: sessionId,
818
- leader_thread_id: 'thread-leader',
819
- updated_at: '2026-06-12T10:03:00.000Z',
820
- threads: {
821
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
822
- 'thread-reviewer': { thread_id: 'thread-reviewer', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1 },
823
- },
824
- },
825
- },
826
- }, null, 2));
827
- const state = {
828
- current_phase: 'ralplan',
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
- provenance_kind: 'native_subagent',
836
- verdict: 'approve',
837
- session_id: sessionId,
838
- thread_id: 'thread-reviewer',
839
- completed_at: '2026-06-12T10:02:00.000Z',
840
- },
841
- ralplan_critic_review: {
842
- agent_role: 'critic',
843
- provenance_kind: 'native_subagent',
844
- verdict: 'approve',
845
- session_id: sessionId,
846
- thread_id: 'thread-reviewer',
847
- completed_at: '2026-06-12T10:03:00.000Z',
848
- },
849
- },
850
- },
851
- };
852
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
853
- assert.equal(decision.allowed, false);
854
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /distinct native subagent tracker threads/);
855
- }
856
- finally {
857
- await rm(cwd, { recursive: true, force: true });
858
- }
859
- });
860
- it('rejects tracker-backed native reviews composed from different sessions', async () => {
861
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-cross-session-'));
862
- const trackingPath = subagentTrackingPath(cwd);
863
- try {
864
- await mkdir(join(trackingPath, '..'), { recursive: true });
865
- await writeFile(trackingPath, JSON.stringify({
866
- schemaVersion: 1,
867
- sessions: {
868
- 'sess-architect': {
869
- session_id: 'sess-architect',
870
- leader_thread_id: 'thread-leader-a',
871
- updated_at: '2026-06-12T10:02:00.000Z',
872
- threads: {
873
- 'thread-leader-a': { thread_id: 'thread-leader-a', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
874
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:02:00.000Z', completed_at: '2026-06-12T10:02:00.000Z', turn_count: 1 },
875
- },
876
- },
877
- 'sess-critic': {
878
- session_id: 'sess-critic',
879
- leader_thread_id: 'thread-leader-c',
880
- updated_at: '2026-06-12T10:03:00.000Z',
881
- threads: {
882
- 'thread-leader-c': { thread_id: 'thread-leader-c', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
883
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-06-12T10:03:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1 },
884
- },
885
- },
886
- },
887
- }, null, 2));
888
- const state = {
889
- current_phase: 'ralplan',
890
- handoff_artifacts: {
891
- ralplan_consensus_gate: {
892
- complete: true,
893
- sequence: ['architect-review', 'critic-review'],
894
- ralplan_architect_review: {
895
- agent_role: 'architect',
896
- provenance_kind: 'native_subagent',
897
- verdict: 'approve',
898
- session_id: 'sess-architect',
899
- thread_id: 'thread-architect',
900
- completed_at: '2026-06-12T10:02:00.000Z',
901
- },
902
- ralplan_critic_review: {
903
- agent_role: 'critic',
904
- provenance_kind: 'native_subagent',
905
- verdict: 'approve',
906
- session_id: 'sess-critic',
907
- thread_id: 'thread-critic',
908
- completed_at: '2026-06-12T10:03:00.000Z',
909
- },
910
- },
911
- },
912
- };
913
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, currentState: state });
914
- assert.equal(decision.allowed, false);
915
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /same native subagent tracker session/);
916
- }
917
- finally {
918
- await rm(cwd, { recursive: true, force: true });
919
- }
920
- });
921
- it('rejects stale review session ids even when transition session context exists', async () => {
922
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-live-session-mismatch-'));
923
- const sessionId = 'sess-autopilot-live-session';
924
- const trackingPath = subagentTrackingPath(cwd);
925
- try {
926
- await mkdir(join(trackingPath, '..'), { recursive: true });
927
- await writeFile(trackingPath, JSON.stringify({
928
- schemaVersion: 1,
929
- sessions: {
930
- [sessionId]: {
931
- session_id: sessionId,
932
- leader_thread_id: 'thread-leader',
933
- updated_at: '2026-06-12T10:03:00.000Z',
934
- threads: {
935
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
936
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:02:00.000Z', completed_at: '2026-06-12T10:02:00.000Z', turn_count: 1 },
937
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-06-12T10:03:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1 },
938
- },
939
- },
940
- },
941
- }, null, 2));
942
- const state = {
943
- current_phase: 'ralplan',
944
- handoff_artifacts: {
945
- ralplan_consensus_gate: {
946
- complete: true,
947
- sequence: ['architect-review', 'critic-review'],
948
- ralplan_architect_review: {
949
- agent_role: 'architect',
950
- provenance_kind: 'native_subagent',
951
- verdict: 'approve',
952
- thread_id: 'thread-architect',
953
- completed_at: '2026-06-12T10:02:00.000Z',
954
- },
955
- ralplan_critic_review: {
956
- agent_role: 'critic',
957
- provenance_kind: 'native_subagent',
958
- verdict: 'approve',
959
- session_id: 'sess-stale-critic',
960
- thread_id: 'thread-critic',
961
- completed_at: '2026-06-12T10:03:00.000Z',
962
- },
963
- },
964
- },
965
- };
966
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
967
- assert.equal(decision.allowed, false);
968
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /critic review session_id=sess-stale-critic does not match/);
969
- }
970
- finally {
971
- await rm(cwd, { recursive: true, force: true });
972
- }
973
- });
974
- it('rejects tracker-backed native reviews whose subagent threads are not completed', async () => {
975
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-incomplete-thread-'));
976
- const sessionId = 'sess-autopilot-incomplete-thread';
977
- const trackingPath = subagentTrackingPath(cwd);
978
- try {
979
- await mkdir(join(trackingPath, '..'), { recursive: true });
980
- await writeFile(trackingPath, JSON.stringify({
981
- schemaVersion: 1,
982
- sessions: {
983
- [sessionId]: {
984
- session_id: sessionId,
985
- leader_thread_id: 'thread-leader',
986
- updated_at: '2026-06-12T10:03:00.000Z',
987
- threads: {
988
- 'thread-leader': { thread_id: 'thread-leader', kind: 'leader', first_seen_at: '2026-06-12T09:59:00.000Z', last_seen_at: '2026-06-12T09:59:00.000Z', turn_count: 1 },
989
- 'thread-architect': { thread_id: 'thread-architect', kind: 'subagent', first_seen_at: '2026-06-12T10:02:00.000Z', last_seen_at: '2026-06-12T10:02:00.000Z', turn_count: 1 },
990
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', first_seen_at: '2026-06-12T10:03:00.000Z', last_seen_at: '2026-06-12T10:03:00.000Z', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1 },
991
- },
992
- },
993
- },
994
- }, null, 2));
995
- const state = {
996
- current_phase: 'ralplan',
997
- handoff_artifacts: {
998
- ralplan_consensus_gate: {
999
- complete: true,
1000
- sequence: ['architect-review', 'critic-review'],
1001
- ralplan_architect_review: {
1002
- agent_role: 'architect',
1003
- provenance_kind: 'native_subagent',
1004
- verdict: 'approve',
1005
- session_id: sessionId,
1006
- thread_id: 'thread-architect',
1007
- completed_at: '2026-06-12T10:02:00.000Z',
1008
- },
1009
- ralplan_critic_review: {
1010
- agent_role: 'critic',
1011
- provenance_kind: 'native_subagent',
1012
- verdict: 'approve',
1013
- session_id: sessionId,
1014
- thread_id: 'thread-critic',
1015
- completed_at: '2026-06-12T10:03:00.000Z',
1016
- },
1017
- },
1018
- },
1019
- };
1020
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
1021
- assert.equal(decision.allowed, false);
1022
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /architect tracker thread thread-architect is not completed/);
1023
- }
1024
- finally {
1025
- await rm(cwd, { recursive: true, force: true });
1026
- }
1027
- });
1028
- it('explains tracker-backed native review schema and observed missing session values', async () => {
1029
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-diagnostic-missing-session-'));
1030
- const sessionId = 'sess-autopilot-diagnostic-missing-session';
1031
- const trackingPath = subagentTrackingPath(cwd);
1032
- try {
1033
- await mkdir(join(trackingPath, '..'), { recursive: true });
1034
- await writeFile(trackingPath, JSON.stringify({
1035
- schemaVersion: 1,
1036
- sessions: {},
1037
- }, null, 2));
1038
- const state = {
1039
- current_phase: 'ralplan',
1040
- handoff_artifacts: {
1041
- ralplan_consensus_gate: {
1042
- complete: true,
1043
- sequence: ['architect-review', 'critic-review'],
1044
- ralplan_architect_review: {
1045
- agent_role: 'architect',
1046
- provenance_kind: 'native_subagent',
1047
- verdict: 'approve',
1048
- session_id: sessionId,
1049
- thread_id: 'thread-architect',
1050
- tracker_path: '.omx/state/subagent-tracking.json',
1051
- completed_at: '2026-06-12T10:02:00.000Z',
1052
- },
1053
- ralplan_critic_review: {
1054
- agent_role: 'critic',
1055
- provenance_kind: 'native_subagent',
1056
- verdict: 'approve',
1057
- session_id: sessionId,
1058
- thread_id: 'thread-critic',
1059
- tracker_path: '.omx/state/subagent-tracking.json',
1060
- completed_at: '2026-06-12T10:03:00.000Z',
1061
- },
1062
- },
1063
- },
1064
- };
1065
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
1066
- assert.equal(decision.allowed, false);
1067
- assert.equal(decision.evidence?.diagnostic?.current_session_id, sessionId);
1068
- assert.equal(decision.evidence?.diagnostic?.architect.session_found, false);
1069
- assert.equal(decision.evidence?.diagnostic?.architect.thread_found, false);
1070
- assert.equal(decision.evidence?.diagnostic?.distinct_thread_ids, true);
1071
- const error = buildAutopilotRalplanUltragoalGateError(decision);
1072
- assert.match(error, /Expected:/);
1073
- assert.match(error, /sessions\["<current_session_id>"\]\.threads\["<architect_thread_id>"\]\.kind = "subagent"/);
1074
- assert.match(error, /current_session_id: sess-autopilot-diagnostic-missing-session/);
1075
- assert.match(error, /architect thread_id: thread-architect found: no kind=missing completed=no/);
1076
- assert.match(error, /session_id: sess-autopilot-diagnostic-missing-session session_found=no/);
1077
- assert.match(error, /Re-run native ralplan Architect\/Critic reviews/);
1078
- assert.match(error, /docs\/contracts\/ralplan-consensus-gate\.md/);
1079
- }
1080
- finally {
1081
- await rm(cwd, { recursive: true, force: true });
1082
- }
1083
- });
1084
- it('explains observed tracker thread kind and completion checks', async () => {
1085
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-diagnostic-thread-values-'));
1086
- const sessionId = 'sess-autopilot-diagnostic-thread-values';
1087
- const trackingPath = subagentTrackingPath(cwd);
1088
- try {
1089
- await mkdir(join(trackingPath, '..'), { recursive: true });
1090
- await writeFile(trackingPath, JSON.stringify({
1091
- schemaVersion: 1,
1092
- sessions: {
1093
- [sessionId]: {
1094
- session_id: sessionId,
1095
- leader_thread_id: 'thread-leader',
1096
- threads: {
1097
- 'thread-architect': { thread_id: 'thread-architect', kind: 'leader', turn_count: 1 },
1098
- 'thread-critic': { thread_id: 'thread-critic', kind: 'subagent', completed_at: '2026-06-12T10:03:00.000Z', turn_count: 1 },
1099
- },
1100
- },
1101
- },
1102
- }, null, 2));
1103
- const state = {
1104
- current_phase: 'ralplan',
1105
- handoff_artifacts: {
1106
- ralplan_consensus_gate: {
1107
- complete: true,
1108
- sequence: ['architect-review', 'critic-review'],
1109
- ralplan_architect_review: {
1110
- agent_role: 'architect',
1111
- provenance_kind: 'native_subagent',
1112
- verdict: 'approve',
1113
- session_id: sessionId,
1114
- thread_id: 'thread-architect',
1115
- },
1116
- ralplan_critic_review: {
1117
- agent_role: 'critic',
1118
- provenance_kind: 'native_subagent',
1119
- verdict: 'approve',
1120
- session_id: sessionId,
1121
- thread_id: 'thread-critic',
1122
- },
1123
- },
1124
- },
1125
- };
1126
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
1127
- assert.equal(decision.allowed, false);
1128
- assert.equal(decision.evidence?.diagnostic?.architect.session_found, true);
1129
- assert.equal(decision.evidence?.diagnostic?.architect.thread_found, true);
1130
- assert.equal(decision.evidence?.diagnostic?.architect.kind, 'leader');
1131
- assert.equal(decision.evidence?.diagnostic?.architect.completed, false);
1132
- const error = buildAutopilotRalplanUltragoalGateError(decision);
1133
- assert.match(error, /architect thread_id: thread-architect found: yes kind=leader completed=no/);
1134
- assert.match(error, /critic thread_id: thread-critic found: yes kind=subagent completed=yes/);
1135
- assert.match(error, /distinct_thread_ids: yes/);
1136
- }
1137
- finally {
1138
- await rm(cwd, { recursive: true, force: true });
1139
- }
1140
- });
1141
- it('rejects native review evidence from the session leader even when malformed tracking marks it as subagent', async () => {
1142
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-leader-spoof-'));
1143
- const sessionId = 'sess-autopilot-leader-spoof';
1144
- const trackingPath = subagentTrackingPath(cwd);
1145
- try {
1146
- await mkdir(join(trackingPath, '..'), { recursive: true });
1147
- await writeFile(join(cwd, '.omx', 'state', 'session.json'), JSON.stringify({
1148
- session_id: sessionId,
1149
- native_session_id: 'thread-leader',
1150
- }, null, 2));
1151
- await writeFile(trackingPath, JSON.stringify({
1152
- schemaVersion: 1,
1153
- sessions: {
1154
- [sessionId]: {
1155
- session_id: sessionId,
1156
- leader_thread_id: 'thread-leader',
1157
- updated_at: '2026-05-28T18:34:51.000Z',
1158
- threads: {
1159
- 'thread-leader': {
1160
- thread_id: 'thread-leader',
1161
- kind: 'subagent',
1162
- first_seen_at: '2026-05-28T18:34:51.000Z',
1163
- last_seen_at: '2026-05-28T18:34:51.000Z',
1164
- turn_count: 2,
1165
- },
1166
- 'thread-critic': {
1167
- thread_id: 'thread-critic',
1168
- kind: 'subagent',
1169
- first_seen_at: '2026-05-28T18:35:10.000Z',
1170
- last_seen_at: '2026-05-28T18:35:10.000Z',
1171
- turn_count: 1,
1172
- },
1173
- },
1174
- },
1175
- },
1176
- }, null, 2));
1177
- const state = {
1178
- current_phase: 'ralplan',
1179
- handoff_artifacts: {
1180
- ralplan_consensus_gate: {
1181
- complete: true,
1182
- sequence: ['architect-review', 'critic-review'],
1183
- ralplan_architect_review: {
1184
- agent_role: 'architect',
1185
- provenance_kind: 'native_subagent',
1186
- verdict: 'approve',
1187
- session_id: sessionId,
1188
- thread_id: 'thread-leader',
1189
- artifact_path: '.omx/artifacts/architect.md',
1190
- tracker_path: '.omx/state/subagent-tracking.json',
1191
- completed_at: '2026-05-28T18:34:51.000Z',
1192
- },
1193
- ralplan_critic_review: {
1194
- agent_role: 'critic',
1195
- provenance_kind: 'native_subagent',
1196
- verdict: 'approve',
1197
- session_id: sessionId,
1198
- thread_id: 'thread-critic',
1199
- artifact_path: '.omx/artifacts/critic.md',
1200
- tracker_path: '.omx/state/subagent-tracking.json',
1201
- completed_at: '2026-05-28T18:35:10.000Z',
1202
- },
1203
- },
1204
- },
1205
- };
1206
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
1207
- assert.equal(decision.allowed, false);
1208
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /architect tracker thread thread-leader is the session leader/);
1209
- }
1210
- finally {
1211
- await rm(cwd, { recursive: true, force: true });
1212
- }
1213
- });
1214
- it('accepts fresh native review evidence when tracker leader id aliases a subagent lane', async () => {
1215
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-fresh-subagent-alias-'));
1216
- const sessionId = 'sess-autopilot-fresh-subagent-alias';
1217
- const trackingPath = subagentTrackingPath(cwd);
1218
- try {
1219
- await mkdir(join(trackingPath, '..'), { recursive: true });
1220
- await writeFile(trackingPath, JSON.stringify({
1221
- schemaVersion: 1,
1222
- sessions: {
1223
- [sessionId]: {
1224
- session_id: sessionId,
1225
- leader_thread_id: 'thread-architect',
1226
- updated_at: '2026-05-28T18:35:10.000Z',
1227
- threads: {
1228
- 'thread-architect': {
1229
- thread_id: 'thread-architect',
1230
- kind: 'subagent',
1231
- first_seen_at: '2026-05-28T18:34:51.000Z',
1232
- last_seen_at: '2026-05-28T18:34:51.000Z',
1233
- completed_at: '2026-05-28T18:34:51.000Z',
1234
- turn_count: 1,
1235
- mode: 'architect',
1236
- },
1237
- 'thread-critic': {
1238
- thread_id: 'thread-critic',
1239
- kind: 'subagent',
1240
- first_seen_at: '2026-05-28T18:35:10.000Z',
1241
- last_seen_at: '2026-05-28T18:35:10.000Z',
1242
- completed_at: '2026-05-28T18:35:10.000Z',
1243
- turn_count: 1,
1244
- mode: 'critic',
1245
- },
1246
- },
1247
- },
1248
- },
1249
- }, null, 2));
1250
- const state = {
1251
- current_phase: 'ralplan',
1252
- handoff_artifacts: {
1253
- ralplan_consensus_gate: {
1254
- complete: true,
1255
- sequence: ['architect-review', 'critic-review'],
1256
- ralplan_architect_review: {
1257
- agent_role: 'architect',
1258
- provenance_kind: 'native_subagent',
1259
- verdict: 'approve',
1260
- session_id: sessionId,
1261
- thread_id: 'thread-architect',
1262
- artifact_path: '.omx/artifacts/architect.md',
1263
- tracker_path: '.omx/state/subagent-tracking.json',
1264
- completed_at: '2026-05-28T18:34:51.000Z',
1265
- },
1266
- ralplan_critic_review: {
1267
- agent_role: 'critic',
1268
- provenance_kind: 'native_subagent',
1269
- verdict: 'approve',
1270
- session_id: sessionId,
1271
- thread_id: 'thread-critic',
1272
- artifact_path: '.omx/artifacts/critic.md',
1273
- tracker_path: '.omx/state/subagent-tracking.json',
1274
- completed_at: '2026-05-28T18:35:10.000Z',
1275
- },
1276
- },
1277
- },
1278
- };
1279
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
1280
- assert.equal(decision.allowed, true);
1281
- assert.equal(decision.evidence?.blockedReason, null);
1282
- }
1283
- finally {
1284
- await rm(cwd, { recursive: true, force: true });
1285
- }
1286
- });
1287
- it('rejects native review evidence from the current native session leader', async () => {
1288
- const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-native-leader-'));
1289
- const sessionId = 'sess-autopilot-native-leader';
1290
- const trackingPath = subagentTrackingPath(cwd);
1291
- try {
1292
- await mkdir(join(trackingPath, '..'), { recursive: true });
1293
- await writeFile(join(cwd, '.omx', 'state', 'session.json'), JSON.stringify({
1294
- session_id: sessionId,
1295
- native_session_id: 'thread-leader',
1296
- }, null, 2));
1297
- await writeFile(trackingPath, JSON.stringify({
1298
- schemaVersion: 1,
1299
- sessions: {
1300
- [sessionId]: {
1301
- session_id: sessionId,
1302
- leader_thread_id: 'thread-leader',
1303
- updated_at: '2026-05-28T18:35:10.000Z',
1304
- threads: {
1305
- 'thread-leader': {
1306
- thread_id: 'thread-leader',
1307
- kind: 'subagent',
1308
- first_seen_at: '2026-05-28T18:34:51.000Z',
1309
- last_seen_at: '2026-05-28T18:34:51.000Z',
1310
- turn_count: 2,
1311
- },
1312
- 'thread-critic': {
1313
- thread_id: 'thread-critic',
1314
- kind: 'subagent',
1315
- first_seen_at: '2026-05-28T18:35:10.000Z',
1316
- last_seen_at: '2026-05-28T18:35:10.000Z',
1317
- turn_count: 1,
1318
- },
1319
- },
1320
- },
1321
- },
1322
- }, null, 2));
1323
- const state = {
1324
- current_phase: 'ralplan',
1325
- handoff_artifacts: {
1326
- ralplan_consensus_gate: {
1327
- complete: true,
1328
- sequence: ['architect-review', 'critic-review'],
1329
- ralplan_architect_review: {
1330
- agent_role: 'architect',
1331
- provenance_kind: 'native_subagent',
1332
- verdict: 'approve',
1333
- session_id: sessionId,
1334
- thread_id: 'thread-leader',
1335
- artifact_path: '.omx/artifacts/architect.md',
1336
- tracker_path: '.omx/state/subagent-tracking.json',
1337
- completed_at: '2026-05-28T18:34:51.000Z',
1338
- },
1339
- ralplan_critic_review: {
1340
- agent_role: 'critic',
1341
- provenance_kind: 'native_subagent',
1342
- verdict: 'approve',
1343
- session_id: sessionId,
1344
- thread_id: 'thread-critic',
1345
- artifact_path: '.omx/artifacts/critic.md',
1346
- tracker_path: '.omx/state/subagent-tracking.json',
1347
- completed_at: '2026-05-28T18:35:10.000Z',
1348
- },
1349
- },
1350
- },
1351
- };
1352
- const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
1353
- assert.equal(decision.allowed, false);
1354
- assert.match(buildAutopilotRalplanUltragoalGateError(decision), /architect tracker thread thread-leader is the session leader/);
1355
- }
1356
- finally {
1357
- await rm(cwd, { recursive: true, force: true });
1358
- }
106
+ assert.equal(decision.allowed, false);
107
+ assert.equal(decision.reason, 'documented_host_consensus_receipt_unavailable');
108
+ assert.equal(decision.evidence?.source, 'next-autopilot-state');
109
+ assert.equal(decision.evidence?.ralplan_architect_review?.review_cycle, 2);
110
+ assert.equal(decision.evidence?.ralplan_critic_review?.verdict, 'iterate');
111
+ assert.deepEqual(decision.evidence?.blockedDetails, ['official host consensus receipt verifier is unavailable']);
1359
112
  });
1360
113
  });
1361
114
  //# sourceMappingURL=ralplan-gate.test.js.map