oh-my-codex 0.18.11 → 0.18.13

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 (196) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +9 -1
  4. package/dist/autopilot/__tests__/ralplan-gate.test.js +668 -0
  5. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
  6. package/dist/autopilot/completion-gate.d.ts +10 -0
  7. package/dist/autopilot/completion-gate.d.ts.map +1 -0
  8. package/dist/autopilot/completion-gate.js +154 -0
  9. package/dist/autopilot/completion-gate.js.map +1 -0
  10. package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
  11. package/dist/autopilot/ralplan-gate.js +42 -21
  12. package/dist/autopilot/ralplan-gate.js.map +1 -1
  13. package/dist/cli/__tests__/codex-plugin-layout.test.js +46 -3
  14. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  15. package/dist/cli/__tests__/doctor-invalid-config.test.js +35 -0
  16. package/dist/cli/__tests__/doctor-invalid-config.test.js.map +1 -1
  17. package/dist/cli/__tests__/doctor-warning-copy.test.js +317 -0
  18. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  19. package/dist/cli/__tests__/index.test.js +120 -2
  20. package/dist/cli/__tests__/index.test.js.map +1 -1
  21. package/dist/cli/__tests__/launch-fallback.test.js +1 -1
  22. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  23. package/dist/cli/__tests__/resume.test.js +217 -1
  24. package/dist/cli/__tests__/resume.test.js.map +1 -1
  25. package/dist/cli/__tests__/session-scoped-runtime.test.js +101 -0
  26. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  27. package/dist/cli/__tests__/session-search-help.test.js +3 -2
  28. package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
  29. package/dist/cli/__tests__/session-search.test.js +64 -2
  30. package/dist/cli/__tests__/session-search.test.js.map +1 -1
  31. package/dist/cli/__tests__/setup-agents-overwrite.test.js +289 -1
  32. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  33. package/dist/cli/__tests__/setup-install-mode.test.js +290 -17
  34. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  35. package/dist/cli/__tests__/setup-prompts-overwrite.test.js +74 -0
  36. package/dist/cli/__tests__/setup-prompts-overwrite.test.js.map +1 -1
  37. package/dist/cli/__tests__/setup-scope.test.js +45 -0
  38. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  39. package/dist/cli/__tests__/state.test.js +93 -0
  40. package/dist/cli/__tests__/state.test.js.map +1 -1
  41. package/dist/cli/__tests__/update.test.js +157 -3
  42. package/dist/cli/__tests__/update.test.js.map +1 -1
  43. package/dist/cli/__tests__/version-sync-contract.test.js +2 -0
  44. package/dist/cli/__tests__/version-sync-contract.test.js.map +1 -1
  45. package/dist/cli/doctor.d.ts.map +1 -1
  46. package/dist/cli/doctor.js +90 -12
  47. package/dist/cli/doctor.js.map +1 -1
  48. package/dist/cli/index.d.ts +13 -4
  49. package/dist/cli/index.d.ts.map +1 -1
  50. package/dist/cli/index.js +439 -46
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/cli/project-runtime-codex-homes.d.ts +6 -0
  53. package/dist/cli/project-runtime-codex-homes.d.ts.map +1 -0
  54. package/dist/cli/project-runtime-codex-homes.js +27 -0
  55. package/dist/cli/project-runtime-codex-homes.js.map +1 -0
  56. package/dist/cli/session-search.d.ts.map +1 -1
  57. package/dist/cli/session-search.js +8 -1
  58. package/dist/cli/session-search.js.map +1 -1
  59. package/dist/cli/setup.d.ts +2 -2
  60. package/dist/cli/setup.d.ts.map +1 -1
  61. package/dist/cli/setup.js +482 -126
  62. package/dist/cli/setup.js.map +1 -1
  63. package/dist/cli/state.d.ts.map +1 -1
  64. package/dist/cli/state.js +79 -8
  65. package/dist/cli/state.js.map +1 -1
  66. package/dist/cli/update.d.ts +1 -0
  67. package/dist/cli/update.d.ts.map +1 -1
  68. package/dist/cli/update.js +42 -10
  69. package/dist/cli/update.js.map +1 -1
  70. package/dist/config/__tests__/codex-hooks.test.js +73 -29
  71. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  72. package/dist/config/codex-hooks.d.ts +14 -0
  73. package/dist/config/codex-hooks.d.ts.map +1 -1
  74. package/dist/config/codex-hooks.js +54 -51
  75. package/dist/config/codex-hooks.js.map +1 -1
  76. package/dist/config/generator.d.ts +1 -1
  77. package/dist/config/generator.d.ts.map +1 -1
  78. package/dist/config/generator.js +1 -1
  79. package/dist/config/generator.js.map +1 -1
  80. package/dist/hooks/__tests__/best-practice-research-skill.test.js +12 -0
  81. package/dist/hooks/__tests__/best-practice-research-skill.test.js.map +1 -1
  82. package/dist/hud/__tests__/authority.test.js +45 -12
  83. package/dist/hud/__tests__/authority.test.js.map +1 -1
  84. package/dist/hud/__tests__/reconcile.test.js +95 -0
  85. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  86. package/dist/hud/__tests__/render.test.js +6 -6
  87. package/dist/hud/__tests__/render.test.js.map +1 -1
  88. package/dist/hud/__tests__/tmux.test.js +2 -2
  89. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  90. package/dist/hud/authority.d.ts.map +1 -1
  91. package/dist/hud/authority.js +17 -2
  92. package/dist/hud/authority.js.map +1 -1
  93. package/dist/hud/index.js +1 -4
  94. package/dist/hud/index.js.map +1 -1
  95. package/dist/hud/reconcile.d.ts.map +1 -1
  96. package/dist/hud/reconcile.js +42 -0
  97. package/dist/hud/reconcile.js.map +1 -1
  98. package/dist/hud/render.d.ts.map +1 -1
  99. package/dist/hud/render.js +6 -0
  100. package/dist/hud/render.js.map +1 -1
  101. package/dist/hud/tmux.d.ts.map +1 -1
  102. package/dist/hud/tmux.js +5 -4
  103. package/dist/hud/tmux.js.map +1 -1
  104. package/dist/mcp/__tests__/bootstrap.test.js +31 -1
  105. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  106. package/dist/mcp/bootstrap.d.ts +1 -0
  107. package/dist/mcp/bootstrap.d.ts.map +1 -1
  108. package/dist/mcp/bootstrap.js +32 -0
  109. package/dist/mcp/bootstrap.js.map +1 -1
  110. package/dist/modes/__tests__/base-autopilot-gates.test.d.ts +2 -0
  111. package/dist/modes/__tests__/base-autopilot-gates.test.d.ts.map +1 -0
  112. package/dist/modes/__tests__/base-autopilot-gates.test.js +154 -0
  113. package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -0
  114. package/dist/modes/base.d.ts +4 -1
  115. package/dist/modes/base.d.ts.map +1 -1
  116. package/dist/modes/base.js +71 -1
  117. package/dist/modes/base.js.map +1 -1
  118. package/dist/pipeline/__tests__/orchestrator.test.js +144 -3
  119. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  120. package/dist/pipeline/__tests__/stages.test.js +109 -0
  121. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  122. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  123. package/dist/pipeline/orchestrator.js +11 -4
  124. package/dist/pipeline/orchestrator.js.map +1 -1
  125. package/dist/pipeline/stages/code-review.d.ts +2 -0
  126. package/dist/pipeline/stages/code-review.d.ts.map +1 -1
  127. package/dist/pipeline/stages/code-review.js +2 -0
  128. package/dist/pipeline/stages/code-review.js.map +1 -1
  129. package/dist/pipeline/stages/ultraqa.d.ts +3 -0
  130. package/dist/pipeline/stages/ultraqa.d.ts.map +1 -1
  131. package/dist/pipeline/stages/ultraqa.js +3 -0
  132. package/dist/pipeline/stages/ultraqa.js.map +1 -1
  133. package/dist/ralplan/__tests__/consensus-gate.test.d.ts +2 -0
  134. package/dist/ralplan/__tests__/consensus-gate.test.d.ts.map +1 -0
  135. package/dist/ralplan/__tests__/consensus-gate.test.js +631 -0
  136. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -0
  137. package/dist/ralplan/consensus-gate.d.ts +9 -1
  138. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  139. package/dist/ralplan/consensus-gate.js +287 -65
  140. package/dist/ralplan/consensus-gate.js.map +1 -1
  141. package/dist/scripts/__tests__/codex-native-hook.test.js +481 -0
  142. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  143. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  144. package/dist/scripts/codex-native-hook.js +145 -25
  145. package/dist/scripts/codex-native-hook.js.map +1 -1
  146. package/dist/scripts/codex-native-pre-post.d.ts +1 -0
  147. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  148. package/dist/scripts/codex-native-pre-post.js +130 -0
  149. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  150. package/dist/session-history/__tests__/search.test.js +166 -0
  151. package/dist/session-history/__tests__/search.test.js.map +1 -1
  152. package/dist/session-history/search.d.ts +7 -0
  153. package/dist/session-history/search.d.ts.map +1 -1
  154. package/dist/session-history/search.js +83 -24
  155. package/dist/session-history/search.js.map +1 -1
  156. package/dist/sidecar/__tests__/collector.test.js +60 -0
  157. package/dist/sidecar/__tests__/collector.test.js.map +1 -1
  158. package/dist/sidecar/collector.d.ts.map +1 -1
  159. package/dist/sidecar/collector.js +3 -6
  160. package/dist/sidecar/collector.js.map +1 -1
  161. package/dist/state/__tests__/operations.test.js +622 -0
  162. package/dist/state/__tests__/operations.test.js.map +1 -1
  163. package/dist/state/__tests__/skill-active.test.js +82 -0
  164. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  165. package/dist/state/operations.d.ts.map +1 -1
  166. package/dist/state/operations.js +31 -9
  167. package/dist/state/operations.js.map +1 -1
  168. package/dist/state/skill-active.d.ts.map +1 -1
  169. package/dist/state/skill-active.js +41 -1
  170. package/dist/state/skill-active.js.map +1 -1
  171. package/dist/team/__tests__/runtime.test.js +81 -57
  172. package/dist/team/__tests__/runtime.test.js.map +1 -1
  173. package/dist/team/runtime.js +4 -4
  174. package/dist/team/runtime.js.map +1 -1
  175. package/dist/utils/__tests__/paths.test.js +23 -0
  176. package/dist/utils/__tests__/paths.test.js.map +1 -1
  177. package/dist/utils/__tests__/version.test.js +27 -0
  178. package/dist/utils/__tests__/version.test.js.map +1 -1
  179. package/dist/utils/paths.d.ts.map +1 -1
  180. package/dist/utils/paths.js +4 -2
  181. package/dist/utils/paths.js.map +1 -1
  182. package/dist/utils/version.d.ts.map +1 -1
  183. package/dist/utils/version.js +7 -2
  184. package/dist/utils/version.js.map +1 -1
  185. package/dist/verification/__tests__/ci-rust-gates.test.js +4 -2
  186. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  187. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +71 -3
  188. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
  189. package/package.json +1 -1
  190. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  191. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +53 -2
  192. package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +6 -1
  193. package/skills/best-practice-research/SKILL.md +6 -1
  194. package/src/scripts/__tests__/codex-native-hook.test.ts +615 -0
  195. package/src/scripts/codex-native-hook.ts +162 -32
  196. package/src/scripts/codex-native-pre-post.ts +137 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consensus-gate.test.js","sourceRoot":"","sources":["../../../src/ralplan/__tests__/consensus-gate.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,16 @@
