feat(episode): TRAZA_ciclo-10-ejecutado-los-espejos-ya-no-s_S20260727.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: ATLAS | Type: advisory
Summary: EPISODIO 1 — MNEMO_PRE_DIGEST: 🪞 Ciclo 10 ejecutado — los espejos ya no se escon
This commit is contained in:
Ember 2026-07-27 15:06:24 +00:00
parent 224b87fdae
commit c54d06f845

View file

@ -0,0 +1,41 @@
---
episode_id: "fc107afc-dfb5-4ece-8262-5e6a54a773f3"
puente_flat: "TRAZA_ciclo-10-ejecutado-los-espejos-ya-no-s_S20260727.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260727.ARCO_CICLO10_ESPEJOS"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "ATLAS"
fase_proyecto: "operations"
tipo_semantico: "advisory"
summary_one_line: "EPISODIO 1 — MNEMO_PRE_DIGEST: 🪞 Ciclo 10 ejecutado — los espejos ya no se esconden, y el g"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-07-27T15:06:22.826095+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
# 🪞 Ciclo 10 ejecutado — los espejos ya no se esconden, y el gate casi pisa trabajo ajeno
Commit `49e91129` en los 3 remotos · Muro VERDE al arrancar · **13/13 mutaciones MUERDEN**
## [R1.seccion1.I1] Lo que decidí sobre los 27 espejos (y por qué no fue "añadir un assert")
Un test-espejo comprueba que un archivo contiene cierto texto. Arreglarlo con un assert cosmético sería teatro; la pregunta real es **si esa pertenencia ES la interfaz**. Ejemplo: que `session-start.py` esté registrado en `settings.json` no es "texto en un archivo" — es literalmente lo que el harness ejecuta. Un hook fabricado y no colgado ahí es exactamente el defecto DJ-1 que tienes pendiente.
Así que hice dos cosas. Primero corregí un **bug de orden en mi propia vara**: un test que sí ejerce al sujeto pero cuyo mensaje menciona "frontmatter" caía mal clasificado (dos casos reales). Segundo, introduje el marcador `CONTRATO-DE-PERTENENCIA: <razón>` en la línea del assert — el patrón `pragma: allowlist` que usa detect-secrets: **visible, greppeable y muestreable por el auditor**, con clase propia para que el conteo nunca se esconda. Dos tests anti-abuso lo custodian: sin razón sustantiva no absuelve, y una declaración lejana tampoco.
**Resultado: espejos 27 → 3**, con 24 declarados uno a uno con su razón real.
## [R1.seccion2.T1] El hallazgo que no buscaba
Al ampliar el manifiesto de mutaciones de 7 a 13 (priorizando **muros**: D3 Ley Zero, anti-SSRF, exfiltración por imagen), descubrí algo en vivo: uno de los sujetos nuevos **tenía trabajo sin commitear de la instancia hermana**. Mi gate lo mutó y lo restauró correctamente — verificado: cero rastro de la mutación, su código intacto — **pero si el proceso muere entre mutar y restaurar, ese trabajo ajeno se pierde y no lo salva ni git**.
Lo cerré con dos capas: copia fuera del árbol antes de tocar, y un aviso explícito cuando el sujeto está sucio (ambos verificados en vivo). El modo verdaderamente seguro sigue siendo el clon — como hizo el auditor.
- **Hice:** el ciclo 10 completo (C10-03 + C10-05): espejos de 27 a 3 con declaraciones auditables, mutaciones de 7 a 13 todas mordiendo, y un riesgo de pérdida de trabajo ajeno cerrado antes de que costara nada.
- **Falta:** auditar este ciclo 10 (el muro lo marcará en rojo, como debe ser) y tus decisiones de siempre: DC-6 (hasta el 3 de agosto), DJ-1a, DJ-2a, DJ-3.
- **Mi consejo:** deja que audite el ciclo 10 en frío antes de nada más — sobre todo porque el marcador nuevo es justo el tipo de mecanismo que un auditor debe atacar ("¿te inventaste una vía de escape?"). Si prefieres cerrar aquí, también está limpio: todo commiteado y en los tres remotos.
📌 **PILA (R1):** ⛔ auditar ciclo 10 (mi recomendación) · 🟢 DC-6 (2026-08-03) · ⚪ DJ-1a settings · ⚪ DJ-2a ventana MCP · ⚪ DJ-3 refactor path · 🟡 quedan 3 espejos + 8 suites sin par de mutación (declarados)