Concilium — revisión adversarial entre modelos
Un segundo modelo, diferente, revisa las afirmaciones (del usuario o tuyas) de forma adversarial. Un linaje de modelo diferente significa puntos ciegos diferentes — ese es el valor. El revisor PROPONE; la sesión que lo invoca RATIFICA. Nunca permitas que la confianza de ninguno de los lados sustituya a la evidencia.
Diseñado para ser orquestado desde Claude Code — Opus 5 y Fable 5 son asientos de ratificación de primera clase (medidos con paridad de silla en un benchmark ciego de predicción de resultados; cualquier modelo Claude puede manejar el bucle, pero el ratificador debe ser uno de los dos). El lado GPT (sol/terra/5.5 mediante codex) realiza la indagación independiente y la ejecución mecánica — y ese asiento entre familias es estructural: captura de forma medible lo que las sillas de la misma familia pasan por alto juntas.
Requisitos previos (verificar una vez por entorno)
-
codex login status→ debe decir "Logged in using ChatGPT" (OAuth de suscripción — NO se necesita una clave API y una suscripción NO se puede usar como tal; no intentes proxies/puentes de enrutamiento). -
Descubrir modelos disponibles:
codex debug modelso~/.codex/models_cache.json. Si un modelo da error "requires a newer version of Codex", ejecutacodex updatey vuelve a intentarlo. -
La primera vez en un entorno nuevo, ejecuta el bootstrap de calibración (references/setup.md) antes de confiar en los veredictos: una prueba de razonamiento con verdad conocida, luego una tarea real simple y luego (opcionalmente) una comparación directa para elegir modelos de nivel.
-
Asiento Kimi — EXPERIMENTAL y optativo; nunca parte de una ronda predeterminada. Agréguelo solo cuando el usuario lo solicite explícitamente como una tercera familia. Dos transportes, cada uno con su propio wrapper aquí:
- Kimi Desktop (Windows).
scripts/concilium-review-kimi.ps1impulsa el ejecutor daimon incluido en la aplicación bajo su propio Electron. Requiere la aplicación de escritorio instalada e iniciada sesión. - Kimi Code CLI (Linux/macOS/Windows).
scripts/concilium-review-kimi.shimpulsa la CLI multiplataforma con licencia MIT —kimi -psin cabeza más OAuth con código de dispositivo, por lo que es adecuado para un contenedor o una máquina virtual desechable (ejemplo práctico: references/isolated-guest-vmware.md). ⚠ El modo de impresión aprueba automáticamente cada llamada de herramienta por construcción, por lo que el aislamiento allí es una condición previa, no una precaución. ⚠ Siempre pasa--model: el valor predeterminado integrado de la CLI es una generación anterior al modelo insignia y nada en la salida lo nombra.
Calibrado pero más inestable que codex, y más débil en aislamiento: rutas, modelos, sandboxing y las advertencias están en references/setup.md y en las trampas #18–21.
- Kimi Desktop (Windows).
Matriz de niveles (los valores predeterminados son modelos actuales — anular por instalación)
| Nivel | Predeterminado | Esfuerzo | Uso para |
|---|---|---|---|
| Investigación | insignia (ej. gpt-5.6-sol) | máximo | rondas de revisión abiertas, verificación adversarial |
| Mecánico | insignia anterior (ej. gpt-5.5) | medio | verificar una afirmación conocida con una sonda |
| Ejecutor | nivel económico (ej. gpt-5.6-terra) | bajo | ejecutar e informar: ejecutar un script, supervisar una importación |
Los wrappers de nivel de investigación tienen como valor predeterminado máximo en cada asiento. Los vocabularios de esfuerzo difieren y vale la pena conocerlos exactamente: codex acepta ninguno · mínimo · bajo · medio · alto · xalto · máximo (medido — la API rechaza cualquier otra cosa y nombra la enumeración), el asiento kimi acepta bajo · alto · máximo.
El esfuerzo no es un sustituto de una segunda familia — medido, con el control. Seis ejecuciones de un asiento (gpt-5.6-sol) sobre el mismo paquete de predicción de 14 elementos, en esfuerzo bajo/medio/alto/xalto/máximo más una réplica del mismo esfuerzo: dos ejecuciones en el MISMO esfuerzo cubrieron 10/14, mientras que los pares de diferente esfuerzo promediaron 8.9 y nunca lo superaron; el conjunto completo de seis ejecuciones también alcanzó solo 10/14, igual al piso de ruido de dos ejecuciones e igual a un par codex+kimi. La precisión no fue monótona en el esfuerzo (alto 9, máximo 9, xalto 7, medio 7, bajo 7) mientras que el tiempo de ejecución creció 8× (21s → 166s). Cuatro elementos fueron omitidos por cada ejecución en cada esfuerzo — y el asiento entre familias obtuvo dos de ellos. Variar el esfuerzo vuelve a muestrear los mismos puntos ciegos; un linaje diferente es lo que los mueve. Si deseas cobertura, agrega una familia, no cómputo. -Mechanical es la reducción deliberada y permanece en medio.
Las tareas de ejecutor NO son revisiones — omite el wrapper y llama a codex directamente:
codex exec -m <modelo-económico> -c model_reasoning_effort=bajo [-s solo-lectura a menos que escriba] "<tarea>" < /dev/null
Siempre cierra stdin en llamadas directas no interactivas (bash < /dev/null; PowerShell $null | codex …) — un stdin abierto que no es TTY bloquea codex para siempre en "Reading additional input from stdin...", y el proceso huérfano sobrevive al tiempo de espera del shell principal (trampa #10; los wrappers son inmunes — canalizan a través de stdin).
Ejecutar una revisión
Usa los wrappers incluidos. Cargan el contrato de revisión compartido desde references/contract.md (fuente única de verdad — sonda de falsificación, explicación alternativa, advertencia, propuesta de veredicto, reglas de esquema/codificación; edita el contrato allí, nunca en los scripts) y agregan sellado de procedencia. Ambos wrappers son funcionalmente idénticos; elige según la plataforma:
Linux / macOS (bash):
- Afirmación:
scripts/concilium-review.sh claim "<afirmación>" - Diff:
scripts/concilium-review.sh diff [rama-base] - Config mediante variables de entorno:
MODEL,EFFORT,MECHANICAL=1(nivel mecánico),REPO_DIR,PROJECT_RULES(ruta del archivo de reglas). - Primer uso después de clonar:
chmod +x scripts/concilium-review.sh.
Windows (PowerShell 5.1+):
- Afirmación:
powershell -ExecutionPolicy Bypass -File scripts/concilium-review.ps1 -Claim "<afirmación>" [-Mechanical] [-RepoDir <ruta>] [-ProjectRules <archivo>] - Diff:
... -Diff [-Base <rama>]— revisa el diff del árbol de trabajo de-RepoDir.
Asiento de tercera familia Kimi — EXPERIMENTAL, optativo. No es parte de una ronda predeterminada; agrégalo solo cuando el usuario solicite una tercera familia. Dos wrappers, mismo contrato y mismos cinco bloques:
concilium-review-kimi.sh (CLI multiplataforma, configurado mediante variables de entorno — MODEL es obligatorio allí) y concilium-review-kimi.ps1 (ejecutor de escritorio Windows).
El wrapper de escritorio acepta las mismas opciones -Claim/-Diff/-RepoDir/-ProjectRules/-PriorRounds, más -Model (predeterminado k3-agent), -Effort (bajo|alto|máximo) y -RawPrompt (sin contrato, para sondas de calibración). Dos diferencias específicas del asiento, ambas medidas: el puente automático de CLAUDE.md está DESACTIVADO de forma predeterminada aquí — la inyección falla la ejecución de forma confiable con un simple Connection error., por lo que es optativo mediante -AutoRules; usa -ProjectRules <archivo> para proporcionar contexto al revisor. Y nunca confíes en su código de salida — sale con 0 incluso en ese fallo, por lo que debes verificar los cinco bloques. Las indicaciones de varias líneas deben pasar a través de este wrapper; un kimi-daimon --prompt directo desde bash hace que sus argumentos se corrompan (trampas #18–19).
Este asiento no tiene sandbox — proporciona una copia desechable. -SandboxFrom <dir> copia el árbol a un directorio temporal (excluyendo .git, entornos virtuales y archivos con forma de secreto), ejecuta el agente allí, imprime exactamente lo que creó/modificó/eliminó y elimina la copia a menos que se use -KeepSandbox. Úsalo de forma predeterminada. Sé claro sobre lo que proporciona: workDir no es un límite — un canario fuera de él fue leído por ruta absoluta y devuelto textualmente (trampas #20) — por lo que esto es control del radio de explosión y una pista de auditoría, no contención. Si el material en la máquina no debe llegar al proveedor, aísla a nivel del sistema operativo (cuenta separada con ACLs, o una máquina virtual).
Para una ronda ciega, el riesgo de esa misma porosidad es contaminación en lugar de daño: un agente que deambula por el árbol real puede encontrar la respuesta, y la ronda deja de ser ciega silenciosamente. Agrega -WatchPaths <a,b,c> — toma instantáneas de las horas de último acceso de NTFS para lo que debe permanecer sin leer (el repositorio real, el registro de resultados, la clave de respuestas) e informa cualquier cosa leída durante la ejecución. Validado contra un escape conocido en ambas direcciones; lee las trampas #21 antes de confiar en él, incluyendo por qué una versión basada en enumeración de la misma verificación informó "limpia" en una ejecución que demostrablemente había escapado.
Reglas operativas (cada una es un fallo medido — el porqué está en references/pitfalls.md):
- Ejecuta en segundo plano con un tiempo de espera completo de ~10 min desde la PRIMERA llamada. Las revisiones reales toman 5–15+ minutos con esfuerzo alto; un tiempo de espera en primer plano las mata a mitad de la sonda.
- Prefiere una sesión nueva en lugar de reanudar una que haya expirado. Las cadenas largas reanudadas sufren compactación de contexto — la lectura cuidadosa temprana del revisor se resume con pérdidas antes del paso final y decisivo.
- Nunca reanudes directamente.
codex exec resumerestablece silenciosamente el modelo Y el sandbox a los valores predeterminados de config.toml del usuario. Si debes reanudar (o quieres cambiar de modelo a mitad de sesión), vuelve a fijar todo:codex exec resume -m <modelo> -c sandbox_mode="read-only" -c model_reasoning_effort=<nivel> <id-de-sesión> -Las banderas van ANTES del id de sesión posicional. La clave essandbox_mode—-c sandbox=...se ignora silenciosamente, y no hay bandera-sen resume. La reanudación entre modelos conserva el contexto. - El revisor es un agente completo, no un chatbot — el sandbox de solo lectura bloquea escrituras de archivos, no comandos de lectura ni SELECTs de bases de datos. Todo lo que revisa va al proveedor del segundo modelo.
- Observa el progreso en vivo, no esperes a ciegas — y monitorea el flujo correcto. El contrato (regla 9) hace que el revisor emita líneas
STATUS:mientras trabaja, y codex escribe progresivamente — pero los flujos se dividen (verificado en vivo): con1> out 2> err, los cinco bloques finales llegan a stdout mientras que la transcripción en streaming (banner, líneas STATUS, llamadas a herramientas) va a stderr. Apunta un tail/monitor a stderr para el progreso + las firmas de fallo; lee stdout para el veredicto. Advertencia: las redirecciones1>/2>de PowerShell escriben UTF-16 — decodifica en consecuencia (o redirige a través de un paso que fuerce UTF-8) antes de grepear. - Una ronda ciega necesita aislamiento estructural, no una instrucción. Cuando la ronda debe ser no preparada (una evaluación ciega, una pasada ciega crítica para el encuadre según una plantilla de solicitud), ejecuta al revisor en un directorio limpio con el puente de reglas automáticas DESACTIVADO (
-NoAutoRules/NO_AUTO_RULES=1): un modelo que lleva contexto del proyecto y al que se le dice "responde solo con el paquete" todavía usa ese contexto de forma medible (trampas #16–17).
Protocolo de ratificación (tarea de la sesión que invoca)
El revisor devuelve cinco bloques: PROBE / ALT / CAVEAT / VERDICT-PROPOSAL / PHASE-LOG.
Antes de reenviar o actuar:
- Lee la sonda real (la consulta/comandos), no solo el resumen en prosa.
- Los resultados extremos son una señal de alerta: 0% o 100% en un primer intento generalmente significa una clave de unión incorrecta, alcance incorrecto o tabla incorrecta, no un descubrimiento. Verifica el paso clave de la sonda tú mismo antes de aceptarlo.
- Verifica el alcance de los desacuerdos: dos sondas pueden ser ambas factualmente correctas en diferentes alcances (una tabla vs. toda la BD, una fuente vs. todas las fuentes). Nombra el alcance antes de comparar números.
- Distingue entre refutado / desactualizado / incompleto. "Los números difieren hoy" no significa que la afirmación fuera incorrecta cuando se escribió — verifica el historial/marcas de tiempo antes de decir "refutado".
- Asigna tú mismo la etiqueta de veredicto final:
[V-código](verificado contra fuente, cita archivo:línea) /[V-bd](consulta de solo lectura, cítala) /[V-sonda](script reejectutable) /[C](no verificado) /[X](refutado — nombra qué lo reemplaza). La propuesta es entrada, no la respuesta. - Pondera el acuerdo por linaje. La confirmación de la misma familia (una silla Claude que está de acuerdo con un orquestador Claude) es evidencia débil — las sillas del mismo linaje comparten respuestas incorrectas de forma medible, hasta producir de forma independiente la misma inferencia incorrecta. Una confirmación o refutación entre familias supera cualquier recuento de votos del mismo linaje; nunca resuelvas una disputa por mayoría entre sillas que comparten un linaje. Una tercera familia (Moonshot) está disponible como asiento optativo experimental; un tercer asiento no aporta nada a menos que sea independiente, por lo que pondera por familia, no por número de votos — y ten en cuenta que un panel unánime puede simplemente significar que el elemento era fácil (setup.md).
El bucle concilium (rondas iterativas)
Una sola pasada de revisión suele ser suficiente. Pero cuando la sonda del revisor tiene una brecha, o tú (el orquestador) no estás de acuerdo con la propuesta por razones defendibles, un intercambio no es un concilium — un consejo delibera. El bucle ejecuta rondas de revisión hasta que el veredicto converge o se demuestra que la disputa es genuina. Este bucle es orquestado por ti, la sesión de Claude que invoca — es un protocolo, no un script (el paso de ratificación es tu juicio; nada puede automatizarlo).
Cada ronda:
- Ejecuta una revisión (el wrapper) → obtén los cinco bloques → ratifica según el protocolo anterior.
- Decide el resultado de la ronda y actúa:
| Resultado | Condición | Acción |
|---|---|---|
| Convergió | Verificaste el paso clave de la sonda y se sostiene | DETENTE — emite la etiqueta final. |
| Disputa | La sonda tiene una brecha, alcance incorrecto, o tienes una objeción específica respaldada por evidencia | Escribe la PROBE de esta ronda + tu objeción en un archivo de rondas; ejecuta la siguiente ronda con -PriorRounds / PRIOR_ROUNDS apuntando a él. |
| Seca | Una ronda no agrega nueva evidencia comprobable — el revisor reafirma, o dice (en CAVEAT) que no tiene un nuevo camino | DETENTE — escala al propietario como [C]/[POLICY] con la pregunta abierta. Este es el guardia contra oscilaciones. |
| Límite | Se alcanzó el límite de rondas (predeterminado 3) sin converger | DETENTE — presenta el estado y escala; una disputa real es un hallazgo, no un fallo. |
Reglas de diseño (se derivan directamente de las trampas):
- Sesión nueva por ronda — nunca una cadena de reanudación. El bucle es exactamente la "cadena larga" contra la que advierte la trampa #3; lleva el contexto hacia adelante mediante el archivo
-PriorRounds, nocodex exec resume. Cada ronda comienza limpia y ve solo un resumen compacto de lo que ya se intentó. - Cada ronda debe agregar una NUEVA ruta de evidencia. El contrato (regla 8) lo impone en el lado del revisor; tú lo impones en el tuyo — una objeción solo vale una ronda si está respaldada por evidencia o apunta a una brecha concreta y comprobable. "No estoy convencido" no es una ronda.
- El ratificador permanece fijo (tú / Fable); el revisor puede bajar de nivel a medida que la disputa se estrecha. Ronda 1 en el nivel de investigación; una vez que se reduce a un punto mecánico, pasa al nivel mecánico. Una vez que solo queda verificar una ejecución, puedes omitir el wrapper y llamar directamente a codex en el nivel ejecutor.