feat(episode): TRAZA_hecho-john-el-contrato-nico-ya-existe_S20260610.R13_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: TESSERA | Type: reflection
Summary: EPISODIO 13 — LEXICON_COSECHA: ✅ Hecho, John — el contrato único ya existe como
This commit is contained in:
Ember 2026-06-12 03:07:44 +00:00
parent 044940f7af
commit 5ccebe74ff

View file

@ -0,0 +1,35 @@
---
episode_id: "96fa2ebc-bbcc-403a-9793-a4939aa1765d"
puente_flat: "TRAZA_hecho-john-el-contrato-nico-ya-existe_S20260610.R13_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 13 — LEXICON_COSECHA: ✅ Hecho, John — el contrato único ya existe como CÓDIGO de p"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-12T03:07:36.405477+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
# ✅ Hecho, John — el contrato único ya existe como CÓDIGO de producción: **[scripts/memory_writer.py](scripts/memory_writer.py)** (commit `c913ef5`, push 3/3, desplegado en el servidor MEMORIA)
## El efecto alzheimer, eliminado
Tu razonamiento era exacto: sin memoria operativa, solo el código commiteado sobrevive entre instancias. Ahora el contrato no es una idea de este chat — es un módulo importable:
- **`CanonicalEpisode`** — EL schema (los campos canónicos, `validate()` que rechaza lo que viole el contrato, y `episode_id` **determinista derivado del sha del contenido**: mismo contenido → mismo id, en cualquier instancia, para siempre).
- **`MemoryWriter`** — EL camino único de grabación: dedup por sha **antes** de embeber (no gastar tokens en duplicados) → embed una sola vez → Qdrant + PostgreSQL + Neo4j con el mismo id y el mismo `embedding_model_id` por punto.
- **Invariantes I-MW1..I-MW5 escritos y testeados** — los que hoy nadie garantizaba: key canónica `content` (nunca más `body`/`content_text`), modelo desde UNA fuente env (jamás hardcode), 1 contenido = 1 punto en cada store.
**Verificación (no de palabra):** tests **7/7 PASS** (3 propiedades Hypothesis + 4 unit) · 1 bug real cazado y arreglado durante los tests (registro `sys.modules` para dataclasses) · smoke en servidor: `IMPORT_OK` y la cadena de config resolviendo — hoy devuelve `gemini-embedding-001` (el fallback correcto pre-formateo); cuando corra el formateo, leerá `gemini-embedding-2` del env compartido que el paso 2 crea. Y la prueba bonita del anti-alzheimer: **el mismo episodio produce el mismo `episode_id` (`c1d13f59-…`) en Windows y en Linux** — el contrato es portable de verdad.
Las "reparaciones más adelante" que anticipaste son exactamente el wiring: que `crisol_run.py` y ember-mcp dejen sus caminos propios y llamen esta librería (pasos 7-8, coordinación R-CAT-2). El contrato ya los espera.
📌 **PILA-PENDIENTES (R12):** 🔴 2do GO `--execute --yes-formateo` (sesión fresca) · 🟠 wiring crisol/mcp → `memory_writer` (R-CAT-2) · 🟡 B15 LEXICON_COSECHA antes del cierre + heredados
📁 **BITÁCORA S20260610.SELFAWARENESS_MISION_CRITICA.R12:** 📖 READ scripts/MAP.md (gate) · 🆕 WRITE memory_writer.py (+280) + test_memory_writer.py (+90) · 🧪 TEST_POST: `pytest test_memory_writer.py` → ERROR colección → fix sys.modules → **7 passed** · 🧪 TEST_POST: `python memory_writer.py` → smoke puro OK (id determinista + 16 keys) · ⚡ BASH scp → servidor + smoke `IMPORT_OK model_id=...001` (fallback correcto) · ⚡ BASH commit `c913ef5` + push origin/forgejo/sriyantra 3/3