diff --git a/.claude/commands/orquestador.md b/.claude/commands/orquestador.md index 80d46cb6..9da8607c 100644 --- a/.claude/commands/orquestador.md +++ b/.claude/commands/orquestador.md @@ -274,6 +274,26 @@ Ningún secundario arranca sin **DoD-contrato**: el criterio de aceptación FIJO El contrato sigue `dod_quality.md` (golden + edge + error con evidencia ejecutable), no un checkbox vago. Sin él, el agente es `MAL_LANZADO`. +### Push automático: el bloque `FLEET-STATE` + +No hace falta acordarse de drenar para enterarse de un cambio. El hook `UserPromptSubmit` +`hook_fleet_state_inject.sh` (registrado en `.claude/settings.local.json`) inyecta en CADA turno del +orquestador —solo cuando la sesión es `role=orchestrator`— un bloque resumen de las transiciones +pendientes del watcher: + +``` +FLEET-STATE: terminados=[:…] reclaman=[…] estancados=[…] (drain con ./fn run drain_fleet_events para consumir) +``` + +Si no hay cambios emite `FLEET-STATE: sin cambios`; si el watcher está caído o el `events.jsonl` no +existe, degrada limpio sin romper el turno. El bloque es solo un **aviso** (hace peek, no avanza el +cursor): para consumir las transiciones y aplicar la política por clasificación sigues drenando +(abajo). El resumen lo produce `summarize_fleet_transitions_py_infra` sobre el feed del watcher. + +Gotcha conocido: hoy el bloque lista transiciones de TODA la flota, incluidas las de otros +orquestadores y sus ejecutores. Si hay más de un orquestador activo, filtra por tu propia familia de +agentes (los que tú lanzaste) — igual que en "No te vigiles a ti mismo" más abajo. + ### Drenar la cola ```bash @@ -401,6 +421,7 @@ El orquestador no hace polling caro: drena la cola **cuando actúa** (cuando la | `reboot_all_claudes_bash_infra` | Reiniciar/parar la flota retomando sesiones; `--exclude-current` para no tocarte | | `set_dod_contract_py_infra` | Escribir el DoD-contrato fijo (`dod_contract`/`dod_status`) en el `goal.json` de un secundario al lanzarlo | | `drain_fleet_events_py_infra` | Consumir la cola de transiciones del watcher (`~/.claude/fleet/events.jsonl`), agrupada por clasificación + urgentes | +| `summarize_fleet_transitions_py_infra` | Resumir las transiciones del feed en una línea (`terminados/reclaman/estancados`); alimenta el bloque `FLEET-STATE` que el hook `UserPromptSubmit` inyecta cada turno | | `classify_fleet_termination_go_infra` | Clasificar el estado de terminación de un agente (RECLAMA/MAL_LANZADO/DICE_TERMINADO/ESTANCADO/TRABAJANDO) — lo usa el watcher | | `list_claude_fleet_go_infra` | Fleet tipado con goal/phase/`role` + `tmux_window` (alimenta `/fleet` y el watcher). **Invócala por el binario `apps/fleetview/fleetview list --json`**, NUNCA por `./fn run` (la despacha como `go test`). El JSON del CLI aún no expone `role`/`dod_contract`/`dod_status`; léelos de `~/.claude/goals/.json` | | `spawn_fleet_agent_bash_infra` | Lanzar un ejecutor (o el orquestador) como window de la flota tmux — preferido sobre kitty cuando hay perfil fleet |