feat(episode): TRAZA_las-dos-vas-de-ingestin_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: TESSERA | Type: troubleshooting
Summary: EPISODIO 1 — MNEMO_PRE_DIGEST: Las dos vías de ingestión
This commit is contained in:
Ember 2026-07-27 02:23:27 +00:00
parent 6d6460082d
commit e20cae591f

View file

@ -0,0 +1,50 @@
---
episode_id: "3c557da8-cd74-4224-bbd1-9b741eec7149"
puente_flat: "TRAZA_las-dos-vas-de-ingestin_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260726.ARCO_CICLO4_AUTOMEJORA"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "TESSERA"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — MNEMO_PRE_DIGEST: Las dos vías de ingestión"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-07-27T02:23:11.496726+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**Percibiste exactamente bien, John.** Hay dos vías, y entender la diferencia es la clave de todo el diagnóstico de hoy.
## Las dos vías de ingestión
**Vía A — el camino directo (`crisol_run.py`)**
Un cron horario lee los archivos del inbox, genera el embedding y **escribe directamente en Qdrant** (`MemoryWriter(stores=("qdrant",))`). Es simple y rápida: como alguien que copia el dato a mano en cada libreta. **Es la que ha estado sosteniendo la memoria todo este tiempo.**
**Vía B — el libro de salidas (`episode_outbox` → `dispatcher` → `workers`)**
PostgreSQL es el canon: cuando nace un episodio, se anota un **evento** en una tabla de salidas (`episode_outbox`). Unos trabajadores independientes toman esos eventos y **proyectan** el episodio a cada destino: uno a Qdrant, otro a Neo4j, otro a Nextcloud, otro a Forgejo. Si uno falla, el evento queda pendiente y se reintenta.
Ese patrón tiene nombre en la industria: ***transactional outbox***. Es el estándar para mantener varios almacenes consistentes sin perder nada, porque el registro de "esto hay que propagarlo" vive en la misma base de datos que el dato.
## Por qué importa la diferencia
| | Vía A (directa) | Vía B (outbox) |
|---|---|---|
| Complejidad | baja | alta |
| Si falla | **se pierde en silencio** | queda pendiente y reintenta |
| Actualiza `episode_sync_status` | ❌ no | ✅ sí |
| Estado hasta hoy | viva | **muerta desde el 19 de junio** |
**Ahí está la explicación completa del hueco de julio:** la vía B es la red de seguridad de la vía A. Al morir la B en junio, el sistema quedó caminando sobre la cuerda floja sin red. Cuando la vía A tropezó del 2 al 11 de julio, **no había nada debajo**: 152 episodios cayeron al vacío.
Y explica también el `1099 pending` que acabas de ver en el arranque: ese contador solo lo actualiza la vía B, así que lleva desde junio congelado — la mayoría de esos episodios **sí están** en Qdrant, puestos ahí por la vía A.
★ Insight ─────────────────────────────────────
**La prueba de que la vía B revivió es casi poética.** Consulté cuál fue el primer episodio que cruzó el canal reparado, y este es su identificador:
`TRAZA_cac-y-correg-un-falso-negativo-en-mi_S20260726.R1` — **hace 0,9 minutos**
Es *mi propio episodio de este turno*: el que narra que cacé el falso negativo en mi detector. El primer recuerdo que atravesó la vía reparada es el recuerdo de la reparación.
─────────────────────────────────────────────────