Commit Graph

811 Commits

Author SHA1 Message Date
egutierrez c1f355ffa5 Merge orq/fleet-detect: detect_fleet_context ($TMUX) + spawn auto-detecta socket + hook CONTEXTO FLEET + doctrina (report 0041) 2026-06-21 21:55:11 +02:00
egutierrez 237f763c19 Merge orq/img3d-registry-funcs: promover remove_background al registry + mask en depth_to_relief_glb (grupo img-to-3d, report 0040) 2026-06-21 21:51:13 +02:00
agent bf67ff3180 docs(orquestador): deteccion de flota por $TMUX, kitty solo fuera de tmux
orquestador.md + orchestration.md: la deteccion de 'estoy en una flota' se hace
por $TMUX (via detect_fleet_context), NO por $FLEET_SOCKET (fragil). kitty es
fallback SOLO cuando in_tmux=false. spawn_fleet_agent auto-detecta el socket
(ya no hace falta pasar --socket/--session). Documenta la linea CONTEXTO FLEET
del hook y anade detect_fleet_context al catalogo del grupo orchestration.
2026-06-21 21:50:32 +02:00
agent 03fc0461fa feat(hook): inyectar CONTEXTO FLEET con socket/session al orquestador
hook_fleet_state_inject.sh ahora, ademas de MODO ORQUESTADOR, llama a
detect_fleet_context (por $TMUX) e inyecta una linea CONTEXTO FLEET con
socket/session + recordatorio de usar spawn_fleet_agent (nunca kitty) cuando
in_fleet=true. No depende del venv (solo bash+tmux) y se emite antes del bloque
FLEET-STATE. Degrada limpio: si el detector falta o $TMUX esta vacia, no emite
la linea y el turno sigue intacto.
2026-06-21 21:50:32 +02:00
agent a1105dc4c5 feat(infra): spawn_fleet_agent auto-detecta socket/session de $TMUX
--socket/--session ahora opcionales: si no se pasan, se auto-detectan del
contexto tmux ($TMUX) via detect_fleet_context. Los explicitos siguen
primando. Aborta (exit 2) solo si tras auto-detectar siguen vacios (no hay
tmux). Elimina el bug de caer a kitty cuando $FLEET_SOCKET viene vacia pese a
estar en la flota. Bump v1.2.0 + growth log.
2026-06-21 21:50:32 +02:00
agent 3c9e909eda feat(infra): detect_fleet_context — contexto de flota por $TMUX (no $FLEET_SOCKET)
Funcion nueva detect_fleet_context_bash_infra (tag orchestration). Deriva
socket/session de $TMUX (senal fiable que todo proceso dentro de tmux tiene
siempre), con fallback a $FLEET_SOCKET/$FLEET_SESSION. Devuelve JSON
{in_fleet,in_tmux,socket,session,source}. Causa raiz del bug: $FLEET_SOCKET
(exportada con tmux set-environment -g por launch_fleetclaude) a veces viene
vacia en un claude resumido/relanzado pese a vivir en la flota, y el modo
orquestador caia al fallback kitty. .md self-doc (Ejemplo + Cuando usarla +
Gotchas).
2026-06-21 21:50:32 +02:00
egutierrez 3cf8b21fea feat(datascience): promover remove_background al registry + mask en depth_to_relief_glb (grupo img-to-3d)
Completa la promoción del flujo imagen->3D al registry (grupo de capacidad
img-to-3d), extraído de la app img_to_3d_webapp.

- remove_background_py_datascience (nueva): elimina el fondo con cascada
  rembg/U2Net -> OpenCV GrabCut -> umbral NumPy, compone el objeto sobre gris
  neutro y devuelve image + mask + engine. Impura, nunca lanza. Adaptada de
  backend/bg_removal.py con firma de ruta (image_path) y salida dict, demo CLI
  JSON-serializable.
