oh-my-codex 0.18.16 → 0.19.0

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 (208) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/crates/omx-sparkshell/tests/execution.rs +8 -1
  4. package/dist/agents/__tests__/definitions.test.js +5 -5
  5. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  6. package/dist/agents/__tests__/native-config.test.js +18 -14
  7. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  8. package/dist/agents/definitions.d.ts +2 -2
  9. package/dist/agents/definitions.d.ts.map +1 -1
  10. package/dist/agents/definitions.js +4 -4
  11. package/dist/agents/definitions.js.map +1 -1
  12. package/dist/agents/native-config.d.ts +1 -0
  13. package/dist/agents/native-config.d.ts.map +1 -1
  14. package/dist/agents/native-config.js +18 -16
  15. package/dist/agents/native-config.js.map +1 -1
  16. package/dist/auth/hotswap.d.ts.map +1 -1
  17. package/dist/auth/hotswap.js +17 -4
  18. package/dist/auth/hotswap.js.map +1 -1
  19. package/dist/autopilot/__tests__/planner-routing.test.js +2 -2
  20. package/dist/autopilot/__tests__/planner-routing.test.js.map +1 -1
  21. package/dist/autopilot/fsm.d.ts +1 -1
  22. package/dist/autopilot/fsm.d.ts.map +1 -1
  23. package/dist/autopilot/fsm.js +1 -1
  24. package/dist/autopilot/fsm.js.map +1 -1
  25. package/dist/cli/__tests__/auth.test.js +78 -3
  26. package/dist/cli/__tests__/auth.test.js.map +1 -1
  27. package/dist/cli/__tests__/codex-plugin-layout.test.js +30 -5
  28. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  29. package/dist/cli/__tests__/doctor-warning-copy.test.js +2 -0
  30. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  31. package/dist/cli/__tests__/index.test.js +96 -8
  32. package/dist/cli/__tests__/index.test.js.map +1 -1
  33. package/dist/cli/__tests__/launch-fallback.test.js +135 -1
  34. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  35. package/dist/cli/__tests__/mcp-parity.test.js +2 -4
  36. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  37. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js +14 -0
  38. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js.map +1 -1
  39. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +8 -0
  40. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  41. package/dist/cli/__tests__/resume.test.js +229 -1
  42. package/dist/cli/__tests__/resume.test.js.map +1 -1
  43. package/dist/cli/__tests__/session-scoped-runtime.test.js +46 -0
  44. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  45. package/dist/cli/__tests__/setup-install-mode.test.js +37 -0
  46. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  47. package/dist/cli/__tests__/ultragoal.test.js +21 -0
  48. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  49. package/dist/cli/__tests__/version.test.js +13 -1
  50. package/dist/cli/__tests__/version.test.js.map +1 -1
  51. package/dist/cli/auth.d.ts +1 -1
  52. package/dist/cli/auth.d.ts.map +1 -1
  53. package/dist/cli/auth.js +49 -9
  54. package/dist/cli/auth.js.map +1 -1
  55. package/dist/cli/index.d.ts +25 -2
  56. package/dist/cli/index.d.ts.map +1 -1
  57. package/dist/cli/index.js +233 -32
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  60. package/dist/cli/plugin-marketplace.js +22 -1
  61. package/dist/cli/plugin-marketplace.js.map +1 -1
  62. package/dist/cli/ralph.d.ts.map +1 -1
  63. package/dist/cli/ralph.js +4 -0
  64. package/dist/cli/ralph.js.map +1 -1
  65. package/dist/cli/setup.d.ts.map +1 -1
  66. package/dist/cli/setup.js +3 -1
  67. package/dist/cli/setup.js.map +1 -1
  68. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +7 -0
  69. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
  70. package/dist/goal-workflows/codex-goal-snapshot.js +1 -1
  71. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  72. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +12 -0
  73. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  74. package/dist/hooks/__tests__/keyword-detector.test.js +267 -7
  75. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  76. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  77. package/dist/hooks/keyword-detector.js +143 -30
  78. package/dist/hooks/keyword-detector.js.map +1 -1
  79. package/dist/hud/__tests__/reconcile.test.js +121 -0
  80. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  81. package/dist/hud/__tests__/state.test.js +110 -0
  82. package/dist/hud/__tests__/state.test.js.map +1 -1
  83. package/dist/hud/__tests__/tmux.test.js +1 -1
  84. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  85. package/dist/hud/reconcile.d.ts +3 -1
  86. package/dist/hud/reconcile.d.ts.map +1 -1
  87. package/dist/hud/reconcile.js +281 -151
  88. package/dist/hud/reconcile.js.map +1 -1
  89. package/dist/hud/render.d.ts.map +1 -1
  90. package/dist/hud/render.js +4 -2
  91. package/dist/hud/render.js.map +1 -1
  92. package/dist/hud/state.d.ts.map +1 -1
  93. package/dist/hud/state.js +44 -12
  94. package/dist/hud/state.js.map +1 -1
  95. package/dist/hud/tmux.d.ts.map +1 -1
  96. package/dist/hud/tmux.js +1 -4
  97. package/dist/hud/tmux.js.map +1 -1
  98. package/dist/hud/types.d.ts +5 -0
  99. package/dist/hud/types.d.ts.map +1 -1
  100. package/dist/hud/types.js.map +1 -1
  101. package/dist/leader/__tests__/contract.test.d.ts +2 -0
  102. package/dist/leader/__tests__/contract.test.d.ts.map +1 -0
  103. package/dist/leader/__tests__/contract.test.js +75 -0
  104. package/dist/leader/__tests__/contract.test.js.map +1 -0
  105. package/dist/leader/contract.d.ts +26 -0
  106. package/dist/leader/contract.d.ts.map +1 -0
  107. package/dist/leader/contract.js +97 -0
  108. package/dist/leader/contract.js.map +1 -0
  109. package/dist/modes/base.d.ts.map +1 -1
  110. package/dist/modes/base.js +22 -7
  111. package/dist/modes/base.js.map +1 -1
  112. package/dist/notifications/__tests__/dispatcher.test.js +16 -0
  113. package/dist/notifications/__tests__/dispatcher.test.js.map +1 -1
  114. package/dist/notifications/__tests__/profiles.test.js +87 -0
  115. package/dist/notifications/__tests__/profiles.test.js.map +1 -1
  116. package/dist/notifications/config.d.ts +1 -0
  117. package/dist/notifications/config.d.ts.map +1 -1
  118. package/dist/notifications/config.js +60 -22
  119. package/dist/notifications/config.js.map +1 -1
  120. package/dist/notifications/dispatcher.d.ts.map +1 -1
  121. package/dist/notifications/dispatcher.js +6 -16
  122. package/dist/notifications/dispatcher.js.map +1 -1
  123. package/dist/pipeline/__tests__/stages.test.js +2 -0
  124. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  125. package/dist/pipeline/stages/ultragoal.d.ts.map +1 -1
  126. package/dist/pipeline/stages/ultragoal.js +6 -1
  127. package/dist/pipeline/stages/ultragoal.js.map +1 -1
  128. package/dist/question/__tests__/renderer.test.js +58 -4
  129. package/dist/question/__tests__/renderer.test.js.map +1 -1
  130. package/dist/question/renderer.d.ts +1 -1
  131. package/dist/question/renderer.d.ts.map +1 -1
  132. package/dist/question/renderer.js +73 -5
  133. package/dist/question/renderer.js.map +1 -1
  134. package/dist/ralplan/__tests__/runtime.test.js +202 -0
  135. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  136. package/dist/ralplan/runtime.d.ts +7 -0
  137. package/dist/ralplan/runtime.d.ts.map +1 -1
  138. package/dist/ralplan/runtime.js +63 -4
  139. package/dist/ralplan/runtime.js.map +1 -1
  140. package/dist/scripts/__tests__/codex-native-hook.test.js +8484 -4560
  141. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  142. package/dist/scripts/codex-native-hook.d.ts +1 -0
  143. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  144. package/dist/scripts/codex-native-hook.js +4387 -190
  145. package/dist/scripts/codex-native-hook.js.map +1 -1
  146. package/dist/state/__tests__/operations.test.js +1137 -0
  147. package/dist/state/__tests__/operations.test.js.map +1 -1
  148. package/dist/state/__tests__/planning-gate.test.js +410 -0
  149. package/dist/state/__tests__/planning-gate.test.js.map +1 -1
  150. package/dist/state/operations.d.ts +10 -0
  151. package/dist/state/operations.d.ts.map +1 -1
  152. package/dist/state/operations.js +242 -8
  153. package/dist/state/operations.js.map +1 -1
  154. package/dist/state/skill-active.d.ts +4 -1
  155. package/dist/state/skill-active.d.ts.map +1 -1
  156. package/dist/state/skill-active.js +5 -3
  157. package/dist/state/skill-active.js.map +1 -1
  158. package/dist/state/workflow-transition.d.ts.map +1 -1
  159. package/dist/state/workflow-transition.js +642 -1
  160. package/dist/state/workflow-transition.js.map +1 -1
  161. package/dist/subagents/__tests__/tracker.test.js +248 -1
  162. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  163. package/dist/subagents/tracker.d.ts +60 -0
  164. package/dist/subagents/tracker.d.ts.map +1 -1
  165. package/dist/subagents/tracker.js +225 -1
  166. package/dist/subagents/tracker.js.map +1 -1
  167. package/dist/team/__tests__/model-contract.test.js +72 -4
  168. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  169. package/dist/team/__tests__/runtime.test.js +44 -2
  170. package/dist/team/__tests__/runtime.test.js.map +1 -1
  171. package/dist/team/__tests__/tmux-session.test.js +127 -8
  172. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  173. package/dist/team/__tests__/worker-runtime-identity.test.js +89 -0
  174. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  175. package/dist/team/model-contract.d.ts +3 -0
  176. package/dist/team/model-contract.d.ts.map +1 -1
  177. package/dist/team/model-contract.js +42 -5
  178. package/dist/team/model-contract.js.map +1 -1
  179. package/dist/team/runtime.d.ts +2 -1
  180. package/dist/team/runtime.d.ts.map +1 -1
  181. package/dist/team/runtime.js +21 -11
  182. package/dist/team/runtime.js.map +1 -1
  183. package/dist/team/scaling.d.ts.map +1 -1
  184. package/dist/team/scaling.js +13 -11
  185. package/dist/team/scaling.js.map +1 -1
  186. package/dist/team/tmux-session.d.ts +1 -0
  187. package/dist/team/tmux-session.d.ts.map +1 -1
  188. package/dist/team/tmux-session.js +63 -13
  189. package/dist/team/tmux-session.js.map +1 -1
  190. package/dist/ultragoal/__tests__/artifacts.test.js +7 -0
  191. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  192. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  193. package/dist/ultragoal/artifacts.js +5 -0
  194. package/dist/ultragoal/artifacts.js.map +1 -1
  195. package/dist/utils/__tests__/agents-model-table.test.js +2 -2
  196. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  197. package/package.json +1 -1
  198. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  199. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +19 -7
  200. package/plugins/oh-my-codex/skills/code-review/SKILL.md +16 -0
  201. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +23 -0
  202. package/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md +3 -2
  203. package/skills/code-review/SKILL.md +16 -0
  204. package/skills/ecomode/references/agent-tiers.md +1 -1
  205. package/skills/ultragoal/SKILL.md +23 -0
  206. package/skills/ultrawork/references/agent-tiers.md +3 -2
  207. package/src/scripts/__tests__/codex-native-hook.test.ts +14014 -9097
  208. package/src/scripts/codex-native-hook.ts +4459 -199
