Multiagente y Orquestación|INEMA.CLUB-PRO

Clase 6 · 20 min

Colas, reanudación y colisión entre sesiones

Una cola en carpetas sobrevive a una caída: lo que estaba corriendo vuelve a la entrada. Pero la misma reanudación que salva una copia atropella a la otra cuando dos corren en la misma carpeta. En esta clase interrumpes y reanudas una cola, provocas la colisión con números, bloqueas con flock y ves a la guardia de colisión preguntar antes de editar.

Empezar la clase
Bandejas de metal en un estante oscuro: entrada con carpetas, una del medio con una carpeta bajo candado y una de salida.

En esta clase vas a

  1. 1Los estados entrada, rodando, feito y falhou
  2. 2Reanudación: al menos una vez, nunca exactamente una
  3. 3Dos copias en la misma carpeta: cada tarea corre dos veces
  4. 4flock y la guardia de colisión del runtime

Objetivo: interrumpir y reanudar una cola, provocar la colisión de dos colas en la misma carpeta y bloquear con flock y con la guardia de colisión.

01El camino de una tarea en la cola

La cola casera de jornada-agentes, en carpetas. Haz clic en cada estado.

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

La cola durable de verdad, con base de datos, reintentos y compuertas, es el inemaccbot del curso de Colas. Aquí va la idea mínima, para ver la falla.

02Interrumpe y retoma

Ejecuta, mata el proceso a la mitad y ejecuta de nuevo. Una tarea falla en la primera ejecución.

entrada/

rodando/

feito/

falhou/

Simulación ilustrativa en el navegador. El ensayo de verdad, con el script y un claude falso, está justo debajo.

03Ensayo: retomada, colisión y flock

Un claude FALSO en el PATH anota cada ejecución en un log. Contar las líneas del log muestra cuántas veces corrió cada tarea.

Terminal · ensayo sin cuota
cd ~/jornada-agentes                      # git clone https://github.com/inematds/jornada-agentes.git ~/jornada-agentes
E=${TMPDIR:-/tmp}/ensaio-multi/fila; rm -rf $E && mkdir -p $E/bin
cat > $E/bin/claude <<'SH'
#!/usr/bin/env bash
# claude FALSO: anota quién ejecutó qué, tarda 1 s y responde (no se llama a ningún modelo)
echo "$PPID $2" >> "${E_LOG:?}"; sleep 1; echo "resposta para: $2"
SH
chmod +x $E/bin/claude; export PATH=$E/bin:$PATH E_LOG=$E/execucoes.log
nova_fila() { rm -rf $E/fila $E_LOG; mkdir -p $E/fila/entrada; for i in 1 2 3 4; do echo "tarefa $i" > $E/fila/entrada/0$i.md; done; }
F=./ferramentas/fila-caseira.sh

echo "## 1) roda e é interrompida no meio"
nova_fila; timeout -s INT 2.5 $F $E/fila
echo "rodando: $(ls $E/fila/rodando) · feito: $(ls $E/fila/feito | tr '\n' ' ')"
echo "## 2) roda de novo: retoma"
$F $E/fila | tail -1
echo "execuções: $(wc -l < $E_LOG) para 4 tarefas"

echo "## 3) duas filas na mesma pasta, ao mesmo tempo"
nova_fila; $F $E/fila > $E/a.log 2>&1 & $F $E/fila > $E/b.log 2>&1 & wait
echo "execuções: $(wc -l < $E_LOG) para 4 tarefas · repetidas: $(cut -d' ' -f2- $E_LOG | sort | uniq -d | tr '\n' ' ')"

echo "## 4) a mesma coisa com flock"
nova_fila; flock -n $E/fila.lock $F $E/fila > $E/a.log 2>&1 &
sleep 0.3; flock -n $E/fila.lock $F $E/fila || echo "outra fila já roda nesta pasta (saída $?)"; wait
echo "execuções: $(wc -l < $E_LOG) para 4 tarefas"
Ejemplo del repositorio
## 1) roda e é interrompida no meio
→ 01.md
  feito
→ 02.md
  feito
→ 03.md
rodando: 03.md · feito: 01.md 02.md 
## 2) roda de novo: retoma
entrada: 0 · feito: 4 · falhou: 0
execuções: 5 para 4 tarefas
## 3) duas filas na mesma pasta, ao mesmo tempo
execuções: 8 para 4 tarefas · repetidas: tarefa 1 tarefa 2 tarefa 3 tarefa 4 
## 4) a mesma coisa com flock
outra fila já roda nesta pasta (saída 1)
execuções: 4 para 4 tarefas

