diff --git a/episodes/TRAZA_1-qu-encontr-el-revisor-del-trinquete-y_S20260919.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD.md b/episodes/TRAZA_1-qu-encontr-el-revisor-del-trinquete-y_S20260919.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD.md new file mode 100644 index 00000000..57f06e5d --- /dev/null +++ b/episodes/TRAZA_1-qu-encontr-el-revisor-del-trinquete-y_S20260919.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD.md @@ -0,0 +1,42 @@ +--- +episode_id: "fd4299ef-6a97-4a63-8cb5-d28bd1b3c853" +puente_flat: "TRAZA_1-qu-encontr-el-revisor-del-trinquete-y_S20260919.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD" +session_code: "S20260919.SIDA341A4963ECD" +acto_dialogico: "informar" +actor_flujo: "multi_actor" +criticidad_aegis: "low" +skill_dominante: "NONE" +fase_proyecto: "operations" +tipo_semantico: "troubleshooting" +summary_one_line: "EPISODIO 1 — Ember: 1. Qué encontró el revisor del trinquete y qué hice con ello" +source_type: "claude_code" +trust_boundary: "internal" +created_at: "2026-09-20T01:31:52.219518+00:00" +relectura_tagged: false +forgejo_commit_sha: "pending" +--- + +**CHAT-TEMA-RAÍZ:** ALQUIMIA v2 — fábrica de prompts con enrutado y perfil de derecho colombiano +**R17-SUB-TEMA:** el trinquete pasó su primera revisión adversarial y está listo para que decidas si se cablea + +## 1. Qué encontró el revisor del trinquete y qué hice con ello +`[R17.seccion1.T1]` + +El revisor independiente dio **NEEDS_REVISION** a la v1.0. Registró 13 hallazgos y 7 evasiones nuevas, y no pudo tumbar lo central. Intentó romper cinco cosas: + +- el troceo en dos commits; +- `commit -a`; +- `commit -- ruta`; +- los árboles de trabajo; +- las rutas con espacios. + +En los cinco casos el diseño aguantó. Comparar lo que entra en el commit contra el commit padre, con tolerancia cero, es correcto. Las objeciones iban contra los bordes del diseño, y la mayoría eran acertadas: + +| Hallazgo del revisor | Qué hice en la v1.1 | +|---|---| +| El código 1 de «deniega» es el mismo con el que Python sale cuando falla. Con `|| exit 1`, un Python roto bloquearía todos los commits. | El código de denegación propio pasa a ser **3**. Un `try` global convierte cualquier fallo inesperado en «se deja pasar, y se dice». | +| Borrar `CLAUDE.md` en un commit y restaurarlo más gordo en el siguiente pasaba las dos veces. Eran dos fail-open encadenados. | **Ausente pesa 0.** El segundo commit se compara contra 0 y se deniega. Este cambio también cierra la evasión de la rama huérfana. | +| El permiso «firmado por John» no tenía firma, y el propio mensaje del muro publicaba el comando para fabricarlo. | Lo renombré a **permiso declarado, sin autenticación**. La CLI ya no lo crea y el mensaje ya no explica cómo saltárselo. | +| Tu `pre-commit` sale con 0 en commits de solo renombre o borrado (filtro `ACM`). Un `git mv` suelto metía un archivo entero sin pasar por el trinquete. | Añadí `--no-renames`. Además el bloque va **antes** de esa línea del guion. | +| Ningún test hacía un `git commit` real. | Añadí 5 commits reales con el hook instalado en un repositorio temporal. | +| Otros 8 hallazgos: CRLF, `--techo`, propiedad espejo, control de la medición, imports en cadena, justificación de concurrencia, rutas sin blindar y latido. | Todos quedaron integrados. |