@@ -1 +1 @@
1
- {"version":3,"file":"codex-goal-snapshot.js","sourceRoot":"","sources":["../../src/goal-workflows/codex-goal-snapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-goal-snapshot.js","sourceRoot":"","sources":["../../src/goal-workflows/codex-goal-snapshot.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ import { fileURLToPath } from 'node:url';
6
6
  const __dirname = dirname(fileURLToPath(import.meta.url));
7
7
  const autopilotSkill = readFileSync(join(__dirname, '../../../skills/autopilot/SKILL.md'), 'utf-8');
8
8
  const ralplanSkill = readFileSync(join(__dirname, '../../../skills/ralplan/SKILL.md'), 'utf-8');
9
+ const codeReviewSkill = readFileSync(join(__dirname, '../../../skills/code-review/SKILL.md'), 'utf-8');
10
+ const ultragoalSkill = readFileSync(join(__dirname, '../../../skills/ultragoal/SKILL.md'), 'utf-8');
9
11
  const pipelineSkill = readFileSync(join(__dirname, '../../../skills/pipeline/SKILL.md'), 'utf-8');
10
12
  const skillsDocs = readFileSync(join(__dirname, '../../../docs/skills.html'), 'utf-8');
11
13
  const gettingStartedDocs = readFileSync(join(__dirname, '../../../docs/getting-started.html'), 'utf-8');
@@ -34,6 +36,16 @@ describe('autopilot skill default Ultragoal contract', () => {
34
36
  assert.match(autopilotSkill, new RegExp(field));
35
37
  }
36
38
  });
39
+ it('documents minimal state/HUD contracts for code-review and ultragoal child phases', () => {
40
+ assert.match(codeReviewSkill, /State\/HUD Phase Contract/);
41
+ assert.match(codeReviewSkill, /not a standalone tracked mode with a `code-review-state\.json` lifecycle/i);
42
+ assert.match(codeReviewSkill, /skill-active-state\.json.*skill:"code-review".*phase:"planning"/s);
43
+ assert.match(codeReviewSkill, /current_phase":"code-review"/);
44
+ assert.match(ultragoalSkill, /State\/HUD Phase Contract/);
45
+ assert.match(ultragoalSkill, /mode:"ultragoal".*active:true.*current_phase/s);
46
+ assert.match(ultragoalSkill, /current_phase":"ultragoal"/);
47
+ assert.match(ultragoalSkill, /handoff_artifacts\.ultragoal/);
48
+ });
37
49
  it('forbids self-attesting clean review and QA gates without durable stage evidence', () => {
38
50
  assert.match(autopilotSkill, /Do not author `review_verdict:\{clean:true\}` from the leader's own summary/i);
39
51
  assert.match(autopilotSkill, /both gates have durable source evidence/i);
@@ -1 +1 @@
1
- {"version":3,"file":"autopilot-skill-contract.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/autopilot-skill-contract.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autopilot-skill-contract.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/autopilot-skill-contract.test.ts"],"names":[],"mappings":"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"}
@@ -326,6 +326,27 @@ describe('keyword detector team compatibility', () => {
326
326
  assert.equal(match.skill, 'cancel');
327
327
  assert.equal(match.keyword.toLowerCase(), 'stop');
328
328
  });
329
+ it('treats explicit slash stop commands as cancel intent', () => {
330
+ const match = detectPrimaryKeyword('/stop');
331
+ assert.ok(match);
332
+ assert.equal(match.skill, 'cancel');
333
+ assert.equal(match.keyword.toLowerCase(), 'stop');
334
+ });
335
+ it('treats comma-delimited slash stop commands as cancel intent', () => {
336
+ for (const prompt of ['/stop, please', 'Please /stop, now']) {
337
+ const match = detectPrimaryKeyword(prompt);
338
+ assert.ok(match, `expected cancel match for ${prompt}`);
339
+ assert.equal(match.skill, 'cancel');
340
+ assert.equal(match.keyword.toLowerCase(), 'stop');
341
+ }
342
+ });
343
+ it('does not trigger cancel from stop inside filenames or paths', () => {
344
+ assert.equal(detectPrimaryKeyword('inspect .omx/context/stop-hook-invalid-json-handoff-20260629T210626Z.md'), null);
345
+ assert.equal(detectPrimaryKeyword('Please summarize /tmp/stop-hook-invalid-json-handoff-20260629T210626Z.md'), null);
346
+ assert.equal(detectPrimaryKeyword('inspect /stop.md'), null);
347
+ assert.equal(detectPrimaryKeyword('inspect /abort.md'), null);
348
+ assert.equal(detectPrimaryKeyword('inspect /stop:hook.md'), null);
349
+ });
329
350
  it('does not trigger cancel from incidental stop/abort test-log prose', () => {
330
351
  assert.equal(detectPrimaryKeyword('FAIL should stop retrying after max attempts'), null);
331
352
  assert.equal(detectPrimaryKeyword('PASS request aborted when upstream returns 499'), null);
@@ -571,7 +592,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
571
592
  assert.deepEqual(modeState.state.planning_routing, {
572
593
  owner: 'main',
573
594
  mainModel: 'gpt-5.5',
574
- plannerModel: 'gpt-5.4-mini',
595
+ plannerModel: 'gpt-5.5',
575
596
  reason: 'main_not_cheap_or_mini',
576
597
  explicitPlannerOverride: false,
577
598
  });
@@ -583,6 +604,172 @@ describe('keyword detector skill-active-state lifecycle', () => {
583
604
  await rm(cwd, { recursive: true, force: true });
584
605
  }
585
606
  });
607
+ it('does not advance the supervised child phase past an unsatisfied deep-interview gate via keyword handoff', async () => {
608
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-supervised-gate-'));
609
+ const stateDir = join(cwd, '.omx', 'state');
610
+ try {
611
+ await mkdir(stateDir, { recursive: true });
612
+ // Activate Autopilot: seeds autopilot-state.json at current_phase=deep-interview
613
+ // with deep_interview_gate.status="required" (gate not satisfied).
614
+ const activated = await recordSkillActivation({
615
+ stateDir,
616
+ text: 'please run $autopilot',
617
+ sessionId: 'sess-gate',
618
+ threadId: 'thread-gate',
619
+ turnId: 'turn-1',
620
+ nowIso: '2026-02-25T00:00:00.000Z',
621
+ });
622
+ assert.equal(activated?.phase, 'deep-interview');
623
+ const autopilotStatePath = join(stateDir, 'sessions', 'sess-gate', 'autopilot-state.json');
624
+ const beforeAdvance = JSON.parse(await readFile(autopilotStatePath, 'utf-8'));
625
+ assert.equal(beforeAdvance.current_phase, 'deep-interview');
626
+ // A bare `$ralplan` keyword handoff must not advance current_phase across the
627
+ // deep-interview -> ralplan gate while the gate is unsatisfied. The keyword
628
+ // path now defers to the same gate as the state_write backend.
629
+ const denied = await recordSkillActivation({
630
+ stateDir,
631
+ text: 'continue with $ralplan',
632
+ sessionId: 'sess-gate',
633
+ threadId: 'thread-gate',
634
+ turnId: 'turn-2',
635
+ nowIso: '2026-02-25T00:01:00.000Z',
636
+ });
637
+ const afterAdvance = JSON.parse(await readFile(autopilotStatePath, 'utf-8'));
638
+ assert.equal(afterAdvance.current_phase, 'deep-interview', 'keyword handoff must not skip the deep-interview gate');
639
+ // The visible canonical skill-active state must stay aligned with the held
640
+ // detail phase (no drift to ralplan) — both the returned state and the
641
+ // persisted skill-active-state.json mirror.
642
+ assert.equal(denied?.phase, 'deep-interview');
643
+ assert.deepEqual(denied?.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'deep-interview']]);
644
+ const canonical = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-gate', SKILL_ACTIVE_STATE_FILE), 'utf-8'));
645
+ assert.equal(canonical.phase, 'deep-interview');
646
+ assert.deepEqual(canonical.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'deep-interview']]);
647
+ }
648
+ finally {
649
+ await rm(cwd, { recursive: true, force: true });
650
+ }
651
+ });
652
+ it('does not let a keyword jump ahead past a planning gate (forward skip)', async () => {
653
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-skip-ahead-'));
654
+ const stateDir = join(cwd, '.omx', 'state');
655
+ try {
656
+ await mkdir(stateDir, { recursive: true });
657
+ await recordSkillActivation({
658
+ stateDir,
659
+ text: 'please run $autopilot',
660
+ sessionId: 'sess-skip',
661
+ threadId: 'thread-skip',
662
+ turnId: 'turn-1',
663
+ nowIso: '2026-02-25T00:00:00.000Z',
664
+ });
665
+ // `$ultragoal` while in deep-interview skips the ralplan gate entirely; the
666
+ // keyword handoff must hold the current phase rather than jump ahead.
667
+ const result = await recordSkillActivation({
668
+ stateDir,
669
+ text: 'jump straight to $ultragoal',
670
+ sessionId: 'sess-skip',
671
+ threadId: 'thread-skip',
672
+ turnId: 'turn-2',
673
+ nowIso: '2026-02-25T00:01:00.000Z',
674
+ });
675
+ const autopilotState = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-skip', 'autopilot-state.json'), 'utf-8'));
676
+ assert.equal(autopilotState.current_phase, 'deep-interview', 'forward skip must be held');
677
+ // skill-active phase is kept in sync with the held autopilot phase.
678
+ assert.equal(result?.phase, 'deep-interview');
679
+ }
680
+ finally {
681
+ await rm(cwd, { recursive: true, force: true });
682
+ }
683
+ });
684
+ it('does not advance or drift canonical state past an unsatisfied ralplan -> ultragoal gate', async () => {
685
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-ralplan-gate-'));
686
+ const stateDir = join(cwd, '.omx', 'state');
687
+ const sessionId = 'sess-ralplan-gate';
688
+ try {
689
+ await mkdir(join(stateDir, 'sessions', sessionId), { recursive: true });
690
+ // Supervised Autopilot already in ralplan, with no ralplan consensus evidence
691
+ // (the ralplan -> ultragoal gate is unsatisfied).
692
+ await writeFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), JSON.stringify({
693
+ version: 1,
694
+ active: true,
695
+ skill: 'autopilot',
696
+ keyword: '$autopilot',
697
+ phase: 'ralplan',
698
+ source: 'keyword-detector',
699
+ session_id: sessionId,
700
+ active_skills: [{ skill: 'autopilot', phase: 'ralplan', active: true, session_id: sessionId }],
701
+ }, null, 2));
702
+ const autopilotStatePath = join(stateDir, 'sessions', sessionId, 'autopilot-state.json');
703
+ await writeFile(autopilotStatePath, JSON.stringify({ active: true, mode: 'autopilot', current_phase: 'ralplan', session_id: sessionId }, null, 2));
704
+ await writeFile(join(stateDir, 'sessions', sessionId, 'ralplan-state.json'), JSON.stringify({
705
+ active: true,
706
+ mode: 'ralplan',
707
+ current_phase: 'planning',
708
+ session_id: sessionId,
709
+ }, null, 2));
710
+ const denied = await recordSkillActivation({
711
+ stateDir,
712
+ text: 'advance to $ultragoal',
713
+ sessionId,
714
+ threadId: 'thread-ralplan-gate',
715
+ turnId: 'turn-ralplan-gate',
716
+ nowIso: '2026-02-25T00:01:00.000Z',
717
+ });
718
+ const afterAdvance = JSON.parse(await readFile(autopilotStatePath, 'utf-8'));
719
+ assert.equal(afterAdvance.current_phase, 'ralplan', 'keyword handoff must not skip the ralplan -> ultragoal gate');
720
+ assert.equal(denied?.phase, 'ralplan');
721
+ assert.deepEqual(denied?.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'ralplan']]);
722
+ const ralplanState = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, 'ralplan-state.json'), 'utf-8'));
723
+ assert.equal(ralplanState.active, true, 'blocked gate must not auto-complete ralplan state');
724
+ assert.equal(ralplanState.current_phase, 'planning', 'blocked gate must not advance ralplan state');
725
+ const canonical = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), 'utf-8'));
726
+ assert.equal(canonical.phase, 'ralplan');
727
+ assert.deepEqual(canonical.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'ralplan']]);
728
+ }
729
+ finally {
730
+ await rm(cwd, { recursive: true, force: true });
731
+ }
732
+ });
733
+ it('does not let an implementation-phase keyword skip the code-review gate to ultraqa', async () => {
734
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-ultraqa-skip-'));
735
+ const stateDir = join(cwd, '.omx', 'state');
736
+ const sessionId = 'sess-ultraqa-skip';
737
+ try {
738
+ await mkdir(join(stateDir, 'sessions', sessionId), { recursive: true });
739
+ // Supervised Autopilot in an implementation phase (ultragoal). The completion
740
+ // gate requires code-review before ultraqa.
741
+ await writeFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), JSON.stringify({
742
+ version: 1,
743
+ active: true,
744
+ skill: 'autopilot',
745
+ keyword: '$autopilot',
746
+ phase: 'ultragoal',
747
+ source: 'keyword-detector',
748
+ session_id: sessionId,
749
+ active_skills: [{ skill: 'autopilot', phase: 'ultragoal', active: true, session_id: sessionId }],
750
+ }, null, 2));
751
+ const autopilotStatePath = join(stateDir, 'sessions', sessionId, 'autopilot-state.json');
752
+ await writeFile(autopilotStatePath, JSON.stringify({ active: true, mode: 'autopilot', current_phase: 'ultragoal', session_id: sessionId }, null, 2));
753
+ const denied = await recordSkillActivation({
754
+ stateDir,
755
+ text: 'run $ultraqa now',
756
+ sessionId,
757
+ threadId: 'thread-ultraqa-skip',
758
+ turnId: 'turn-ultraqa-skip',
759
+ nowIso: '2026-02-25T00:01:00.000Z',
760
+ });
761
+ const afterAdvance = JSON.parse(await readFile(autopilotStatePath, 'utf-8'));
762
+ assert.equal(afterAdvance.current_phase, 'ultragoal', 'keyword handoff must not skip the code-review gate');
763
+ assert.equal(denied?.phase, 'ultragoal');
764
+ assert.deepEqual(denied?.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'ultragoal']]);
765
+ const canonical = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), 'utf-8'));
766
+ assert.equal(canonical.phase, 'ultragoal');
767
+ assert.deepEqual(canonical.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'ultragoal']]);
768
+ }
769
+ finally {
770
+ await rm(cwd, { recursive: true, force: true });
771
+ }
772
+ });
586
773
  it('seeds dedicated planner routing in Autopilot state when main is cheap', async () => {
587
774
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-autopilot-planner-routing-'));
588
775
  const stateDir = join(cwd, '.omx', 'state');
@@ -2236,7 +2423,7 @@ deepMaxRounds = 21
2236
2423
  await rm(cwd, { recursive: true, force: true });
2237
2424
  }
2238
2425
  });
