¿Qué hace pcommittee (comité de dos agentes para causa raíz)?
Resumen
Dos agentes, dos familias de modelos, el mismo problema, contexto nuevo en ambos lados. Analizan en paralelo; tú haces que discutan donde no estén de acuerdo; sintetizas lo que sobrevive. Después TÚ implementas — el comité nunca toca un archivo.
Cuándo merece la pena: has dado la misma vuelta dos veces, el error no tiene una causa raíz obvia,
o un plan es lo suficientemente costoso como para merecer una segunda y tercera opinión antes de
construirlo. Dos agentes xhigh no son baratos. Para una sola opinión usa padvisor; para delegar
el trabajo usa pspawn o phandoff.
Qué pueden hacer los agentes generados. Ambos se ejecutan sin solicitudes de permiso según la
configuración predeterminada del equipo (bypassPermissions en Claude, full-access en Codex), pero
son de solo lectura por instrucción, no por modo: el sufijo de "no editar" en el prompt les impide
modificar archivos. Un equipo que quiera más puede solicitarlo en el archivo AGENTS.md del
repositorio, que también es una instrucción, o bloquearlo con las reglas permissions.deny de Claude
Code, que siguen aplicándose en bypassPermissions.
Invocación
/pcommittee <problema> — el par predeterminado se muestra a continuación; los miembros que nombre el
usuario lo reemplazan.
Composición
El contraste es el mecanismo, no un lujo. Dos agentes de la misma familia producen el mismo punto ciego dos veces y lo llaman confirmación.
El comité predeterminado empareja claude y codex; ambos deben aparecer como available y
Enabled en paseo provider ls:
- Miembro A: el Opus más reciente que
paseo provider models claudeliste (por ejemploclaude/claude-opus-5-5) · pensamientoxhigh· modobypassPermissions - Miembro B: el modelo más reciente de Codex, el primer id de
paseo provider models codex· pensamientoxhigh· modofull-access
Lee los ids de esas listas, nunca de memoria. El miembro Claude toma el id simple, que es el modelo
1M (pspawn explica por qué no [1m]). Ambos miembros se ejecutan sin solicitudes de permiso, como
cada generación (predeterminado del equipo); el sufijo de "no editar", no el modo, les impide
modificar archivos.
Si el usuario nombra miembros, úsalos. Si solo una familia está disponible, dilo y ejecuta padvisor
en lugar de fingir que un comité de un solo miembro es un comité.
Pasos
1. Escribe UN prompt de problema. Ambos miembros reciben el texto idéntico — prompts diferentes hacen que el desacuerdo sea un artefacto de tu redacción en lugar de una división real.
Escríbelo en un archivo propio y pasa "$(cat <archivo de prompt>)" a ambas generaciones. Escribir el mismo
heredoc dos veces es cómo los textos se desvían silenciosamente; un archivo hace que la identidad sea
estructural en lugar de descuidada. Crea el archivo con mktemp y usa la ruta que imprime como
<archivo de prompt>: un nombre fijo en /tmp choca con el comité de otra sesión y es legible por
cualquier usuario; un archivo mktemp es nuevo para esta ejecución y legible solo por ti.
Comienza con el idioma de respuesta, aquel en el que está la conversación del usuario (Responde en <idioma>.). — los
miembros responden en el idioma en el que está el prompt, y una conversación en un idioma con dos
informes en otro es fricción que pagas en el momento de la síntesis.
[El idioma de la conversación del usuario, como instrucción: "Responde en <ese idioma>."]
## El problema
[Qué está mal o no está decidido. Síntomas, no tu teoría — tu teoría es lo que quieres que pongan a prueba.]
## Lo que se sabe
[Hechos, mediciones, mensajes de error, textual. No conclusiones.]
## Lo que se ha intentado
- [Enfoque] — [qué pasó, por qué se abandonó]
## Dónde mirar
- `/ruta/absoluta/archivo.ts` — [qué es y por qué importa]
## Lo que quiero recibir
Un análisis de causa raíz y un plan. Indica tu nivel de confianza y nombra qué falsificaría tu diagnóstico.
Si el problema plantado es el problema equivocado, dilo primero.
Esto es solo análisis. NO edites, crees ni elimines ningún archivo. NO escribas código.
Mantén TU propia hipótesis FUERA del prompt, o la recibirás de vuelta dos veces con palabras diferentes. Si debes mencionarla, márcala como una hipótesis que debe ser atacada.
2. Genera ambos como hijos de esta sesión. Primero, disponibilidad del proveedor, exactamente como
el paso 1 de pspawn (<directorio base de este skill>/../pspawn/SKILL.md). Luego, en la misma respuesta para que piensen
en paralelo:
paseo run --no-wait --json --provider '<claude/nuevo-opus>' --thinking xhigh \
--mode bypassPermissions --title "[Comité A] <tema>" "$(cat <archivo de prompt>)"
paseo run --no-wait --json --provider '<codex/nuevo>' --thinking xhigh \
--mode full-access --title "[Comité B] <tema>" "$(cat <archivo de prompt>)"
Con paseo ambos aterrizan en el espacio de trabajo de esta sesión por sí solos, como hijos de esta
sesión — y permanecen así: no los separes. El comité pertenece a esta pregunta; archivar esta
sesión los archiva también, que es lo que debería ocurrir. Fuera de paseo añade --workspace <id>, buscado una vez
como en el paso 2 de pspawn.
3. Espera a ambos — una paseo-notify por miembro, luego termina tu turno.
paseo-notify <id-a>; paseo-notify <id-b>
El mensaje de cada miembro llega por separado. Si uno está dentro y el otro todavía fuera, termina tu
turno de nuevo; el segundo mensaje te despierta. terminó su turno → respondió. está esperando un permiso → hay una solicitud esperándote. se detuvo con un error → dilo y lee sus registros; no
vuelvas a generarlo silenciosamente. Un límite de uso no te despierta: paseo-limit-watch reanuda al
miembro y rearma la vigilancia, donde está instalada su línea cron (consulta el README); sin ella,
revisa al miembro tú mismo después del restablecimiento. Los miembros suelen tardar 15–30 minutos.
Nunca hagas polling, nunca sleep, nunca envíes mensajes de prisa.
Fuera de paseo (sin $PASEO_AGENT_ID): paseo wait <id-a> --json; paseo wait <id-b> --json en UNA
llamada a bash con run_in_background: true, y lee cada status del JSON, nunca el código de salida.
Ante permission (raro en bypass y full-access, pero un rm -rf sigue preguntando) el miembro se
detiene sin que nadie lo vigile. Léelo (paseo permit ls), decide si está dentro del mandato que le
diste, luego paseo permit allow <agent-id> <request-id> o deny (ambos ids de paseo permit ls), y
arma paseo-notify de nuevo. Fuera del mandato o no claro → pregunta al
usuario, no apruebes por él.
4. Lee ambos.
paseo logs <id> --filter text --tail 3
pagent.py <id> -t -n 3 --full (<directorio base de este skill>/../pagent/) es más rico, con
marcas de tiempo, y lee tanto al miembro Claude como al Codex.
5. Hazlos argumentar. Este es el paso que hace que un comité valga dos agentes — saltártelo te deja con dos informes y ninguna resolución.
Encuentra dónde realmente divergen — una causa raíz diferente, una solución diferente, una evaluación de riesgo diferente. Ignora las diferencias en redacción y énfasis; esos no son desacuerdos.
Para cada división real, envía a cada miembro el argumento del OTRO:
paseo send --behavior steer --no-wait <id-a> "El Miembro B concluye <X>, basándose en: <razonamiento textual>. Respóndelo directamente: ¿dónde se equivoca B, o dónde te equivocaste tú? Cambia tu postura si B tiene razón — dilo claramente si no lo haces."
paseo send --behavior steer --no-wait <id-b> "El Miembro A concluye <Y>, basándose en: <razonamiento textual>. Respóndelo directamente: ¿dónde se equivoca A, o dónde te equivocaste tú? Cambia tu postura si A tiene razón — dilo claramente si no lo haces."
El razonamiento textual largo es más fácil de pasar como archivo: escribe el mensaje y usa
paseo send --behavior steer --no-wait --prompt-file <archivo> <id>. Si el proveedor no acepta
steering, puede recurrir a la interrupción. paseo send revive un agente archivado — comprueba
ArchivedAt en paseo inspect <id> --json primero; no revivas miembros archivados.
--no-wait es obligatorio aquí. Un paseo send simple BLOQUEA hasta que el agente termina — dos
bloqueos sequentiales ejecutan los miembros secuencialmente en lugar de en paralelo, y el primero
supera el límite de 10 minutos de Bash en primer plano. Dispara ambos no bloqueantes, luego arma
ambas vigilancias de nuevo (paso 3) y lee de nuevo
(paso 4). Normalmente dos rondas son suficientes. Si todavía
están en desacuerdo después de dos rondas, detente e informa del desacuerdo como el resultado — una
división genuina no resuelta entre dos modelos fuertes es un hallazgo real sobre el problema, y forzar
el consenso enviando una tercera ronda lo destruye.
6. Sintetiza para el usuario:
- En qué coincidieron ambos — esta es la parte que soporta la carga
- Dónde se dividieron, y cómo se resolvió (o que no se resolvió)
- Tu propia lectura, marcada como tuya
- El plan que seguirías ahora
7. Archiva ambos — paseo archive <id> cada uno — a menos que el usuario quiera seguir
interrogándolos.
Errores comunes
| Error | Solución |
|---|---|
| Dos miembros de la misma familia de proveedores | El contraste es el mecanismo — claude + codex |
| Prompt diferente por miembro | Un archivo, "$(cat …)" en ambas generaciones — dos heredocs se desvían |
| Idioma de respuesta no indicado | Los miembros responden en el idioma del prompt; comienza con el del usuario |
| Tu propia hipótesis presentada como hecho en el prompt | Déjala fuera, o márcala como hipótesis a atacar |
| Saltarse la ronda de argumentación | Dos informes no son un comité — el paso 5 es el valor |
| Forzar el consenso en la tercera ronda | Una división no resuelta entre dos modelos fuertes ES el hallazgo |
Confiar en el código de salida de paseo wait | Es 0 tanto para inactivo, permiso como error — lee status de --json |
| Espera en primer plano | run_in_background: true; el límite de 10 minutos de Bash mata la espera, no a los agentes |
Miembro Codex dejado en su modo predeterminado, o claude en auto | codex → full-access, claude → bypassPermissions (predeterminados del equipo); un miembro en su modo predeterminado se detiene en prompts que nadie responde |
| Mensajes de polling / prisa | paseo-notify por miembro y termina tu turno; los miembros razonan durante 15–30 minutos |
paseo send simple en la segunda ronda | BLOQUEA hasta terminar — --no-wait para ambos, luego paso 3 |
| Sufijo de "no editar" omitido | Ambos miembros empiezan a implementar lo que les pediste analizar |
Separar a los miembros, o env -u PASEO_AGENT_ID | Son hijos de esta sesión a propósito: se van cuando se archiva |
| Ejecutar un comité para una pregunta pequeña | padvisor — un agente, una opinión, una fracción del costo |