v0.8.0
[0.8.0] — Fase 14 (Escala y HA real) — 2026-07-17
Hace que ciel serve sea multi-réplica real (N>=2 detrás de un balanceador)
para deploy k8s/VPS enterprise. Corresponde a F15–F18 del roadmap
interno (v0.8 — Escala y HA real). Offline-safe primero: el default siempre
corre sin remoto (SQLite); Postgres es opt-in.
F15 — Checkpoint compartido
ciel.runtime.state_backend: ABCStateBackend(superficie mínima
set/get/delete/search/record_tool_execution/close+is_ready()para
readiness) +SqliteStateBackend(default offline) +PostgresStateBackend
(SQLAlchemy, upsert idempotente por(tenant_id, session_id, key)para evitar
races entre réplicas). Extra opcionalpg(psycopg[binary]).MemoryStorerefactorizado para heredar deSqliteStateBackend:
retrocompatible (MemoryStore(path)sigue funcionando) y aceptable donde se
espera unStateBackend. Los 4 stores de resume (CheckpointStore,
SessionStore,GraphCheckpointStore,EventLoopCheckpointStore) lo consumen
sin cambios de API.make_appleeCIEL_STATE_BACKEND/CIEL_STATE_DSN(oCIEL_STATE_SQLITE)
y construye el backend; lo inyecta a los stores de checkpoint/session expuestos
enapp.state.
F16 — HA operativa
- Health reales:
GET /healthz(liveness, proceso vivo) yGET /readyz
(readiness:StateBackendconectado + migrado;{"status":"ready"|"not_ready", "backend":"sqlite|postgres",...}).GET /healthqueda como alias. - Resume multi-réplica (
ciel.runtime.resume):claim_run_leaseadquiere un
lease idempotente porrun_idcon TTL para evitar doble ejecución entre
réplicas;release_run_leaselo libera;load_shared_checkpointrehidrata
desde el backend compartido. - El chart Helm apunta las probes de deployment a
/healthz(liveness) y
/readyz(readiness).
F17 — Runbooks + backup
docs/runbooks/backup.mdCORREGIDO: el audit (enterprise/audit.py) es
JSONL append-only particionado por tenant/session, NO SQLite (el runbook
previo era incorrecto). Board = SQLite; state = SQLite/Postgres.scripts/backup_state.py: backup offline-safe de audit/board/state (JSON
local + tar.gz; S3 opcional víaCIEL_BACKUP_S3).- Chart Helm:
templates/backupjob.yaml(CronJobBackupJob) + bloque
backup:envalues.yamlque vuelca audit/board/state a un PVC (o S3). docs/runbooks/incident.mdactualizado: resume multi-réplica con lease;
/readyznot_readysemántica.
F18 — Cierre de release v0.8.0
- Bump
pyproject.toml0.7.0 → 0.8.0;uv.lockregenerado. - Suite completa: 353 passed / 2 skipped (+14 tests Fase 14).
- Release v0.8.0: tag + push + PyPI
mana-ciel+ GitHub Release "v0.8.0".
Notas
- No rompe API: F15 solo cambia type hints + añade un parámetro de backend;
MemoryStoresigue siendo construible igual. - Decisión de diseño: en prod el checkpoint STATE se comparte vía
StateBackend(Postgres); los dashboards de Studio (costo/trace) son
best-effort por réplica. No usar SQLite sobre PVC RWX (corrupción bajo
concurrencia).