2239
- it('keeps Autopilot visible when a supervised code-review child keyword appears', async () => {
2426
+ it('keeps Autopilot visible and advances HUD phase when a supervised code-review child keyword appears', async () => {
2240
2427
  const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-autopilot-child-code-review-'));
2241
2428
  const stateDir = join(cwd, '.omx', 'state');
2242
2429
  const sessionId = 'sess-autopilot-child-code-review';
@@ -2247,12 +2434,18 @@ deepMaxRounds = 21
2247
2434
  active: true,
2248
2435
  skill: 'autopilot',
2249
2436
  keyword: '$autopilot',
2250
- phase: 'ralplan',
2437
+ phase: 'ultragoal',
2251
2438
  activated_at: '2026-05-30T00:00:00.000Z',
2252
2439
  updated_at: '2026-05-30T00:01:00.000Z',
2253
2440
  source: 'keyword-detector',
2254
2441
  session_id: sessionId,
2255
- active_skills: [{ skill: 'autopilot', phase: 'ralplan', active: true, session_id: sessionId }],
2442
+ active_skills: [{ skill: 'autopilot', phase: 'ultragoal', active: true, session_id: sessionId }],
2443
+ }, null, 2));
2444
+ await writeFile(join(stateDir, 'sessions', sessionId, 'autopilot-state.json'), JSON.stringify({
2445
+ active: true,
2446
+ mode: 'autopilot',
2447
+ current_phase: 'ultragoal',
2448
+ session_id: sessionId,
2256
2449
  }, null, 2));
2257
2450
  const result = await recordSkillActivation({
2258
2451
  stateDir,
@@ -2264,13 +2457,72 @@ deepMaxRounds = 21
2264
2457
  });
2265
2458
  assert.ok(result);
2266
2459
  assert.equal(result.skill, 'autopilot');
2267
- assert.equal(result.phase, 'ralplan');
2460
+ assert.equal(result.phase, 'code-review');
2268
2461
  assert.equal(result.supervised_child_skill, 'code-review');
2269
2462
  const persisted = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), 'utf-8'));
