feat: spawn de ejecutores en la flota tmux (flow 0012, gap 1 cerrado)

- spawn_fleet_agent (bash/functions/infra): lanza un Claude como window de
  la sesion tmux de un perfil fleet (no kitty suelta), con --skill para
  arrancar en un modo (ej. /orquestador), --prompt-file para ejecutores
  autocontenidos, y --role para marcar el goal.json via mark_claude_role.
  Asi ejecutores y orquestador viven en la flota, visibles en fleetview y
  conmutables con /fleet focus.
- skill /orquestador: paso 2 ahora prefiere spawn_fleet_agent sobre kitty
  cuando se opera dentro de un perfil fleet ($FLEET_SOCKET seteado); tabla
  de funciones del grupo actualizada.

Validado en vivo: el orquestador arranca en la flota fleet2 en modo
(MODO ORQUESTADOR activo), role=orchestrator marcado, pinneado arriba en
la TUI; los 9 ejecutores existentes intactos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
agent
2026-06-20 20:56:12 +02:00
parent 05d0b71d5d
commit 4b732ca4d3
3 changed files with 208 additions and 0 deletions
+22
View File
@@ -81,6 +81,26 @@ queda en telemetría):
el comando canónico exacto y devuelve el log donde se ve el arranque. Valida que el dir y el
prompt_file existan y que kitty esté instalado.
#### En la flota tmux (PREFERIDO cuando operas en un perfil fleet)
Si estás dentro de un perfil FleetView (variable `$FLEET_SOCKET` seteada — eres el orquestador de
una flota tmux montada con `launch_fleetclaude`), **NO lances kitties sueltas**: lanza cada
ejecutor como una **window de la flota tmux** con `spawn_fleet_agent`, para que viva en la flota,
se vea en la TUI `fleetview` y sea conmutable con `/fleet focus`:
```bash
./fn run spawn_fleet_agent --socket "$FLEET_SOCKET" --session "$FLEET_SESSION" \
--cwd <dir-aislado> --prompt-file /tmp/orq_<slug>.md --title "<subtarea>"
# devuelve el window_id; despues escribe el DoD-contrato del ejecutor:
./fn run set_dod_contract <sessionId-del-ejecutor> "<DoD golden+edge+error>" pending
```
- `spawn_fleet_agent_bash_infra` crea la window tmux + arranca claude con el prompt autocontenido
(o `--skill <name>` para arrancar en un modo), y con `--role executor|orchestrator` marca su
`goal.json` (via `mark_claude_role`). El aislamiento git (sub-repo / worktree / scope) sigue
imponiéndose en el prompt igual que con kitty.
- Usa kitty (arriba) solo para secundarios que deban vivir **fuera** de un perfil fleet.
### 3. Aislamiento git obligatorio por secundario (regla de oro)
**Dos Claudes en el MISMO working tree comparten `HEAD` y el índice; sus `git checkout` se
@@ -303,6 +323,8 @@ El orquestador no hace polling caro: drena la cola **cuando actúa** (cuando la
| `drain_fleet_events_py_infra` | Consumir la cola de transiciones del watcher (`~/.claude/fleet/events.jsonl`), agrupada por clasificación + urgentes |
| `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/`dod_contract`/`dod_status`/`role` + window tmux (alimenta `/fleet` y el watcher) |
| `spawn_fleet_agent_bash_infra` | Lanzar un ejecutor (o el orquestador) como window de la flota tmux — preferido sobre kitty cuando hay perfil fleet |
| `mark_claude_role_py_infra` | Marcar `role` (orchestrator/executor) en el goal.json de un Claude resolviendo PID→sessionId |
## Ejemplo end-to-end