feat(episode): TRAZA_la-historia-de-la-decisin-curar-el-dri_S20260619.R3_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 3 — PostgreSQL: 📖 La historia de la decisión — ¿curar el drift o acepta
This commit is contained in:
Ember 2026-06-20 02:54:25 +00:00
parent 8a9dc4e53b
commit a2e19b154f

View file

@ -0,0 +1,45 @@
---
episode_id: "274706a7-f358-4818-9009-f84ac4e863d2"
puente_flat: "TRAZA_la-historia-de-la-decisin-curar-el-dri_S20260619.R3_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260619.WIKI_MEMORIA_SCRUB_AVISO"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 3 — PostgreSQL: 📖 La historia de la decisión — ¿curar el drift o aceptarlo?"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-20T02:54:25.372434+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Reconciliador C2 (detección) commiteado: `ff89b24` triple-remoto. **Drift caracterizado y corregido** — el deliverable está.
### 📖 La historia de la decisión — ¿curar el drift o aceptarlo?
**El reframe.** "B" lo elegiste para *cerrar el drift de raíz*. El FORENSE cambió el cuadro: **el drift no era el 92 que asustaba** (eso fue doble falso positivo de llave, cazado por verify-first). El drift **real** es chico y, en su mayoría, benigno. Así que ahora decides algo más matizado: ¿*curar* los gaps reales, o *aceptarlos* (son benignos) y quedarte con el reconciliador como monitor?
**De dónde viene.** Construí el reconciliador → reveló que uní por llave equivocada (episode_id uuid4≠uuid5) → corregí a `puente_flat` → reveló un 2º detalle (Qdrant usa `puente_id`) → corregí → **drift real**:
| Gap | n | Severidad |
|---|---|---|
| Qdrant huérfanos (basura) | **0** | ✅ Qdrant 100% limpio |
| PG sin embeber en Qdrant | **9** | 🟡 real — 9 episodios NO recuperables por búsqueda semántica (sí por PG/exact) |
| PG sin escribir a Neo4j | **18** | ⚪ grafo — lag F5 |
| Neo4j legacy sin PG | **15** | ⚪ episodios reales legacy (no borrar, per ADR) |
**Consecuencias por camino:**
- 🟡 **Curar** — re-embeber los 9 a Qdrant (los vuelve semánticamente recuperables, el gap de más valor) + opcional re-drive 18 a Neo4j. Es **data-op load-bearing** (escribe a Qdrant/Neo4j re-corriendo crisol F3/F5 para esos episodios). Lleva parity casi-exacta.
- ⚪ **Aceptar + monitorear** — PostgreSQL (canónico) está completo, Qdrant sin basura, el drift es benigno. Dejo el reconciliador como detector periódico (capa detección de C2). Los 9 quedan recuperables por exact/PG, solo no por semántica.
**Mi inclinación, razonada:** **curar SOLO los 9 Qdrant-missing** (es el único gap con impacto real — recuperabilidad semántica) y **aceptar** el resto (Neo4j 15/18 es grafo-lag + legacy benigno). El re-embed de 9 es acotado y de valor directo; re-driver 33 nodos de grafo es esfuerzo por ganancia marginal. **Lo que cambiaría mi voto:** si quieres parity cross-store exacta como invariante (no solo recuperabilidad), entonces curamos los 3 gaps.
**La pregunta esencial —solo tú:** *¿curo los 9 Qdrant-missing (re-embed, valor: recuperabilidad semántica) y dejo lo demás benigno, o quieres parity exacta de los 3 stores?*
### 📍 PARA JOHN — R14
- **Hice:** construí el reconciliador C2 (detección cross-store por `puente_flat`), cacé 2 falsos positivos de llave (verify-first), caractericé el drift REAL (chico, Qdrant limpio), commit `ff89b24` triple-remoto.
- **Falta:** decidir la curación (los 9 Qdrant-missing valen; el resto es benigno).
- **Elige:** 🟢 **A** curar los 9 Qdrant-missing (re-embed) · 🟡 **B** parity exacta (curar los 3 gaps) · ⚪ **C** aceptar benigno + dejar el reconciliador como monitor.