2270
2463
  assert.equal(persisted.skill, 'autopilot');
2271
- assert.equal(persisted.phase, 'ralplan');
2272
- assert.deepEqual(persisted.active_skills?.map((entry) => entry.skill), ['autopilot']);
2464
+ assert.equal(persisted.phase, 'code-review');
2465
+ assert.deepEqual(persisted.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'code-review']]);
2466
+ assert.equal(existsSync(join(stateDir, 'sessions', sessionId, 'code-review-state.json')), false);
2467
+ const autopilot = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, 'autopilot-state.json'), 'utf-8'));
2468
+ assert.equal(autopilot.current_phase, 'code-review');
2469
+ assert.equal(autopilot.thread_id, 'thread-autopilot-child-code-review');
2470
+ assert.equal(autopilot.turn_id, 'turn-autopilot-child-code-review');
2471
+ }
2472
+ finally {
2473
+ await rm(cwd, { recursive: true, force: true });
2474
+ }
2475
+ });
2476
+ it('repairs stale inactive Autopilot detail when a supervised code-review child keyword appears', async () => {
2477
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-autopilot-child-stale-detail-'));
2478
+ const stateDir = join(cwd, '.omx', 'state');
2479
+ const sessionId = 'sess-autopilot-child-stale-detail';
2480
+ try {
2481
+ await mkdir(join(stateDir, 'sessions', sessionId), { recursive: true });
2482
+ await writeFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), JSON.stringify({
2483
+ version: 1,
2484
+ active: true,
2485
+ skill: 'autopilot',
2486
+ keyword: '$autopilot',
2487
+ phase: 'ultragoal',
2488
+ activated_at: '2026-05-30T00:00:00.000Z',
2489
+ updated_at: '2026-05-30T00:01:00.000Z',
2490
+ source: 'keyword-detector',
2491
+ session_id: sessionId,
2492
+ active_skills: [{ skill: 'autopilot', phase: 'ultragoal', active: true, session_id: sessionId }],
2493
+ }, null, 2));
2494
+ await writeFile(join(stateDir, 'sessions', sessionId, 'autopilot-state.json'), JSON.stringify({
2495
+ active: false,
2496
+ mode: 'autopilot',
2497
+ current_phase: 'ultragoal',
2498
+ started_at: '2026-05-30T00:00:00.000Z',
2499
+ updated_at: '2026-05-30T00:01:00.000Z',
2500
+ session_id: sessionId,
2501
+ }, null, 2));
2502
+ const result = await recordSkillActivation({
2503
+ stateDir,
2504
+ text: '$code-review inspect before QA',
2505
+ sessionId,
2506
+ threadId: 'thread-autopilot-child-stale-detail',
2507
+ turnId: 'turn-autopilot-child-stale-detail',
2508
+ nowIso: '2026-05-30T00:02:00.000Z',
2509
+ });
2510
+ assert.ok(result);
2511
+ assert.equal(result.skill, 'autopilot');
2512
+ assert.equal(result.phase, 'code-review');
2513
+ assert.equal(result.supervised_child_skill, 'code-review');
2514
+ assert.equal(result.transition_error, undefined);
2273
2515
  assert.equal(existsSync(join(stateDir, 'sessions', sessionId, 'code-review-state.json')), false);
2516
+ const persisted = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, SKILL_ACTIVE_STATE_FILE), 'utf-8'));
2517
+ assert.equal(persisted.skill, 'autopilot');
2518
+ assert.equal(persisted.phase, 'code-review');
2519
+ assert.deepEqual(persisted.active_skills?.map((entry) => [entry.skill, entry.phase]), [['autopilot', 'code-review']]);
2520
+ const autopilot = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, 'autopilot-state.json'), 'utf-8'));
2521
+ assert.equal(autopilot.active, true);
2522
+ assert.equal(autopilot.mode, 'autopilot');
2523
+ assert.equal(autopilot.current_phase, 'code-review');
2524
+ assert.equal(autopilot.thread_id, 'thread-autopilot-child-stale-detail');
2525
+ assert.equal(autopilot.turn_id, 'turn-autopilot-child-stale-detail');
2274
2526
  }
