# Reglas de despliegue

Cuando despliegas una imagen nueva (o cambias algo de la plantilla de pods), las unidades en marcha quedan **obsoletas**. El `rollout` de la política decide cómo se reemplazan.

| Regla | Comportamiento | Úsala para |
|---|---|---|
| `rolling` | Reemplaza las unidades obsoletas por lotes, creando primero la nueva. La capacidad nunca baja | APIs sin estado, workers |
| `replace_idle` | Reemplaza ahora toda unidad obsoleta que **no esté asignada ni ocupada**, como mucho una cuarta parte de las unidades a la vez y nunca por debajo de `min_units` listas. Las asignadas u ocupadas se reemplazan **cuando terminan**: por su salida, parada o destrucción, o en su siguiente señal `idle` | lobbies, partidas |
| `next_start` | No toca las unidades en marcha. El cambio se aplica la próxima vez que la plataforma crea un pod para esa unidad: un arranque tras una parada, un pod perdido, una unidad caliente nueva | mundos privados, parcelas |

`replace_idle` necesita señales: sin ellas no se puede saber qué es "idle" y la política se rechaza con `invalid-field-value` (`details` empieza por `replace_idle_needs_signals`). Es el valor por defecto del modo `code`.

Las versiones mezcladas son normales con `replace_idle` y `next_start`. Allocate prefiere unidades que ya están en la plantilla más nueva y la consola muestra cuántas siguen en la antigua.

## Leer el estado

`GET .../units/policy` informa del despliegue:

```json
{
  "rollout": "replace_idle",
  "rollout_status": {
    "strategy": "replace_idle",
    "target_template": "9c1f...",
    "stale_units": 2,
    "replaced_units": 7,
    "waiting_on": [{"key": "duel-81", "why": "allocated"}],
    "started_at": "2026-10-14T10:00:00Z"
  }
}
```

y el registro de eventos lleva `rollout.started`, `rollout.completed` y `rollout.paused` (falló un reemplazo). `rollout_status` está en la referencia de la API como `RolloutStatusResponse`.

## Elige una

- Una partida nunca debe cortarse y las unidades son efímeras: `replace_idle`.
- Cada unidad guarda el mundo de un jugador y puede pasar semanas detenida: `next_start`.
- Las unidades son intercambiables y sin estado: `rolling`.
