chore(metodo): gate del reparto — la matriz avisa si lo editado no ha viajado

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
sirxavor 2026-08-31 13:00:22 +02:00
parent 7be163a03c
commit 8a24fb5fdb
2 changed files with 26 additions and 1 deletions

View File

@ -1,5 +1,5 @@
fe3263dd8d8dde7173757d0308246942dd0bdf40a743f6ad832ee946375bc722 metodo.md
50b430881762d9af218fe9de0deb48b0d7c87a9e2a8bbe6620b2ee16e959cd3d bin/metodo
420e223b19e57a84181bfd5585ab4b63e3c7ec6df637930b51efb6d12f43d127 bin/metodo
f89b71bdf31028b05075636c1763c964e379bc37a00e0357d1c23a4dd19c09aa workflows/README.md
cc241bbecf9647c747b8525b3a6b527455cd50ca0312caa44bc3544342c8ac41 workflows/comunicacion-entre-sesiones.md
2b9037f6dd57b5598c70a676cb728556654f05d1c5b024e7b716864659f7b884 workflows/sesion-ejecucion.md

View File

@ -94,6 +94,28 @@ info() { printf ' \033[36minfo\033[0m %s\n' "$*"; } # censo, NO veredicto: no
# contando celdas a mano. ⚠️ Y el contador tiene su propia trampa, pagada al escribirlo:
# `awk -F'|'` NO distingue `\|` de `|`, así que decía «sigue rota» sobre una fila ya arreglada.
# Se cuentan pipes NO precedidos por barra invertida, carácter a carácter. Sin atajos.
# ⛔ Gate del REPARTO (2026-08-31). Decidible sin adivinar ⇒ se ata. Nace de una ventana real:
# tres raíles entraron a la matriz y NO se repartieron, así que la copia sellada de los 27 repos
# iba por detrás — y un puntero a `.metodo/metodo.md` apuntaba a un sitio donde el raíl no estaba.
# ⭐ Y eso es el propio raíl de §6 en su forma más pura: escrito, correcto, e invisible desde donde
# se usa. Un puntero roto NO avisa: no encuentras lo que buscabas y concluyes que no existe.
# `update` sella aquí lo que reparte; `check` compara. Sólo aplica a la MATRIZ.
_huella_reparto() { { tr -d '\r' < "$SELF_ROOT/metodo.md"; tr -d '\r' < "$SELF_ROOT/bin/metodo"; } | md5sum | cut -d' ' -f1; }
check_reparto_al_dia() {
_is_matriz || return 0
hdr "la matriz está repartida (lo editado ha viajado)"
local sello ahora
sello=$(cat "$SELF_ROOT/.metodo/ULTIMO-REPARTO" 2>/dev/null)
ahora=$(_huella_reparto)
if [ -z "$sello" ]; then
info "sin sello de reparto todavía — se escribe en el próximo 'metodo update'"
elif [ "$sello" = "$ahora" ]; then
ok "lo que hay en la matriz es lo que se repartió"
else
bad "la MATRIZ ha cambiado desde el último reparto — corre 'metodo update' en los clientes, o su copia sellada (y cualquier puntero a ella) va por detrás"
fi
}
check_semaforo_forma() {
local f="$ROOT/workflows/sesiones-activas.md"
[ -f "$f" ] || return 0
@ -887,6 +909,7 @@ EOF
_stamp_gitattributes "$tgt"
_ga_verifica "$tgt"
_stamp_pointer "$tgt"
_is_matriz && _huella_reparto > "$SELF_ROOT/.metodo/ULTIMO-REPARTO"
echo "metodo init: $tgt inicializado — .metodo/ (máster $mver) + doc/ de CUATRO capas (backlog · decisiones · AVISOS · bitácora)."
echo " siguiente: siembra doc/backlog.md con el trabajo abierto de hoy y corre 'metodo check .'"
}
@ -929,6 +952,7 @@ cmd_update() {
_stamp_gitattributes "$tgt"
_ga_verifica "$tgt"
_stamp_pointer "$tgt"
_is_matriz && _huella_reparto > "$SELF_ROOT/.metodo/ULTIMO-REPARTO"
# Un destino SIN git recibe la copia igual, pero esa copia no tiene historial ni
# marcha atrás. ⚠️ NO se afirma que «no tenga dueño»: eso es una INFERENCIA y el update no puede
# medirla — una carpeta a medias suele ser una PAUSA de su dueño, no un defecto. Se ve, y ya.
@ -951,6 +975,7 @@ cmd_check() {
printf 'metodo check — %s\n' "$ROOT"
check_drift
check_apendices_no_viajan
check_reparto_al_dia
check_semaforo_forma
check_semaforo_en_vuelo
check_ids