Multiagente y Orquestación|INEMA.CLUB-PRO

Clase 5 · 20 min

Aislamiento: worktrees y sandboxes

Dos agentes en el mismo checkout no dan error: uno borra el trabajo del otro en silencio. Worktree le da a cada uno su propia copia y convierte la pérdida silenciosa en un conflicto visible a la hora del merge. Sandbox hace lo mismo con los permisos: el revisor lee, pero no escribe. En esta clase compruebas las dos cosas sin gastar cuota.

Empezar la clase
Tres cajas de acrílico separadas sobre una mesa oscura, cada una con su placa y su pila de fichas.

En esta clase vas a

  1. 1La escritura perdida: dos agentes, un archivo, ningún error
  2. 2Worktree a mano, en claude --worktree, en subagente y en Codex
  3. 3Sandbox read-only y workspace-write de Codex, probados
  4. 4El conflicto en el merge como buena señal

Objetivo: darle a cada agente que escribe un worktree propio y a cada revisor un sandbox de solo lectura, y comprobar la diferencia.

01Tres formas de poner a dos agentes en el mismo repositorio

Haz clic en cada una. El ensayo de más abajo prueba las dos primeras.

Haz clic en cada bloque del diagrama para ver qué hace.

Worktree aísla archivos, no procesos: dos worktrees todavía comparten puertos, base de datos local y cuota.

02Ensayo: la escritura perdida y el worktree

Repositorio desechable y dos agentes falsos que leen, piensan (A 2 s, B 1 s) y escriben el archivo completo.

Terminal · ensayo sin cuota
E=${TMPDIR:-/tmp}/ensaio-multi/wt; rm -rf $E && mkdir -p $E && cd $E
git init -q repo && cd repo && git config user.name ensaio && git config user.email ensaio@local
printf 'versao = 1\nnome = treino\ncor = azul\n' > config.txt && git add -A && git commit -qm base
# un "agente" lee el archivo, piensa $4 s y escribe el archivo completo (como la herramienta Write); A piensa más que B
agente() { c=$(cat "$1/config.txt"); sleep "$4"; printf '%s\n' "$c" | sed "$2" > "$1/config.txt"; echo "$3 gravou"; }

echo "## A) dois agentes no MESMO checkout"
agente . 's/azul/verde/' A 2 & agente . 's/versao = 1/versao = 2/' B 1 & wait
cat config.txt
git checkout -q config.txt

echo "## B) um worktree para cada agente"
git worktree add -q ../wt-a -b agente-a && git worktree add -q ../wt-b -b agente-b
agente ../wt-a 's/azul/verde/' A 2 & agente ../wt-b 's/versao = 1/versao = 2/' B 1 & wait
git -C ../wt-a commit -qam "A: cor" && git -C ../wt-b commit -qam "B: versão"
git merge -q agente-a && git merge -q --no-edit agente-b && cat config.txt
git worktree list | wc -l
Ejemplo del repositorio
## A) dois agentes no MESMO checkout
B gravou
A gravou
versao = 1
nome = treino
cor = verde
## B) um worktree para cada agente
B gravou
A gravou
Auto-merging config.txt
versao = 2
nome = treino
cor = verde
3

En A, los dos dijeron "gravou", pero solo una de las dos modificaciones sobrevivió: A leyó el archivo antes de que B escribiera y, como piensa más, escribió encima, y la versión 2 desapareció. En B, las dos modificaciones entraron.

Las esperas diferentes (A 2 s, B 1 s) fijan el orden para que el ensayo dé siempre el mismo resultado (18 de 18 rondas iguales el 19/10/2026). Con esperas iguales, quien escribe al final cambia en cada ronda, pero nunca quedan las dos modificaciones.

03Worktree en las herramientas

Claude Code 2.1.303 y Codex CLI 0.163.0, según las docs leídas el 19/10/2026.

1. claude --worktree

claude --worktree [nombre] crea el worktree en .claude/worktrees/[nombre] y abre la sesión allí. Necesita al menos un commit y, en el modo interactivo, que la carpeta esté marcada como de confianza (ejecuta claude una vez en ella).

