# El emulador local

El emulador es el **mismo binario del agente** que corre junto a tu unidad en el clúster, arrancado en otro modo. No puede diverger de lo real. Crea el árbol `/zaroz`, fija el entorno del contrato, ejecuta tu comando, imprime cada señal que recibe y aplica la misma validación.

## Ejecuta tu servidor con él

```bash
zaroz-unit-agent emulate --dir ./zaroz --key match-1 --label mode=2v2 \
  --user-data roster.json -- ./my-server
```

Tu proceso ve `ZAROZ_DIR=./zaroz`, `ZAROZ_UNIT_KEY=match-1`, `ZAROZ_CONTRACT_VERSION=1` y las demás variables del [contrato](/es/units-code/contract). Lee `./zaroz/unit.json`, escribe `./zaroz/signals/ready` y el emulador imprime la señal con su hora.

## Contrólalo desde otra terminal

```bash
zaroz-unit-agent ctl --dir ./zaroz allocate --user-data match.json   # lo que haría allocate
zaroz-unit-agent ctl --dir ./zaroz labels mode=2v2
zaroz-unit-agent ctl --dir ./zaroz drain --reason stop               # el aviso de drenaje
zaroz-unit-agent ctl --dir ./zaroz undrain
zaroz-unit-agent ctl --dir ./zaroz release
zaroz-unit-agent ctl --dir ./zaroz status
```

El socket de control (`./zaroz/.control.sock`) existe solo en el emulador, nunca en un pod real.

## En Docker

```dockerfile
FROM eclipse-temurin:21-jre
COPY --from=<registry>/zaroz-unit-agent:emulate /zaroz-unit-agent /usr/local/bin/
COPY server.jar /srv/server.jar
ENTRYPOINT ["zaroz-unit-agent", "emulate", "--dir", "/zaroz", "--key", "dev-1", "--", "java", "-jar", "/srv/server.jar"]
```

```bash
docker exec <contenedor> /usr/local/bin/zaroz-unit-agent ctl allocate --user-data /roster.json
```

Los binarios estáticos se construyen para Linux (amd64 y arm64). En Windows usa WSL. Todavía no hay compilación para macOS.

## La suite de conformidad

El crate `conformance` tiene licencia MIT. Arranca una unidad y comprueba el contrato de punta a punta: archivos presentes antes de empezar, señales reflejadas, asignación entregada y confirmada, el aviso de drenaje antes de SIGTERM y cada archivo contra su JSON Schema. Los mismos identificadores de aserción se ejecutan contra el emulador en tu CI y contra una unidad real en la plataforma, así que una unidad que pasa en local se comporta igual en el clúster.

:::note
La imagen y los binarios del emulador se publicarán en la organización `zaroz-oss` con el lanzamiento (allí se anunciará el nombre exacto de la imagen; `<registry>` arriba lo representa). El código del agente es privado; los esquemas del contrato, el emulador, la suite de conformidad, el helper y los ejemplos son públicos.
:::
