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,11 +1,14 @@
1
1
  import { describe, it } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
3
  import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
+ import { existsSync, realpathSync } from 'node:fs';
4
5
  import { join } from 'node:path';
5
- import { tmpdir } from 'node:os';
6
- import { addUltragoalGoal, buildCodexGoalInstruction, checkpointUltragoal, createUltragoalPlan, isFinalRunCompletionCandidate, isUltragoalDone, readUltragoalPlan, recordFinalReviewBlockers, steerUltragoal, startNextUltragoal, summarizeUltragoalPlan, ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE, validateUltragoalSteeringProposal, } from '../artifacts.js';
6
+ import { tmpdir as osTmpdir } from 'node:os';
7
+ import { __resetSessionPointerTransactionDependenciesForTests, __setSessionPointerTransactionDependenciesForTests, } from '../../hooks/session.js';
8
+ import { addUltragoalGoal, assertUltragoalWritableLifecycleAuthority, buildCodexGoalInstruction, checkpointUltragoal, createUltragoalPlan, isFinalRunCompletionCandidate, isUltragoalDone, readUltragoalPlan, recordFinalReviewBlockers, steerUltragoal, startNextUltragoal, summarizeUltragoalPlan, ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE, UltragoalError, validateUltragoalSteeringProposal, } from '../artifacts.js';
7
9
  import { LEADER_CONDUCTOR_BLOCK, buildUnsupportedNativeSubagentGuidance } from '../../leader/contract.js';
8
10
  import { steeringFixtures } from './steering-fixtures.js';
11
+ const tmpdir = () => realpathSync(osTmpdir());
9
12
  async function withTempRepo(run) {
10
13
  const cwd = await mkdtemp(join(tmpdir(), 'omx-ultragoal-'));
11
14
  try {
@@ -39,6 +42,35 @@ function cleanQualityGate() {
39
42
  function escapeRegExp(value) {
40
43
  return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
41
44
  }
45
+ function aggregateFixtureGoal(id, status, extra = {}) {
46
+ return {
47
+ id,
48
+ title: id,
49
+ objective: `${id} work.`,
50
+ status,
51
+ attempt: 1,
52
+ createdAt: '2026-01-01T00:00:00.000Z',
53
+ updatedAt: '2026-01-01T00:00:00.000Z',
54
+ ...extra,
55
+ };
56
+ }
57
+ async function writeAggregateFixturePlan(cwd, activeGoalId, goals) {
58
+ await mkdir(join(cwd, '.omx/ultragoal'), { recursive: true });
59
+ await writeFile(join(cwd, '.omx/ultragoal/brief.md'), 'aggregate terminalization fixture\n');
60
+ await writeFile(join(cwd, '.omx/ultragoal/goals.json'), `${JSON.stringify({
61
+ version: 1,
62
+ createdAt: '2026-01-01T00:00:00.000Z',
63
+ updatedAt: '2026-01-01T00:00:00.000Z',
64
+ briefPath: '.omx/ultragoal/brief.md',
65
+ goalsPath: '.omx/ultragoal/goals.json',
66
+ ledgerPath: '.omx/ultragoal/ledger.jsonl',
67
+ codexGoalMode: 'aggregate',
68
+ codexObjective: ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE,
69
+ activeGoalId,
70
+ goals,
71
+ }, null, 2)}\n`);
72
+ await writeFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), '');
73
+ }
42
74
  async function writeFixturePlan(cwd, plan) {
43
75
  await mkdir(join(cwd, '.omx/ultragoal'), { recursive: true });
44
76
  await writeFile(join(cwd, '.omx/ultragoal/brief.md'), 'G001-core-steering-model fixture for .omx/ultragoal steering behavior.\n');
@@ -491,6 +523,11 @@ describe('ultragoal artifacts', () => {
491
523
  evidence: 'first audit passed',
492
524
  codexGoal: { goal: { objective: aggregateObjective, status: 'active' } },
493
525
  });
526
+ const midRunPlan = await readUltragoalPlan(cwd);
527
+ assert.equal(midRunPlan.goals.find((goal) => goal.id === 'G001-first')?.status, 'complete');
528
+ assert.equal(midRunPlan.goals.find((goal) => goal.id === 'G002-second')?.status, 'pending');
529
+ assert.equal(midRunPlan.aggregateCompletion, undefined);
530
+ assert.equal(summarizeUltragoalPlan(midRunPlan).aggregateComplete, false);
494
531
  const second = await startNextUltragoal(cwd);
495
532
  await checkpointUltragoal(cwd, {
496
533
  goalId: second.goal.id,
@@ -500,8 +537,16 @@ describe('ultragoal artifacts', () => {
500
537
  qualityGate: cleanQualityGate(),
501
538
  });
502
539
  const plan = await readUltragoalPlan(cwd);
540
+ assert.equal(plan.goals.find((goal) => goal.id === second.goal.id)?.status, 'complete');
503
541
  assert.equal(plan.goals.every((goal) => goal.status === 'complete'), true);
504
542
  assert.equal(plan.activeGoalId, undefined);
543
+ assert.equal(plan.aggregateCompletion?.status, 'complete');
544
+ const summary = summarizeUltragoalPlan(plan);
545
+ assert.equal(summary.aggregateComplete, true);
546
+ assert.equal(summary.artifactComplete, true);
547
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
548
+ assert.equal((ledger.match(/"event":"goal_completed"/g) ?? []).length, 2);
549
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 1);
505
550
  });
506
551
  });
507
552
  it('treats existing v1 plans without mode metadata as legacy per-story plans', async () => {
@@ -740,6 +785,437 @@ describe('ultragoal artifacts', () => {
740
785
  assert.match(ledger, /"event":"aggregate_completed"/);
741
786
  });
742
787
  });
