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
@@ -0,0 +1,172 @@
1
+ import assert from "node:assert/strict";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { dirname, join } from "node:path";
6
+ import { describe, it } from "node:test";
7
+ import { DEEP_INTERVIEW_HANDOFF_REJECT_DETAILS, evaluateDeepInterviewRalplanHandoffCommand, } from "../../scripts/codex-native-hook.js";
8
+ const PROJECT_ROOT = join(dirname(new URL(import.meta.url).pathname), "../../..");
9
+ const HANDOFF_MARKER = "<!-- OMX:AUTOPILOT:DEEP-INTERVIEW-RALPLAN-HANDOFF:v1 -->";
10
+ const SESSION_ID = "issue-3293-session";
11
+ function handoffPayload(cwd) {
12
+ return {
13
+ mode: "autopilot",
14
+ active: true,
15
+ current_phase: "ralplan",
16
+ session_id: SESSION_ID,
17
+ workingDirectory: cwd,
18
+ state: {
19
+ deep_interview_gate: {
20
+ status: "complete",
21
+ rationale: "The requirements are complete.",
22
+ handoff_summary: "The interview is ready for planning.",
23
+ },
24
+ handoff_artifacts: {
25
+ deep_interview: ".omx/specs/deep-interview-handoff.md",
26
+ },
27
+ },
28
+ };
29
+ }
30
+ function handoffCommand(payload) {
31
+ return `omx state write --input '${JSON.stringify(payload)}' --json`;
32
+ }
33
+ function documentedHandoffCommand() {
34
+ const skill = readFileSync(join(PROJECT_ROOT, "skills/autopilot/SKILL.md"), "utf-8");
35
+ const markerOffset = skill.indexOf(HANDOFF_MARKER);
36
+ assert.notEqual(markerOffset, -1, "the stable handoff marker must be documented");
37
+ const fence = skill.slice(markerOffset).match(/^<!--[\s\S]*?-->\n```bash\n([\s\S]*?)\n```/);
38
+ assert.ok(fence?.[1], "the marker must immediately precede an executable bash fence");
39
+ return fence[1];
40
+ }
41
+ async function withFixture(action) {
42
+ const cwd = await mkdtemp(join(tmpdir(), "omx-issue-3293-handoff-"));
43
+ try {
44
+ await mkdir(join(cwd, ".omx", "specs"), { recursive: true });
45
+ await writeFile(join(cwd, ".omx", "specs", "deep-interview-handoff.md"), "# Clarified requirements\n");
46
+ await action(cwd);
47
+ }
48
+ finally {
49
+ await rm(cwd, { recursive: true, force: true });
50
+ }
51
+ }
52
+ function assertValueFreeDiagnostic(reason, cwd) {
53
+ const detail = DEEP_INTERVIEW_HANDOFF_REJECT_DETAILS[reason];
54
+ assert.ok(detail.length > 0);
55
+ assert.equal(detail.includes(cwd), false);
56
+ assert.equal(detail.includes(SESSION_ID), false);
57
+ assert.equal(detail.includes("deep-interview-handoff.md"), false);
58
+ }
59
+ describe("issue #3293 Autopilot deep-interview handoff", () => {
60
+ it("admits the exact stable-marked documented handoff command", async () => {
61
+ await withFixture(async (cwd) => {
62
+ const command = documentedHandoffCommand();
63
+ const result = evaluateDeepInterviewRalplanHandoffCommand(cwd, command, SESSION_ID);
64
+ assert.deepEqual(result, { allowed: true });
65
+ assert.match(command, /"current_phase":"ralplan"/);
66
+ });
67
+ });
68
+ const rejectionCases = [
69
+ {
70
+ name: "reports session_id_missing",
71
+ reason: "session_id_missing",
72
+ command: (cwd) => {
73
+ const payload = handoffPayload(cwd);
74
+ delete payload.session_id;
75
+ return handoffCommand(payload);
76
+ },
77
+ },
78
+ {
79
+ name: "reports session_id_mismatch",
80
+ reason: "session_id_mismatch",
81
+ command: (cwd) => handoffCommand({ ...handoffPayload(cwd), session_id: "other-session" }),
82
+ },
83
+ {
84
+ name: "reports session_alias_conflict",
85
+ reason: "session_alias_conflict",
86
+ command: (cwd) => handoffCommand({ ...handoffPayload(cwd), codex_session_id: "other-session" }),
87
+ },
88
+ {
89
+ name: "reports working_directory_missing",
90
+ reason: "working_directory_missing",
91
+ command: (cwd) => {
92
+ const payload = handoffPayload(cwd);
93
+ delete payload.workingDirectory;
94
+ return handoffCommand(payload);
95
+ },
96
+ },
97
+ {
98
+ name: "reports working_directory_mismatch",
99
+ reason: "working_directory_mismatch",
100
+ command: (cwd) => handoffCommand({ ...handoffPayload(cwd), workingDirectory: join(cwd, "other") }),
101
+ },
102
+ {
103
+ name: "reports gate_incomplete",
104
+ reason: "gate_incomplete",
105
+ command: (cwd) => handoffCommand({ ...handoffPayload(cwd), state: {} }),
106
+ },
107
+ {
108
+ name: "reports durable_evidence_missing",
109
+ reason: "durable_evidence_missing",
110
+ command: (cwd) => handoffCommand(handoffPayload(cwd)),
111
+ },
112
+ {
113
+ name: "reports unsafe_transport",
114
+ reason: "unsafe_transport",
115
+ command: (cwd) => `${handoffCommand(handoffPayload(cwd))} $(printf unsafe)`,
116
+ },
117
+ {
118
+ name: "reports artifact_target_not_allowed",
119
+ reason: "artifact_target_not_allowed",
120
+ command: (cwd) => `${handoffCommand(handoffPayload(cwd))} > .omx/specs/allowed.md 2> forbidden.txt`,
121
+ },
122
+ ];
123
+ for (const testCase of rejectionCases) {
124
+ it(testCase.name, async () => {
125
+ if (testCase.reason === "durable_evidence_missing") {
126
+ const cwd = await mkdtemp(join(tmpdir(), "omx-issue-3293-no-evidence-"));
127
+ try {
128
+ const result = evaluateDeepInterviewRalplanHandoffCommand(cwd, testCase.command(cwd), SESSION_ID);
129
+ assert.equal(result.allowed, false);
130
+ assert.equal(result.reason, testCase.reason);
131
+ assertValueFreeDiagnostic(testCase.reason, cwd);
132
+ }
133
+ finally {
134
+ await rm(cwd, { recursive: true, force: true });
135
+ }
136
+ return;
137
+ }
138
+ await withFixture(async (cwd) => {
139
+ const result = evaluateDeepInterviewRalplanHandoffCommand(cwd, testCase.command(cwd), SESSION_ID);
140
+ assert.equal(result.allowed, false);
141
+ assert.equal(result.reason, testCase.reason);
142
+ assertValueFreeDiagnostic(testCase.reason, cwd);
143
+ });
144
+ });
145
+ }
146
+ it("preserves boolean admission parity for representative accepted and rejected commands", async () => {
147
+ await withFixture(async (cwd) => {
148
+ const accepted = handoffCommand(handoffPayload(cwd));
149
+ const rejected = handoffCommand({ ...handoffPayload(cwd), session_id: "other-session" });
150
+ assert.equal(evaluateDeepInterviewRalplanHandoffCommand(cwd, accepted, SESSION_ID).allowed, true);
151
+ assert.equal(evaluateDeepInterviewRalplanHandoffCommand(cwd, rejected, SESSION_ID).allowed, false);
152
+ const documentedCommand = documentedHandoffCommand();
153
+ assert.deepEqual(evaluateDeepInterviewRalplanHandoffCommand(cwd, documentedCommand, SESSION_ID), { allowed: true });
154
+ const unexpectedExpansion = documentedCommand.replace("${PWD:?working directory required}", "${UNTRUSTED_WORKING_DIRECTORY}");
155
+ assert.deepEqual(evaluateDeepInterviewRalplanHandoffCommand(cwd, unexpectedExpansion, SESSION_ID), {
156
+ allowed: false,
157
+ reason: "unsafe_transport",
158
+ });
159
+ assert.deepEqual(evaluateDeepInterviewRalplanHandoffCommand(cwd, handoffCommand({
160
+ ...handoffPayload(cwd),
161
+ unexpected: true,
162
+ }), SESSION_ID), {
163
+ allowed: false,
164
+ reason: "unsafe_transport",
165
+ });
166
+ });
167
+ });
168
+ it("keeps the plugin Autopilot skill mirror byte-identical", { skip: existsSync(join(PROJECT_ROOT, "dist", "scripts", "sync-plugin-mirror.js")) ? false : "requires the built sync-plugin mirror runner" }, () => {
169
+ assert.equal(readFileSync(join(PROJECT_ROOT, "plugins/oh-my-codex/skills/autopilot/SKILL.md"), "utf-8"), readFileSync(join(PROJECT_ROOT, "skills/autopilot/SKILL.md"), "utf-8"));
170
+ });
171
+ });
172
+ //# sourceMappingURL=issue-3293-autopilot-handoff.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-3293-autopilot-handoff.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/issue-3293-autopilot-handoff.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,qCAAqC,EACrC,0CAA0C,GAE3C,MAAM,oCAAoC,CAAC;AAE5C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;AAClF,MAAM,cAAc,GAAG,0DAA0D,CAAC;AAClF,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,UAAU;QACtB,gBAAgB,EAAE,GAAG;QACrB,KAAK,EAAE;YACL,mBAAmB,EAAE;gBACnB,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,gCAAgC;gBAC3C,eAAe,EAAE,sCAAsC;aACxD;YACD,iBAAiB,EAAE;gBACjB,cAAc,EAAE,sCAAsC;aACvD;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAgC;IACtD,OAAO,4BAA4B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;AACvE,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,2BAA2B,CAAC,EAAE,OAAO,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,8CAA8C,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5F,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,8DAA8D,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAsC;IAC/D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACvG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAwC,EAAE,GAAW;IACtF,MAAM,MAAM,GAAG,qCAAqC,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,0CAA0C,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YACpF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAIf;QACH;YACE,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACf,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;gBACpC,OAAO,OAAO,CAAC,UAAU,CAAC;gBAC1B,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;SACF;QACD;YACE,IAAI,EAAE,6BAA6B;YACnC,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;SAC1F;QACD;YACE,IAAI,EAAE,gCAAgC;YACtC,MAAM,EAAE,wBAAwB;YAChC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;SAChG;QACD;YACE,IAAI,EAAE,mCAAmC;YACzC,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACf,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;gBACpC,OAAO,OAAO,CAAC,gBAAgB,CAAC;gBAChC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;SACF;QACD;YACE,IAAI,EAAE,oCAAoC;YAC1C,MAAM,EAAE,4BAA4B;YACpC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;SACnG;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SACxE;QACD;YACE,IAAI,EAAE,kCAAkC;YACxC,MAAM,EAAE,0BAA0B;YAClC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;SACtD;QACD;YACE,IAAI,EAAE,0BAA0B;YAChC,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,mBAAmB;SAC5E;QACD;YACE,IAAI,EAAE,qCAAqC;YAC3C,MAAM,EAAE,6BAA6B;YACrC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,2CAA2C;SACpG;KACF,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YAC3B,IAAI,QAAQ,CAAC,MAAM,KAAK,0BAA0B,EAAE,CAAC;gBACnD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,6BAA6B,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,0CAA0C,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;oBAClG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC7C,yBAAyB,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAClD,CAAC;wBAAS,CAAC;oBACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,0CAA0C,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;gBAClG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC7C,yBAAyB,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;QACpG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC;YACzF,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClG,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACnG,MAAM,iBAAiB,GAAG,wBAAwB,EAAE,CAAC;YACrD,MAAM,CAAC,SAAS,CAAC,0CAA0C,CAAC,GAAG,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACpH,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,OAAO,CACnD,oCAAoC,EACpC,gCAAgC,CACjC,CAAC;YACF,MAAM,CAAC,SAAS,CAAC,0CAA0C,CAAC,GAAG,EAAE,mBAAmB,EAAE,UAAU,CAAC,EAAE;gBACjG,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,0CAA0C,CAAC,GAAG,EAAE,cAAc,CAAC;gBAC9E,GAAG,cAAc,CAAC,GAAG,CAAC;gBACtB,UAAU,EAAE,IAAI;aACjB,CAAC,EAAE,UAAU,CAAC,EAAE;gBACf,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CACA,wDAAwD,EACxD,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,8CAA8C,EAAE,EAC7I,GAAG,EAAE;QACH,MAAM,CAAC,KAAK,CACV,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,+CAA+C,CAAC,EAAE,OAAO,CAAC,EAC1F,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,2BAA2B,CAAC,EAAE,OAAO,CAAC,CACvE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -5,8 +5,10 @@ import { mkdtemp, mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promis
5
5
  import { tmpdir } from 'node:os';
