feat(orquestador): feed reactivo FLEET-STATE + fix peek de drain_fleet_events
El orquestador no se enteraba de los cambios de estado de su flota: el drenado
era manual y el peek documentado `./fn run drain_fleet_events --advance false`
devolvia un falso `{total_new:0, cursor:0}` porque `fn run` mapea los argumentos
posicionalmente y no parsea flags `--nombre valor` (events_path acababa valiendo
"--advance", una ruta inexistente).
- drain_fleet_events: nuevo helper _normalize_fn_run_flags que renormaliza el
patron `--advance <bool>` aplanado por `fn run`, de modo que el peek funciona
directo desde la CLI sin tocar el runner de Go. Bump 1.1.0 + growth log + tests
del normalizador (unit y end-to-end por HOME).
- summarize_fleet_transitions (nueva, pure, grupo claude-fleet): resume el dict
by_classification de drain en un bloque de una linea con las tres categorias
accionables (terminados / reclaman / estancados), dedup por session_id y
truncado de objetivo.
- hook_fleet_state_inject.sh (UserPromptSubmit): si la sesion es role=orchestrator
(leido de ~/.claude/goals/<session_id>.json), hace peek de la cola sin mover el
cursor y emite el bloque FLEET-STATE cada turno. Degrada limpio si el watcher
esta caido, la cola no existe o la sesion no es orquestador.
El registro del hook va en .claude/settings.local.json (gitignored, fuera de este
commit). Pendiente, lo integra otro agente: documentar el bloque FLEET-STATE en
.claude/commands/orquestador.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@ name: drain_fleet_events
|
||||
kind: function
|
||||
lang: py
|
||||
domain: infra
|
||||
version: "1.0.0"
|
||||
version: "1.1.0"
|
||||
purity: impure
|
||||
signature: "def drain_fleet_events(events_path: str | None = None, cursor_path: str | None = None, advance: bool = True) -> dict"
|
||||
description: "Drena la cola JSONL de eventos de la flota desde un cursor persistente. Lee los eventos nuevos (desde la linea del cursor hasta el final), los parsea saltando lineas en blanco o JSON invalido, los agrupa por su campo `to` (RECLAMA, MAL_LANZADO, DICE_TERMINADO, ESTANCADO, TRABAJANDO, GONE), aisla los urgentes y avanza el cursor para no reprocesar. Pensado para que el orquestador-Claude de flota consuma eventos nuevos cada vez que despierta."
|
||||
@@ -31,6 +31,8 @@ tests:
|
||||
- "json invalido se salta"
|
||||
- "agrupacion por to y urgent"
|
||||
- "cursor mayor que lineas reinicia"
|
||||
- "normaliza flag advance posicional de fn run"
|
||||
- "peek flag posicional no mueve cursor"
|
||||
test_file_path: "python/functions/infra/drain_fleet_events_test.py"
|
||||
file_path: "python/functions/infra/drain_fleet_events.py"
|
||||
---
|
||||
@@ -55,6 +57,17 @@ for ev in drained["urgent"]:
|
||||
peek = drain_fleet_events(advance=False)
|
||||
```
|
||||
|
||||
Tambien desde la CLI, sin escribir codigo. El drenado canonico consume y avanza
|
||||
el cursor; el peek inspecciona sin moverlo:
|
||||
|
||||
```bash
|
||||
# Drenado canonico: consume los eventos nuevos y avanza el cursor.
|
||||
./fn run drain_fleet_events
|
||||
|
||||
# Peek (no mueve el cursor): inspeccionar la cola sin consumirla.
|
||||
./fn run drain_fleet_events --advance false
|
||||
```
|
||||
|
||||
## Cuando usarla
|
||||
|
||||
Usala en el orquestador-Claude de flota cada vez que despierta y necesita ver
|
||||
@@ -80,3 +93,19 @@ cola sin consumirla.
|
||||
- **Fallo al persistir el cursor**: si `advance=True` pero no se puede escribir
|
||||
el cursor (permisos, FS), el drain sigue siendo valido pero la proxima llamada
|
||||
reprocesara estos eventos (at-least-once, no at-most-once).
|
||||
- **Peek por `fn run`**: `fn run` mapea los argumentos POSICIONALMENTE y no
|
||||
parsea flags `--nombre valor`. Para que el peek documentado
|
||||
`./fn run drain_fleet_events --advance false` funcione, la funcion renormaliza
|
||||
ese patron internamente (`_normalize_fn_run_flags`): detecta `--advance` como
|
||||
primer posicional y lo interpreta como el booleano `advance`, devolviendo las
|
||||
rutas a su default. Una llamada normal por kwargs no se ve afectada. Acepta
|
||||
`--advance false|true|0|1|no|yes`; `--advance` sin valor equivale a `true`.
|
||||
|
||||
## Capability growth log
|
||||
|
||||
- v1.1.0 (2026-06-21) — el peek `./fn run drain_fleet_events --advance false`
|
||||
ahora funciona directo desde la CLI. Antes `fn run` colaba el flag como
|
||||
`events_path="--advance"` (ruta inexistente) y devolvia un falso
|
||||
`{total_new:0, cursor:0}`. Se añade `_normalize_fn_run_flags` para renormalizar
|
||||
el patron sin tocar el runner de Go. Elimina el gotcha de invocacion que
|
||||
silenciaba la cola al orquestador (reports 0011/0012).
|
||||
|
||||
Reference in New Issue
Block a user