En resumen: tstack es un conjunto de 9 skills de agente que Theo (t3dotgg) publicó como código abierto el 26 de octubre. Instalarlo consiste en copiar las carpetas a ~/.claude/skills/ o a ~/.codex/skills/. Conectamos Claude Code y Codex con la misma API Key de este sitio. Resultados:
- Instalación (clonar el repositorio + copiar en los dos clientes): unos 3 s;
- En Codex 0.164.0, basta con decir "sol loop" para que lance un subagente gpt-6.1-sol que revisa el código: 2 rondas, 62 s, con un bug de división entera detectado y corregido;
- Claude Code 2.1.310 no puede ejecutar sol-loop tal cual y responde con honestidad "no hay ninguna vía para ejecutar Sol"; tras añadir un subagente con
model: gpt-6.1-sol, se completó en 2 rondas, 70 s; full-senddeja que el Agent fusione PR por su cuenta. En los dos lados añadimos una regla que bloqueagh pr merge, y en la prueba ambos lo bloquearon.
Crear API Key y conectar Claude Code y Codex con una sola Key →
Qué es tstack
Según la publicación de lanzamiento de Theo en X, tstack reúne "las skills que uso todos los días", limpias y publicadas. Al escribir este artículo, la publicación tenía unas 440.000 visualizaciones y el repositorio de GitHub unas 2.000 estrellas, con licencia MIT. El README dice que funciona tanto en Claude Code como en Codex; algunas skills usan funciones de T3 Code cuando existen y, si no, recurren a las herramientas propias del cliente.
Las 9 skills y sus disparadores (según el README del repositorio):
| Skill | Lo que dices | Qué hace |
|---|---|---|
| full-send | full send | Sin supervisión: termina el cambio, lo demuestra, lo revisa, abre un PR, vigila la CI y luego lo fusiona por su cuenta |
| full-stop | full stop | Igual que full-send, pero se detiene en "listo para fusionar" y no fusiona |
| council | council | Pide revisión a tres modelos de proveedores distintos hasta que coinciden |
| sol-loop | sol loop | Hace que GPT Sol revise el cambio en bucle hasta que ambos agentes estén de acuerdo |
| file-pr | file a PR | Abre un PR corto que empieza por el problema, no por una lista de cambios |
| takeover | take over | Termina el PR, la rama o el hilo de Agent de otra persona y conserva su autoría |
| babysit-pr | babysit | Vigila un PR a través de la CI y los bots de revisión, y corrige los hallazgos reales |
| modernize | modernize | Hace rebase de un PR antiguo y decide si todavía debe existir |
| leaving-pr-comments | automático | Define el formato de los comentarios que el Agent publica en tu nombre |
Las skills dependen unas de otras: full-send usa sol-loop, file-pr y babysit-pr; full-stop usa full-send. Lo más sencillo es instalarlas todas.
Paso 1: configurar Claude Code y Codex
Los dos clientes pueden usar la misma Key de este sitio.
Para Claude Code, en el archivo global ~/.claude/settings.json:
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.aicodewith.ai",
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY"
},
"model": "claude-sonnet-5-5"
}
La dirección es https://api.aicodewith.ai, sin /v1. Para todos los pasos, consulta Cómo conectar Claude Code a una API de terceros.
Para Codex, en el archivo global ~/.codex/config.toml:
model = "gpt-6.1-sol"
model_provider = "aicodewith"
[model_providers.aicodewith]
name = "aicodewith"
base_url = "https://api.aicodewith.ai/chatgpt/v1"
wire_api = "responses"
experimental_bearer_token = "YOUR_API_KEY"
Para el significado de cada campo, consulta Codex config.toml explicado.
Paso 2: instalar tstack
git clone https://github.com/t3dotgg/tstack
mkdir -p ~/.claude/skills ~/.codex/skills
cp -R tstack/skills/* ~/.claude/skills/ # Claude Code
cp -R tstack/skills/* ~/.codex/skills/ # Codex
Estos pasos tardaron unos 3 s en nuestra prueba. Después, Claude Code muestra las skills al arrancar, y Codex lee el SKILL.md correspondiente cuando dices un disparador. Para saber qué son las skills y dónde se guardan, consulta Cómo usar Skills en agentes de IA.
Dos requisitos más: las skills que abren PR, como full-send y babysit-pr, necesitan una GitHub CLI con sesión iniciada (gh); el script de espera de babysit-pr necesita python3.
Paso 3: llamar a GPT Sol con la misma Key y ejecutar sol-loop
Primero comprueba que la Key llega a Sol. La lista de modelos de este sitio incluye gpt-6.1-sol. Enviamos una frase al endpoint Responses y recibimos HTTP 200 en unos 4 s:
curl https://api.aicodewith.ai/chatgpt/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-6.1-sol","input":"Reply with exactly: SOL_OK"}'
El proyecto de prueba es mínimo: calc.py en average() recibió una comprobación de lista vacía, pero el mismo cambio también convirtió / en //. Las pruebas existentes solo comprueban una media entera, así que siguen en verde. Ese bug queda para que lo encuentre Sol.
En Codex
Ejecuta en el directorio del proyecto:
codex exec --sandbox workspace-write "sol loop: review the current uncommitted changes (no remote, use HEAD as the base). After approval, do not commit or push."
Terminó en 62 s. El registro de la sesión muestra que Codex buscó primero delegate_task de T3 Code, no lo encontró y usó su spawn_agent integrado para lanzar un subagente con "model":"gpt-6.1-sol". Lo que pasó:
- Ronda 1: Sol señaló que
average([1, 2])devuelve1en lugar de1.5; - El Agent principal volvió a
/, añadió una pruebatest_average_fractionaly comprobó que esa prueba falla con el código anterior; - Ronda 2: Sol aprobó. No se hizo commit ni push.
Informe final de Codex (traducido del original):
Completadas 2 rondas de sol-loop. GPT-6.1 Sol dio la aprobación final; no queda nada abierto.
- Corregido S1: la división entera daba medias no enteras erróneas; restaurado /, se mantiene el manejo de la lista vacía y se añadió una prueba de regresión.
Sin commit ni push; los cambios siguen en el directorio de trabajo.
En Claude Code
Si solo dices "sol loop", Claude Code se niega a ejecutarlo. Respondió en 11 s (traducido del original):
La revisión de Sol no pudo ejecutarse, así que este cambio no ha pasado la revisión.
Bloqueo: aquí no hay ninguna vía para ejecutar Sol... Según las reglas de sol-loop, no sustituiré Sol por otro modelo ni trataré una revisión ausente como una aprobación.
Es una regla de la propia skill: en Claude Code solo se ejecuta con un subagente configurado para Sol, y no puede cambiar a otro modelo. La solución es crear ~/.claude/agents/sol-reviewer.md:
---
name: sol-reviewer
description: Read-only code reviewer running GPT Sol. Use for the sol-loop skill.
model: gpt-6.1-sol
tools: Read, Grep, Glob, Bash
---
You are a read-only code reviewer. Never edit, commit, or push. Follow the review brief you are given and reply in its exact format.
El endpoint compatible con Anthropic de este sitio también puede llamar a gpt-6.1-sol, así que este subagente usa la misma Key. Vuelve a ejecutarlo:
claude -p "sol loop: review the current uncommitted changes (no remote, use HEAD as the base). After approval, do not commit or push." --permission-mode acceptEdits
Tardó 70 s y 2 rondas, con el mismo resultado que Codex: en la ronda 1 Sol devolvió VERDICT: CHANGES y señaló el problema de la división; tras corregirlo, la ronda 2 devolvió VERDICT: APPROVE. Las estadísticas de uso de la salida incluyen tanto claude-sonnet-5-5 (Agent principal) como gpt-6.1-sol (subagente de revisión), lo que demuestra que la revisión la hizo Sol.
Al arrancar, Claude Code muestra un aviso unrecognized_model porque no reconoce el nombre gpt-6.1-sol. Puedes ignorarlo; no afecta a la ejecución. Para más detalles sobre subagentes, consulta también Configuración de subagentes en Claude Code.
| Escenario | Resultado | Tiempo |
|---|---|---|
| Clonar + copiar en los dos clientes | Correcto | unos 3 s |
| sol-loop en Codex 0.164.0 | 2 rondas, Sol aprueba | 62 s |
| Claude Code 2.1.310, sin subagente de Sol | Informa de un bloqueo, sin revisión | 11 s |
| Claude Code 2.1.310 con sol-reviewer | 2 rondas, Sol aprueba | 70 s |
Crear API Key y ejecutar sol-loop en Claude Code y Codex →
El riesgo de full-send: autoriza al Agent a fusionar por su cuenta
full-send: el SKILL.md es muy claro. Si dices "full send", das por hecho que no estás mirando el hilo, y el Agent lleva el cambio hasta la fusión en la rama principal. Concede al Agent tres permisos de forma explícita:
- Cuando se cumple la condición de fusión, fusionar el PR por su cuenta;
- Tras un rebase, hacer push forzado de la rama del propio PR con
--force-with-lease; - Saltarse las reglas del proyecto del tipo "pregúntame antes de esta prueba" y ejecutar las pruebas directamente.
Tiene límites: nada de --admin para saltarse la protección de ramas, y borrar datos o tocar producción sigue requiriendo preguntar a una persona. Pero la fusión en sí ya no te la pregunta. Si tu repositorio despliega al fusionar, decir "full send" equivale a dejar que el Agent pase a producción por su cuenta.
La skill dice "si el usuario no pidió claramente full send, no asumas autonomía total", pero eso queda a juicio del Agent, no es un interruptor real. Mientras la skill esté instalada, puede activarse por error.
Cómo desactivarlo o limitarlo
De lo más suave a lo más estricto:
Opción 1: no instalar full-send
Si solo quieres que Sol revise código, copia solo la carpeta sol-loop (no depende de otras skills) y deja fuera full-send y full-stop.
Opción 2: usar full-stop en su lugar
Sigue el mismo flujo, pero se detiene en "listo para fusionar" y eres tú quien pulsa fusionar.
Opción 3: bloquear el comando de fusión en Claude Code
Añade en el archivo global ~/.claude/settings.json:
{
"permissions": {
"deny": ["Bash(gh pr merge:*)", "Bash(gh api:*)"]
}
}
gh api también debe bloquearse; si no, el Agent puede fusionar llamando directamente a la API de GitHub. Cuando pedimos a Claude Code que ejecutara gh pr merge 1 --squash, se bloqueó en menos de 5 s, y el campo permission_denials del resultado registró el comando.
Opción 4: bloquear el comando de fusión en Codex
Crea ~/.codex/rules/default.rules:
prefix_rule(
pattern = ["gh", "pr", "merge"],
decision = "forbidden",
justification = "Merging a PR must be done by a human",
)
En la prueba se rechazó en menos de 8 s, y el registro muestra rejected: Merging a PR must be done by a human. Para más ajustes de sandbox y aprobación, consulta Los permisos del sandbox de Codex.
Opción 5: activar la protección de ramas en GitHub
Exige una aprobación antes de fusionar. Según la documentación de GitHub, el autor de un PR no puede aprobar su propio PR; el Agent usa tu cuenta de gh, así que no puede reunir la aprobación por sí mismo. Esta capa no depende de la configuración del cliente y es la más fiable.
No ejecutamos full-send hasta la fusión en un repositorio real; solo probamos el sol-loop del que depende y las dos reglas de bloqueo anteriores.
Preguntas frecuentes
¿Se puede usar tstack sin T3 Code?
Sí. Nunca instalamos T3 Code. Codex usa sus subagentes integrados; Claude Code necesita un subagente de Sol configurado como se indica arriba.
¿Puede sol-loop revisar con otro modelo?
La skill dice de forma explícita que no se cambie de modelo y que se informe de un bloqueo si Sol no está disponible. Para cambiarlo, edita tú mismo SKILL.md; el README también anima a "hacerlas tuyas".
¿Qué necesita council?
Según el README, council necesita modelos insignia de tres proveedores distintos revisando a la vez, por ejemplo Claude Opus, GPT Sol y Gemini Pro. La lista de este sitio incluye claude-opus-5-5, gpt-6.1-sol y gemini-4-argon, así que puedes configurar un subagente para cada uno igual que sol-reviewer. En este artículo no probamos council.
¿sol-loop en Codex solo revisa cambios sin commit?
No. Si hay un remote, usa git merge-base para encontrar la base y revisa toda la rama; solo usa HEAD cuando no hay remote. Si solo quieres revisar los cambios del directorio de trabajo, también puedes usar la revisión integrada de Codex; consulta Revisión de Codex para cambios sin commit.
Entorno de prueba
- Claude Code 2.1.310, Codex CLI 0.164.0, Linux;
- commit de tstack
92e38e2(2026-10-27); - Modelos principales:
claude-sonnet-5-5para Claude Code ygpt-6.1-solpara Codex; modelo de revisióngpt-6.1-sol; - Todas las peticiones pasaron por la misma API Key de este sitio. Tras la prueba borramos la configuración y los registros que contenían la Key.