- depth_to_relief_glb_py_datascience (v1.1.0): añade el parámetro opcional mask
  para recortar la malla de relieve al objeto (descarta las caras del fondo),
  cerrando la cadena con remove_background. Aditivo (mask=None = comportamiento
  previo), fiel al original de backend/depth.py.
- docs/capabilities/img-to-3d.md: incorpora remove_background como paso 0
  (pre-proceso), actualiza el flujo a 3 pasos encadenados, la tabla de funciones
  (4), el ejemplo end-to-end con mask y las deps (rembg/opencv).
- docs/capabilities/INDEX.md: conteo del grupo 3 -> 4.

Las dos funciones ya presentes (estimate_image_depth, depth_to_relief_glb) y el
pipeline build_relief_glb_from_image fueron promovidas en una ronda previa.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 21:43:08 +02:00
egutierrez cbefc82c02 Merge orq/pane-id-json: campo ClaudeFleet.PaneID + resolve_pane_ids + poblar en list_claude_fleet (report 0039) 2026-06-21 21:30:40 +02:00
egutierrez fb76b53c17 feat(infra): exponer pane_id (%N) estable en el JSON de la flota
El orquestador identificaba cada agente por el campo tmux_window (@N), pero
el window_id de tmux cambia cuando un pane entra/sale de windows (el focus de
la flota usa break-pane + join-pane, que recrean windows). El pane_id (%N) en
cambio es estable durante toda la vida del pane: es el identificador correcto.

- claude_fleet.go: nuevo campo ClaudeFleet.PaneID `json:"pane_id"`. Se mantiene
  TmuxWindow (lo necesita el focus internamente); esto AÑADE pane_id, no lo
  reemplaza.
- resolve_pane_ids.go (+ .md, .go test): nueva función del registry
  ResolvePaneIDs(socket, pids) -> map[pid]pane_id. Lista los panes del socket
  (tmux -L <socket> list-panes -a) y para cada PID sube por el árbol de procesos
  (PPID en /proc) hasta dar con un pane_pid. Reutiliza runTmux y procPPID del
  paquete infra. Best-effort: tmux/socket caído o PID sin pane -> "" sin crash.
  Núcleo testeable con inyección de la salida tmux y del resolvedor de PPID.
- list_claude_fleet.go: ListClaudeFleet() puebla PaneID resolviendo cada PID
  vivo contra $FLEET_SOCKET (default "fleet"). Solo la entrada pública lo hace;
  ListClaudeFleetFrom() queda intacta (cero coste tmux en tests y en el bucle
  de render de fleetview).

Tag de grupo: orchestration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 21:19:55 +02:00
egutierrez 8e16202935 Merge orq/doc-tags: documentar tools MCP fleet_* + corregir drift role/dod + tag orchestration a 6 funciones 2026-06-21 18:05:48 +02:00
egutierrez e4a36f1133 chore(tags): anadir tag 'orchestration' a las 6 funciones del grupo que faltaban
capability_groups.md exige que toda funcion de un grupo lleve su tag plano para
ser descubrible via fn_search tag='orchestration'. 6 de las funciones del grupo
(reboot_all_claudes, classify_fleet_termination, list_claude_fleet,
drain_fleet_events, mark_claude_role, set_dod_contract) no lo llevaban. Se anade
sin borrar los tags existentes.

