feat(episode): TRAZA_lo-que-constru_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: advisory
Summary: EPISODIO 1 — MNEMO_PRE_DIGEST: Lo que construí
This commit is contained in:
Ember 2026-07-26 18:48:58 +00:00
parent 70b062034a
commit a6d38ac364

View file

@ -0,0 +1,45 @@
---
episode_id: "69c88ea0-5ddf-41c3-82c5-4ef782b0f09a"
puente_flat: "TRAZA_lo-que-constru_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260726.ARCO_CICLO4_AUTOMEJORA"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "advisory"
summary_one_line: "EPISODIO 1 — MNEMO_PRE_DIGEST: Lo que construí"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-07-26T18:48:42.065692+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**Funciona end-to-end con datos reales.** Un payload real de la cola, materializado, y lo importante:
**El cotejo da verdadero.** Ese es el punto entero del camino C: el archivo no es una copia que haya que creerse — es cotejable contra el vector por su hash. Si mañana alguien pregunta "¿este `.md` y este vector son el mismo contenido?", hay una función que responde en vez de una declaración que confiar.
## Lo que construí
**`lib/episodio_materializer.py`** — contrato de entrada/salida explícito, cinco micro-mecanismos por debajo de 40 líneas, cada uno con su patrón canónico citado (sanitización por lista blanca, clave compuesta ordenable, guard clause, escritura atómica, map con filtrado defensivo).
**`test_episodio_materializer.py`** — 17 tests, con los bordes que suelen olvidarse: payload que no es diccionario, texto vacío, sin hash, y un título con `../../../etc/passwd` para confirmar que ningún nombre puede escribir fuera del directorio base.
**Idempotente**: re-drenar la cola no reescribe archivos con el mismo hash. Sin eso, cada drenaje ensuciaría git con cambios falsos.
## Dos cosas que decides tú, no yo
**Dónde viven los episodios.** Lo ejecuté en un directorio temporal a propósito. Crear `episodios/` en la raíz de tu repositorio es una decisión de estructura tuya.
**El enganche.** No toqué `settings.json` — tu directiva sobre esos ficheros es explícita. La librería está lista; registrarla en el hook de cierre es acto deliberado tuyo.
Y un detalle que prefiero señalar antes de que muerda: **el nombre generado conserva tildes** (`próxima`). Es más legible, pero los nombres con Unicode a veces dan guerra entre Windows, Linux y git. Si prefieres nombres solo ASCII, es una línea.
—
—
**Hice** — El camino C construido y probado: 17 tests verdes y, sobre un episodio real de tu cola, el cotejo archivo-vector dando verdadero. Y de paso resolví por qué B13 llevaba meses incumplida: nunca tuvo mecanismo, era solo un recordatorio. El materializador no repite ese error — es determinista, no depende de que nadie se acuerde.
**Falta** — Dos decisiones tuyas (dónde viven los episodios y el enganche) y, sobre todo, **versionar**. El arco entero sigue sin confirmar en git.