Los archivos ignorados por git, como .env, no van al worktree; lístalos en un .worktreeinclude en la raíz para copiarlos.

OjoLos hooks con ${CLAUDE_PROJECT_DIR} siguen corriendo en el checkout principal; lo que acompaña al worktree es el campo cwd del hook.

04Sandbox por rol, probado sin modelo

codex sandbox corre un comando cualquiera con las mismas reglas que Codex usa en los suyos. No llama a ningún modelo.

Terminal · ensayo sin cuota
E=${TMPDIR:-/tmp}/ensaio-multi/sbx; rm -rf $E && mkdir -p $E && cd $E
codex sandbox -c sandbox_mode=read-only -- bash -c 'echo x > a.txt 2>/dev/null && echo "read-only: gravou" || echo "read-only: bloqueado na pasta"'
codex sandbox -c sandbox_mode=workspace-write -- bash -c 'echo x > b.txt && echo "workspace-write: gravou na pasta"; echo x > ~/fora-sbx.txt 2>/dev/null && echo "gravou fora" || echo "workspace-write: bloqueado fora da pasta"'
ls; ls ~/fora-sbx.txt 2>&1 | tail -1
Terminal · worktree de verdad en el proyecto de práctica
# terminal 1: abre la sesión ya dentro del worktree (no hace falta pedir nada)
cd ~/treino-multi && claude --worktree treino-a

# terminal 2, con la sesión abierta:
cd ~/treino-multi && git worktree list | grep -c ".claude/worktrees/treino-a"
git branch --list worktree-treino-a

# terminal 1: /exit (worktree sin cambios: elige remover, si pregunta). Después:
git worktree list | wc -l
Ejemplo del repositorio
bash: line 1: a.txt: Read-only file system
read-only: bloqueado na pasta
workspace-write: gravou na pasta
bash: line 1: ~/fora-sbx.txt: Read-only file system
workspace-write: bloqueado fora da pasta
b.txt
ls: cannot access '~/fora-sbx.txt': No such file or directory

Edición declarada: la ruta de la carpeta personal aparece como ~. El read-only no escribió ni dentro; el workspace-write escribió b.txt y fue bloqueado fuera.

05Práctica

Dos ensayos y un worktree de verdad.

E9 · La escritura perdida

10 min

Corre el ensayo de los dos agentes.

Listo cuando: en A, solo uno de los dos cambios sobrevive: el cat config.txt muestra versao = 1 y cor = verde (el cambio de B desapareció); en B, muestra versao = 2 y cor = verde; la última línea es 3.

E10 · Sandbox por rol

5 min

Corre el ensayo del codex sandbox.

Listo cuando: aparecen read-only: bloqueado na pasta, workspace-write: gravou na pasta y workspace-write: bloqueado fora da pasta, y ls muestra solo b.txt.

E11 · Un worktree de Claude Code

10 min

En el proyecto de práctica, abre claude --worktree treino-a en una terminal y verifica desde otra. Al salir, un worktree limpio se elimina (en una sesión con nombre, Claude pregunta antes).

Listo cuando: con la sesión abierta, git worktree list | grep -c ".claude/worktrees/treino-a" → 1 y la branch worktree-treino-a existe; después de salir, git worktree list | wc -l → 1 (si quedó, git worktree remove .claude/worktrees/treino-a).

06Prueba de la clase

Pregunta 1 de 4

Dos agentes editaron el mismo archivo en el mismo checkout y los dos dijeron "gravou". ¿Qué puede haber pasado?competencia

07En tres frases

Checkout único pierdeDos agentes escribiendo el mismo archivo: el último gana y nadie avisa.
Worktree por escritorCada agente que escribe recibe una copia y una branch; el merge las junta o muestra el conflicto.
Sandbox por rolRevisor en read-only, ejecutor en workspace-write; acceso total solo en una VM dedicada.

Para ir más allá

Clase anteriorSiguiente clase