ember-memory-test/episodes/TRAZA_hecho-john-el-contrato-nico-ya-existe_S20260610.R9_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD.md
Ember 65201b3cfc feat(episode): TRAZA_hecho-john-el-contrato-nico-ya-existe_S20260610.R9_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD
Skill: TESSERA | Type: reflection
Summary: EPISODIO 9 — LEXICON_COSECHA:  Hecho, John — el contrato único ya existe como C
2026-06-11 23:00:43 +00:00

3.3 KiB

episode_id puente_flat session_code acto_dialogico actor_flujo criticidad_aegis skill_dominante fase_proyecto tipo_semantico summary_one_line source_type trust_boundary created_at relectura_tagged forgejo_commit_sha
c9273ff0-b6eb-4c2d-b74f-d0fb7f9928a9 TRAZA_hecho-john-el-contrato-nico-ya-existe_S20260610.R9_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD S20260610.SELFAWARENESS_MISION_CRITICA informar multi_actor low TESSERA operations reflection EPISODIO 9 — LEXICON_COSECHA: Hecho, John — el contrato único ya existe como CÓDIGO de p claude_code internal 2026-06-11T23:00:06.984644+00:00 false pending

Hecho, John — el contrato único ya existe como CÓDIGO de producción: 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