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
This commit is contained in:
Ember 2026-07-27 04:32:19 +00:00
parent 709d4e868d
commit 8a05304d46

View file

@ -0,0 +1,39 @@
---
episode_id: "5f4459c2-c51f-4bc8-b345-95ee5cb98879"
puente_flat: "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"
session_code: "S20260726.ARCO_CICLO4_AUTOMEJORA"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — MNEMO_PRE_DIGEST: C — los tres bugs de la zona de exclusión"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-07-27T04:32:09.736776+00:00"
relectura_tagged: false
forgejo_commit_sha: "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ía `basename`. 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](docs/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.