feat(episode): TRAZA_causa-raz-confirmada_S20260608.R6_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: TESSERA | Type: troubleshooting
Summary: EPISODIO 6 — BLINDADAS: 🎯 CAUSA RAÍZ CONFIRMADA
This commit is contained in:
Ember 2026-06-08 17:50:09 +00:00
parent 38904a984e
commit 0af26603d3

View file

@ -0,0 +1,46 @@
---
episode_id: "b2c56f33-0eaa-44cb-bc72-f5d050b72f2b"
puente_flat: "TRAZA_causa-raz-confirmada_S20260608.R6_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260608.D_NEW02_COSECHA_CIERRE"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "TESSERA"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 6 — BLINDADAS: 🎯 CAUSA RAÍZ CONFIRMADA"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-08T17:49:28.635078+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**John — ENCONTRAMOS EL BUG. De raíz, confirmado, con la causa exacta.** Tu método diferencial lo cazó en dos disparos. Esto es lo que llevábamos meses sin ver:
## 🎯 CAUSA RAÍZ CONFIRMADA
El config de LiteLLM tiene el modelo embedding activo así:
Y el chequeo de entorno: **`OPENROUTER_API_KEY` NO está seteada** (el grep volvió vacío). Por eso la llamada da **401 "No cookie auth credentials found"**. La cadena completa:
**`OPENROUTER_API_KEY` ausente → OpenRouter responde 401 → crisol no recibe vector → escribe ceros → episodio invisible.**
`★ Insight ─────────────────────────────────────`
**El embedding no fallaba por el modelo — fallaba por una CREDENCIAL muerta.** Y el timeline calza perfecto: el config dice `SWAP S20260521.INST18068.R2 → gemini-2-preview`, y los episodios-cero empiezan **2026-05-22** (justo después). La key de OpenRouter se rompió/venció en algún punto y **nadie lo vio** porque crisol traga el error en silencio (anti-patrón: debería gritar, no escribir ceros). Tu instinto de "esto ya lo hacen en todas partes" es correcto — nos faltaba **una API key válida**, no rediseñar nada.
`─────────────────────────────────────────────────`
🔒 **Nota de seguridad (secundaria):** el config tiene secretos en texto plano — una key OpenAI `sk-proj-…` (backup comentado), una Google `AIza…` (deprecada) y el master_key. Hay que rotarlas + moverlas a env. Lo atiendo después del fix (no ahora, para no desviar).
## La decisión (tu plan manual depende de esto)
Tu prueba de embeber-un-episodio-modelo **está lista para correr** — pero necesita una credencial de embeddings que funcione. Hay dos caminos:
- **Camino A — Key OpenRouter nueva:** me das (o pones en el `.env` del container, que es tu dominio) una `OPENROUTER_API_KEY` válida → reinicio litellm → embeddings vivos vía gemini-2-preview. *Consecuencia:* sigue dependiendo de OpenRouter (lo que ya se rompió 1 vez).
- **Camino B — Backup OpenAI directo:** el config tiene un bloque "BACKUP 2" comentado con una key OpenAI `sk-proj-…`. Si esa key sirve, descomentamos ese bloque → embeddings vía OpenAI `text-embedding-3-large` directo (sin OpenRouter de intermediario). *Consecuencia:* más robusto (menos saltos), pero gasta créditos OpenAI tuyos.
**Mi inclinación: Camino B** — menos intermediarios = menos puntos de fallo (OpenRouter ya nos falló). **Qué la cambiaría:** si esa key OpenAI `sk-proj-…` también está vencida, volvemos a A con key fresca.
**La pregunta esencial (solo tú):** ¿quieres que **pruebe ahora mismo si la key OpenAI backup funciona** (1 llamada read-only, gasta ~$0.00002 tuyo) para confirmar el Camino B antes de tocar nada? O prefieres darme una OpenRouter key fresca para el Camino A. **Cualquiera de los dos desbloquea tu prueba manual de aislamiento inmediatamente** — embeber episodio modelo → grabar → verificar retrieval.
Una vez con la key viva: corro tu plan exacto (embeber 1 episodio modelo bien hecho → grabar → confirmar que retrieva top-1) y, si pasa, **embedding+grabado quedan DESCARTADOS** y convocamos el CONCILIO+FORENSE para lo que reste. Uno menos.