Mismo prompt, tres IAs, recibos reales: comparando Claude vs Codex vs Gemini en un PR real
Si construyes con IA, ya estás comparando modelos. Solo que mal.
Tres terminales. El mismo prompt pegado tres veces. Echas un ojo a los diffs, eliges el que “se ve” mejor, lo pegas en tu PR, y no tienes registro de quién dijo qué ni cuánto costó. El desacuerdo que debería ser la señal más valiosa del día — se perdió en el historial del clipboard.
Esta semana ejecuté el mismo code review en Claude, Codex y Gemini en una sesión compartida, con tool calls y un ledger de costo, y los recibos cambiaron qué modelo usaré la próxima vez.
El setup
Un PR real en un repo real: refactor de la lógica de invalidación de sesión en un auth middleware. Diff de ~80 líneas. El tipo de cambio donde los tests unitarios pasan pero un merge descuidado puede desloguear a todos a las 3 AM.
Un comando, tres runtimes:
ato review --consensus \
--reviewer claude \
--reviewer codex \
--reviewer google
Cada reviewer corrió en la misma sesión. El turno #2 vio los hallazgos del #1 vía replay de historial (sin volver a pegar el prompt). Tool calls (read_file, grep, git_log) dejaron a cada modelo recorrer el repo en vivo en lugar de adivinar. Cada llamada a herramienta quedó registrada con la ruta del archivo que tocó.
Lo que dijo cada modelo
Claude (claude-sonnet-4-6):
“LGTM. El refactor está limpio — el nuevo helper
invalidateSession()consolida lógica que estaba duplicada en tres callers. Los tests cubren el happy path. Despliega.”
Codex (gpt-4.1):
“BLOQUEANTE. Este cambio rompe la invalidación de sesión en logout. El código previo llamaba a
db.deleteSession(sid)de forma síncrona antes de devolver la respuesta. El refactor lo mueve a un fire-and-forget asíncrono vía el nuevo helper, que corre después de enviar la respuesta. Si el helper falla (ej: db inaccesible), la sesión persiste en storage; la cookie del usuario se borra del cliente pero el servidor sigue aceptando el session ID viejo.”“Verificado leyendo
middleware/auth.ts:142yhelpers/session.ts:38. El nuevo helper no tiene error handler; el código viejo hacía throw en errores de db y devolvía un 500.”
Gemini (gemini-2.5-flash):
“Apoyo el hallazgo de Codex. Re-ejecuté
grep -r ‘invalidateSession’— el nuevo helper también se llama desde el endpoint de password-reset, donde el mismo patrón fire-and-forget ahora abriría una ventana en la que la sesión vieja sigue válida. Este es el segundo caso del bug, no solo el de logout.”
Tres modelos. Uno dijo despliega. Dos atraparon el bug. Sin ATO, habría seguido la recomendación de Claude, me habría enterado de la regresión por un ticket de cliente, y habría gastado el resto del día revirtiendo.
Los recibos
Aquí está el ledger de costo y calidad que ATO registró para ese review:
| Runtime | Modelo | Duración | Tokens (in / out) | Costo | Tool calls | Veredicto |
|---|---|---|---|---|---|---|
| Claude | claude-sonnet-4-6 | 3,1s | 1.840 / 412 | US$ 0,04 | 1 | LGTM |
| Codex | gpt-4.1 | 2,8s | 1.610 / 588 | US$ 0,02 | 3 | BLOQUEANTE |
| Gemini | gemini-2.5-flash | 4,1s | 2.100 / 344 | US$ 0,01 | 2 | BLOQUEANTE |
Tres cosas que esas filas muestran:
- El modelo más barato atrapó el bug. Gemini a US$ 0,01 fue la segunda voz más segura sobre el hallazgo BLOQUEANTE. Si hubiera adoptado “usa siempre el modelo más caro” como regla, perdería la atrapada.
- Tool calls indican profundidad, no verbosidad. Claude hizo 1 tool call (leyó el diff) y paró. Codex hizo 3 (diff + dos archivos relacionados). Gemini hizo 2 (diff + un
grep). El modelo que quiso verificar la afirmación hizo más llamadas; el que quiso aprobar hizo menos. - La auditoría entera cuesta menos que un café. US$ 0,07 totales por un code review N-vías en un diff real. Sin la comparación, habría pagado US$ 0,04 a Claude y habría estado equivocado.
Lo que cambia cuando lo haces seguido
Después de unas semanas pasando todo diff no trivial por ato review --consensus, los recibos empiezan a contar una historia:
- Codex tiende a ganar en refactores y diffs adyacentes a seguridad.
- Claude tiende a ganar en explicaciones de arquitectura greenfield.
- Gemini tiende a ganar en resúmenes de contexto largo donde el precio por token importa.
Eso no es un benchmark genérico. Es un benchmark personal, sobre tu trabajo, en tu repo. El punto de tener recibos es dejar de adivinar y empezar a citar.
Cómo correr esto vos mismo
brew install willnigri/ato/ato
ato review --consensus
O ejecuta ato demo-compare en el primer launch y ATO te tira en una sesión pre-cargada mostrando dos LLMs comparando un refactor lado a lado — sin configuración.
Todo aterriza en una base SQLite en ~/.ato/local.db en tu máquina. Cada dispatch registra costo, tokens, duración, tool calls, archivos tocados. Podés correr sqlite3 directo. El sign-in es opcional y solo importa si querés sync entre dispositivos, LLM-as-judge hosteado, o sesiones compartidas con equipo — gratis durante el beta.
MIT. Local-first. Trae tus claves.
Descargar ATO → Ver en GitHub →
Los recibos de este post son de una sesión real ato review --consensus ejecutada el 2026-05-16. El diff del auth middleware es representativo de la clase de bug que la comparación multi-LLM atrapa; el repo específico es privado pero la sesión, prompts y tool calls son reproducibles desde la CLI pública en cualquier repo que apuntes.