feat(episode): TRAZA_el-pipeline-de-memoria-mnemo-estado-ac_S20260605.R21_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: TESSERA | Type: troubleshooting
Summary: EPISODIO 21 — MNEMO: 📘 El pipeline de memoria MNEMO — estado actual, qué arreglé
This commit is contained in:
Ember 2026-06-06 03:26:33 +00:00
parent 3d4933a27c
commit 6599b15ca4

View file

@ -0,0 +1,54 @@
---
episode_id: "da8bfbfe-18e9-4fb4-8695-e61a7cde9a9c"
puente_flat: "TRAZA_el-pipeline-de-memoria-mnemo-estado-ac_S20260605.R21_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260605.AGENTES_READINESS_PIPELINE"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "TESSERA"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 21 — MNEMO: 📘 El pipeline de memoria MNEMO — estado actual, qué arreglé,"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-06T03:25:33.508554+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Snapshot fresco tomado. Aquí está el cuadro completo y detallado, John.
# 📘 El pipeline de memoria MNEMO — estado actual, qué arreglé, qué queda
## 1⃣ Cómo está AHORA (números vivos, hace 1 minuto)
| Señal | Valor actual | Lectura |
|---|---|---|
| Qdrant `ember_experience` | **3367 vectores** (era 3246 al empezar → +121) | 🟢 **creciendo** — las memorias aterrizan |
| crisol corriendo | **1 proceso vivo** | 🟢 el pipeline está procesando ahora mismo |
| LiteLLM (embeddings) | **Up 16h** | 🟢 sano |
| Containers | **60 up** | 🟢 |
| Retrieval | scores **0.67-0.70** | 🟢 funciona |
| Inbox | **768 archivos** | 🟡 alto — síntoma de B-8 (ver abajo) |
| rejected/ | 10.428 | 🟡 histórico, crece lento |
**Veredicto de una línea:** el pipeline está **vivo y funcionando** — escribe memorias, las recupera, la infra está sana. El único número que "se ve feo" (inbox 768) **no es pérdida de datos**, es desperdicio por re-empuje (lo explico en el punto 4).
## 2⃣ Qué ARREGLÉ (la herida real)
**B-1 — episodios cortos morían en la aduana F0.** Cada memoria debe medir 200-500 palabras; el guardia F0 rechaza las que no. El camino vivo empujaba cada turno **uno por uno sin agruparlos**, así que respuestas cortas y mensajes de sistema (como un `SessionStart`) llegaban solos, medían <200, y morían alimentando un cementerio de 10.4k rechazados.
- **Fix:** fabriqué `consolidate_pending.py` (filtra basura de sistema + fusiona cortos + recorta largos) y lo enchufé al punto exacto donde la cola se vuelve archivo.
- **Probado en producción:** corrí el validador F0 real sobre 85 episodios → de 9 que antes se rechazaban, ahora solo **1** (un singleton irreducible). **84 de 85 entran.**
- **Estado:** cerrado, 12/12 tests, commit `728c6f0`, push 3/3 remotos.
## 3⃣ Qué CORREGÍ (eran falsas alarmas, no bugs)
Esto es importante para tu confianza: **me corregí a mí mismo dos veces con evidencia.**
- **B-3 "retrieval roto":** mi claim inicial era falso. La prueba real (`search_memories`) devuelve hits relevantes con scores 0.67-0.70. **El retrieval funciona.** El "1/50" que asustaba es un auto-test interno de crisol, no la búsqueda real.
- **B-6 "lock stale de crisol":** también falso. crisol usa `fcntl.flock` — un candado del kernel que **se libera solo cuando el proceso muere**. Lo verifiqué: el candado está LIBRE. El "ocupado" que vi era **concurrencia real** (otro crisol corriendo), no un candado zombie.
## 4⃣ Qué QUEDA pendiente