feat(episode): TRAZA_r32seccion1i1-lo-que-arregl-y-por-qu-era_S20260902.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: FORJA | Type: troubleshooting
Summary: EPISODIO 1 — Docker: [R32.seccion1.I1] Lo que arreglé, y por qué eran tres y no
This commit is contained in:
Ember 2026-09-05 00:22:10 +00:00
parent 312ddad799
commit 3868786ab4

View file

@ -0,0 +1,43 @@
---
episode_id: "7c1e94b3-4fc7-433b-9b0f-2375f0b3b4ae"
puente_flat: "TRAZA_r32seccion1i1-lo-que-arregl-y-por-qu-era_S20260902.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260902.SID80EF6E909F98"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "FORJA"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — Docker: [R32.seccion1.I1] Lo que arreglé, y por qué eran tres y no d"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-09-05T00:22:08.108244+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
🧪 **TEST_POST:** `test_rotar_openrouter_guard.py` → **6/6 · EXIT=0** · y el script end-to-end sigue dando `DIMS=3072`.
## [R32.seccion1.I1] Lo que arreglé, y por qué eran tres y no dos
Al revisar el incidente encontré que los dos defectos que te nombré eran **síntomas**, no la causa.
**El primero** hacía el fallo confuso: el script interrogaba a los contenedores mientras arrancaban, `docker exec` se colgaba, y reventaba a los 180 segundos. Ahora espera a que estén corriendo, con sondeos cortos que fallan rápido en vez de colgarse una vez.
**El segundo** dejó entrar la clave mala: el guardián solo rechazaba la que queríamos jubilar, así que cualquier *otra* clave muerta pasaba. Ahora rechaza todas las que tus registros declaran muertas.
**El tercero es el que causó el corte,** y no te lo había nombrado: el script **recreaba los contenedores con una credencial que aún no había validado**, y si luego el oráculo fallaba, se limitaba a avisar dejando el servicio caído. Ahora, si el embedding no responde tras el cambio, **restaura solo desde el respaldo que acaba de crear, vuelve a levantar y re-verifica**. Pasa de avisar del desastre a deshacerlo.
## [R32.seccion2.I2] Y un cuarto arreglo que no estaba en la lista
El guardián vivía dentro del flujo principal, detrás del campo de contraseña. Al intentar probarlo, el proceso se colgó: `getpass` en Windows no lee de una tubería, **así que era imposible probar el guardián sin ejecutar todo el flujo contra tu servidor**.
Eso es precisamente lo que produce guardianes dormidos: si probar cuesta un despliegue, nadie prueba. Extraje la decisión a una función independiente, y ahora el control positivo cabe en un fichero de test que cualquiera corre en un segundo. Incluye un **control negativo** —una clave válida debe pasar— porque un guardián que rechaza todo también daría verde y sería igual de inútil.
✅ **RESUELTA · B-001** — Tres defectos corregidos + guardián extraído y probado (6/6).
🟠 **HIGH · S-004** — La rotación sigue pendiente; necesita una clave OpenRouter válida. *Dueño: John.*
🟠 **HIGH · S-001** — Langfuse, después de OpenRouter. *Dueño: John.*
🟡 **MEDIUM · C-002** — Commitear lo de hoy (script + test). *Pendiente de tu visto bueno.*
🟡 **MEDIUM · S-002** — Limpieza atacando `INFRA_MANIFEST.yaml`. *Dueño: Ember · tras las rotaciones.*
## 📁 BITÁCORA S20260904.SID80EF6E909F98.R32