notify_desktop_go_infra ya llevaba el tag pero no figuraba en la tabla del grupo:
se decide que SI pertenece (la usa el orquestador/watcher para avisar de un
RECLAMA u otro evento urgente) y se anade a la tabla en orchestration.md (commit
anterior), en lugar de quitarle el tag. Resultado: 13 funciones con tag
orchestration, identicas a las 13 filas de la tabla del grupo (sin drift).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 18:03:14 +02:00
egutierrez 295f90afaf docs(orquestador): documentar tools MCP fleet_* + corregir drift role/dod en list --json
orchestration.md: nueva subseccion 'Via preferida: tools MCP fleet_*' con mapa
operacion->tool (fleet_list/drain/classify/set_dod/kill/spawn) marcando el MCP
orchestrator como via preferida sobre ./fn run (permisos pre-aprobados, salida
estructurada, telemetria) y el ./fn run / binario fleetview como fallback CLI.
Corrige la afirmacion obsoleta de que 'fleetview list --json no incluye todavia
role/dod_contract/dod_status': el CLI ya los expone directamente y el MCP rellena
los vacios desde el sidecar goal.json. Anade notify_desktop_go_infra a la tabla
del grupo. orquestador.md: linea en el flujo senalando el MCP como via preferida.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 18:03:04 +02:00
integrador f85c1a322a feat(mcp): registrar orchestrator_mcp en .mcp.json
Expone el grupo de capacidad de orquestación de flota (fleet_list/drain/classify/
kill/set_dod/spawn) como tools MCP tipadas para el Claude orquestador. Binario en
apps/orchestrator_mcp (sub-repo). Command relativo igual que registry_mcp; stdio
por defecto, sin flags. Listo para /mcp reconnect.
2026-06-21 15:00:22 +02:00
egutierrez 32c7336bf6 feat(infra): auto-commit con 56 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-21 14:22:55 +02:00
egutierrez c1071a82b3 Merge orq/orquestador-doc: dieta /orquestador + rules/orchestration.md + fan-out=6 + hook reancla rol
Fixes B (fan-out duro=6), C (hook_fleet_state_inject reancla role=orchestrator),
D (command 555->299 lineas, maquinaria extraida a .claude/rules/orchestration.md).
Verificado adversarial: met (todas las clausulas re-ejecutadas independientes).
2026-06-21 14:11:50 +02:00
egutierrez fac2cceea3 docs(orquestador): tope de fan-out duro = 6 ejecutores por orquestador
El doc hablaba de "tope de fan-out para no explotar la flota" sin numero. Se
fija un maximo DURO: 6 ejecutores role=executor activos simultaneos por
orquestador. Al alcanzarlo, el orquestador no lanza mas: encola las sub-tareas
restantes hasta que un slot se libere (ejecutor verificado met + kill_fleet_agent).

Justificacion: ya hubo el caso de 30 agentes que no cerraban nada y, al competir
todos por el mismo rate-limit compartido, hubo que desactivar goal_refine. Mas
ejecutores no es mas throughput; el cuello de botella es el rate-limit compartido
y los DoD que nadie cierra.

Escrito en el splitter + regla dura de orchestration.md (detalle + justificacion)
y en las reglas duras del command (numero + encolado, puntero al detalle).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:55:03 +02:00
egutierrez f852993412 docs(orquestador): dieta del command + extraccion de maquinaria a rules/orchestration.md
El command /orquestador (555 lineas) se cargaba entero en contexto cada turno y
predicaba "responde conciso" siendo el mismo prolijo. Se parte en dos:

- Nueva regla .claude/rules/orchestration.md con la maquinaria estable: seguir
  la flota (fleetview, tiempo de actividad), cola del watcher (events.jsonl,
  push activo, FLEET-STATE), clasificacion (classify_fleet_termination),
  politicas por clasificacion, verificador adversarial, auto-kill
  (kill_fleet_agent), nudge, splitter, cadencia y el catalogo de funciones del
  grupo orchestration. Todo el contenido sustantivo se mueve integro.
- El command queda con la doctrina y el flujo: arranque (marcar role +
  confirmacion), diferencia con fn-orquestador/autopilot, ciclo de 8 pasos
  (resumido donde la maquinaria se fue a la regla, con punteros), reglas duras,
  anti-patrones, ejemplo end-to-end y salida del modo. Baja de 555 a 299 lineas.

Redundancias colapsadas a una canonica + punteros: "NUNCA Agent tool para
lanzar trabajo" vive en el paso 8; "nunca pkill/killall claude" en el paso 6.
El resto referencia esos pasos.