2275
2527
  finally {
2276
2528
  await rm(cwd, { recursive: true, force: true });
@@ -2346,6 +2598,12 @@ deepMaxRounds = 21
2346
2598
  current_phase: 'executing',
2347
2599
  session_id: sessionId,
2348
2600
  }, null, 2));
2601
+ await writeFile(join(stateDir, 'sessions', sessionId, 'autopilot-state.json'), JSON.stringify({
2602
+ active: true,
2603
+ mode: 'autopilot',
2604
+ current_phase: 'ultragoal',
2605
+ session_id: sessionId,
2606
+ }, null, 2));
2349
2607
  const result = await recordSkillActivation({
2350
2608
  stateDir,
2351
2609
  text: '$deep-interview go back and re-plan',
@@ -2359,6 +2617,8 @@ deepMaxRounds = 21
2359
2617
  const ultragoal = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, 'ultragoal-state.json'), 'utf-8'));
2360
2618
  assert.equal(ultragoal.active, true);
2361
2619
  assert.equal(ultragoal.current_phase, 'executing');
2620
+ const autopilot = JSON.parse(await readFile(join(stateDir, 'sessions', sessionId, 'autopilot-state.json'), 'utf-8'));
2621
+ assert.equal(autopilot.current_phase, 'ultragoal');
2362
2622
  }
2363
2623
  finally {
2364
2624
  await rm(cwd, { recursive: true, force: true });