788
+ it('does not terminalize through a one-way designated resolver pointer', async () => {
789
+ await withTempRepo(async (cwd) => {
790
+ await createUltragoalPlan(cwd, {
791
+ brief: 'brief',
792
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
793
+ });
794
+ const started = await startNextUltragoal(cwd);
795
+ const objective = started.plan.codexObjective;
796
+ const blocked = await recordFinalReviewBlockers(cwd, {
797
+ goalId: started.goal.id,
798
+ title: 'Resolve final code-review blockers',
799
+ objective: 'Fix final code-review blockers and rerun final gates.',
800
+ evidence: 'code-reviewer REQUEST CHANGES before resolver',
801
+ codexGoal: { goal: { objective, status: 'active' } },
802
+ });
803
+ const resolver = await startNextUltragoal(cwd);
804
+ assert.equal(resolver.goal?.id, blocked.addedGoal.id);
805
+ const planPath = join(cwd, '.omx/ultragoal/goals.json');
806
+ const tampered = JSON.parse(await readFile(planPath, 'utf-8'));
807
+ const resolverGoal = tampered.goals.find((goal) => goal.id === resolver.goal.id);
808
+ delete resolverGoal.resolvesReviewBlockedGoalId;
809
+ await writeFile(planPath, `${JSON.stringify(tampered, null, 2)}\n`);
810
+ const parentBeforeCheckpoint = tampered.goals.find((goal) => goal.id === blocked.blockedGoal.id);
811
+ assert.equal(isFinalRunCompletionCandidate(tampered, resolverGoal), true);
812
+ assert.equal(parentBeforeCheckpoint?.reviewBlockerResolution?.resolverGoalId, resolverGoal.id);
813
+ const completed = await checkpointUltragoal(cwd, {
814
+ goalId: resolverGoal.id,
815
+ status: 'complete',
816
+ evidence: `${resolverGoal.id} fixed blockers; final gate passed for .omx/ultragoal/goals.json`,
817
+ codexGoal: { goal: { objective, status: 'complete' } },
818
+ qualityGate: cleanQualityGate(),
819
+ });
820
+ const parent = completed.goals.find((goal) => goal.id === blocked.blockedGoal.id);
821
+ const completedResolver = completed.goals.find((goal) => goal.id === resolverGoal.id);
822
+ const summary = summarizeUltragoalPlan(completed);
823
+ assert.equal(completedResolver?.status, 'complete');
824
+ assert.equal(parent?.status, 'review_blocked');
825
+ assert.equal(parent?.reviewBlockerResolution?.resolverGoalId, resolverGoal.id);
826
+ assert.equal(completed.aggregateCompletion, undefined);
827
+ assert.equal(summary.reviewBlocked, 1);
828
+ assert.equal(summary.aggregateComplete, false);
829
+ assert.equal(summary.artifactComplete, false);
830
+ assert.equal(isUltragoalDone(completed), false);
831
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
832
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
833
+ });
834
+ });
835
+ it('does not terminalize when two unresolved review-blocked parents point at one resolver', async () => {
836
+ await withTempRepo(async (cwd) => {
837
+ await createUltragoalPlan(cwd, {
838
+ brief: 'brief',
839
+ goals: [{ title: 'Final', objective: 'Complete final milestone.' }],
840
+ });
841
+ const started = await startNextUltragoal(cwd);
842
+ const objective = started.plan.codexObjective;
843
+ const blocked = await recordFinalReviewBlockers(cwd, {
844
+ goalId: started.goal.id,
845
+ title: 'Resolve final code-review blockers',
846
+ objective: 'Fix final code-review blockers and rerun final gates.',
847
+ evidence: 'code-reviewer REQUEST CHANGES before resolver',
848
+ codexGoal: { goal: { objective, status: 'active' } },
849
+ });
850
+ const resolver = await startNextUltragoal(cwd);
851
+ assert.equal(resolver.goal?.id, blocked.addedGoal.id);
852
+ const planPath = join(cwd, '.omx/ultragoal/goals.json');
853
+ const tampered = JSON.parse(await readFile(planPath, 'utf-8'));
854
+ const resolverGoal = tampered.goals.find((goal) => goal.id === resolver.goal.id);
855
+ const originalParent = tampered.goals.find((goal) => goal.id === blocked.blockedGoal.id);
856
+ tampered.goals.push({
857
+ ...originalParent,
858
+ id: 'G999-forged-second-parent',
859
+ title: 'Forged second review-blocked parent',
860
+ objective: 'Forge a second unresolved review-blocked parent.',
861
+ status: 'review_blocked',
862
+ reviewBlockerResolution: {
863
+ resolverGoalId: resolverGoal.id,
864
+ status: 'pending',
865
+ evidence: 'forged second parent',
866
+ },
867
+ });
868
+ await writeFile(planPath, `${JSON.stringify(tampered, null, 2)}\n`);
869
+ assert.equal(tampered.goals.filter((goal) => goal.status === 'review_blocked').length, 2);
870
+ assert.equal(isFinalRunCompletionCandidate(tampered, resolverGoal), true);
871
+ const completed = await checkpointUltragoal(cwd, {
872
+ goalId: resolverGoal.id,
873
+ status: 'complete',
874
+ evidence: `${resolverGoal.id} fixed blockers; final gate passed for .omx/ultragoal/goals.json`,
875
+ codexGoal: { goal: { objective, status: 'complete' } },
876
+ qualityGate: cleanQualityGate(),
877
+ });
878
+ const originalParentAfter = completed.goals.find((goal) => goal.id === originalParent.id);
879
+ const secondParentAfter = completed.goals.find((goal) => goal.id === 'G999-forged-second-parent');
880
+ const completedResolver = completed.goals.find((goal) => goal.id === resolverGoal.id);
881
+ const summary = summarizeUltragoalPlan(completed);
882
+ assert.equal(completedResolver?.status, 'complete');
883
+ assert.equal(originalParentAfter?.status, 'complete');
884
+ assert.equal(originalParentAfter?.reviewBlockerResolution?.status, 'complete');
885
+ assert.equal(secondParentAfter?.status, 'review_blocked');
886
+ assert.equal(secondParentAfter?.reviewBlockerResolution?.status, 'pending');
887
+ assert.equal(completed.aggregateCompletion, undefined);
888
+ assert.equal(summary.reviewBlocked, 1);
889
+ assert.equal(summary.aggregateComplete, false);
890
+ assert.equal(summary.artifactComplete, false);
891
+ assert.equal(isUltragoalDone(completed), false);
892
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
893
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
894
+ });
895
+ });
896
+ it('does not terminalize when a review-blocked parent names a resolver whose back-pointer targets another parent', async () => {
897
+ await withTempRepo(async (cwd) => {
898
+ const objective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
899
+ await writeAggregateFixturePlan(cwd, 'G004-final', [
900
+ aggregateFixtureGoal('G001-parent', 'review_blocked', {
901
+ reviewBlockerResolution: {
902
+ resolverGoalId: 'G002-resolver',
903
+ status: 'complete',
904
+ resolvedAt: '2026-01-01T00:00:00.000Z',
905
+ evidence: 'forged resolution metadata',
906
+ },
907
+ }),
908
+ aggregateFixtureGoal('G002-resolver', 'complete', {
909
+ completedAt: '2026-01-01T00:00:00.000Z',
910
+ evidence: 'resolver done',
911
+ resolvesReviewBlockedGoalId: 'G003-other',
912
+ }),
913
+ aggregateFixtureGoal('G003-other', 'complete', { completedAt: '2026-01-01T00:00:00.000Z', evidence: 'other done' }),
914
+ aggregateFixtureGoal('G004-final', 'in_progress', { startedAt: '2026-01-01T00:00:00.000Z' }),
915
+ ]);
916
+ const tampered = await readUltragoalPlan(cwd);
917
+ assert.equal(isFinalRunCompletionCandidate(tampered, tampered.goals.find((goal) => goal.id === 'G004-final')), false);
918
+ await assert.rejects(() => checkpointUltragoal(cwd, {
919
+ goalId: 'G004-final',
920
+ status: 'complete',
921
+ evidence: 'G004-final completed planned work for .omx/ultragoal/goals.json; validation complete; reviews clean.',
922
+ codexGoal: { goal: { objective, status: 'complete' } },
923
+ qualityGate: cleanQualityGate(),
924
+ }), /not complete|objective mismatch|Completed task-scoped aggregate reconciliation/);
925
+ const plan = await readUltragoalPlan(cwd);
926
+ assert.equal(plan.goals.find((goal) => goal.id === 'G001-parent')?.status, 'review_blocked');
927
+ assert.equal(plan.aggregateCompletion, undefined);
928
+ assert.equal(summarizeUltragoalPlan(plan).aggregateComplete, false);
929
+ assert.equal(isUltragoalDone(plan), false);
930
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
931
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
932
+ });
933
+ });
934
+ it('does not terminalize when a falsely-resolved parent coexists with a legitimate designated resolver', async () => {
935
+ await withTempRepo(async (cwd) => {
936
+ const objective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
937
+ await writeAggregateFixturePlan(cwd, 'G004-resolver-b', [
938
+ aggregateFixtureGoal('G001-parent-a', 'review_blocked', {
939
+ reviewBlockerResolution: {
940
+ resolverGoalId: 'G002-resolver-a',
941
+ status: 'complete',
942
+ resolvedAt: '2026-01-01T00:00:00.000Z',
943
+ evidence: 'forged resolution metadata for parent A',
944
+ },
945
+ }),
946
+ aggregateFixtureGoal('G002-resolver-a', 'complete', {
947
+ completedAt: '2026-01-01T00:00:00.000Z',
948
+ evidence: 'resolver A done',
949
+ resolvesReviewBlockedGoalId: 'G009-elsewhere',
950
+ }),
951
+ aggregateFixtureGoal('G003-parent-b', 'review_blocked', {
952
+ reviewBlockerResolution: {
953
+ resolverGoalId: 'G004-resolver-b',
954
+ status: 'pending',
955
+ evidence: 'legitimate blocker for parent B',
956
+ },
957
+ }),
958
+ aggregateFixtureGoal('G004-resolver-b', 'in_progress', {
959
+ startedAt: '2026-01-01T00:00:00.000Z',
960
+ resolvesReviewBlockedGoalId: 'G003-parent-b',
961
+ }),
962
+ ]);
963
+ await assert.rejects(() => checkpointUltragoal(cwd, {
964
+ goalId: 'G004-resolver-b',
965
+ status: 'complete',
966
+ evidence: 'G004-resolver-b completed planned work for .omx/ultragoal/goals.json; validation complete; reviews clean.',
967
+ codexGoal: { goal: { objective, status: 'complete' } },
968
+ qualityGate: cleanQualityGate(),
969
+ }), /not complete|objective mismatch|Completed task-scoped aggregate reconciliation/);
970
+ const plan = await readUltragoalPlan(cwd);
971
+ assert.equal(plan.goals.find((goal) => goal.id === 'G001-parent-a')?.status, 'review_blocked');
972
+ assert.equal(plan.aggregateCompletion, undefined);
973
+ assert.equal(summarizeUltragoalPlan(plan).aggregateComplete, false);
974
+ assert.equal(isUltragoalDone(plan), false);
975
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
976
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
977
+ });
978
+ });
979
+ it('does not treat a self-referential review-blocker resolver as a designated resolver', async () => {
980
+ await withTempRepo(async (cwd) => {
981
+ const objective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
982
+ await writeAggregateFixturePlan(cwd, 'G001-self', [
983
+ aggregateFixtureGoal('G001-self', 'review_blocked', {
984
+ reviewBlockerResolution: {
985
+ resolverGoalId: 'G001-self',
986
+ status: 'pending',
987
+ evidence: 'self-referential resolver metadata',
988
+ },
989
+ resolvesReviewBlockedGoalId: 'G001-self',
990
+ }),
991
+ ]);
992
+ const completed = await checkpointUltragoal(cwd, {
993
+ goalId: 'G001-self',
994
+ status: 'complete',
995
+ evidence: 'G001-self completed planned work for .omx/ultragoal/goals.json; validation complete; reviews clean.',
996
+ codexGoal: { goal: { objective, status: 'complete' } },
997
+ qualityGate: cleanQualityGate(),
998
+ });
999
+ assert.equal(completed.aggregateCompletion, undefined);
1000
+ assert.equal(summarizeUltragoalPlan(completed).aggregateComplete, false);
1001
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1002
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
1003
+ });
1004
+ });
1005
+ it('does not terminalize when the final aggregate candidate is steering-blocked', async () => {
1006
+ await withTempRepo(async (cwd) => {
1007
+ const objective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
1008
+ await writeAggregateFixturePlan(cwd, 'G002-target', [
1009
+ aggregateFixtureGoal('G001-first', 'complete', { completedAt: '2026-01-01T00:00:00.000Z', evidence: 'first done' }),
1010
+ aggregateFixtureGoal('G002-target', 'in_progress', { startedAt: '2026-01-01T00:00:00.000Z', steeringStatus: 'blocked' }),
1011
+ ]);
1012
+ const tampered = await readUltragoalPlan(cwd);
1013
+ assert.equal(isFinalRunCompletionCandidate(tampered, tampered.goals.find((goal) => goal.id === 'G002-target')), true);
1014
+ const completed = await checkpointUltragoal(cwd, {
1015
+ goalId: 'G002-target',
1016
+ status: 'complete',
1017
+ evidence: 'G002-target completed planned work for .omx/ultragoal/goals.json; validation complete; reviews clean.',
1018
+ codexGoal: { goal: { objective, status: 'complete' } },
1019
+ qualityGate: cleanQualityGate(),
1020
+ });
1021
+ assert.equal(completed.goals.find((goal) => goal.id === 'G002-target')?.steeringStatus, 'blocked');
1022
+ assert.equal(completed.aggregateCompletion, undefined);
1023
+ assert.equal(summarizeUltragoalPlan(completed).aggregateComplete, false);
1024
+ assert.equal(isUltragoalDone(completed), false);
1025
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1026
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
1027
+ });
1028
+ });
1029
+ it('does not terminalize when duplicate goal ids hide an unresolved row', async () => {
1030
+ await withTempRepo(async (cwd) => {
1031
+ const objective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
1032
+ await writeAggregateFixturePlan(cwd, 'G002-dup', [
1033
+ aggregateFixtureGoal('G001-first', 'complete', { completedAt: '2026-01-01T00:00:00.000Z', evidence: 'first done' }),
1034
+ aggregateFixtureGoal('G002-dup', 'in_progress', { startedAt: '2026-01-01T00:00:00.000Z' }),
1035
+ aggregateFixtureGoal('G002-dup', 'pending'),
1036
+ ]);
1037
+ const tampered = await readUltragoalPlan(cwd);
1038
+ assert.equal(isFinalRunCompletionCandidate(tampered, tampered.goals.find((goal) => goal.id === 'G002-dup')), true);
1039
+ const completed = await checkpointUltragoal(cwd, {
1040
+ goalId: 'G002-dup',
1041
+ status: 'complete',
1042
+ evidence: 'G002-dup completed planned work for .omx/ultragoal/goals.json; validation complete; reviews clean.',
1043
+ codexGoal: { goal: { objective, status: 'complete' } },
1044
+ qualityGate: cleanQualityGate(),
1045
+ });
1046
+ assert.equal(completed.goals.filter((goal) => goal.id === 'G002-dup' && goal.status === 'pending').length, 1);
1047
+ assert.equal(completed.aggregateCompletion, undefined);
1048
+ assert.equal(summarizeUltragoalPlan(completed).aggregateComplete, false);
1049
+ assert.equal(isUltragoalDone(completed), false);
1050
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1051
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
1052
+ });
1053
+ });
1054
+ it('does not terminalize a final aggregate candidate that is not the active in-progress goal', async () => {
1055
+ const objective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
1056
+ for (const unowned of ['pending', 'failed', 'needs_user_decision']) {
1057
+ await withTempRepo(async (cwd) => {
1058
+ await writeAggregateFixturePlan(cwd, 'G002-target', [
1059
+ aggregateFixtureGoal('G001-first', 'complete', { completedAt: '2026-01-01T00:00:00.000Z', evidence: 'first done' }),
1060
+ aggregateFixtureGoal('G002-target', unowned),
1061
+ ]);
1062
+ const tampered = await readUltragoalPlan(cwd);
1063
+ assert.equal(isFinalRunCompletionCandidate(tampered, tampered.goals.find((goal) => goal.id === 'G002-target')), true);
1064
+ const completed = await checkpointUltragoal(cwd, {
1065
+ goalId: 'G002-target',
1066
+ status: 'complete',
1067
+ evidence: 'G002-target completed planned work for .omx/ultragoal/goals.json; validation complete; reviews clean.',
1068
+ codexGoal: { goal: { objective, status: 'complete' } },
1069
+ qualityGate: cleanQualityGate(),
1070
+ });
1071
+ assert.equal(completed.aggregateCompletion, undefined, unowned);
1072
+ assert.equal(summarizeUltragoalPlan(completed).aggregateComplete, false, unowned);
1073
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1074
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0, unowned);
1075
+ });
1076
+ }
1077
+ });
1078
+ it('keeps terminal aggregate completion idempotent under repeated and concurrent final checkpoints', async () => {
1079
+ await withTempRepo(async (cwd) => {
1080
+ await createUltragoalPlan(cwd, {
1081
+ brief: 'brief',
1082
+ goals: [
1083
+ { title: 'First', objective: 'Complete first milestone.' },
1084
+ { title: 'Second', objective: 'Complete second milestone.' },
1085
+ ],
1086
+ });
1087
+ const first = await startNextUltragoal(cwd);
1088
+ const aggregateObjective = first.plan.codexObjective;
1089
+ await checkpointUltragoal(cwd, {
1090
+ goalId: first.goal.id,
1091
+ status: 'complete',
1092
+ evidence: 'first audit passed',
1093
+ codexGoal: { goal: { objective: aggregateObjective, status: 'active' } },
1094
+ });
1095
+ const second = await startNextUltragoal(cwd);
1096
+ const terminal = await checkpointUltragoal(cwd, {
1097
+ goalId: second.goal.id,
1098
+ status: 'complete',
1099
+ evidence: 'final audit passed',
1100
+ codexGoal: { goal: { objective: aggregateObjective, status: 'complete' } },
1101
+ qualityGate: cleanQualityGate(),
1102
+ });
1103
+ const firstCompletedAt = terminal.aggregateCompletion?.completedAt;
1104
+ assert.equal(terminal.aggregateCompletion?.status, 'complete');
1105
+ assert.ok(firstCompletedAt);
1106
+ for (let attempt = 0; attempt < 3; attempt += 1) {
1107
+ await checkpointUltragoal(cwd, {
1108
+ goalId: second.goal.id,
1109
+ status: 'complete',
1110
+ evidence: `repeated terminal checkpoint ${attempt}`,
1111
+ codexGoal: { goal: { objective: aggregateObjective, status: 'complete' } },
1112
+ qualityGate: cleanQualityGate(),
1113
+ }).catch(() => undefined);
1114
+ }
1115
+ await Promise.allSettled(Array.from({ length: 5 }, (_, index) => checkpointUltragoal(cwd, {
1116
+ goalId: second.goal.id,
1117
+ status: 'complete',
1118
+ evidence: `concurrent terminal checkpoint ${index}`,
1119
+ codexGoal: { goal: { objective: aggregateObjective, status: 'complete' } },
1120
+ qualityGate: cleanQualityGate(),
1121
+ })));
1122
+ const plan = await readUltragoalPlan(cwd);
1123
+ assert.equal(plan.aggregateCompletion?.status, 'complete');
1124
+ assert.equal(plan.aggregateCompletion?.completedAt, firstCompletedAt);
1125
+ assert.equal(summarizeUltragoalPlan(plan).aggregateComplete, true);
1126
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1127
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 1);
1128
+ });
1129
+ });
1130
+ it('pins allowActiveFinalCodexGoal as a required negative condition for terminal aggregate completion', async () => {
1131
+ await withTempRepo(async (cwd) => {
1132
+ await createUltragoalPlan(cwd, {
1133
+ brief: 'brief',
1134
+ goals: [
1135
+ { title: 'First', objective: 'Complete first milestone.' },
1136
+ { title: 'Second', objective: 'Complete second milestone.' },
1137
+ ],
1138
+ });
1139
+ const first = await startNextUltragoal(cwd);
1140
+ const aggregateObjective = first.plan.codexObjective;
1141
+ await checkpointUltragoal(cwd, {
1142
+ goalId: first.goal.id,
1143
+ status: 'complete',
1144
+ evidence: 'first audit passed',
1145
+ codexGoal: { goal: { objective: aggregateObjective, status: 'active' } },
1146
+ });
1147
+ const second = await startNextUltragoal(cwd);
1148
+ const completed = await checkpointUltragoal(cwd, {
1149
+ goalId: second.goal.id,
1150
+ status: 'complete',
1151
+ evidence: 'final story completed while the aggregate Codex goal stays active',
1152
+ codexGoal: { goal: { objective: aggregateObjective, status: 'active' } },
1153
+ allowActiveFinalCodexGoal: true,
1154
+ });
1155
+ assert.equal(completed.goals.find((goal) => goal.id === second.goal.id)?.status, 'complete');
1156
+ assert.equal(completed.aggregateCompletion, undefined);
1157
+ assert.equal(summarizeUltragoalPlan(completed).aggregateComplete, false);
1158
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1159
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0);
1160
+ });
1161
+ });
1162
+ it('does not terminalize an in-progress final candidate whose activeGoalId pointer does not match', async () => {
1163
+ const objective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
1164
+ for (const activePointer of ['G001-first', undefined]) {
1165
+ await withTempRepo(async (cwd) => {
1166
+ await writeAggregateFixturePlan(cwd, activePointer, [
1167
+ aggregateFixtureGoal('G001-first', 'complete', { completedAt: '2026-01-01T00:00:00.000Z', evidence: 'first done' }),
1168
+ aggregateFixtureGoal('G002-target', 'in_progress', { startedAt: '2026-01-01T00:00:00.000Z' }),
1169
+ ]);
1170
+ const tampered = await readUltragoalPlan(cwd);
1171
+ const target = tampered.goals.find((goal) => goal.id === 'G002-target');
1172
+ assert.equal(target.status, 'in_progress');
1173
+ assert.equal(isFinalRunCompletionCandidate(tampered, target), true);
1174
+ const completed = await checkpointUltragoal(cwd, {
1175
+ goalId: 'G002-target',
1176
+ status: 'complete',
1177
+ evidence: 'G002-target completed planned work for .omx/ultragoal/goals.json; validation complete; reviews clean.',
1178
+ codexGoal: { goal: { objective, status: 'complete' } },
1179
+ qualityGate: cleanQualityGate(),
1180
+ });
1181
+ assert.equal(completed.aggregateCompletion, undefined, String(activePointer));
1182
+ assert.equal(summarizeUltragoalPlan(completed).aggregateComplete, false, String(activePointer));
1183
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1184
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 0, String(activePointer));
1185
+ });
1186
+ }
1187
+ });
1188
+ it('freezes a completed aggregate plan against post-terminal failure checkpoints and goal additions', async () => {
1189
+ await withTempRepo(async (cwd) => {
1190
+ await createUltragoalPlan(cwd, {
1191
+ brief: 'brief',
1192
+ goals: [{ title: 'Only', objective: 'Complete the only milestone.' }],
1193
+ });
1194
+ const started = await startNextUltragoal(cwd);
1195
+ const terminal = await checkpointUltragoal(cwd, {
1196
+ goalId: started.goal.id,
1197
+ status: 'complete',
1198
+ evidence: 'terminal aggregate checkpoint',
1199
+ codexGoal: { goal: { objective: started.plan.codexObjective, status: 'complete' } },
1200
+ qualityGate: cleanQualityGate(),
1201
+ });
1202
+ assert.equal(terminal.aggregateCompletion?.status, 'complete');
1203
+ await assert.rejects(() => checkpointUltragoal(cwd, {
1204
+ goalId: started.goal.id,
1205
+ status: 'failed',
1206
+ evidence: 'post-terminal failure attempt',
1207
+ }), /after the aggregate ultragoal plan is complete/);
1208
+ await assert.rejects(() => addUltragoalGoal(cwd, { title: 'Post terminal', objective: 'Added after completion.' }), /already completed aggregate ultragoal plan/);
1209
+ const plan = await readUltragoalPlan(cwd);
1210
+ assert.equal(plan.goals.length, 1);
1211
+ assert.equal(plan.goals[0]?.status, 'complete');
1212
+ assert.equal(plan.aggregateCompletion?.status, 'complete');
1213
+ assert.equal(summarizeUltragoalPlan(plan).aggregateComplete, true);
1214
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
1215
+ assert.equal((ledger.match(/"event":"aggregate_completed"/g) ?? []).length, 1);
1216
+ assert.equal((ledger.match(/"event":"goal_failed"/g) ?? []).length, 0);
1217
+ });
1218
+ });
743
1219
  it('does not reconcile a review-blocked parent from a non-designated resolver goal', async () => {
744
1220
  await withTempRepo(async (cwd) => {
745
1221
  await createUltragoalPlan(cwd, {
@@ -1757,6 +2233,41 @@ describe('ultragoal artifacts', () => {
1757
2233
  }), /different completed legacy Codex goal/);
1758
2234
  });
1759
2235
  });
2236
+ it('records matching native blocked Codex goal checkpoints as non-terminal', async () => {
2237
+ await withTempRepo(async (cwd) => {
2238
+ await createUltragoalPlan(cwd, {
2239
+ brief: 'brief',
2240
+ goals: [
2241
+ { title: 'First', objective: 'Complete first milestone.' },
2242
+ ],
2243
+ });
2244
+ const first = await startNextUltragoal(cwd);
2245
+ const objective = first.plan.codexObjective ?? first.goal.objective;
2246
+ const plan = await checkpointUltragoal(cwd, {
2247
+ goalId: first.goal.id,
2248
+ status: 'blocked',
2249
+ evidence: 'native matching blocked needs attention',
2250
+ codexGoal: { goal: { objective, status: 'blocked' } },
2251
+ });
2252
+ const goal = plan.goals.find((item) => item.id === first.goal.id);
2253
+ assert.equal(goal?.status, 'in_progress');
2254
+ assert.equal(plan.activeGoalId, first.goal.id);
2255
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
2256
+ assert.match(ledger, /"event":"goal_blocked"/);
2257
+ assert.match(ledger, /Native Codex goal status is blocked/);
2258
+ await assert.rejects(() => checkpointUltragoal(cwd, {
2259
+ goalId: first.goal.id,
2260
+ status: 'blocked',
2261
+ codexGoal: { goal: { objective, status: 'blocked' } },
2262
+ }), /--evidence/);
2263
+ await assert.rejects(() => checkpointUltragoal(cwd, {
2264
+ goalId: first.goal.id,
2265
+ status: 'blocked',
2266
+ evidence: 'foreign blocked goal',
2267
+ codexGoal: { goal: { objective: 'Different blocked work', status: 'blocked' } },
2268
+ }), /objective mismatch/);
2269
+ });
2270
+ });
1760
2271
  it('steers a split pending goal through superseded lifecycle without weakening completion gates', async () => {
1761
2272
  await withTempRepo(async (cwd) => {
1762
2273
  await createUltragoalPlan(cwd, {
@@ -1891,5 +2402,442 @@ describe('ultragoal artifacts', () => {
1891
2402
  assert.equal((ledger.match(/"event":"steering_accepted"/g) ?? []).length, 1);
1892
2403
  });
1893
2404
  });
2405
+ it('preserves root-mode bootstrap when OMX_SESSION_ID is absent', async () => {
2406
+ await withTempRepo(async (cwd) => {
2407
+ const previousEnv = process.env.OMX_SESSION_ID;
2408
+ delete process.env.OMX_SESSION_ID;
2409
+ try {
2410
+ const plan = await createUltragoalPlan(cwd, { brief: '- Root-mode goal' });
2411
+ assert.equal(plan.goals.length, 1);
2412
+ assert.equal(existsSync(join(cwd, '.omx/ultragoal/brief.md')), true);
2413
+ assert.equal(existsSync(join(cwd, '.omx/ultragoal/goals.json')), true);
2414
+ assert.equal(existsSync(join(cwd, '.omx/ultragoal/ledger.jsonl')), true);
2415
+ }
2416
+ finally {
2417
+ if (typeof previousEnv === 'string')
2418
+ process.env.OMX_SESSION_ID = previousEnv;
2419
+ else
2420
+ delete process.env.OMX_SESSION_ID;
2421
+ }
2422
+ });
2423
+ });
2424
+ for (const [label, malformedSessionId] of [
2425
+ ['path separator', 'bad/session'],
2426
+ ['overlong value', 'x'.repeat(65)],
2427
+ ]) {
2428
+ it(`rejects root-mode bootstrap for a nonempty OMX_SESSION_ID with ${label}`, async () => {
2429
+ await withTempRepo(async (cwd) => {
2430
+ const previousEnv = process.env.OMX_SESSION_ID;
2431
+ process.env.OMX_SESSION_ID = malformedSessionId;
2432
+ try {
2433
+ await assert.rejects(() => createUltragoalPlan(cwd, { brief: '- Must not persist' }), /OMX_SESSION_ID/);
2434
+ assert.equal(existsSync(join(cwd, '.omx/ultragoal')), false);
2435
+ }
2436
+ finally {
2437
+ if (typeof previousEnv === 'string')
2438
+ process.env.OMX_SESSION_ID = previousEnv;
2439
+ else
2440
+ delete process.env.OMX_SESSION_ID;
2441
+ }
2442
+ });
2443
+ });
2444
+ }
2445
+ it('rejects a malformed OMX_SESSION_ID even when a live selected session exists', async () => {
2446
+ await withTempRepo(async (cwd) => {
2447
+ const previousEnv = process.env.OMX_SESSION_ID;
2448
+ process.env.OMX_SESSION_ID = 'bad/session';
2449
+ try {
2450
+ const stateDir = join(cwd, '.omx', 'state');
2451
+ await mkdir(stateDir, { recursive: true });
2452
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-live', cwd }));
2453
+ await assert.rejects(() => createUltragoalPlan(cwd, { brief: '- Must not persist' }), /OMX_SESSION_ID/);
2454
+ assert.equal(existsSync(join(cwd, '.omx/ultragoal')), false);
2455
+ }
2456
+ finally {
2457
+ if (typeof previousEnv === 'string')
2458
+ process.env.OMX_SESSION_ID = previousEnv;
2459
+ else
2460
+ delete process.env.OMX_SESSION_ID;
2461
+ }
2462
+ });
2463
+ });
2464
+ it('preserves unbound compatibility for mutations of an existing plan', async () => {
2465
+ await withTempRepo(async (cwd) => {
2466
+ const previousEnv = process.env.OMX_SESSION_ID;
2467
+ delete process.env.OMX_SESSION_ID;
2468
+ try {
2469
+ await createUltragoalPlan(cwd, { brief: '- Initial goal' });
2470
+ process.env.OMX_SESSION_ID = 'sess-compat';
2471
+ const added = await addUltragoalGoal(cwd, {
2472
+ title: 'Compatibility goal',
2473
+ objective: 'Preserve the existing-plan compatibility path.',
2474
+ });
2475
+ assert.equal(added.plan.goals.length, 2);
2476
+ assert.equal(added.goal.title, 'Compatibility goal');
2477
+ const ledger = await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
2478
+ assert.match(ledger, /"event":"goal_added"/);
2479
+ }
2480
+ finally {
2481
+ if (typeof previousEnv === 'string')
2482
+ process.env.OMX_SESSION_ID = previousEnv;
2483
+ else
2484
+ delete process.env.OMX_SESSION_ID;
2485
+ }
2486
+ });
2487
+ });
2488
+ it('blocks durable ultragoal mutations while the selected pointer is stale-dead and no exact session is bound', async () => {
2489
+ await withTempRepo(async (cwd) => {
2490
+ const previousEnv = process.env.OMX_SESSION_ID;
2491
+ delete process.env.OMX_SESSION_ID;
2492
+ __setSessionPointerTransactionDependenciesForTests({ probePid: () => 'dead' });
2493
+ try {
2494
+ const stateDir = join(cwd, '.omx', 'state');
2495
+ await mkdir(stateDir, { recursive: true });
2496
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-stale-dead', cwd, pid: 8388607 }));
2497
+ await assert.rejects(() => createUltragoalPlan(cwd, { brief: '- Ship the fix' }), (error) => {
2498
+ assert.match(String(error), /writable lifecycle authority/);
2499
+ assert.match(String(error), /OMX_SESSION_ID/);
2500
+ return true;
2501
+ });
2502
+ assert.equal(existsSync(join(cwd, '.omx', 'ultragoal', 'goals.json')), false);
2503
+ }
2504
+ finally {
2505
+ if (typeof previousEnv === 'string')
2506
+ process.env.OMX_SESSION_ID = previousEnv;
2507
+ __resetSessionPointerTransactionDependenciesForTests();
2508
+ }
2509
+ });
2510
+ });
2511
+ it('allows durable ultragoal mutations after exact-session reconciliation of a stale-dead pointer', async () => {
2512
+ await withTempRepo(async (cwd) => {
2513
+ const previousEnv = process.env.OMX_SESSION_ID;
2514
+ process.env.OMX_SESSION_ID = 'sess-current';
2515
+ __setSessionPointerTransactionDependenciesForTests({ probePid: () => 'dead' });
2516
+ try {
2517
+ const stateDir = join(cwd, '.omx', 'state');
2518
+ await mkdir(stateDir, { recursive: true });
2519
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-stale-dead', cwd, pid: 8388607 }));
2520
+ const plan = await createUltragoalPlan(cwd, { brief: '- Ship the fix' });
2521
+ assert.equal(plan.goals.length, 1);
2522
+ assert.equal(existsSync(join(cwd, '.omx', 'ultragoal', 'goals.json')), true);
2523
+ }
2524
+ finally {
2525
+ if (typeof previousEnv === 'string')
2526
+ process.env.OMX_SESSION_ID = previousEnv;
2527
+ else
2528
+ delete process.env.OMX_SESSION_ID;
2529
+ __resetSessionPointerTransactionDependenciesForTests();
2530
+ }
2531
+ });
2532
+ });
2533
+ it('gates every durable ultragoal mutator while the selected pointer is stale-dead and no exact session is bound', async () => {
2534
+ await withTempRepo(async (cwd) => {
2535
+ const previousEnv = process.env.OMX_SESSION_ID;
2536
+ delete process.env.OMX_SESSION_ID;
2537
+ __setSessionPointerTransactionDependenciesForTests({ probePid: () => 'dead' });
2538
+ try {
2539
+ const stateDir = join(cwd, '.omx', 'state');
2540
+ await mkdir(stateDir, { recursive: true });
2541
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-stale-dead', cwd, pid: 8388607 }));
2542
+ const attempts = [
2543
+ ['createUltragoalPlan', () => createUltragoalPlan(cwd, { brief: '- Ship the fix' })],
2544
+ ['addUltragoalGoal', () => addUltragoalGoal(cwd, { title: 'Later', objective: 'Later objective.' })],
2545
+ ['steerUltragoal', () => steerUltragoal(cwd, {
2546
+ kind: 'add_subgoal',
2547
+ source: 'user_prompt_submit',
2548
+ title: 'Later',
2549
+ objective: 'Later objective.',
2550
+ evidence: 'prompt-submit evidence',
2551
+ rationale: 'bounded explicit directive requires one follow-up only',
2552
+ idempotencyKey: 'gate-check',
2553
+ })],
2554
+ ['startNextUltragoal', () => startNextUltragoal(cwd)],
2555
+ ['checkpointUltragoal', () => checkpointUltragoal(cwd, { goalId: 'G001-ship-the-fix', status: 'complete', evidence: 'done' })],
2556
+ ['recordFinalReviewBlockers', () => recordFinalReviewBlockers(cwd, { goalId: 'G001-ship-the-fix', title: 'Blocker', objective: 'Resolve blocker.' })],
2557
+ ];
2558
+ for (const [name, attempt] of attempts) {
2559
+ await assert.rejects(attempt, (error) => {
2560
+ assert.match(String(error), /writable lifecycle authority/, name);
2561
+ return true;
2562
+ });
2563
+ }
2564
+ assert.equal(existsSync(join(cwd, '.omx', 'ultragoal', 'goals.json')), false);
2565
+ }
2566
+ finally {
2567
+ if (typeof previousEnv === 'string')
2568
+ process.env.OMX_SESSION_ID = previousEnv;
2569
+ __resetSessionPointerTransactionDependenciesForTests();
2570
+ }
2571
+ });
2572
+ });
2573
+ it('propagates non-compatibility resolver failures instead of permitting durable mutation', async () => {
2574
+ await withTempRepo(async (cwd) => {
2575
+ const allowedRoot = await mkdtemp(join(tmpdir(), 'omx-ultragoal-allowlist-'));
2576
+ const prevAllowlist = process.env.OMX_MCP_WORKDIR_ROOTS;
2577
+ const previousEnv = process.env.OMX_SESSION_ID;
2578
+ delete process.env.OMX_SESSION_ID;
2579
+ process.env.OMX_MCP_WORKDIR_ROOTS = allowedRoot;
2580
+ try {
2581
+ await assert.rejects(() => createUltragoalPlan(cwd, { brief: '- Ship the fix' }), /outside allowed roots/);
2582
+ assert.equal(existsSync(join(cwd, '.omx', 'ultragoal', 'goals.json')), false);
2583
+ }
2584
+ finally {
2585
+ if (typeof prevAllowlist === 'string')
2586
+ process.env.OMX_MCP_WORKDIR_ROOTS = prevAllowlist;
2587
+ else
2588
+ delete process.env.OMX_MCP_WORKDIR_ROOTS;
2589
+ if (typeof previousEnv === 'string')
2590
+ process.env.OMX_SESSION_ID = previousEnv;
2591
+ await rm(allowedRoot, { recursive: true, force: true });
2592
+ }
2593
+ });
2594
+ });
2595
+ it('fails closed when a live selected pointer does not match OMX_SESSION_ID', async () => {
2596
+ await withTempRepo(async (cwd) => {
2597
+ const previousEnv = process.env.OMX_SESSION_ID;
2598
+ process.env.OMX_SESSION_ID = 'sess-unmatched';
2599
+ try {
2600
+ const stateDir = join(cwd, '.omx', 'state');
2601
+ await mkdir(stateDir, { recursive: true });
2602
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-live', cwd }));
2603
+ await assert.rejects(() => createUltragoalPlan(cwd, { brief: '- Ship the fix' }), /does not match the live session/);
2604
+ assert.equal(existsSync(join(cwd, '.omx', 'ultragoal', 'goals.json')), false);
2605
+ }
2606
+ finally {
2607
+ if (typeof previousEnv === 'string')
2608
+ process.env.OMX_SESSION_ID = previousEnv;
2609
+ else
2610
+ delete process.env.OMX_SESSION_ID;
2611
+ }
2612
+ });
2613
+ });
2614
+ it('refuses read-path legacy objective migration while writable lifecycle authority is unrestored', async () => {
2615
+ await withTempRepo(async (cwd) => {
2616
+ const previousEnv = process.env.OMX_SESSION_ID;
2617
+ delete process.env.OMX_SESSION_ID;
2618
+ __setSessionPointerTransactionDependenciesForTests({ probePid: () => 'dead' });
2619
+ try {
2620
+ const stateDir = join(cwd, '.omx', 'state');
2621
+ await mkdir(stateDir, { recursive: true });
2622
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-stale-dead', cwd, pid: 8388607 }));
2623
+ await mkdir(join(cwd, '.omx/ultragoal'), { recursive: true });
2624
+ const legacyObjective = 'Complete all ultragoal stories in .omx/ultragoal/goals.json: G001-first First';
2625
+ const legacyPlan = `${JSON.stringify({
2626
+ version: 1,
2627
+ createdAt: '2026-05-04T10:00:00.000Z',
2628
+ updatedAt: '2026-05-04T10:00:00.000Z',
2629
+ briefPath: '.omx/ultragoal/brief.md',
2630
+ goalsPath: '.omx/ultragoal/goals.json',
2631
+ ledgerPath: '.omx/ultragoal/ledger.jsonl',
2632
+ codexGoalMode: 'aggregate',
2633
+ codexObjective: legacyObjective,
2634
+ goals: [
2635
+ { id: 'G001-first', title: 'First', objective: 'Complete first.', status: 'pending', attempt: 0, createdAt: '2026-05-04T10:00:00.000Z', updatedAt: '2026-05-04T10:00:00.000Z' },
2636
+ ],
2637
+ }, null, 2)}\n`;
2638
+ await writeFile(join(cwd, '.omx/ultragoal/goals.json'), legacyPlan);
2639
+ await writeFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), '');
2640
+ await assert.rejects(() => readUltragoalPlan(cwd), /writable lifecycle authority/);
2641
+ // No durable transition happened: the plan bytes and ledger are untouched.
2642
+ assert.equal(await readFile(join(cwd, '.omx/ultragoal/goals.json'), 'utf-8'), legacyPlan);
2643
+ assert.equal(await readFile(join(cwd, '.omx/ultragoal/ledger.jsonl'), 'utf-8'), '');
2644
+ }
2645
+ finally {
2646
+ if (typeof previousEnv === 'string')
2647
+ process.env.OMX_SESSION_ID = previousEnv;
2648
+ __resetSessionPointerTransactionDependenciesForTests();
2649
+ }
2650
+ });
2651
+ });
2652
+ it('T16 compares the full writable authority token around ultragoal mutation locks', async () => {
2653
+ await withTempRepo(async (cwd) => {
2654
+ const previousEnv = process.env.OMX_SESSION_ID;
2655
+ const stateDir = join(cwd, '.omx/state');
2656
+ const pointerPath = join(stateDir, 'session.json');
2657
+ const pointer = (sessionId) => JSON.stringify({ session_id: sessionId, cwd, state_root: stateDir });
2658
+ const goalsPath = join(cwd, '.omx/ultragoal/goals.json');
2659
+ const ledgerPath = join(cwd, '.omx/ultragoal/ledger.jsonl');
2660
+ const lockPath = join(cwd, '.omx/ultragoal/.mutation.lock');
2661
+ delete process.env.OMX_SESSION_ID;
2662
+ try {
2663
+ await mkdir(stateDir, { recursive: true });
2664
+ await createUltragoalPlan(cwd, { brief: '- Initial goal' });
2665
+ process.env.OMX_SESSION_ID = 'sess-compat';
2666
+ await writeFile(lockPath, 'held');
2667
+ setTimeout(() => { void rm(lockPath, { force: true }); }, 25);
2668
+ await addUltragoalGoal(cwd, { title: 'Stable compatibility authority', objective: 'Mutation proceeds.' });
2669
+ await writeFile(pointerPath, pointer('sess-compat'));
2670
+ await addUltragoalGoal(cwd, { title: 'Stable resolved authority', objective: 'Mutation proceeds.' });
2671
+ for (const [kind, beforeLock, change] of [
2672
+ ['resolved to different live session', async () => writeFile(pointerPath, pointer('sess-compat')), async () => { process.env.OMX_SESSION_ID = 'sess-replacement'; await writeFile(pointerPath, pointer('sess-replacement')); }],
2673
+ ['resolved to compatibility', async () => writeFile(pointerPath, pointer('sess-compat')), async () => rm(pointerPath)],
2674
+ ['compatibility to resolved', async () => rm(pointerPath, { force: true }), async () => writeFile(pointerPath, pointer('sess-compat'))],
2675
+ ]) {
2676
+ process.env.OMX_SESSION_ID = 'sess-compat';
2677
+ await beforeLock();
2678
+ const beforeGoals = await readFile(goalsPath, 'utf-8');
2679
+ const beforeLedger = await readFile(ledgerPath, 'utf-8');
2680
+ await writeFile(lockPath, 'held');
2681
+ setTimeout(() => { void change(); }, 20);
2682
+ setTimeout(() => { void rm(lockPath, { force: true }); }, 45);
2683
+ await assert.rejects(() => addUltragoalGoal(cwd, { title: kind, objective: 'Must not persist.' }), UltragoalError);
2684
+ assert.equal(await readFile(goalsPath, 'utf-8'), beforeGoals);
2685
+ assert.equal(await readFile(ledgerPath, 'utf-8'), beforeLedger);
2686
+ }
2687
+ }
2688
+ finally {
2689
+ await rm(lockPath, { force: true });
2690
+ if (typeof previousEnv === 'string')
2691
+ process.env.OMX_SESSION_ID = previousEnv;
2692
+ else
2693
+ delete process.env.OMX_SESSION_ID;
2694
+ }
2695
+ });
2696
+ });
2697
+ describe('canonical state paths in nested projects', () => {
2698
+ async function withNestedRepo(run) {
2699
+ const repo = await mkdtemp(join(tmpdir(), 'omx-ultragoal-nested-'));
2700
+ try {
2701
+ // A real git worktree root plus pre-existing root-level state that must never be selected.
2702
+ await mkdir(join(repo, '.git'), { recursive: true });
2703
+ await mkdir(join(repo, '.omx/ultragoal'), { recursive: true });
2704
+ await writeFile(join(repo, '.omx/ultragoal/goals.json'), '{"version":1,"goals":[]}\n');
2705
+ await writeFile(join(repo, '.omx/ultragoal/ledger.jsonl'), '');
2706
+ const subproject = join(repo, 'subproject');
2707
+ await mkdir(subproject, { recursive: true });
2708
+ return await run({ repo, subproject });
2709
+ }
2710
+ finally {
2711
+ await rm(repo, { recursive: true, force: true });
2712
+ }
2713
+ }
2714
+ it('binds the aggregate objective to the subtree state root', async () => {
2715
+ await withNestedRepo(async ({ subproject }) => {
2716
+ const plan = await createUltragoalPlan(subproject, { brief: 'Ship the nested feature' });
2717
+ assert.equal(plan.statePathPrefix, 'subproject');
2718
+ assert.match(plan.codexObjective ?? '', /subproject\/\.omx\/ultragoal\/goals\.json/);
2719
+ assert.match(plan.codexObjective ?? '', /subproject\/\.omx\/ultragoal\/ledger\.jsonl/);
2720
+ assert.notEqual(plan.codexObjective, ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE);
2721
+ });
2722
+ });
2723
+ it('keeps repository-root launches byte-identical to the root objective', async () => {
2724
+ await withNestedRepo(async ({ repo }) => {
2725
+ const plan = await createUltragoalPlan(repo, { brief: 'Ship the root feature', force: true });
2726
+ assert.equal(plan.statePathPrefix, undefined);
2727
+ assert.equal(plan.codexObjective, ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE);
2728
+ });
2729
+ });
2730
+ it('renders the aggregate handoff header with canonical state paths', async () => {
2731
+ await withNestedRepo(async ({ subproject }) => {
2732
+ await createUltragoalPlan(subproject, { brief: 'Ship the nested feature' });
2733
+ const started = await startNextUltragoal(subproject);
2734
+ const instruction = buildCodexGoalInstruction(started.goal, started.plan);
2735
+ assert.match(instruction, /Plan: subproject\/\.omx\/ultragoal\/goals\.json/);
2736
+ assert.match(instruction, /Ledger: subproject\/\.omx\/ultragoal\/ledger\.jsonl/);
2737
+ });
2738
+ });
2739
+ it('reconciles the prefixed objective and rejects the ambiguous bare objective', async () => {
2740
+ await withNestedRepo(async ({ subproject }) => {
2741
+ const created = await createUltragoalPlan(subproject, { brief: 'Ship the nested feature' });
2742
+ const started = await startNextUltragoal(subproject);
2743
+ const checkpointed = await checkpointUltragoal(subproject, {
2744
+ goalId: started.goal.id,
2745
+ status: 'complete',
2746
+ evidence: 'tests passed',
2747
+ codexGoal: { goal: { objective: created.codexObjective, status: 'complete' } },
2748
+ qualityGate: cleanQualityGate(),
2749
+ });
2750
+ assert.equal(checkpointed.goals[0]?.status, 'complete');
2751
+ // A reader that resolved the bare `.omx/...` reference from the repo root must not match.
2752
+ await assert.rejects(checkpointUltragoal(subproject, {
2753
+ goalId: started.goal.id,
2754
+ status: 'complete',
2755
+ evidence: 'tests passed',
2756
+ codexGoal: { goal: { objective: ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE, status: 'complete' } },
2757
+ qualityGate: cleanQualityGate(),
2758
+ }));
2759
+ });
2760
+ });
2761
+ it('migrates a pre-existing nested plan and leaves root plans untouched', async () => {
2762
+ await withNestedRepo(async ({ repo, subproject }) => {
2763
+ await createUltragoalPlan(subproject, { brief: 'Ship the nested feature' });
2764
+ const planPath = join(subproject, '.omx/ultragoal/goals.json');
2765
+ const stale = JSON.parse(await readFile(planPath, 'utf-8'));
2766
+ stale.codexObjective = ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE;
2767
+ delete stale.statePathPrefix;
2768
+ await writeFile(planPath, `${JSON.stringify(stale, null, 2)}\n`);
2769
+ const migrated = await readUltragoalPlan(subproject);
2770
+ assert.equal(migrated.statePathPrefix, 'subproject');
2771
+ assert.match(migrated.codexObjective ?? '', /subproject\/\.omx\/ultragoal\/goals\.json/);
2772
+ assert.deepEqual(migrated.codexObjectiveAliases, [ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE]);
2773
+ const ledger = await readFile(join(subproject, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
2774
+ assert.match(ledger, /"event":"aggregate_objective_migrated"/);
2775
+ assert.match(ledger, /canonical repo-root-relative state paths/);
2776
+ // The already-active hidden Codex goal keeps reconciling through the retained alias.
2777
+ const started = await startNextUltragoal(subproject);
2778
+ const checkpointed = await checkpointUltragoal(subproject, {
2779
+ goalId: started.goal.id,
2780
+ status: 'complete',
2781
+ evidence: 'tests passed',
2782
+ codexGoal: { goal: { objective: ULTRAGOAL_AGGREGATE_CODEX_OBJECTIVE, status: 'complete' } },
2783
+ qualityGate: cleanQualityGate(),
2784
+ });
2785
+ assert.equal(checkpointed.goals[0]?.status, 'complete');
2786
+ const rootPlan = await createUltragoalPlan(repo, { brief: 'Ship the root feature', force: true });
2787
+ const rootLedgerBefore = await readFile(join(repo, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
2788
+ const reread = await readUltragoalPlan(repo);
2789
+ const rootLedgerAfter = await readFile(join(repo, '.omx/ultragoal/ledger.jsonl'), 'utf-8');
2790
+ assert.equal(reread.codexObjective, rootPlan.codexObjective);
2791
+ assert.equal(reread.codexObjectiveAliases, undefined);
2792
+ assert.equal(rootLedgerAfter, rootLedgerBefore);
2793
+ });
2794
+ });
2795
+ });
2796
+ it('allows durable Ultragoal mutations for an exact-match identity-indeterminate pointer and rejects mismatches', async () => {
2797
+ await withTempRepo(async (cwd) => {
2798
+ const previousEnv = process.env.OMX_SESSION_ID;
2799
+ const sessionId = 'sess-indeterminate';
2800
+ const stateDir = join(cwd, '.omx', 'state');
2801
+ try {
2802
+ await mkdir(stateDir, { recursive: true });
2803
+ await writeFile(join(stateDir, 'session.json'), JSON.stringify({
2804
+ session_id: sessionId,
2805
+ cwd,
2806
+ state_root: stateDir,
2807
+ pid: 8388607,
2808
+ }));
2809
+ __setSessionPointerTransactionDependenciesForTests({ probePid: () => 'indeterminate' });
2810
+ process.env.OMX_SESSION_ID = sessionId;
2811
+ const plan = await createUltragoalPlan(cwd, { brief: '- Ship the indeterminate recovery' });
2812
+ assert.equal(plan.goals.length, 1);
2813
+ assert.equal(existsSync(join(cwd, '.omx', 'ultragoal', 'goals.json')), true);
2814
+ const authority = await assertUltragoalWritableLifecycleAuthority(cwd);
2815
+ assert.deepEqual(authority, {
2816
+ kind: 'resolved',
2817
+ source: 'session',
2818
+ sessionId,
2819
+ stateDir: join(stateDir, 'sessions', sessionId),
2820
+ });
2821
+ const goalsPath = join(cwd, '.omx', 'ultragoal', 'goals.json');
2822
+ const beforeMismatch = await readFile(goalsPath, 'utf-8');
2823
+ process.env.OMX_SESSION_ID = 'sess-foreign';
2824
+ // withUltragoalMutationLock calls assertUltragoalWritableLifecycleAuthority before and after lock
2825
+ // acquisition, and that helper calls resolveWritableStateScope, so its point-in-time revalidation
2826
+ // inherits this exact-match branch for free with no separate production-code change needed.
2827
+ await assert.rejects(() => addUltragoalGoal(cwd, { title: 'Must not persist', objective: 'Foreign session mutation.' }), (error) => {
2828
+ assert.match(String(error), /writable lifecycle authority/);
2829
+ return true;
2830
+ });
2831
+ assert.equal(await readFile(goalsPath, 'utf-8'), beforeMismatch);
2832
+ }
2833
+ finally {
2834
+ if (typeof previousEnv === 'string')
2835
+ process.env.OMX_SESSION_ID = previousEnv;
2836
+ else
2837
+ delete process.env.OMX_SESSION_ID;
2838
+ __resetSessionPointerTransactionDependenciesForTests();
2839
+ }
2840
+ });
2841
+ });
1894
2842
  });
1895
2843
  //# sourceMappingURL=artifacts.test.js.map