diff --git a/.metodo/CHECKSUMS b/.metodo/CHECKSUMS index 33a5469..d736f06 100644 --- a/.metodo/CHECKSUMS +++ b/.metodo/CHECKSUMS @@ -1,2 +1,2 @@ -4cef3371e4ec9258933baf34cc23ee757542631a3e36c899f3bb9808ea8b3f3b metodo.md -3b35cfedfe36441d5c2b9b8e543657119a76daaebf6b317bcc4918b2cb7ca9b7 bin/metodo +847436a4133ca8287d75a493a1ca363670c632a6c219f3628db9ade82274731a metodo.md +ca4a7a3ab4e9db733fa8cd7a11d678531233e475bcf1ff229498ea4518a4b5d7 bin/metodo diff --git a/.metodo/bin/metodo b/.metodo/bin/metodo index 038043a..fc5a132 100644 --- a/.metodo/bin/metodo +++ b/.metodo/bin/metodo @@ -290,11 +290,36 @@ check_commits() { # verde entrena a ignorar los rojos (`D107`, misma razón que lo puso verde por primera vez). # ⛔ Lo que NO se hizo: mover `adopted_commit` hacia delante para callarlo. Eso es editar la # declaración hasta que la alerta calle (§1), y además perdona todo lo que haya en medio. - while IFS= read -r s; do - printf '%s' "$s" | grep -qE '^(feat|fix|docs|ci|refactor|test|chore|build|perf|semaforo|semáforo)(\(.+\))?!?: .' \ - || { bad "commit no-Conventional: \"$s\" (C25)"; bad_c=$((bad_c+1)); } - done < <(git -C "$ROOT" log --format=%s $range 2>/dev/null) - [ "$bad_c" -eq 0 ] && ok "los ${n} commit(s) desde la adopción siguen Conventional" + # ── EXCEPCIONES DECLARADAS (2026-08-29, Xavier) ──────────────────────────── + # El problema que resuelven, medido: el PRIMERO que rompe C25 con historia YA EMPUJADA condena su + # repo a rojo permanente — reescribir está descartado (los shas se citan en corpus de OTROS + # frentes y hay commits encima) y mover `adopted_commit` está prohibido (§1: editar la declaración + # hasta que la alerta calle). A partir de ahí `metodo check` deja de significar nada en ese repo, + # y ÉSE es el daño, no los commits. + # ⚠️ Y no vale ensanchar la gramática como con `semaforo:`: aquello era un TIPO legítimo y + # recurrente; un mensaje mal escrito es un ERROR, y para el error no había salida ninguna. + # ⇒ Se admite excepción, pero **DECLARADA**, con las cuatro propiedades que la separan de callar: + # (1) NOMINAL, por sha exacto y uno por línea: no hay rangos ni patrones, así que no se puede + # "declarar de más" sin escribir cada caso a mano. + # (2) FECHADA Y MOTIVADA: la línea dice cuándo y por qué no se puede arreglar. + # (3) VISIBLE: se CUENTAN y se IMPRIMEN siempre. El gate no dice «pasa» a secas, dice con + # cuántas excepciones pasa — el coste se sigue viendo; lo que desaparece es el ruido eterno. + # (4) NO PERDONA EL FUTURO: sólo silencia los shas escritos. Ésa es la diferencia con mover el + # sello, que además perdona todo lo que haya en medio. Probado con control negativo. + # Formato de `.metodo/EXCEPCIONES` (del repo; NO se vendoriza — cada uno lleva las suyas): + # C25 + local excf="$ROOT/.metodo/EXCEPCIONES" exc_c=0 sha subj + while IFS=$'\t' read -r sha subj; do + [ -n "$sha" ] || continue + printf '%s' "$subj" | grep -qE '^(feat|fix|docs|ci|refactor|test|chore|build|perf|semaforo|semáforo)(\(.+\))?!?: .' && continue + if [ -f "$excf" ] && grep -qE "^C25[[:space:]]+${sha}([[:space:]]|$)" "$excf"; then + exc_c=$((exc_c+1)); continue + fi + bad "commit no-Conventional: \"$subj\" ($sha) (C25) — arréglalo, o decláralo en .metodo/EXCEPCIONES si ya está empujado" + bad_c=$((bad_c+1)) + done < <(git -C "$ROOT" log --format="%h%x09%s" $range 2>/dev/null) + [ "$exc_c" -gt 0 ] && warn "C25: ${exc_c} commit(s) con EXCEPCIÓN DECLARADA en .metodo/EXCEPCIONES (historia ya empujada; NO perdona lo que venga después)" + [ "$bad_c" -eq 0 ] && ok "los ${n} commit(s) desde la adopción siguen Conventional$([ "$exc_c" -gt 0 ] && printf ' (%s con excepción declarada)' "$exc_c")" } # ── Check 6 · el puntero de enrutado existe y RESUELVE (raíl 8) ────────────── diff --git a/.metodo/metodo.md b/.metodo/metodo.md index 2a4c0e1..1b7b483 100644 --- a/.metodo/metodo.md +++ b/.metodo/metodo.md @@ -1085,6 +1085,24 @@ relevo no transmite y lo que un sucesor necesita **en los primeros diez minutos* frente lleva, escrito y al día, **cómo se trabaja hoy**: dónde se edita, cómo se aplica, cómo se sabe en treinta segundos en qué estado está el banco, y **qué está publicado y qué no**. +⛔ **Y LA FRONTERA DE «NO EJECUTES, DELEGA» SE SOSTIENE BIEN PARA MÁQUINAS Y MAL PARA TEXTO.** Ante +el hierro la pregunta se hace sola —*¿esto puede romper algo?*—; ante el corpus **no aparece**, +porque quien coordina **escribe en él todo el día legítimamente** —avisos, decisiones, bitácora— y +una pasada de ordenación **se siente como más de lo mismo**. **No lo es**: reescribe **memoria +compartida que leen todas las sesiones**, y por eso su propio procedimiento la declara **única**. +*(Cicatriz 2026-08-29: una orquestadora leyó el workflow de ordenación **entero**, tomó las medidas y +**empezó a hacerlo ella**. Lo correcto era pedir que se abriera esa sesión y pasarle el encargo. La +paró el usuario: «estaba esperando a ver si me sacabas un mensaje para que te abriera una sesión».)* +⇒ ⭐ **El criterio que sí para, y no es ninguno de los dos que se usan por instinto**: no es *«¿sé +hacerlo?»* ni *«¿es peligroso?»* — es **«¿esto tiene un TIPO DE SESIÓN PROPIO?»**. Si lo tiene, **se +delega aunque sea texto, aunque sea barato y aunque sepas hacerlo**. +⇒ ⛔ **Y el mecanismo del fallo, que es lo transferible**: **un documento que describe un TIPO DE +SESIÓN se lee como un MÉTODO que aplicar uno mismo.** Son las dos cosas a la vez —describen la sesión +*y* contienen su método— y **nada en el texto obliga a decidir qué lectura estás haciendo**: un +método **invita a ejecutarlo**, un tipo de sesión **invita a delegarlo**, y el mismo fichero produce +las dos conductas. ⇒ Por eso un documento así **lo dice en su primera línea**: *«esto lo hace una +sesión propia; si lo estás leyendo y no eres ella, tu trabajo es escribir su encargo»*. + ⛔ **Y LA UNIDAD DE MEDIDA DEL CORPUS ES EL TOKEN, NO LA LÍNEA** *(Xavier, 2026-08-29)*. Contar líneas **hace invisible el problema real**: una línea de **8.196 caracteres** y una de **70** cuentan igual, y en los corpus de este árbol **eso no es una anomalía, es la norma** — un `AVISOS.md` con