Fila 38 anadida a .claude/rules/INDEX.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:53:40 +02:00
egutierrez 8328637935 feat(orquestador): reanclar role=orchestrator en el hook de inyeccion de flota
El modo /orquestador dependia de que su prompt siguiera en contexto. Ahora el
hook UserPromptSubmit que ya filtra por role=orchestrator reinyecta tambien una
linea recordatorio del rol cada turno, reanclando el modo independientemente del
prompt. Se emite antes de la guarda del venv para sobrevivir a un watcher caido.
El path limpio (sin goal.json o role != orchestrator) sigue saliendo con exit 0
y stdout vacio.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:47:46 +02:00
egutierrez 687c72805d docs(orquestador): paternidad spawn --parent, auto-kill, push activo, statusline sin LLM
Integra las 4 mejoras de la tanda: (1) --parent en los ejemplos de spawn y la
explicacion del routing del watcher por parent_orchestrator; (2) regla de
auto-kill — cerrar cada ejecutor con kill_fleet_agent tras verificar met, con sus
guards; (3) push activo del watcher (tmux send-keys al pane del orquestador padre)
+ indicador 'idle nuevo sin ver' de la TUI fleetview (los implementa otro agente,
aqui solo se describen); (4) el dod movil del statusline ya no se regenera con LLM
por turno (objetivo/DoD fijo, ajustable con dod:). Anade mark_claude_parent y
kill_fleet_agent a la tabla del grupo orchestration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:28:07 +02:00
egutierrez f415dd56f5 feat(infra): kill_fleet_agent — cierre dirigido de un ejecutor de la flota (auto-kill)
Cierra UN ejecutor por sessionId (exacto/prefijo) o PID: SIGTERM al proceso claude
(cierre limpio, recuperable con --resume) + kill-window de su window tmux. Lo usa
el orquestador para liberar el slot idle de cada ejecutor en cuanto verifica que
su DoD-contrato esta met. Guards: NO mata a un role=orchestrator (leido del
goal.json) ni a la sesion que invoca (PID propio por ancestros /proc). --dry-run
para inspeccionar sin tocar nada. Overrides FN_FLEET_* para tests. Tag grupo
orchestration. Tests: 17 asserts (golden por sessionId/PID/prefijo, guards
orchestrator/self rc=3, errores rc=2).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:28:07 +02:00
egutierrez b6ad1a3a15 feat(infra): spawn_fleet_agent --parent <sid> atribuye el ejecutor a su orquestador
Nuevo flag opcional --parent: persiste parent_orchestrator en el goal.json del
Claude recien lanzado (via mark_claude_parent, en background). Habilita el routing
del watcher de fleetview, que asi sabe a que pane de orquestador empujar el aviso
de cierre del ejecutor. El bloque background ahora cubre --role y/o --parent
encadenados secuencialmente (primero role, luego parent) para evitar la carrera de
lectura-modificacion-escritura sobre el goal.json. Retro-compatible: sin --parent,
el spawn se comporta igual que antes. Bump 1.0.0 -> 1.1.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:28:07 +02:00
egutierrez 753e16b84c feat(infra): mark_claude_parent — escribe parent_orchestrator en goal.json (PID->sessionId)
Helper py analogo a mark_claude_role: resuelve el sessionId de un Claude recien
arrancado por su PID (sondeando sessions/<pid>.json) y escribe SOLO la clave
parent_orchestrator en su goal.json, preservando el resto. Lo consume
spawn_fleet_agent --parent para que el watcher de fleetview rutee los avisos del
ejecutor a su orquestador padre. Tests: escribe+preserva, goal inexistente,
parent vacio (ValueError), timeout sin crash.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:27:47 +02:00
Egutierrez b6f4b4eb03 docs(orquestador): documentar push automatico FLEET-STATE + fn summarize_fleet_transitions 2026-06-21 12:28:20 +02:00
agent 118d5d36d3 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>
2026-06-21 00:06:01 +02:00
agent b410328cec fix(orquestador): invocaciones exactas que funcionan en el system prompt 2026-06-20 23:27:25 +02:00
agent 2f184d9dd9 docs(orquestador): usar edad de actividad (fleetview list AGE), no etime de proceso
El orquestador reporta el tiempo de actividad (cuanto lleva sin avanzar)
via fleetview list AGE/idle_seconds, no el etime (vida del proceso = 8h de
sesion), que no es progreso.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:19:56 +02:00
agent b823271eb6 docs(orquestador): regla de concision + aclarar pin en sidebar
El orquestador responde conciso (velocidad de iteracion sobre detalle) y
va pinneado arriba en el sidebar de fleetview via role=orchestrator. Se
corrige una regla previa que afirmaba erroneamente un comportamiento de
no-conmutacion del pane (no era lo pedido).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:05:54 +02:00
agent 2a279abb15 docs(flows): 0012 gap 1 cerrado (spawn en flota tmux validado en vivo)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:56:30 +02:00
agent 4b732ca4d3 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>
2026-06-20 20:56:12 +02:00
agent 05d0b71d5d docs(flows): 0012 fase 3b validada (launcher+pin) + gap del spawn en flota
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:34:23 +02:00
agent 334a71eed1 feat: launcher arranca orquestador + idle, pin por role (flow 0012, fase 3b)
- mark_claude_role (python/functions/infra): resuelve PID->sessionId
  esperando sessions/<PID>.json y escribe role en el goal.json sin pisar
  el resto. 4 tests.
