# Reproducción de ECHO-5.5-v1

Desde la raíz del checkout. Linux con systemd de usuario, cgroups v2 y Bubblewrap;
Python 3.11 o posterior para este arnés. No se usa el entorno de echo-discord.
Los fallos de aislamiento son errores de entorno: no existe fallback sin sandbox.

```bash
python3 -m unittest tests.test_echo55_v1 -v
python3 ECHO-5.5/scripts/run_v1.py bench --output /tmp/echo55-bench-1
```

La salida debe ser nueva. `results.json` separa solicitudes de script de acciones
físicas e incluye hashes de fuentes antes/después, límites y cierre de procesos.
El observador existente permite ver el registro factual:

```bash
python3 observe.py --launch --technical /tmp/echo55-bench-1/3-program/thought.jsonl
```

`receipts/` contiene recibos HMAC y `authority/` sus claves privadas. El CLI
verifica los recibos al cerrar. No publicar `authority/`: la comprobación HMAC
requiere custodia local; la firma no prueba la verdad de una hipótesis.

## Modelo real opcional, CPU

Servidor llama.cpp con un GGUF instruct propio. Ajustar la ruta del modelo:

```bash
llama-server --model /ruta/modelo.gguf --host 127.0.0.1 --port 8795 \
  --ctx-size 4096 --parallel 1 --threads 4 --threads-batch 4 \
  --n-gpu-layers 0 --device none --no-op-offload
python3 ECHO-5.5/scripts/run_v1.py cpu-llm \
  --provider ECHO-5.5/docs/CPU-PROVIDER.example.json \
  --lengths 3 --max-calls 2 --output /tmp/echo55-model-1
```

Detener el servidor al terminar. Fijar hash/revisión del GGUF y versión del
servidor para comparar. El proveedor cuenta los tokens de la plantilla completa
y envía esos mismos IDs a `/completion`. Límites por defecto: 3.000 de entrada,
512 de salida y 5.000 acumulados por episodio. Ante interrupción o uso desconocido
se carga toda la reserva y no se repite automáticamente. Es una calibración
sencilla; no evalúa la capacidad del modelo en ARC.

## Niveles oficiales offline

Entorno opcional separado:

```bash
python3 -m venv "$HOME/.local/share/echoai-tools/echo55-v1"
"$HOME/.local/share/echoai-tools/echo55-v1/bin/pip" install \
  arc-agi==0.9.3 arcengine==0.9.3
"$HOME/.local/share/echoai-tools/echo55-v1/bin/python" \
  ECHO-5.5/scripts/run_v1.py official-smoke \
  --environments /ruta/environment_files \
  --games bp35-0a0ad940 s5i5-18d95033 --actions 12 \
  --output /tmp/echo55-official-1
```

`environment_files` debe contener juegos públicos de desarrollo del toolkit
oficial, adquiridos previamente bajo sus condiciones de uso. El comando no
descarga juegos, no tiene fallback sintético y no requiere API key. Guarda el
hash del archivo de cada juego y las versiones del motor. Solo usa frames,
acciones legales, estado y niveles públicos. El smoke usa acciones scriptadas:
comprueba integración, no es un solver ni un envío al leaderboard. El reset
inicial se cuenta por separado.

## API de cada mini-programa

```python
s = echo.observe()  # dict; el flag es s['terminal'], no echo.terminal
objects = echo.objects()
delta = echo.changes()
agency_hypotheses = echo.agency()
contact_hypotheses = echo.contacts()
if not s['terminal']:
    echo.act(s['available_actions'][0])
```

`echo.act(6, data={'x': 12, 'y': 8})` solicita un clic cuando ACTION6 es legal.
`echo.execute(actions)` para en terminal o veto; cada paso consume una acción
real. No hay rollback del mundo tras un error.

`echo.plan(grid, start, goal, wall_colors=[1])` reutiliza el planificador para
mapas de **2..16 celdas por eje**, con abstención fuera de alcance. Su prior
0/1/2/3 = arriba/derecha/abajo/izquierda NO es el mapeo oficial ARC.
Las coordenadas del helper son `[fila, columna]`; las del clic son `x,y`.

Cada programa tiene un namespace nuevo; juego y cuotas persisten en el padre.
La evicción elimina bloques antiguos completos y conserva política + último
frame completo, codificado con RLE sin pérdida. Si no caben, aborta antes de
inferir. Agencia/contacto son hipótesis, nunca identidades o causalidad ciertas.

## Gráfica

Con matplotlib en un entorno de herramientas:

```bash
python3 ECHO-5.5/scripts/plot_v1.py --results /tmp/echo55-bench-1/results.json \
  --output /tmp/echo55-figures
```

La figura identifica explícitamente el control scriptado. No se garantizan los
mismos tiempos/RSS en otro equipo; sí se pueden comprobar las acciones,
victorias del fixture y límites bajo las condiciones declaradas.
