docs(metodo): máster 2026-08-29 (6) — raíles de la purga, la frontera del texto y el push por ámbito

Re-estampado. Cambios del máster desde el reparto anterior:
- Entrega/Git: el límite del `git add` con ruta explícita (no protege si el
  cambio ajeno está en el mismo fichero) · medir dos veces caza el arrastre.
- §7: el veredicto va en la PRIMERA PALABRA del campo · un `id` es ancla débil,
  discrimina una cifra · la frontera «no ejecutes, delega» falla con el TEXTO, y
  el criterio que sí para es «¿esto tiene un tipo de sesión propio?».

Sólo se toca .metodo/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
sirxavor 2026-08-29 20:09:32 +02:00
parent 89504a3a31
commit 801394335d
3 changed files with 50 additions and 7 deletions

View File

@ -1,2 +1,2 @@
4cef3371e4ec9258933baf34cc23ee757542631a3e36c899f3bb9808ea8b3f3b metodo.md
3b35cfedfe36441d5c2b9b8e543657119a76daaebf6b317bcc4918b2cb7ca9b7 bin/metodo
847436a4133ca8287d75a493a1ca363670c632a6c219f3628db9ade82274731a metodo.md
ca4a7a3ab4e9db733fa8cd7a11d678531233e475bcf1ff229498ea4518a4b5d7 bin/metodo

View File

@ -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 <sha> <AAAA-MM-DD> <motivo en una línea>
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) ──────────────

View File

@ -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