- launch_fleetclaude: el pane derecho arranca el ORQUESTADOR con el skill
  /orquestador embebido como primer prompt; tras arrancar, mark_claude_role
  le pone role=orchestrator (en background, no-fatal) para que la TUI lo
  pinee arriba; ademas siembra 1 ejecutor idle inicial en su propia window.
- skill /orquestador: regla 'no te vigiles a ti mismo' (ignora en la cola
  su propia sesion y cualquier role=orchestrator).

Validado en vivo (perfil aislado): claude /orquestador entra en modo,
role marcado, idle sembrado, pin correcto, fleet2 intacto.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:33:37 +02:00
agent c55bb17d09 docs(flows): 0012 fase 2 construida (cerebro reactivo en /orquestador)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:19:51 +02:00
agent 9365def3dd feat: cerebro reactivo del meta-orquestador (flow 0012, fase 2)
Primitivas (python/functions/infra):
- drain_fleet_events: consume la cola del watcher (~/.claude/fleet/
  events.jsonl) desde un cursor, agrupa por clasificacion, marca
  urgentes. 7 tests.
- set_dod_contract: escribe el DoD-contrato fijo (dod_contract/dod_status)
  en el goal.json de un agente sin pisar el resto (escritura atomica).
  5 tests.

Skill /orquestador evolucionado (sin romper lo existente): vigila la
flota por su DoD (no por 'esta vivo'). Nueva seccion 'Consumo de la cola
de la flota': DoD-contrato obligatorio al lanzar, drenar la cola,
politicas por clasificacion (RECLAMA escala / DICE_TERMINADO verifica /
ESTANCADO nudge / MAL_LANZADO re-DoD), verificador independiente del
ejecutor (lee el report vs dod_contract), splitter con tope de fan-out,
y cadencia (drain al actuar + heartbeat).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:19:26 +02:00
agent 251db2bfc5 docs(flows): 0012 fase 1 validada en vivo (3 capas DoD cumplidas)
Transicion real MAL_LANZADO->DICE_TERMINADO escrita a la cola JSONL con
la TUI viva. Hallazgo: la flota actual clasifica MAL_LANZADO (sin
dod_contract), comportamiento correcto que Fase 3 corrige.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:10:36 +02:00
agent 0e93258974 docs(flows): 0012 fase 1 hecha — watcher dentro de fleetview + cola JSONL
Refleja la decisión real: el watcher no es un daemon aparte sino que se
embebe en fleetview (reutiliza su polling); la cola es JSONL en
~/.claude/fleet/events.jsonl (sin SQLite/CGO).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:02:01 +02:00
agent 28a53ee357 feat(infra): modelo de datos del meta-orquestador de flota (flow 0012)
Fase 1, piezas 1+2:
- ClaudeFleet + list_claude_fleet ganan DodContract/DodStatus/Role,
  leidos de goals/<sessionId>.json (.dod_contract/.dod_status/.role).
  Aditivo: fleetview sigue compilando.
