Caos de estado y reloj ('Poisoned Well')
Corrompe el almacenamiento persistido (localStorage / sessionStorage), dispara QuotaExceededError, adelanta el reloj de JS y evalúa la supervivencia al rehidratar con page.reload().
Uso
bash
loki run http://localhost:8000 --persona novice-chaotic --state-chaosloki run http://localhost:8000 --swarmloki run http://localhost:8000 --no-state-chaos
Personas que lo activan
StateChaosEngine (src/loki/engine/state_chaos.py) se ejecuta durante sesiones con novice-chaotic, swarm (--swarm) y all cuando --state-chaos está habilitado (activo por defecto).
Tipos de fallo 'Poisoned Well' (`--state-chaos`)
| Flag | Tipo | Por defecto | Descripción |
|---|---|---|---|
| storage_corrupt_json | localStorage / sessionStorage | truncated JSON | Trunca valores JSON serializados a mitad de objeto (ej. {"items":[{"id":1) para exponer llamadas JSON.parse() sin protección durante la hidratación de estado. |
| storage_trap_literal | localStorage / sessionStorage | "undefined", "null", "NaN" | Reemplaza valores persistidos con literales trampa de JavaScript ("undefined", "null", "NaN", "[object Object]"). |
| storage_type_swap / schema_strip | localStorage / sessionStorage | Zustand / Redux-Persist aware | Intercambia tipos esperados (arreglos por números, objetos por cadenas, totales positivos por -999999) o elimina claves internas de envolturas {state, version}. |
| quota_exhausted | Storage.prototype.setItem | QuotaExceededError | Sobrescribe Storage.prototype.setItem en el contexto de la página para lanzar DOMException("QuotaExceededError") en escrituras posteriores. |
| clock_drift | Date.now / new Date | +1h, +2h, +24h | Adelanta el reloj JavaScript del cliente a mitad de sesión para exponer bucles de refresco de JWT expirados, temporizadores rotos y fallos de TTL en caché. |
| poisoned_reload | page.reload() | end of wave | Recarga la página manteniendo el almacenamiento envenenado e inspecciona el DOM en busca de pantallas en blanco por colapso de hidratación ([UI Freeze / Poisoned Reload Collapse]). |