6
6
  import { join } from 'node:path';
7
7
  import { detectKeywords, detectPrimaryKeyword, classifyKeywordInput, KEYWORD_INERT_DIAGNOSTIC_ORDER, recordSkillActivation, DEEP_INTERVIEW_STATE_FILE, DEEP_INTERVIEW_BLOCKED_APPROVAL_INPUTS, DEEP_INTERVIEW_INPUT_LOCK_MESSAGE, persistDeepInterviewModeState, } from '../keyword-detector.js';
8
- import { SKILL_ACTIVE_STATE_FILE } from '../../state/skill-active.js';
8
+ import { readSkillActiveState, SKILL_ACTIVE_STATE_FILE } from '../../state/skill-active.js';
9
9
  import { isUnderspecifiedForExecution, applyRalplanGate } from '../keyword-detector.js';
10
+ import { neutralizeOwnedRoutingRalplan } from '../../ralplan/documented-leader-preflight.js';
11
+ import { readActiveWorkflowModes } from '../../state/workflow-transition.js';
10
12
  import { EXPLICIT_SKILL_ALIASES, getExplicitSkillDefinition, KEYWORD_TRIGGER_DEFINITIONS, } from '../keyword-registry.js';
11
13
  import { evaluateResolvedPromptTurn } from '../prompt-session-provenance.js';