Ejecutado tres veces, mismo resultado. En 2, la tarea 3 corrió dos veces (interrumpida y retomada): la tarea tiene que aguantar correr de nuevo. En 3, las cuatro corrieron dos veces. En 4, la segunda copia ni siquiera empezó.

04Sesiones que editan el mismo archivo: la guardia de colisión

El proyecto de práctica trae colisao.mjs, un hook que anota quién editó cada archivo y pregunta antes de que otra sesión edite. Aquí, solo la detección; el hook como guardia es el curso 4.

Terminal · ensayo sin cuota (dos sesiones fingidas por el session_id)
cd ~/treino-multi
export INEMA_RUNTIME_ESTADO=${TMPDIR:-/tmp}/ensaio-multi/colisao; rm -rf $INEMA_RUNTIME_ESTADO
G=runtime/mods/runtime-guarda/hooks/colisao.mjs
j() { printf '{"session_id":"%s","cwd":"%s","tool_input":{"file_path":"notas.md"}}' "$1" "$PWD"; }
echo "rascunho" > notas.md
j sessao-AAAAAAAA | node $G pos                      # a sessão A acabou de editar notas.md
echo "## A quer editar de novo"; j sessao-AAAAAAAA | node $G pre; echo "(saída $?)"
echo "## B quer editar o mesmo arquivo"; j sessao-BBBBBBBB | node $G pre; echo; echo "(saída $?)"
Ejemplo del repositorio
## A quer editar de novo
(saída 0)
## B quer editar o mesmo arquivo
{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"ask","permissionDecisionReason":"Guarda de colisão: Outra sessão (sessao-A) editou notas.md agora há pouco. Seguir mesmo assim, usar outra cópia (worktree) ou cancelar?"}}
(saída 0)

La misma sesión pasa callada. La otra recibe "permissionDecision":"ask": Claude Code se detiene y pregunta. La ventana predeterminada es de 30 min (INEMA_COLISAO_MIN). INEMA_RUNTIME_ESTADO manda el registro a la carpeta de ensayo, para no mezclarlo con el tuyo real.

05Colisiones que ya ocurrieron en esta máquina

Del LESSONS.md del proyecto de monitoreo de INEMA, con fecha. Cada una se convirtió en una regla de una línea.

1. Scratchpad

Cursos hechos en paralelo por subagentes compartían la misma carpeta temporal. Una carpeta de imágenes con nombre genérico colisionó: el script de un agente se saltó la imagen porque la arte del otro ya existía.

Regla: carpeta temporal con el id de la tarea en el nombre.

06Práctica

Cola, colisión y guardia, sin gastar cuota.

E12 · Interrumpir y retomar

10 min

Clona el jornada-agentes y ejecuta las partes 1 y 2 del ensayo.

Listo cuando: aparecen rodando: 03.md · feito: 01.md 02.md y después execuções: 5 para 4 tarefas.

E13 · Colisión y flock

10 min

Ejecuta las partes 3 y 4. Después escribe, en una línea de tu AGENTS.md o CLAUDE.md, la regla de bloqueo para los scripts de cola que usas.

Listo cuando: la parte 3 imprime execuções: 8 para 4 tarefas; la parte 4 imprime outra fila já roda nesta pasta (saída 1) y execuções: 4 para 4 tarefas; grep -c flock AGENTS.md CLAUDE.md encuentra tu regla.

E14 · Guardia de colisión

10 min

Ejecuta el ensayo de la guardia en el proyecto de entrenamiento.

Listo cuando: la sesión A sale sin texto y (saída 0); la sesión B imprime "permissionDecision":"ask" con Outra sessão (sessao-A) editou notas.md.

07Prueba de la clase

Pregunta 1 de 4

La cola se cayó en medio de la tarea 3. Al retomar, ¿cuántas veces habrá corrido la tarea 3?competencia

08En tres frases

La retomada repiteLo que estaba corriendo vuelve a la entrada; cada tarea tiene que aguantar correr de nuevo.
Una cola por carpetaSin bloqueo, dos copias ejecutan todo dos veces; flock -n lo resuelve con una línea.
Las sesiones se cruzanLa guardia pregunta antes de editar lo que otra sesión tocó; worktree evita la pregunta.

Para ir más allá

Clase anteriorSiguiente clase