- classify_fleet_termination (pura): clasifica el estado de terminacion
  de un agente (RECLAMA/MAL_LANZADO/DICE_TERMINADO/ESTANCADO/TRABAJANDO)
  con precedencia fija, para que un watcher sin LLM decida. 34 tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 19:51:11 +02:00
agent b569561115 docs(flows): 0012 meta-orquestador de flota con DoD-contrato
Diseño del sistema para manejar 20-30 agentes Claude hablando solo con
uno: 4 roles (orquestador/splitter/ejecutores/verificador), DoD-contrato
fijo en goal.json como criterio estable de terminación, máquina de
terminación clasificable sin LLM, y 3 fases (watcher edge-triggered,
orquestador reactivo + verificador independiente, spawn en flota +
splitter). Métrica de salud = throughput de DoD cumplidos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 19:38:35 +02:00
agent 224f714d4a feat(commands): /fleet — listar y saltar con foco a la flota de Claudes
Slash command que envuelve el modo CLI de fleetview (list/focus) para
preguntar por la flota de Claudes vivos o saltar con foco a una
conversación dentro de la sesión tmux fleet, desde cualquier sesión.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 18:38:12 +02:00
egutierrez 763e06c127 feat(browser): auto-commit con 178 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-20 18:22:23 +02:00
egutierrez 7d100e7f3e feat(infra): auto-commit con 2 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-17 11:11:35 +02:00
egutierrez e7a8edfed8 fix(infra): tmux_swap_window_into_console base-index-agnostico
La funcion direccionaba panes por indice literal ("console.0",
"windowID.0", filtro pane_index != "0"). El socket aislado de fleetview
(tmux -L fleet) hereda ~/.tmux.conf, asi que con `pane-base-index 1`
(config muy comun) el primer pane es el indice 1 y no existe el 0:
join-pane fallaba con "can't find pane: 0" tras haber hecho ya el
break-pane, dejando la sesion fleet con las windows desperdigadas y sin
el sidebar de la TUI.

Ahora resuelve el pane sidebar como el de MENOR pane_index y opera
siempre por pane_id (estable e inmune al base-index). Helpers nuevos:
tmuxConsolePanes, tmuxFirstPaneID, tmuxPanesSorted, tmuxSidebarWidth.

Tests actualizados a base-index-agnostico (localizan el sidebar por
menor indice, no por "0") y el default de ancho del sidebar pasa de 47
a 52 para coincidir con launch_fleetclaude.

Bump v1.0.0 -> v1.0.1 + Capability growth log.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:10:56 +02:00
egutierrez cd87a8c28e chore: auto-commit (1 archivos)
- cpp/apps/shaders_lab

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-17 10:37:14 +02:00
egutierrez 6ab85ee701 Merge remote-tracking branch 'origin/master' 2026-06-17 10:30:27 +02:00
egutierrez 909290ddbf feat(infra): auto-commit con 8 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-17 10:30:26 +02:00
egutierrez 111ee17bcc feat(infra): auto-commit con 1 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-17 09:21:15 +02:00
egutierrez 0d3118d98d feat(infra): fleetclaude usa terminal actual + sidebar 52 + tmux gris
- launch_fleetclaude: si hay TTY, exec tmux attach en la terminal actual (no abre
  ventana kitty nueva); atajos alt+q (cerrar flota con confirmacion) y alt+flecha
  izquierda (volver atras); estetica neutra de tmux (status/bordes gris).
