feat(episode): TRAZA_fix-drift-embedding-searchv2-protocolo_S20260618.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: TESSERA | Type: troubleshooting
Summary: EPISODIO 1 — LEXICON_COSECHA: Fix drift embedding search_v2 — protocolo 7 fases
This commit is contained in:
Ember 2026-06-19 05:25:52 +00:00
parent 8514f48d67
commit ed710f277b

View file

@ -0,0 +1,43 @@
---
episode_id: "b9a48af2-a8a6-49b1-a2bb-f68ea727b1a4"
puente_flat: "TRAZA_fix-drift-embedding-searchv2-protocolo_S20260618.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260618.VERIFY_FIRST_PASSPORT_FIX"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "TESSERA"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — LEXICON_COSECHA: Fix drift embedding search_v2 — protocolo 7 fases"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-19T05:25:48.668194+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**Fix B completo y pusheado** — commit `087468c` a los 3 remotos. (El DLC advisory cita 5 docs archivados sobre *otros* bugs, no este drift — no requieren AVISO; advisory genérico por commit "fix".)
## Fix drift embedding search_v2 — protocolo 7 fases
**Causa raíz (una frase):** `search_v2.py` (lado READ) embebía las queries con un modelo distinto (`gemini-text-embedding-004`, hardcoded, lib directa) al que el WRITE usa (`text-embedding-3-large` = alias de `gemini-embedding-2`, vía proxy LiteLLM) → los vectores de query no eran comparables con los almacenados → **retrieval degradado silenciosamente**.
| | Antes | Después |
|---|---|---|
| `EMBED_MODEL` | `"gemini-text-embedding-004"` hardcoded | `os.environ.get("EMBED_MODEL", "text-embedding-3-large")`**idéntico al WRITE** |
| Fallback | `litellm.embedding()` lib directa (→ podría ir a OpenAI) | proxy LiteLLM (`LITELLM_URL/embeddings`) — **mismo mecanismo que el WRITE** |
| Camino primario | `litellm_embed` del crisol (canónico) | **intacto** (no tocado) |
Era un bug de **consecuencia real** (no cosmético): un mismatch read/write degrada la búsqueda semántica sin error visible. **write==read** ahora garantizado (verificado: search_v2:57 ≡ qdrant_worker:70). Suite **226/0**, test_search_v2 17/17, docstring stale corregido (DLC-2).
### 📍 PARA JOHN — R9
**Hice:** alineé el embedding READ de `search_v2.py` al canónico del WRITE (commit `087468c`, pusheado). Con esto cerré las dos deudas post-migración `[C2 S20260613]` que quedaban en FEAT-011 (los 4 tests + este drift).
**Falta (deudas nuevas que detecté, no en alcance):** 🟡 wiki-MEMORIA **FROZEN** (96% de 23 páginas stale >30d — el self-awareness lo destapó este turno); 🟡 cosecha LEXICON pendiente (3 archivos con PRE_DIGEST sin `LEXICON_COSECHA` de hoy).
**Mi consejo:** las dos deudas de FEAT-011 están cerradas y verdes. Buen momento para **cerrar la sesión limpia** (actualizar `STATE.md`/`HANDOFF` + cosecha LEXICON, BLINDADA-11). Si prefieres seguir, la wiki-MEMORIA stale es el siguiente candidato natural.
**Para avanzar, elige:** 🟢 **A** *(recomendado)* cerrar sesión (STATE + HANDOFF + cosecha) · 🟡 **B** atacar la wiki-MEMORIA stale · ⚪ **C** otra cosa.
📌 **PILA-PENDIENTES (R9):** ✅ RESUELTAS: drift embedding search_v2 (commit 087468c, write==read, suite 226/0) · 🟡 MED: wiki-MEMORIA FROZEN 96% stale, cosecha LEXICON pendiente · ❓ John: A/B/C.