12
14
  async function withIsolatedHome(prefix, run) {
@@ -27,6 +29,12 @@ async function withIsolatedHome(prefix, run) {
27
29
  const AUTOPILOT_TEST_NOW = '2026-05-30T00:00:00.000Z';
28
30
  const AUTOPILOT_TEST_STARTED_AT = '2026-05-29T00:00:00.000Z';
29
31
  const AUTOPILOT_TEST_UPDATED_AT = '2026-05-29T00:10:00.000Z';
32
+ const availableAutopilotReceiptVerifier = {
33
+ getRalplanHostConsensusReceiptVerifierCapability: () => 'available',
34
+ };
35
+ function recordSkillActivationWithAvailableAutopilotReceipt(input) {
36
+ return recordSkillActivation(input, availableAutopilotReceiptVerifier);
37
+ }
30
38
  async function writeActiveAutopilotSkillState(stateDir, sessionId, phase = 'ralplan') {
31
39
  await mkdir(join(stateDir, 'sessions', sessionId), { recursive: true });
32
40
  await writeFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), JSON.stringify({
@@ -45,7 +53,7 @@ async function readAutopilotModeState(stateDir, sessionId) {
45
53
  return JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, 'autopilot-state.json'), 'utf-8'));
46
54
  }
47
55
  async function continueAutopilotTestState(stateDir, cwd, sessionId, suffix, text = 'continue') {
48
- await recordSkillActivation({
56
+ await recordSkillActivationWithAvailableAutopilotReceipt({
49
57
  stateDir,
50
58
  sourceCwd: cwd,
51
59
  text,
@@ -1794,6 +1802,61 @@ describe('keyword detector skill-active-state lifecycle', () => {
1794
1802
  await rm(root, { recursive: true, force: true });
1795
1803
  }
1796
1804
  });
1805
+ it('fails fresh native Autopilot before deep-interview when receipt verification is unavailable', async () => {
1806
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-autopilot-preflight-'));
1807
+ const stateDir = join(cwd, '.omx', 'state');
1808
+ try {
1809
+ const result = await recordSkillActivation({
1810
+ stateDir,
1811
+ sourceCwd: cwd,
1812
+ text: '$autopilot implement the task',
1813
+ sessionId: 'sess-autopilot-preflight',
1814
+ nowIso: '2026-07-23T00:00:00.000Z',
1815
+ });
1816
+ assert.equal(result?.active, false);
1817
+ assert.equal(result?.phase, 'failed');
1818
+ assert.equal(result?.error, 'documented_host_consensus_receipt_unavailable');
1819
+ assert.deepEqual(result?.active_skills, []);
1820
+ const modeState = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-autopilot-preflight', 'autopilot-state.json'), 'utf-8'));
1821
+ assert.equal(modeState.active, false);
1822
+ assert.equal(modeState.current_phase, 'failed');
1823
+ assert.equal(modeState.error, 'documented_host_consensus_receipt_unavailable');
1824
+ assert.equal(existsSync(join(stateDir, 'sessions', 'sess-autopilot-preflight', 'deep-interview-state.json')), false);
1825
+ assert.equal(existsSync(join(stateDir, 'sessions', 'sess-autopilot-preflight', 'ultragoal-state.json')), false);
1826
+ }
1827
+ finally {
1828
+ await rm(cwd, { recursive: true, force: true });
1829
+ }
1830
+ });
1831
+ it('byte-preserves an active native Autopilot session when receipt verification is unavailable', async () => {
1832
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-active-autopilot-preflight-'));
1833
+ const stateDir = join(cwd, '.omx', 'state');
1834
+ const sessionId = 'sess-active-autopilot-preflight';
1835
+ const sessionDir = join(stateDir, 'sessions', sessionId);
1836
+ const statePath = join(sessionDir, SKILL_ACTIVE_STATE_FILE);
1837
+ const modePath = join(sessionDir, 'autopilot-state.json');
1838
+ const rawState = '{"version":1,"active":true,"skill":"autopilot","keyword":"$autopilot","phase":"ralplan","activated_at":"2026-07-22T00:00:00.000Z","updated_at":"2026-07-22T00:00:00.000Z","source":"keyword-detector","session_id":"sess-active-autopilot-preflight","metadata":{"preserve":true},"active_skills":[{"skill":"autopilot","active":true,"phase":"ralplan","session_id":"sess-active-autopilot-preflight"}]}\n';
1839
+ const rawMode = '{"active":true,"mode":"autopilot","current_phase":"ralplan","session_id":"sess-active-autopilot-preflight","metadata":{"preserve":true},"handoff_artifacts":{"ralplan":{"path":".omx/plans/existing.md"}}}\n';
1840
+ try {
1841
+ await mkdir(sessionDir, { recursive: true });
1842
+ await writeFile(statePath, rawState);
1843
+ await writeFile(modePath, rawMode);
1844
+ const result = await recordSkillActivation({
1845
+ stateDir,
1846
+ sourceCwd: cwd,
1847
+ text: '$autopilot continue',
1848
+ sessionId,
1849
+ nowIso: '2026-07-23T00:00:00.000Z',
1850
+ });
1851
+ assert.equal(result?.active, true);
1852
+ assert.equal(result?.phase, 'ralplan');
1853
+ assert.equal(await readFile(statePath, 'utf-8'), rawState);
1854
+ assert.equal(await readFile(modePath, 'utf-8'), rawMode);
1855
+ }
1856
+ finally {
1857
+ await rm(cwd, { recursive: true, force: true });
1858
+ }
1859
+ });
1797
1860
  it('writes skill-active-state.json with deep-interview phase when autopilot keyword activates', async () => {
1798
1861
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-'));
1799
1862
  const stateDir = join(cwd, '.omx', 'state');
@@ -1802,7 +1865,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
1802
1865
  try {
1803
1866
  process.env.CODEX_HOME = codexHome;
1804
1867
  await mkdir(stateDir, { recursive: true });
1805
- const result = await recordSkillActivation({
1868
+ const result = await recordSkillActivationWithAvailableAutopilotReceipt({
1806
1869
  stateDir,
1807
1870
  text: 'please run $autopilot and keep going',
1808
1871
  sessionId: 'sess-1',
@@ -1895,7 +1958,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
1895
1958
  await mkdir(stateDir, { recursive: true });
1896
1959
  // Activate Autopilot: seeds autopilot-state.json at current_phase=deep-interview
1897
1960
  // with deep_interview_gate.status="required" (gate not satisfied).
1898
- const activated = await recordSkillActivation({
1961
+ const activated = await recordSkillActivationWithAvailableAutopilotReceipt({
1899
1962
  stateDir,
1900
1963
  text: 'please run $autopilot',
1901
1964
  sessionId: 'sess-gate',
@@ -1938,7 +2001,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
1938
2001
  const stateDir = join(cwd, '.omx', 'state');
1939
2002
  try {
1940
2003
  await mkdir(stateDir, { recursive: true });
1941
- await recordSkillActivation({
2004
+ await recordSkillActivationWithAvailableAutopilotReceipt({
1942
2005
  stateDir,
1943
2006
  text: 'please run $autopilot',
1944
2007
  sessionId: 'sess-skip',
@@ -2066,7 +2129,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
2066
2129
  models: { autopilot: 'o4-mini' },
2067
2130
  agentModels: { planner: 'gpt-5.6-sol-planner' },
2068
2131
  }));
2069
- await recordSkillActivation({
2132
+ await recordSkillActivationWithAvailableAutopilotReceipt({
2070
2133
  stateDir,
2071
2134
  sourceCwd: cwd,
2072
2135
  text: '$autopilot implement issue #2918',
@@ -2137,7 +2200,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
2137
2200
  context_snapshot_path: '.omx/context/../../escape.md',
2138
2201
  state: { handoff_artifacts: { deep_interview: null } },
2139
2202
  }, null, 2));
2140
- const result = await recordSkillActivation({
2203
+ const result = await recordSkillActivationWithAvailableAutopilotReceipt({
2141
2204
  stateDir,
2142
2205
  text: 'continue',
2143
2206
  sessionId,
@@ -2327,7 +2390,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
2327
2390
  mock.method(console, 'warn', (...args) => {
2328
2391
  warnings.push(args);
2329
2392
  });
2330
- await recordSkillActivation({
2393
+ await recordSkillActivationWithAvailableAutopilotReceipt({
2331
2394
  stateDir,
2332
2395
  sourceCwd: cwd,
2333
2396
  text: '$autopilot symlink escape',
@@ -2351,7 +2414,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
2351
2414
  const stateDir = join(cwd, '.omx', 'state');
2352
2415
  try {
2353
2416
  await mkdir(stateDir, { recursive: true });
2354
- await recordSkillActivation({
2417
+ await recordSkillActivationWithAvailableAutopilotReceipt({
2355
2418
  stateDir,
2356
2419
  sourceCwd: cwd,
2357
2420
  text: '$autopilot same task',
@@ -2360,7 +2423,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
2360
2423
  turnId: 'turn-collision-a',
2361
2424
  nowIso: '2026-05-30T00:00:00.000Z',
2362
2425
  });
2363
- await recordSkillActivation({
2426
+ await recordSkillActivationWithAvailableAutopilotReceipt({
2364
2427
  stateDir,
2365
2428
  sourceCwd: cwd,
2366
2429
  text: '$autopilot same task',
@@ -2619,6 +2682,54 @@ describe('keyword detector skill-active-state lifecycle', () => {
2619
2682
  await rm(cwd, { recursive: true, force: true });
2620
2683
  }
2621
2684
  });
2685
+ it('preserves an active Autopilot mode when canonical skill state is missing', async () => {
2686
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-autopilot-mode-drift-'));
2687
+ const stateDir = join(cwd, '.omx', 'state');
2688
+ const sessionId = 'sess-autopilot-mode-drift';
2689
+ const modePath = join(stateDir, 'sessions', sessionId, 'autopilot-state.json');
2690
+ try {
2691
+ await mkdir(join(stateDir, 'sessions', sessionId), { recursive: true });
2692
+ const rawMode = '{"active":true,"mode":"autopilot","current_phase":"ralplan","session_id":"sess-autopilot-mode-drift","marker":"preserve-active-mode","metadata":{"nested":{"keep":true}}}\n';
2693
+ await writeFile(modePath, rawMode);
2694
+ const result = await recordSkillActivation({
2695
+ stateDir,
2696
+ text: '$autopilot continue',
2697
+ sessionId,
2698
+ nowIso: '2026-07-23T00:00:00.000Z',
2699
+ });
2700
+ assert.equal(result?.skill, 'autopilot');
2701
+ assert.equal(result?.phase, 'ralplan');
2702
+ assert.equal(await readFile(modePath, 'utf-8'), rawMode);
2703
+ assert.equal(existsSync(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE)), false);
2704
+ }
2705
+ finally {
2706
+ await rm(cwd, { recursive: true, force: true });
2707
+ }
2708
+ });
2709
+ it('preserves active standalone Ralplan state bytes when fresh Autopilot preflight is unavailable', async () => {
2710
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-ralplan-autopilot-preflight-'));
2711
+ const stateDir = join(cwd, '.omx', 'state');
2712
+ const sessionId = 'sess-ralplan-autopilot-preflight';
2713
+ const statePath = join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE);
2714
+ const rawState = '{"version":1,"active":true,"skill":"ralplan","keyword":"$ralplan","phase":"planning","session_id":"sess-ralplan-autopilot-preflight","active_skills":[{"skill":"ralplan","phase":"planning","active":true,"session_id":"sess-ralplan-autopilot-preflight"}]}';
2715
+ try {
2716
+ await mkdir(join(stateDir, 'sessions', sessionId), { recursive: true });
2717
+ await writeFile(statePath, rawState);
2718
+ const denied = await recordSkillActivation({
2719
+ stateDir,
2720
+ text: '$autopilot do it too',
2721
+ sessionId,
2722
+ nowIso: '2026-07-23T00:00:00.000Z',
2723
+ });
2724
+ assert.equal(denied?.skill, 'ralplan');
2725
+ assert.equal(denied?.transition_error, 'documented_host_consensus_receipt_unavailable');
2726
+ assert.equal(await readFile(statePath, 'utf-8'), rawState);
2727
+ assert.equal(existsSync(join(stateDir, 'sessions', sessionId, 'autopilot-state.json')), false);
2728
+ }
2729
+ finally {
2730
+ await rm(cwd, { recursive: true, force: true });
2731
+ }
2732
+ });
2622
2733
  it('denies prompt-submit overlaps against the current session-visible canonical state', async () => {
2623
2734
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-session-visible-'));
2624
2735
  const stateDir = join(cwd, '.omx', 'state');
@@ -2842,6 +2953,35 @@ describe('keyword detector skill-active-state lifecycle', () => {
2842
2953
  await rm(cwd, { recursive: true, force: true });
2843
2954
  }
2844
2955
  });
2956
+ it('does not reactivate a neutralized routing-only Ralplan seed on plain continuation', async () => {
2957
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-neutralized-ralplan-'));
2958
+ const stateDir = join(cwd, '.omx', 'state');
2959
+ const sessionId = 'sess-neutralized';
2960
+ const previousSessionId = process.env.OMX_SESSION_ID;
2961
+ try {
2962
+ process.env.OMX_SESSION_ID = sessionId;
2963
+ await mkdir(stateDir, { recursive: true });
2964
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: sessionId, cwd, state_root: stateDir }));
2965
+ assert.ok(await recordSkillActivation({ stateDir, sourceCwd: cwd, text: '$ralplan tighten the plan', sessionId, nowIso: '2026-02-25T00:00:00.000Z' }));
2966
+ const sessionDir = join(stateDir, 'sessions', sessionId);
2967
+ const ralplanPath = join(sessionDir, 'ralplan-state.json');
2968
+ const skillPath = join(sessionDir, SKILL_ACTIVE_STATE_FILE);
2969
+ const [ralplanBefore, skillBefore] = await Promise.all([readFile(ralplanPath), readFile(skillPath)]);
2970
+ assert.equal(await neutralizeOwnedRoutingRalplan(cwd), true);
2971
+ assert.deepEqual(await readActiveWorkflowModes(cwd, sessionId), []);
2972
+ assert.equal(await recordSkillActivation({ stateDir, sourceCwd: cwd, text: 'continue', sessionId, nowIso: '2026-02-25T00:00:01.000Z' }), null);
2973
+ assert.deepEqual(await readFile(ralplanPath), ralplanBefore);
2974
+ assert.deepEqual(await readFile(skillPath), skillBefore);
2975
+ assert.equal((await readSkillActiveState(skillPath))?.active, false);
2976
+ }
2977
+ finally {
2978
+ if (previousSessionId === undefined)
2979
+ delete process.env.OMX_SESSION_ID;
2980
+ else
2981
+ process.env.OMX_SESSION_ID = previousSessionId;
2982
+ await rm(cwd, { recursive: true, force: true });
2983
+ }
2984
+ });
2845
2985
  it('auto-completes deep-interview during allowlisted forward handoff', async () => {
2846
2986
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-handoff-'));
2847
2987
  const stateDir = join(cwd, '.omx', 'state');
@@ -3167,7 +3307,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
3167
3307
  await rm(cwd, { recursive: true, force: true });
3168
3308
  }
3169
3309
  });
3170
- it('emits terminal ralplan state before explicit ultragoal execution handoff', async () => {
3310
+ it('keeps a locally approved ralplan active when the host consensus receipt verifier is unavailable', async () => {
3171
3311
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-ralplan-ultragoal-handoff-'));
3172
3312
  const stateDir = join(cwd, '.omx', 'state');
3173
3313
  try {
@@ -3187,6 +3327,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
3187
3327
  current_phase: 'complete',
3188
3328
  planning_complete: true,
3189
3329
  ralplan_consensus_gate: {
3330
+ documented_host_consensus_receipt: { issuer: 'official-host', verdict: 'approve' },
3190
3331
  complete: true,
3191
3332
  sequence: ['architect-review', 'critic-review'],
3192
3333
  ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', approved: true },
@@ -3200,19 +3341,13 @@ describe('keyword detector skill-active-state lifecycle', () => {
3200
3341
  sessionId: 'sess-ralplan-ultragoal',
3201
3342
  nowIso: '2026-04-10T00:20:00.000Z',
3202
3343
  });
3203
- assert.equal(result?.transition_error, undefined);
3204
- assert.equal(result?.skill, 'ultragoal');
3205
- assert.equal(result?.transition_message, 'mode transiting: ralplan -> ultragoal');
3206
- assert.deepEqual(result?.active_skills?.map((entry) => entry.skill), ['ultragoal']);
3344
+ assert.notEqual(result?.skill, 'ultragoal');
3345
+ assert.notEqual(result?.transition_message, 'mode transiting: ralplan -> ultragoal');
3207
3346
  const ralplan = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-ralplan-ultragoal', 'ralplan-state.json'), 'utf-8'));
3208
- assert.equal(ralplan.active, false);
3209
- assert.equal(ralplan.current_phase, 'completed');
3210
- assert.equal(ralplan.auto_completed_reason, 'mode transiting: ralplan -> ultragoal');
3211
- assert.ok(ralplan.completed_at);
3212
- const ultragoal = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-ralplan-ultragoal', 'ultragoal-state.json'), 'utf-8'));
3213
- assert.equal(ultragoal.active, true);
3214
- assert.equal(ultragoal.mode, 'ultragoal');
3215
- assert.equal(ultragoal.current_phase, 'planning');
3347
+ assert.equal(ralplan.active, true);
3348
+ assert.equal(ralplan.current_phase, 'complete');
3349
+ assert.notEqual(ralplan.auto_completed_reason, 'mode transiting: ralplan -> ultragoal');
3350
+ assert.equal(existsSync(join(stateDir, 'sessions', 'sess-ralplan-ultragoal', 'ultragoal-state.json')), false);
3216
3351
  }
3217
3352
  finally {
3218
3353
  await rm(cwd, { recursive: true, force: true });
@@ -4008,7 +4143,7 @@ deepMaxRounds = 21
4008
4143
  await rm(cwd, { recursive: true, force: true });
4009
4144
  }
4010
4145
  });
4011
- it('emits a warning when skill-active-state persistence fails', async () => {
4146
+ it('warns when fresh Autopilot preflight persistence fails', async () => {
4012
4147
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-persist-fail-'));
4013
4148
  const warnings = [];
4014
4149
  mock.method(console, 'warn', (...args) => {
@@ -4024,6 +4159,7 @@ deepMaxRounds = 21
4024
4159
  });
4025
4160
  assert.ok(result);
4026
4161
  assert.equal(result.skill, 'autopilot');
4162
+ assert.equal(result.phase, 'failed');
4027
4163
  assert.equal(warnings.length, 1);
4028
4164
  assert.match(String(warnings[0][0]), /failed to persist keyword activation state/);
4029
4165
  }
@@ -4047,7 +4183,7 @@ deepMaxRounds = 21
4047
4183
  updated_at: '2026-02-25T00:10:00.000Z',
4048
4184
  source: 'keyword-detector',
4049
4185
  }));
4050
- const result = await recordSkillActivation({
4186
+ const result = await recordSkillActivationWithAvailableAutopilotReceipt({
4051
4187
  stateDir,
4052
4188
  text: 'autopilot keep going',
4053
4189
  nowIso: '2026-02-26T00:00:00.000Z',
@@ -4090,7 +4226,7 @@ deepMaxRounds = 21
4090
4226
  }));
4091
4227
  await mkdir(join(cwd, '.omx', 'context'), { recursive: true });
4092
4228
  await writeFile(join(cwd, '.omx', 'context', 'existing.md'), '# existing context');
4093
- const result = await recordSkillActivation({
4229
+ const result = await recordSkillActivationWithAvailableAutopilotReceipt({
4094
4230
  stateDir,
4095
4231
  text: 'autopilot keep going',
4096
4232
  sessionId: 'sess-autopilot',
@@ -4276,7 +4412,7 @@ deepMaxRounds = 21
4276
4412
  }, null, 2));
4277
4413
  await mkdir(join(cwd, '.omx', 'context'), { recursive: true });
4278
4414
  await writeFile(join(cwd, '.omx', 'context', 'autopilot.md'), '# autopilot context');
4279
- const result = await recordSkillActivation({
4415
+ const result = await recordSkillActivationWithAvailableAutopilotReceipt({
4280
4416
  stateDir,
4281
4417
  text: '\\ keep going now',
4282
4418
  sessionId: 'sess-autopilot-bare',
@@ -4697,7 +4833,7 @@ describe('applyRalplanGate', () => {
4697
4833
  await rm(cwd, { recursive: true, force: true });
4698
4834
  }
4699
4835
  });
4700
- it('does not re-enter ralplan for a short approved team follow-up with durable consensus', async () => {
4836
+ it('keeps short approved team follow-ups gated without an official host consensus receipt', async () => {
4701
4837
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-ko-'));
4702
4838
  try {
4703
4839
  const plansDir = join(cwd, '.omx', 'plans');
@@ -4712,13 +4848,14 @@ describe('applyRalplanGate', () => {
4712
4848
  ralplan_consensus_gate: {
4713
4849
  complete: true,
4714
4850
  sequence: ['architect-review', 'critic-review'],
4715
- ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
4716
- ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
4851
+ ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1, sequence_index: 1 },
4852
+ ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1, sequence_index: 2 },
4717
4853
  },
4718
4854
  }));
4719
4855
  const result = applyRalplanGate(['team'], 'team으로 해줘', { cwd });
4720
- assert.equal(result.gateApplied, false);
4721
- assert.deepEqual(result.keywords, ['team']);
4856
+ assert.equal(result.gateApplied, true);
4857
+ assert.deepEqual(result.keywords, ['ralplan']);
4858
+ assert.equal(result.blockedReason, 'documented_host_consensus_receipt_unavailable');
4722
4859
  }
4723
4860
  finally {
4724
4861
  await rm(cwd, { recursive: true, force: true });
@@ -4756,12 +4893,13 @@ describe('applyRalplanGate', () => {
4756
4893
  const result = applyRalplanGate(['team'], 'team', { cwd, requireNativeSubagents: true });
4757
4894
  assert.equal(result.gateApplied, true);
4758
4895
  assert.deepEqual(result.keywords, ['ralplan']);
4896
+ assert.equal(result.blockedReason, 'documented_host_consensus_receipt_unavailable');
4759
4897
  }
4760
4898
  finally {
4761
4899
  await rm(cwd, { recursive: true, force: true });
4762
4900
  }
4763
4901
  });
4764
- it('does not re-enter ralplan for a short approved ralph follow-up with durable consensus', async () => {
4902
+ it('keeps short approved ralph follow-ups gated without an official host consensus receipt', async () => {
4765
4903
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-ralph-'));
4766
4904
  try {
4767
4905
  const plansDir = join(cwd, '.omx', 'plans');
@@ -4776,13 +4914,14 @@ describe('applyRalplanGate', () => {
4776
4914
  ralplan_consensus_gate: {
4777
4915
  complete: true,
4778
4916
  sequence: ['architect-review', 'critic-review'],
4779
- ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
4780
- ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
4917
+ ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1, sequence_index: 1 },
4918
+ ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1, sequence_index: 2 },
4781
4919
  },
4782
4920
  }));
4783
4921
  const result = applyRalplanGate(['ralph'], 'ralph please', { cwd, priorSkill: 'ralplan' });
4784
- assert.equal(result.gateApplied, false);
4785
- assert.deepEqual(result.keywords, ['ralph']);
4922
+ assert.equal(result.gateApplied, true);
4923
+ assert.deepEqual(result.keywords, ['ralplan']);
4924
+ assert.equal(result.blockedReason, 'documented_host_consensus_receipt_unavailable');
4786
4925
  }
4787
4926
  finally {
4788
4927
  await rm(cwd, { recursive: true, force: true });