- ancho del sidebar 47 -> 52; tmux_swap_window_into_console preserva 52 por defecto.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:09:11 +02:00
egutierrez f6b9747f11 refactor(infra): launch_kittyclaude → launch_fleetclaude (comando fleetclaude)
Renombra la funcion entrypoint y su comando a fleetclaude. Ademas, sobre el .sh:
- atajos nuevos: alt+0 (= alt+n), alt+k (kill), alt+r (resume picker),
  alt+flecha-izquierda (volver atras), alt+q (cerrar toda la flota con confirmacion).
- mouse on, remain-on-exit off (cierra window al salir el Claude).
- estetica neutra de tmux: status bar y bordes de pane en gris (sin verde fosforo),
  borde activo igual que inactivo (separacion simple sin resaltado de foco).
Docs (INDEX, claude-fleet.md) actualizadas al nuevo nombre.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 00:36:09 +02:00
egutierrez 927437a8d8 feat(infra): grupo claude-fleet — FleetView TUI + orquestacion de Claudes
Sistema FleetView para centralizar la flota de procesos Claude Code vivos en una
sola ventana kitty + tmux (socket aislado -L fleet) con un panel TUI:

- list_claude_fleet (+ tipo claude_fleet): escanea ~/.claude/sessions + goals +
  runtime, valida procesos vivos (anti-PID-reciclado), join por sessionId.
- list_resumable_claudes (+ tipo resumable_claude): sesiones cerradas reanudables.
- wrappers tmux: tmux_new_claude_window (con --resume), tmux_swap_window_into_console
  (preserva ancho del sidebar), tmux_map_claude_panes.
- launch_kittyclaude: comando entrypoint; instala atajos alt+flechas/enter/n/0/k/r,
  mouse on, remain-on-exit off; fija el ancho del sidebar con hooks.
- docs/capabilities/claude-fleet.md + entrada en el INDEX.

Incluye ademas funciones datascience en progreso (excel/duckdb/postgres) y ajustes
varios de docs e infra de otra sesion, agrupados aqui para no perderlos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 00:04:41 +02:00
Egutierrez 7d395f39e5 feat(browser): cdp_click_ref/cdp_hover_ref usan cdp_wait_actionable
Antes de calcular el centro y despachar el pointer, ambos esperan a que el
elemento sea accionable (visible + stable + hit-test contra elementFromPoint),
evitando clicks/hover tragados por overlays/banners o por elementos aún
montándose o animándose. Si la comprobación no converge en 2s, se cae al
cálculo de centro previo (sin regresión). Modo 'instant' sigue saltando al
click JS directo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 20:57:44 +02:00
Egutierrez 4187f9b6b1 feat(browser): actionability + dropdowns + fill + role locator (estilo Playwright)
Tras estudiar el código de Playwright (sources/playwright), 4 primitivas nuevas y
1 endurecida para que la interacción web sea fiable:

- cdp_wait_actionable: visible + stable (2 rAF) + enabled + hit-test (elementFromPoint
  cruzando shadow DOM) + retry backoff + scroll cycling. Devuelve el punto validado.
  Réplica de _retryAction/_checkElementIsStable/expectHitTarget de Playwright.
- cdp_select_dropdown: desplegables custom (combobox/MUI/select2/headlessui): click real
  en trigger -> espera apertura (aria-expanded/[role=option] visible) -> click real en
  la opción. Resuelve el fallo nº1: clicar antes de que monte el listbox.
- cdp_select_option (endurecida v1.1.0): valida <select> real, match value/label
  normalizado/índice, option.selected para multiple, eventos input{composed}+change.
- cdp_fill: escribir fiable en inputs React/Vue: focus -> select-all -> Input.insertText
  (sin native value setter, como Playwright); native setter solo para inputs especiales.
- cdp_find_by_role: localizar por rol ARIA + accessible name (estilo getByRole),
  reutilizando el AX tree de cdp_get_ax_outline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 20:49:37 +02:00