diff --git a/.claude/rules/orchestration.md b/.claude/rules/orchestration.md index 32c307e7..ab7a4255 100644 --- a/.claude/rules/orchestration.md +++ b/.claude/rules/orchestration.md @@ -27,7 +27,7 @@ La fuente de verdad del mapeo PID→sessionId→cwd son los archivos `~/.claude/ `goal`, `phase`, `status`, `tmux_window` y `age`/`idle_seconds` la da el CLI de la app fleetview: ```bash -apps/fleetview/fleetview list --json # flota tipada: session_id, goal, phase, status, tmux_window, age, idle_seconds +apps/fleetview/fleetview list --json # flota tipada: session_id, goal, phase, status, pane_id ("%N", el id estable), tmux_window ("@N", interno para focus/send-keys), age, idle_seconds apps/fleetview/fleetview list # tabla legible (incluye columna AGE) ``` @@ -58,7 +58,7 @@ devuelven salida estructurada y se registran en la telemetría como cualquier MC | Operación de la flota | Tool MCP (preferido) | Fallback `./fn run` / binario | |---|---|---| -| Listar la flota tipada (session_id, goal, phase, status, **role, dod_contract, dod_status**, tmux_window, age, idle_seconds) | `mcp__orchestrator__fleet_list` | `apps/fleetview/fleetview list --json` (NO `./fn run list_claude_fleet`) | +| Listar la flota tipada (session_id, goal, phase, status, **role, dod_contract, dod_status**, **pane_id** (el id estable), age, idle_seconds) | `mcp__orchestrator__fleet_list` | `apps/fleetview/fleetview list --json` (NO `./fn run list_claude_fleet`) | | Drenar la cola de transiciones del watcher (agrupada por clasificación + urgentes) | `mcp__orchestrator__fleet_drain` (`advance` true consume, false hace peek) | `./fn run drain_fleet_events` | | Clasificar el estado de terminación de UN agente (RECLAMA/MAL_LANZADO/DICE_TERMINADO/ESTANCADO/TRABAJANDO) | `mcp__orchestrator__fleet_classify` | (Go con tests; lo consume el watcher, no se invoca a mano) | | Escribir el DoD-contrato fijo (`dod_contract`/`dod_status`) en el `goal.json` de un agente | `mcp__orchestrator__fleet_set_dod` | `./fn run set_dod_contract` | @@ -69,6 +69,15 @@ Ventaja extra de `fleet_list`: expone `role`/`dod_contract`/`dod_status` directa vacíos desde el sidecar `goal.json`), así que la regla "No te vigiles a ti mismo" se resuelve sin leer el sidecar a mano — filtra por el `role` que ya trae cada fila. +**Identifica a cada agente por su `pane_id` ("%N").** Es el id ESTABLE de por vida del pane: el +`fleet_list` del MCP lo expone como el único identificador y **omite a propósito el `tmux_window` +("@N")**, que migra cuando el focus-swap mueve el pane entre windows y por eso nunca debe usarse ni +mostrarse como id (la persona no tiene referencia mental de "@4"). Las operaciones internas que sí +necesitan la window viva — `focus`, `send-keys`/nudge y `kill` — la resuelven BAJO DEMANDA contra +tmux a partir del session_id/PID (`kill_fleet_agent` y `fleetview focus` la recalculan por llamada); +para el nudge, lee `tmux_window` del binario `fleetview list --json` (que sí lo conserva como campo +interno), nunca del payload del MCP. + Mantén una **tabla de seguimiento**, una fila por secundario, y actualízala en cada turno: | slug | título kitty | PID | cwd / dir aislado | rama | log | report | estado |