ember-memory-test/episodes/TRAZA_c-los-tres-bugs-de-la-zona-de-exclusin_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD.md
Ember 8a05304d46 feat(episode): TRAZA_c-los-tres-bugs-de-la-zona-de-exclusin_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD
Skill: NONE | Type: troubleshooting
Summary: EPISODIO 1 — MNEMO_PRE_DIGEST: C — los tres bugs de la zona de exclusión
2026-07-27 04:32:19 +00:00

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
5f4459c2-c51f-4bc8-b345-95ee5cb98879 TRAZA_c-los-tres-bugs-de-la-zona-de-exclusin_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD S20260726.ARCO_CICLO4_AUTOMEJORA informar multi_actor low NONE operations troubleshooting EPISODIO 1 — MNEMO_PRE_DIGEST: C — los tres bugs de la zona de exclusión claude_code internal 2026-07-27T04:32:09.736776+00:00 false pending

Cerrado. Push a los tres, verificado por contención, no por el mensaje del push: ed313d5f..2f85b797 en forgejo, origin y sriyantra.

C — los tres bugs de la zona de exclusión

Elegí C primero y resultó ser la decisión correcta por una razón que no había previsto: el hallazgo más grave no estaba en tu lista. Apareció mientras probaba la fragilidad del segundo.

El bug que nadie había visto. _files_overlap hacía startswith(b + "/") sobre un valor que ya terminaba en /, comparando contra "docs//". Efecto: declarar un directorio en ACTIVO.md no reservaba absolutamente nada de lo que hay dentro.

Falso negativo puro, sin corrupción de datos ni concurrencia rara: el único mecanismo que impide que dos ventanas se pisen el trabajo tenía un agujero silencioso para toda declaración de directorio.

El markdown arrastrado (tu hallazgo 2) resultó ser el más benigno de los tres: el split(":", 1) corta dentro del negrita y deja '** \x.md'como nombre de archivo, pero el match acertaba **por casualidad** víabasename`. Lo que estaba roto era el match exacto y el de directorio.

El self-lock (tu hallazgo 1) tenía la solución escondida a la vista: el bloque de ACTIVO.md ya declara su Session code: —la identidad estable— y el parser solo miraba el tag libre del encabezado. Otra ventana lo había probado en vivo (dejó S20260726.TEST_EM8 en el archivo) pero no dejó fix ni decisión.

Lo que hace creíble el arreglo: el control positivo. Reverti cada fix en memoria y sus tests se pusieron rojos — 5 asserts para el del directorio, 5 para el markdown, 1 para el self-lock. Y el control que de verdad importaba: un bloque ajeno sigue bloqueando (ajeno → 1 conflicto, ajeno con directorio → 1, propio con tag distinto → 0). Un fix que silencie un guardián es peor que el bug, porque convierte el fallo en invisible.

26 PASS / 0 FAIL en la suite nueva. Sin regresión en las cuatro existentes: correo_protocol 25/25, E2E 5 passed + 1 xfailed, guard 36/36, override 30/30.

A — las dos notas

En FIX_S20260727_override_leyzero_dueno.md quedaron dos secciones nuevas. La primera es el hueco de BLINDADA-29 que descubrimos anoche: el primero que cierra publica el estado de todos, verificado en vivo, y mi cautela no evitó el escenario — solo decidió quién lo ejecutaba.