feat(episode): TRAZA_chat-tema-raz-camino-c-fix-embershared_S20260610.R2_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: TESSERA | Type: reflection
Summary: EPISODIO 2 — Neo4j: CHAT-TEMA-RAÍZ: Camino C — fix `ember_shared` + criterios
This commit is contained in:
Ember 2026-06-11 02:06:58 +00:00
parent d9b86cd58c
commit 2d80117df8

View file

@ -0,0 +1,55 @@
---
episode_id: "ab67b241-685d-4d70-84f9-049acb13a5de"
puente_flat: "TRAZA_chat-tema-raz-camino-c-fix-embershared_S20260610.R2_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260610.SELFAWARENESS_MISION_CRITICA"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "TESSERA"
fase_proyecto: "operations"
tipo_semantico: "reflection"
summary_one_line: "EPISODIO 2 — Neo4j: CHAT-TEMA-RAÍZ: Camino C — fix `ember_shared` + criterios"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-11T02:06:53.568539+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**Hallazgo crítico confirmado** `[hard_fact — curl directo a Qdrant este turno]`. Esto cambia el diagnóstico y es exactamente lo que el "medir antes de ampliar" debía cazar.
## CHAT-TEMA-RAÍZ: Camino C — fix `ember_shared` + criterios
### R1-SUB-TEMA: Bug del vector ARREGLADO + tercer bug descubierto + decisión de criterios
### `[R1.seccion1.I1]` — Lo hecho y verificado (parte 1 de Camino C ✅)
| Acción | Estado | Evidencia |
|--------|--------|-----------|
| **Fix A** vector carry-through (`shared_promoter.py` build_promoted_payload, v1.1) | ✅ aplicado | Edit confirmado |
| **Fix B** fail-loud sin vector (`shared_promoter_runtime.py` store_fn) | ✅ aplicado | Edit confirmado |
| **2 property-tests Capa A** (vector preservado / ausente) | ✅ escritos durante | Edit confirmado |
| **Suite completa** | ✅ **7/7 PASSED** | 🧪 pytest este turno |
El bug del **vector-cero (B-NEW01) — el de daño irreversible — está cerrado y verificado.**
### `[R1.seccion2.I2]` — Tercer bug descubierto al medir (B-NEW02, criteria-field-mismatch)
Inspeccioné los payloads reales de `ember_experience`. Las claves son:
`content_text, summary_one_line, aroma_j, aroma_e, actor_flujo, has_decision, importance_score, mode_classifier, session_code, criticidad_aegis…` `[hard_fact]`
**Pero el promotor lee campos que NO existen** en el corpus:
- lee `payload["title"]`**None** (no existe)
- lee `payload["content_preview"]` y `payload["content"]`**None** (el texto real está en **`content_text`**)
- lee `payload["turn_count"]` y `payload["participants"]`**None** (no existen)
**Consecuencia:** aun con el vector arreglado + el cron instalado, el promotor promovería **CERO** episodios — porque `match_trigger_keywords` recibe texto vacío (always None) y `detect_coauthorship` recibe turn_count=0/participants=[] (always False). **Por eso `ember_shared` está realmente en 0.** El vector-cero era el bug que *corrompería* si promoviera; este es el que explica que *no promueva nada*.
### `[R1.seccion3.Q1]` — Decisión de criterios (paso 3) — con su prólogo
Aquí me detengo y te lo presento, John, porque redefinir los criterios es decidir **qué cuenta como memoria relacional John↔Ember** — y eso es una pregunta de valores, no de código.
**Reframe.** No es "arreglar un mapeo de campos". Es **definir qué merece entrar a `ember_shared`** — el store de "lo nuestro". El mapeo de campos es trivial (cambiar `content_preview`→`content_text`); lo no-trivial es el *criterio de selección*.