1
+ export declare const RALPLAN_CONSENSUS_BLOCKED_REASONS: {
2
+ readonly nativeSubagentEvidenceMissing: "native_subagent_consensus_evidence_missing";
3
+ readonly nonApprovingReview: "non_approving_ralplan_consensus_review";
4
+ readonly missingSequentialApproval: "missing_sequential_architect_then_critic_approval";
5
+ };
6
+ export type RalplanConsensusBlockedReason = typeof RALPLAN_CONSENSUS_BLOCKED_REASONS[keyof typeof RALPLAN_CONSENSUS_BLOCKED_REASONS];
1
7
  export interface RalplanConsensusGateEvidence {
2
8
  complete: boolean;
3
9
  sequence: ['architect-review', 'critic-review'];
4
10
  ralplan_architect_review: Record<string, unknown> | null;
5
11
  ralplan_critic_review: Record<string, unknown> | null;
6
12
  source: string | null;
7
- blockedReason: string | null;
13
+ blockedReason: RalplanConsensusBlockedReason | null;
8
14
  blockedDetails?: string[];
9
15
  }
10
16
  export interface RalplanNativeSubagentConsensusOptions {
@@ -15,6 +21,7 @@ export interface RalplanNativeSubagentConsensusOptions {
15
21
  export interface RalplanConsensusSource {
16
22
  source: string;
17
23
  value: unknown;
24
+ sessionId?: string;
18
25
  }
19
26
  export declare function buildRalplanConsensusGateFromSources(sources: RalplanConsensusSource[], options?: RalplanNativeSubagentConsensusOptions): RalplanConsensusGateEvidence;
20
27
  export declare function buildRalplanConsensusGateForCwd(cwd: string, options?: {
@@ -28,4 +35,5 @@ export declare function hasDurableRalplanConsensusEvidenceForCwd(cwd: string, op
28
35
  requireNativeSubagents?: boolean;
29
36
  }): boolean;
30
37
  export declare function readLocalRalplanConsensusStateCandidates(cwd: string, sessionId?: string): RalplanConsensusSource[];
38
+ export declare function withParentReturnToRalplanContext(value: unknown, parent: Record<string, unknown>): unknown;
31
39
  //# sourceMappingURL=consensus-gate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"consensus-gate.d.ts","sourceRoot":"","sources":["../../src/ralplan/consensus-gate.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAChD,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,qCAAqC;IACpD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,sBAAsB,EAAE,EACjC,OAAO,GAAE,qCAA0C,GAClD,4BAA4B,CAmD9B;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1G,4BAA4B,CAY9B;AAED,wBAAgB,wCAAwC,CACtD,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1G,OAAO,CAET;AAED,wBAAgB,wCAAwC,CACtD,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,sBAAsB,EAAE,CAkB1B"}
1
+ {"version":3,"file":"consensus-gate.d.ts","sourceRoot":"","sources":["../../src/ralplan/consensus-gate.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iCAAiC;;;;CAIpC,CAAC;AAEX,MAAM,MAAM,6BAA6B,GACvC,OAAO,iCAAiC,CAAC,MAAM,OAAO,iCAAiC,CAAC,CAAC;AAE3F,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAChD,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,6BAA6B,GAAG,IAAI,CAAC;IACpD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,qCAAqC;IACpD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,sBAAsB,EAAE,EACjC,OAAO,GAAE,qCAA0C,GAClD,4BAA4B,CAyF9B;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1G,4BAA4B,CAsB9B;AAED,wBAAgB,wCAAwC,CACtD,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1G,OAAO,CAET;AAED,wBAAgB,wCAAwC,CACtD,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,sBAAsB,EAAE,CA0B1B;AAkKD,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAoBzG"}
@@ -1,26 +1,56 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { subagentTrackingPath } from '../subagents/tracker.js';
4
+ import { getBaseStateDir, resolveWorkingDirectoryForState } from '../state/paths.js';
5
+ export const RALPLAN_CONSENSUS_BLOCKED_REASONS = {
6
+ nativeSubagentEvidenceMissing: 'native_subagent_consensus_evidence_missing',
7
+ nonApprovingReview: 'non_approving_ralplan_consensus_review',
8
+ missingSequentialApproval: 'missing_sequential_architect_then_critic_approval',
9
+ };
4
10
  export function buildRalplanConsensusGateFromSources(sources, options = {}) {
5
11
  let nativeBlockedEvidence = null;
12
+ let validEvidence = null;
13
+ let invalidCompleteEvidence = null;
6
14
  for (const candidate of sources) {
7
- const evidence = extractSequentialConsensusEvidence(candidate.value);
8
- if (evidence) {
15
+ const evidence = resolveConsensusEvidence(candidate.value);
16
+ const candidateOptions = {
17
+ ...options,
18
+ sessionId: options.sessionId ?? candidate.sessionId,
19
+ };
20
+ if (evidence?.kind === 'invalid') {
21
+ invalidCompleteEvidence ??= { ...evidence, source: candidate.source };
22
+ continue;
23
+ }
24
+ if (evidence?.kind === 'valid') {
9
25
  if (options.requireNativeSubagents
10
- && !hasTrackerBackedNativeRalplanLanes(evidence, options)) {
11
- nativeBlockedEvidence ??= { ...evidence, source: candidate.source };
26
+ && !hasTrackerBackedNativeRalplanLanes(evidence, candidateOptions)) {
27
+ nativeBlockedEvidence ??= { ...evidence, source: candidate.source, options: candidateOptions };
12
28
  continue;
13
29
  }
14
- return {
15
- complete: true,
16
- sequence: ['architect-review', 'critic-review'],
17
- ralplan_architect_review: evidence.ralplan_architect_review,
18
- ralplan_critic_review: evidence.ralplan_critic_review,
19
- source: candidate.source,
20
- blockedReason: null,
21
- };
30
+ validEvidence ??= { ...evidence, source: candidate.source };
22
31
  }
23
32
  }
33
+ if (invalidCompleteEvidence) {
34
+ return {
35
+ complete: false,
36
+ sequence: ['architect-review', 'critic-review'],
37
+ ralplan_architect_review: invalidCompleteEvidence.ralplan_architect_review,
38
+ ralplan_critic_review: invalidCompleteEvidence.ralplan_critic_review,
39
+ source: invalidCompleteEvidence.source,
40
+ blockedReason: RALPLAN_CONSENSUS_BLOCKED_REASONS.nonApprovingReview,
41
+ blockedDetails: invalidCompleteEvidence.blockedDetails,
42
+ };
43
+ }
44
+ if (validEvidence) {
45
+ return {
46
+ complete: true,
47
+ sequence: ['architect-review', 'critic-review'],
48
+ ralplan_architect_review: validEvidence.ralplan_architect_review,
49
+ ralplan_critic_review: validEvidence.ralplan_critic_review,
50
+ source: validEvidence.source,
51
+ blockedReason: null,
52
+ };
53
+ }
24
54
  if (nativeBlockedEvidence) {
25
55
  return {
26
56
  complete: false,
@@ -28,10 +58,11 @@ export function buildRalplanConsensusGateFromSources(sources, options = {}) {
28
58
  ralplan_architect_review: nativeBlockedEvidence.ralplan_architect_review,
29
59
  ralplan_critic_review: nativeBlockedEvidence.ralplan_critic_review,
30
60
  source: nativeBlockedEvidence.source,
31
- blockedReason: 'native_subagent_consensus_evidence_missing',
61
+ blockedReason: RALPLAN_CONSENSUS_BLOCKED_REASONS.nativeSubagentEvidenceMissing,
32
62
  blockedDetails: [
33
- trackerBackedNativeReviewProblem(nativeBlockedEvidence.ralplan_architect_review, 'architect', options),
34
- trackerBackedNativeReviewProblem(nativeBlockedEvidence.ralplan_critic_review, 'critic', options),
63
+ trackerBackedNativeReviewPairProblem(nativeBlockedEvidence, nativeBlockedEvidence.options),
64
+ trackerBackedNativeReviewProblem(nativeBlockedEvidence.ralplan_architect_review, 'architect', nativeBlockedEvidence.options),
65
+ trackerBackedNativeReviewProblem(nativeBlockedEvidence.ralplan_critic_review, 'critic', nativeBlockedEvidence.options),
35
66
  ].filter((detail) => Boolean(detail)),
36
67
  };
37
68
  }
@@ -41,16 +72,26 @@ export function buildRalplanConsensusGateFromSources(sources, options = {}) {
41
72
  ralplan_architect_review: null,
42
73
  ralplan_critic_review: null,
43
74
  source: null,
44
- blockedReason: 'missing_sequential_architect_then_critic_approval',
75
+ blockedReason: RALPLAN_CONSENSUS_BLOCKED_REASONS.missingSequentialApproval,
45
76
  };
46
77
  }
47
78
  export function buildRalplanConsensusGateForCwd(cwd, options = {}) {
79
+ const localStateCandidates = readLocalRalplanConsensusStateCandidates(cwd, options.sessionId)
80
+ .map((candidate) => ({
81
+ ...candidate,
82
+ value: options.artifacts
83
+ ? withParentReturnToRalplanContext(candidate.value, options.artifacts)
84
+ : candidate.value,
85
+ }));
48
86
  return buildRalplanConsensusGateFromSources([
49
87
  ...(options.artifacts ? [
50
88
  { source: 'stage-context-artifacts', value: options.artifacts },
51
- { source: 'stage-context-ralplan-artifact', value: options.artifacts.ralplan },
89
+ {
90
+ source: 'stage-context-ralplan-artifact',
91
+ value: withParentReturnToRalplanContext(options.artifacts.ralplan, options.artifacts),
92
+ },
52
93
  ] : []),
53
- ...readLocalRalplanConsensusStateCandidates(cwd, options.sessionId),
94
+ ...localStateCandidates,
54
95
  ], {
55
96
  cwd,
56
97
  sessionId: options.sessionId,
@@ -63,52 +104,74 @@ export function hasDurableRalplanConsensusEvidenceForCwd(cwd, options = {}) {
63
104
  export function readLocalRalplanConsensusStateCandidates(cwd, sessionId) {
64
105
  const explicitSession = sessionId !== undefined;
65
106
  const sessionIdList = explicitSession ? validateLocalSessionId(sessionId) : readLocalCurrentSessionIds(cwd);
107
+ const scopedStateDir = getBaseStateDir(cwd);
108
+ const localStateDir = localBaseStateDir(cwd);
66
109
  if (explicitSession && sessionIdList.length === 0)
67
110
  return [];
68
111
  const stateRoots = sessionIdList.length > 0
69
- ? sessionIdList.map((id) => join(cwd, '.omx', 'state', 'sessions', id))
70
- : [join(cwd, '.omx', 'state')];
71
- const paths = stateRoots.flatMap((dir) => [
72
- join(dir, 'ralplan-state.json'),
73
- join(dir, 'autopilot-state.json'),
112
+ ? uniquePaths(sessionIdList.flatMap((id) => [
113
+ join(scopedStateDir, 'sessions', id),
114
+ join(localStateDir, 'sessions', id),
115
+ ])).map((dir) => ({
116
+ dir,
117
+ sessionId: sessionIdFromStateRoot(dir),
118
+ }))
119
+ : [{ dir: localStateDir }];
120
+ const paths = stateRoots.flatMap(({ dir, sessionId }) => [
121
+ { path: join(dir, 'ralplan-state.json'), sessionId },
122
+ { path: join(dir, 'autopilot-state.json'), sessionId },
74
123
  ]);
75
- return paths.flatMap((path) => {
124
+ return paths.flatMap(({ path, sessionId }) => {
76
125
  const state = readJsonState(path);
77
126
  if (!state)
78
127
  return [];
79
- return [{ source: path, value: state }];
128
+ return [{ source: path, value: state, sessionId }];
80
129
  });
81
130
  }
82
- function extractSequentialConsensusEvidence(value) {
131
+ function resolveConsensusEvidence(value) {
83
132
  if (!value || typeof value !== 'object')
84
133
  return null;
85
134
  const record = value;
86
- const gate = record.ralplanConsensusGate ?? record.ralplan_consensus_gate;
87
- if (gate && typeof gate === 'object') {
88
- const gateRecord = gate;
89
- const architectReview = asRecord(gateRecord.ralplan_architect_review ?? gateRecord.architectReview ?? gateRecord.architect_review);
90
- const criticReview = asRecord(gateRecord.ralplan_critic_review ?? gateRecord.criticReview ?? gateRecord.critic_review);
91
- if (gateRecord.complete === true
92
- && hasArchitectThenCriticSequence(gateRecord)
93
- && isApproveReview(architectReview, 'architect')
94
- && isApproveReview(criticReview, 'critic')
95
- && isCriticNotBeforeArchitect(architectReview, criticReview)) {
96
- return { ralplan_architect_review: architectReview, ralplan_critic_review: criticReview };
97
- }
135
+ const returnToRalplanCycle = isReturnToRalplanCycle(record);
136
+ const advancedReviewCycle = explicitFreshnessReviewCycle(record);
137
+ const staleReturnToRalplanCycle = returnToRalplanCycle && advancedReviewCycle === null;
138
+ const directGate = resolveDirectGate(record);
139
+ if (directGate?.kind === 'invalid')
140
+ return directGate;
141
+ if (directGate
142
+ && (!returnToRalplanCycle
143
+ || (advancedReviewCycle !== null && reviewsCarryFreshnessCycle(directGate, advancedReviewCycle))))
144
+ return directGate;
145
+ const handoffArtifactsAreStale = staleReturnToRalplanCycle;
146
+ const topLevelHandoffArtifacts = handoffArtifactsAreStale ? null : asRecord(record.handoff_artifacts);
147
+ if (topLevelHandoffArtifacts) {
148
+ const evidence = resolveConsensusEvidence(withParentReturnToRalplanContext(topLevelHandoffArtifacts, record));
149
+ if (evidence)
150
+ return evidence;
98
151
  }
99
- const stateHandoffArtifacts = asRecord(asRecord(record.state)?.handoff_artifacts);
152
+ const stateRecord = asRecord(record.state);
153
+ const stateHasOwnReturnLoopContext = stateRecord !== null && isReturnToRalplanCycle(stateRecord);
154
+ const stateHandoffArtifacts = handoffArtifactsAreStale && !stateHasOwnReturnLoopContext
155
+ ? null
156
+ : asRecord(stateRecord?.handoff_artifacts);
100
157
  if (stateHandoffArtifacts) {
101
- const evidence = extractSequentialConsensusEvidence(stateHandoffArtifacts);
158
+ const stateContext = stateHasOwnReturnLoopContext ? stateRecord : record;
159
+ const evidence = resolveConsensusEvidence(withParentReturnToRalplanContext(stateHandoffArtifacts, stateContext));
102
160
  if (evidence)
103
161
  return evidence;
104
162
  }
163
+ if (returnToRalplanCycle && advancedReviewCycle === null)
164
+ return null;
105
165
  const directArchitectReview = asRecord(record.ralplan_architect_review);
106
166
  const directCriticReview = asRecord(record.ralplan_critic_review);
107
167
  if (hasArchitectThenCriticSequence(record)
108
168
  && isApproveReview(directArchitectReview, 'architect')
109
169
  && isApproveReview(directCriticReview, 'critic')
110
- && isCriticNotBeforeArchitect(directArchitectReview, directCriticReview)) {
170
+ && isCriticNotBeforeArchitect(directArchitectReview, directCriticReview)
171
+ && (!returnToRalplanCycle
172
+ || (advancedReviewCycle !== null && reviewPairCarriesFreshnessCycle(directArchitectReview, directCriticReview, advancedReviewCycle)))) {
111
173
  return {
174
+ kind: 'valid',
112
175
  ralplan_architect_review: directArchitectReview,
113
176
  ralplan_critic_review: directCriticReview,
114
177
  };
@@ -120,8 +183,10 @@ function extractSequentialConsensusEvidence(value) {
120
183
  const criticReview = asRecord(latestReviewEntry.ralplan_critic_review ?? latestReviewEntry.critic_review ?? latestReviewEntry.criticReview);
121
184
  if (isApproveReview(architectReview, 'architect')
122
185
  && isApproveReview(criticReview, 'critic')
123
- && isCriticNotBeforeArchitect(architectReview, criticReview)) {
124
- return { ralplan_architect_review: architectReview, ralplan_critic_review: criticReview };
186
+ && isCriticNotBeforeArchitect(architectReview, criticReview)
187
+ && (!returnToRalplanCycle
188
+ || (advancedReviewCycle !== null && reviewPairCarriesFreshnessCycle(architectReview, criticReview, advancedReviewCycle)))) {
189
+ return { kind: 'valid', ralplan_architect_review: architectReview, ralplan_critic_review: criticReview };
125
190
  }
126
191
  }
127
192
  const architectReviews = Array.isArray(record.architectReviews) ? record.architectReviews : [];
@@ -130,13 +195,99 @@ function extractSequentialConsensusEvidence(value) {
130
195
  const architectReview = asRecord(architectReviews.at(-1));
131
196
  const criticReview = asRecord(criticReviews.at(-1));
132
197
  if (isApproveReview(architectReview, 'architect')
198
+ && isApproveReview(criticReview, 'critic')
199
+ && isCriticNotBeforeArchitect(architectReview, criticReview)
200
+ && (!returnToRalplanCycle
201
+ || (advancedReviewCycle !== null && reviewPairCarriesFreshnessCycle(architectReview, criticReview, advancedReviewCycle)))) {
202
+ return { kind: 'valid', ralplan_architect_review: architectReview, ralplan_critic_review: criticReview };
203
+ }
204
+ }
205
+ return null;
206
+ }
207
+ function resolveDirectGate(record) {
208
+ const gate = record.ralplanConsensusGate ?? record.ralplan_consensus_gate;
209
+ if (gate && typeof gate === 'object') {
210
+ const gateRecord = gate;
211
+ const architectReview = asRecord(gateRecord.ralplan_architect_review ?? gateRecord.architectReview ?? gateRecord.architect_review);
212
+ const criticReview = asRecord(gateRecord.ralplan_critic_review ?? gateRecord.criticReview ?? gateRecord.critic_review);
213
+ if (gateRecord.complete === true
214
+ && hasArchitectThenCriticSequence(gateRecord)
215
+ && isApproveReview(architectReview, 'architect')
133
216
  && isApproveReview(criticReview, 'critic')
134
217
  && isCriticNotBeforeArchitect(architectReview, criticReview)) {
135
- return { ralplan_architect_review: architectReview, ralplan_critic_review: criticReview };
218
+ return {
219
+ kind: 'valid',
220
+ ralplan_architect_review: architectReview,
221
+ ralplan_critic_review: criticReview,
222
+ };
223
+ }
224
+ if (gateRecord.complete === true) {
225
+ const blockedDetails = [
226
+ ...reviewApprovalProblems(architectReview, 'architect'),
227
+ ...reviewApprovalProblems(criticReview, 'critic'),
228
+ ];
229
+ if (!hasArchitectThenCriticSequence(gateRecord)) {
230
+ blockedDetails.push('consensus review sequence is not architect-review then critic-review');
231
+ }
232
+ if (!isCriticNotBeforeArchitect(architectReview, criticReview)) {
233
+ blockedDetails.push('critic review is ordered before architect review');
234
+ }
235
+ if (blockedDetails.length > 0) {
236
+ return {
237
+ kind: 'invalid',
238
+ ralplan_architect_review: architectReview,
239
+ ralplan_critic_review: criticReview,
240
+ blockedDetails,
241
+ };
242
+ }
136
243
  }
137
244
  }
138
245
  return null;
139
246
  }
247
+ export function withParentReturnToRalplanContext(value, parent) {
248
+ const reason = parent.return_to_ralplan_reason ?? parent.returnToRalplanReason;
249
+ if (typeof reason !== 'string' || reason.trim() === '' || !value || typeof value !== 'object' || Array.isArray(value)) {
250
+ return value;
251
+ }
252
+ const record = value;
253
+ const parentReviewCycle = numericValue(parent.return_to_ralplan_parent_review_cycle
254
+ ?? parent.returnToRalplanParentReviewCycle
255
+ ?? parent.review_cycle
256
+ ?? parent.reviewCycle);
257
+ const inheritedReviewCycle = record.review_cycle ?? record.reviewCycle ?? parent.review_cycle ?? parent.reviewCycle;
258
+ return {
259
+ ...record,
260
+ review_cycle: inheritedReviewCycle,
261
+ current_phase: parent.current_phase ?? parent.currentPhase ?? 'ralplan',
262
+ return_to_ralplan_reason: reason,
263
+ return_to_ralplan_parent_review_cycle: parentReviewCycle,
264
+ };
265
+ }
266
+ function explicitFreshnessReviewCycle(record) {
267
+ const parentReviewCycle = numericValue(record.return_to_ralplan_parent_review_cycle ?? record.returnToRalplanParentReviewCycle);
268
+ const candidateReviewCycle = numericValue(record.review_cycle ?? record.reviewCycle);
269
+ return parentReviewCycle !== null
270
+ && candidateReviewCycle !== null
271
+ && candidateReviewCycle > parentReviewCycle
272
+ ? candidateReviewCycle
273
+ : null;
274
+ }
275
+ function reviewsCarryFreshnessCycle(evidence, reviewCycle) {
276
+ return evidence.kind === 'valid'
277
+ && reviewPairCarriesFreshnessCycle(evidence.ralplan_architect_review, evidence.ralplan_critic_review, reviewCycle);
278
+ }
279
+ function reviewPairCarriesFreshnessCycle(architectReview, criticReview, reviewCycle) {
280
+ return reviewCarriesFreshnessCycle(architectReview, reviewCycle)
281
+ && reviewCarriesFreshnessCycle(criticReview, reviewCycle);
282
+ }
283
+ function reviewCarriesFreshnessCycle(review, reviewCycle) {
284
+ const cycle = numericValue(review?.review_cycle ?? review?.reviewCycle);
285
+ return cycle !== null && cycle >= reviewCycle;
286
+ }
287
+ function numericValue(value) {
288
+ const parsed = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : Number.NaN;
289
+ return Number.isFinite(parsed) ? parsed : null;
290
+ }
140
291
  function asRecord(value) {
141
292
  return value && typeof value === 'object' ? value : null;
142
293
  }
@@ -145,16 +296,48 @@ function isApproveReview(value, agentRole) {
145
296
  return false;
146
297
  if (value.verdict !== undefined && value.verdict !== 'approve')
147
298
  return false;
148
- if (value.status !== undefined && !['approve', 'approved', 'clear', 'pass', 'passed'].includes(String(value.status).toLowerCase())) {
299
+ if (value.status !== undefined && !isApprovedStatus(value.status)) {
149
300
  return false;
150
301
  }
151
- if (value.recommendation !== undefined && !['approve', 'approved'].includes(String(value.recommendation).toLowerCase())) {
302
+ if (value.recommendation !== undefined && !isApproveRecommendation(value.recommendation)) {
152
303
  return false;
153
304
  }
154
305
  if (hasBlockingReviewSignal(value))
155
306
  return false;
307
+ return hasPositiveReviewApprovalSignal(value);
308
+ }
309
+ function reviewApprovalProblems(value, agentRole) {
310
+ const issues = [];
311
+ if (!value)
312
+ return [`${agentRole} review is missing`];
313
+ if (value.agent_role !== agentRole)
314
+ issues.push(`${agentRole} review has agent_role=${String(value.agent_role || 'missing')}`);
315
+ if (value.verdict !== undefined && value.verdict !== 'approve') {
316
+ issues.push(`${agentRole} review verdict=${String(value.verdict)} is not approve`);
317
+ }
318
+ if (value.status !== undefined && !isApprovedStatus(value.status)) {
319
+ issues.push(`${agentRole} review status=${String(value.status)} is not approve`);
320
+ }
321
+ if (value.recommendation !== undefined && !isApproveRecommendation(value.recommendation)) {
322
+ issues.push(`${agentRole} review recommendation=${String(value.recommendation)} is not approve`);
323
+ }
324
+ if (issues.length === 0 && hasBlockingReviewSignal(value)) {
325
+ issues.push(`${agentRole} review has a blocking signal`);
326
+ }
327
+ if (issues.length === 0 && !hasPositiveReviewApprovalSignal(value)) {
328
+ issues.push(`${agentRole} review lacks approving evidence`);
329
+ }
330
+ return issues;
331
+ }
332
+ function hasPositiveReviewApprovalSignal(value) {
156
333
  return value.verdict === 'approve' || value.approved === true || value.clean === true;
157
334
  }
335
+ function isApprovedStatus(value) {
336
+ return ['approve', 'approved', 'clear', 'pass', 'passed'].includes(String(value).toLowerCase());
337
+ }
338
+ function isApproveRecommendation(value) {
339
+ return ['approve', 'approved'].includes(String(value).toLowerCase());
340
+ }
158
341
  function hasArchitectThenCriticSequence(value) {
159
342
  if (!Array.isArray(value.sequence))
160
343
  return true;
@@ -185,9 +368,7 @@ function reviewOrderValue(review) {
185
368
  return null;
186
369
  }
187
370
  function hasTrackerBackedNativeRalplanLanes(evidence, options) {
188
- const architectThreadId = nativeReviewThreadId(evidence.ralplan_architect_review);
189
- const criticThreadId = nativeReviewThreadId(evidence.ralplan_critic_review);
190
- if (!architectThreadId || !criticThreadId || architectThreadId === criticThreadId)
371
+ if (trackerBackedNativeReviewPairProblem(evidence, options))
191
372
  return false;
192
373
  return isTrackerBackedNativeReview(evidence.ralplan_architect_review, 'architect', options)
193
374
  && isTrackerBackedNativeReview(evidence.ralplan_critic_review, 'critic', options);
@@ -195,16 +376,35 @@ function hasTrackerBackedNativeRalplanLanes(evidence, options) {
195
376
  function nativeReviewThreadId(review) {
196
377
  return typeof review?.thread_id === 'string' ? review.thread_id.trim() : '';
197
378
  }
379
+ function trackerBackedNativeReviewPairProblem(evidence, options) {
380
+ const architectThreadId = nativeReviewThreadId(evidence.ralplan_architect_review);
381
+ const criticThreadId = nativeReviewThreadId(evidence.ralplan_critic_review);
382
+ if (architectThreadId && criticThreadId && architectThreadId === criticThreadId) {
383
+ return 'architect and critic reviews must reference distinct native subagent tracker threads';
384
+ }
385
+ const transitionSessionId = typeof options.sessionId === 'string' ? options.sessionId.trim() : '';
386
+ const architectSessionId = transitionSessionId || nativeReviewSessionId(evidence.ralplan_architect_review);
387
+ const criticSessionId = transitionSessionId || nativeReviewSessionId(evidence.ralplan_critic_review);
388
+ if (!architectSessionId || !criticSessionId)
389
+ return null;
390
+ return architectSessionId === criticSessionId
391
+ ? null
392
+ : `architect and critic reviews must resolve to the same native subagent tracker session; architect session_id=${architectSessionId}, critic session_id=${criticSessionId}`;
393
+ }
198
394
  function isTrackerBackedNativeReview(review, agentRole, options) {
199
395
  return trackerBackedNativeReviewProblem(review, agentRole, options) === null;
200
396
  }
397
+ function nativeReviewSessionId(review) {
398
+ return typeof review?.session_id === 'string' ? review.session_id.trim() : '';
399
+ }
201
400
  function trackerBackedNativeReviewProblem(review, agentRole, options) {
401
+ const issues = [];
202
402
  if (!review)
203
403
  return `${agentRole} review is missing`;
204
404
  if (review.agent_role !== agentRole)
205
- return `${agentRole} review has agent_role=${String(review.agent_role || 'missing')}`;
405
+ issues.push(`${agentRole} review has agent_role=${String(review.agent_role || 'missing')}`);
206
406
  if (review.provenance_kind !== 'native_subagent')
207
- return `${agentRole} review has provenance_kind=${String(review.provenance_kind || 'missing')}`;
407
+ issues.push(`${agentRole} review has provenance_kind=${String(review.provenance_kind || 'missing')}`);
208
408
  const sessionId = typeof options.sessionId === 'string' && options.sessionId.trim()
209
409
  ? options.sessionId.trim()
210
410
  : typeof review.session_id === 'string'
@@ -212,21 +412,21 @@ function trackerBackedNativeReviewProblem(review, agentRole, options) {
212
412
  : '';
213
413
  const reviewSessionId = typeof review.session_id === 'string' ? review.session_id.trim() : '';
214
414
  const threadId = typeof review.thread_id === 'string' ? review.thread_id.trim() : '';
215
- const artifactPath = typeof review.artifact_path === 'string' ? review.artifact_path.trim() : '';
216
415
  const trackerPath = typeof review.tracker_path === 'string' ? review.tracker_path.trim() : '';
217
416
  if (!sessionId)
218
- return `${agentRole} review cannot resolve session_id`;
219
- if (!reviewSessionId || reviewSessionId !== sessionId)
220
- return `${agentRole} review session_id=${reviewSessionId || 'missing'} does not match ${sessionId}`;
417
+ issues.push(`${agentRole} review cannot resolve session_id`);
418
+ if (reviewSessionId && reviewSessionId !== sessionId)
419
+ issues.push(`${agentRole} review session_id=${reviewSessionId} does not match ${sessionId || 'missing'}`);
221
420
  if (!threadId)
222
- return `${agentRole} review missing thread_id`;
223
- if (!artifactPath)
224
- return `${agentRole} review missing artifact_path`;
225
- if (!trackerPath || !trackerPath.endsWith('subagent-tracking.json'))
226
- return `${agentRole} review missing subagent-tracking.json tracker_path`;
227
- if (!options.cwd)
228
- return `${agentRole} review cannot resolve cwd for tracker lookup`;
229
- const expectedTrackerPath = subagentTrackingPath(options.cwd);
421
+ issues.push(`${agentRole} review missing thread_id`);
422
+ if (trackerPath && !trackerPath.endsWith('subagent-tracking.json'))
423
+ issues.push(`${agentRole} review tracker_path=${trackerPath} is not subagent-tracking.json`);
424
+ const cwd = typeof options.cwd === 'string' ? options.cwd.trim() : '';
425
+ if (!cwd)
426
+ issues.push(`${agentRole} review cannot resolve cwd for tracker lookup`);
427
+ if (issues.length > 0)
428
+ return issues.join('; ');
429
+ const expectedTrackerPath = subagentTrackingPath(cwd);
230
430
  const tracking = readJsonState(expectedTrackerPath);
231
431
  const session = asRecord(asRecord(tracking?.sessions)?.[sessionId]);
232
432
  const thread = asRecord(asRecord(session?.threads)?.[threadId]);
@@ -241,12 +441,15 @@ function trackerBackedNativeReviewProblem(review, agentRole, options) {
241
441
  return `${agentRole} tracker thread ${threadId} is the session leader`;
242
442
  if (thread.kind !== 'subagent')
243
443
  return `${agentRole} tracker thread ${threadId} has kind=${String(thread.kind || 'missing')}`;
444
+ const completedAt = typeof thread.completed_at === 'string' ? thread.completed_at.trim() : '';
445
+ if (!completedAt)
446
+ return `${agentRole} tracker thread ${threadId} is not completed`;
244
447
  return null;
245
448
  }
246
449
  function currentSessionNativeLeaderThreadId(cwd) {
247
450
  if (!cwd)
248
451
  return '';
249
- const sessionState = readJsonState(join(cwd, '.omx', 'state', 'session.json'));
452
+ const sessionState = readJsonState(join(getBaseStateDir(cwd), 'session.json'));
250
453
  return typeof sessionState?.native_session_id === 'string' ? sessionState.native_session_id.trim() : '';
251
454
  }
252
455
  function validateLocalSessionId(sessionId) {
@@ -283,12 +486,31 @@ function hasBlockingReviewSignal(value) {
283
486
  return false;
284
487
  }
285
488
  function readLocalCurrentSessionIds(cwd) {
286
- const state = readJsonState(join(cwd, '.omx', 'state', 'session.json'));
489
+ const state = readJsonState(join(getBaseStateDir(cwd), 'session.json'));
287
490
  if (typeof state?.cwd === 'string' && state.cwd !== cwd)
288
491
  return [];
289
492
  const sessionId = typeof state?.session_id === 'string' ? state.session_id : undefined;
290
493
  return sessionId ? validateLocalSessionId(sessionId) : [];
291
494
  }
495
+ function localBaseStateDir(cwd) {
496
+ return join(resolveWorkingDirectoryForState(cwd), '.omx', 'state');
497
+ }
498
+ function sessionIdFromStateRoot(path) {
499
+ const normalized = path.replace(/\\/g, '/');
500
+ const match = /\/sessions\/([^/]+)$/.exec(normalized);
501
+ const sessionId = match?.[1];
502
+ return sessionId && validateLocalSessionId(sessionId).length > 0 ? sessionId : undefined;
503
+ }
504
+ function uniquePaths(paths) {
505
+ return [...new Set(paths)];
506
+ }
507
+ function isReturnToRalplanCycle(record) {
508
+ const currentPhase = String(record.current_phase ?? record.currentPhase ?? '').toLowerCase();
509
+ const reason = record.return_to_ralplan_reason ?? record.returnToRalplanReason;
510
+ return currentPhase === 'ralplan'
511
+ && typeof reason === 'string'
512
+ && reason.trim().length > 0;
513
+ }
292
514
  function readJsonState(path) {
293
515
  if (!existsSync(path))
294
516
  return null;