From e51afc27f04625f6e06c88a8c1035c090ecc7610 Mon Sep 17 00:00:00 2001 From: Eyejoker Date: Mon, 30 Mar 2026 18:15:17 +0900 Subject: [PATCH] feat: failover reviewer to codex when Claude reviewer is unavailable When the reviewer is Claude and hits auth/429/overloaded errors, hand off the review turn to codex-review instead of swapping owner/reviewer roles (which is the owner failover path). --- src/message-agent-executor.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/message-agent-executor.ts b/src/message-agent-executor.ts index 2e387ae..7998d1c 100644 --- a/src/message-agent-executor.ts +++ b/src/message-agent-executor.ts @@ -192,6 +192,27 @@ export async function runAgentForGroup( return false; } + if (reviewerMode) { + // Reviewer failed (e.g. Claude 401/429) — re-trigger review with codex + // instead of swapping owner/reviewer roles. + createServiceHandoff({ + chat_jid: chatJid, + group_folder: group.folder, + source_service_id: SERVICE_SESSION_SCOPE, + target_service_id: CODEX_REVIEW_SERVICE_ID, + target_agent_type: 'codex', + prompt, + start_seq: startSeq ?? null, + end_seq: endSeq ?? null, + reason: `reviewer-claude-${reason}`, + }); + logger.warn( + { chatJid, group: group.name, runId, reason }, + 'Claude reviewer unavailable, handed off review turn to codex-review', + ); + return true; + } + activateCodexFailover(chatJid, `claude-${reason}`); createServiceHandoff({ chat_jid: chatJid,