diff --git a/.metodo/CHECKSUMS b/.metodo/CHECKSUMS index a176c0b..232e4b2 100644 --- a/.metodo/CHECKSUMS +++ b/.metodo/CHECKSUMS @@ -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 diff --git a/.metodo/bin/metodo b/.metodo/bin/metodo index 99416a4..b0510ce 100644 --- a/.metodo/bin/metodo +++ b/.metodo/bin/metodo @@ -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