chore(metodo): lo medido se escribe en la capa del que EJECUTA, no del que DECIDE

Tres railes nuevos en §6: el dato correcto que cae en la capa del ejecutor y es
invisible desde donde se decide; el instrumento que no puede ver el estado malo
y contesta con aplomo; y mtime/ctime para datar un artefacto.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
sirxavor 2026-08-31 12:55:00 +02:00
parent 087819ff77
commit 7be163a03c
3 changed files with 105 additions and 3 deletions

View File

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

View File

@ -89,6 +89,24 @@ info() { printf ' \033[36minfo\033[0m %s\n' "$*"; } # censo, NO veredicto: no
# propósito: el fichero no puede saber si el dueño respira, y un gate que lo adivinara daría
# rojos crónicos, que es la ceguera que este mismo Método prohíbe. Queda como criterio
# humano, y se dice — o alguien lo mecanizará «por completitud» y creará el rojo permanente.
# ⛔ Gate de FORMA de la tabla (2026-08-31). Decidible sin adivinar ⇒ se ata.
# Nace de que una fila heredó una celda de más al copiarse de otra, y NADA avisó: se pilló
# 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.
check_semaforo_forma() {
local f="$ROOT/workflows/sesiones-activas.md"
[ -f "$f" ] || return 0
hdr "forma de la tabla del semáforo (4 celdas por fila)"
local mal
mal=$(awk '/^\| 2026/ { l=$0; c=0; for(i=1;i<=length(l);i++){ ch=substr(l,i,1); if(ch=="|" && substr(l,i-1,1)!="\\") c++ } if(c!=5) printf "%d ", NR }' "$f")
if [ -n "$mal" ]; then
bad "fila(s) con celdas de más o de menos en línea(s): ${mal}— un | sin escapar parte la celda y el estado se lee en la columna equivocada"
else
ok "$(grep -c '^| 2026' "$f") filas, todas con 4 celdas"
fi
}
check_semaforo_en_vuelo() {
local f="$ROOT/workflows/sesiones-activas.md"
[ -f "$f" ] || return 0 # sólo aplica donde vive el semáforo (el árbol)
@ -96,11 +114,13 @@ check_semaforo_en_vuelo() {
# ⛔ El sujeto es LA CELDA DE ESTADO, no la línea. La v1 hacía `grep` de 🟢 sobre la línea entera
# y marcó como viva una fila CERRADA que usaba 🟢 como PROSA dentro de una predicción — el gate
# perdió su sujeto. Y una fila CERRADA/CANCELADA queda fuera pase lo que pase con su texto.
# ⛔ Una fila 🟠 DUEÑO AUSENTE NO cuenta como viva: no tiene quien sostenga su estado.
# Se excluye EXPLÍCITAMENTE, no por accidente de que el marcador rompa el ancla.
# ⛔ Y NO se usa `grep -c`: imprime 0 **y además sale con código 1**, así que un `|| echo 0`
# añadía un segundo cero y `[ -gt ]` reventaba — el gate no podía salir VERDE.
local vivas sin
vivas=$(grep -c "| 🟢" "$f" || true)
sin=$(grep "| 🟢" "$f" | grep -vc "EN VUELO" || true)
sin=$(grep "| 🟢" "$f" | grep -v "DUEÑO AUSENTE" | grep -vc "EN VUELO" || true)
if [ "$sin" -gt 0 ]; then
bad "$sin de $vivas fila(s) viva(s) sin bloque EN VUELO — una fila viva sin estado en vuelo no releva a nadie"
else
@ -931,6 +951,7 @@ cmd_check() {
printf 'metodo check — %s\n' "$ROOT"
check_drift
check_apendices_no_viajan
check_semaforo_forma
check_semaforo_en_vuelo
check_ids
check_headings

View File

@ -905,6 +905,54 @@ mirar**. Las dos veces lo cazó la sesión nueva, que era la única que **no dab
⇒ ⭐ **Y las tres de este bloque son la misma familia con el fallo movido de sitio**: **(a)** falla
**a quién** · **(b)** falla **que no se dijo** · **(c)** falla **cuándo**. En las tres **el dato es
correcto** — lo que está mal es **a quién, o desde cuándo, se refiere**.
⛔⛔ **LO QUE SE MIDE SE ESCRIBE EN LA CAPA DEL QUE EJECUTA, NO EN LA DEL QUE DECIDE — y por eso es
correcto, está escrito, y quien decide no puede verlo.** Evidencias, scripts de banco, mensajes de
commit, comentarios dentro de un rol: **todos son sitios donde el trabajo cae de forma natural** y
**ninguno se lee para decidir**.
*(Medido 2026-08-31: **tres instancias en una sola jornada**, en el mismo frente y todas ciertas —un
sujeto de prueba documentado en un directorio de evidencias y un script de banco · una deuda escrita
en el mensaje de un commit · una versión de herramienta medida cinco días antes, en un aviso, un
comentario del rol y la cabecera de una comprobación—. **Las tres las destapó otra sesión leyendo por
casualidad. Ninguna la cazó un gate.** Y en las tres, quien decidía llegó a proponer trabajo ya hecho
o a operar con un riesgo que no existía.)*
**No es descuido de nadie**: las cuatro capas están pensadas **para el que ejecuta**. Falta el gesto
que las cruza. ⇒ **Al medir algo que cambia lo que otro decidiría, la pregunta no es «¿lo he
escrito?» sino «¿lo va a VER quien decide?»** — y el sitio donde cae solo casi nunca es ése.
**Y un careo por FECHAS no lo caza**: eso detecta *«la capa va por detrás»*; esto es **«el dato
nunca entró en ninguna capa»**. Son dos enfermedades y la fecha sólo ve una.
⛔ **UN INSTRUMENTO QUE NO PUEDE VER EL ESTADO MALO DEVUELVE LO MISMO EN LOS DOS ESTADOS — Y CONTESTA
CON APLOMO.** No se equivoca: **no puede distinguir**, y su salida no lo dice.
*(Cicatriz 2026-08-31: `clevis luks list` **no puede desmentir** la existencia de una ranura de
contraseña — devuelve `1: tpm2` **con una ranura y con dos**. Se comprobaba justamente si esa frase
seguía abriendo el disco. La respuesta la dio otro instrumento, `luksDump`, que **sí enumera todas
las ranuras**.)*
⇒ Es la cara consultiva de *«un gate que no puede enrojecer»*: allí el veredicto no puede ser malo;
aquí **la pregunta no puede tener la respuesta que buscas**. ⇒ **Antes de creer una respuesta
tranquilizadora, pregúntate si ese comando PODRÍA haber dicho lo contrario** — y si no, cambia de
instrumento antes de cambiar de conclusión.
⇒ ⭐ Y para **datar** un artefacto en una máquina: **el `mtime` es lo que alguien decidió que
pusiera; el `ctime` es cuándo pasó** *(un `useradd -m` copia `/etc/skel` **conservando fechas**, así
que un home puede llevar una fecha meses anterior a la máquina)*. ⛔ Y la zanja obvia —carear el
`stat` del directorio contra el de su contenido— **no separa las dos hipótesis**: las mueve las dos.
⛔ **UN DOCUMENTO PUEDE ACERTAR EL EFECTO Y EQUIVOCARSE DE COMPONENTE — y entonces manda a quien lo
lea a depurar el sitio equivocado.** El síntoma correcto, la causa correcta y el arreglo correcto no
salvan a un texto que nombra mal **de quién es el fallo**.
*(Cicatriz 2026-08-25→31: un aviso decía «el instalador no baja el seed» y nombraba a **subiquity**.
Quien pide las cuatro rutas y **valida la cadena TLS** es **`cloud-init`**; subiquity **consume** lo
que cloud-init ya le entregó. El aviso era **útil y accionable durante seis días** —el síntoma que
describía es el que se ve— y aun así habría mandado a depurar el componente equivocado. Lo escribió
un frente, **lo heredó otro al citarlo**, y lo corrigió el segundo al medirlo.)*
⇒ Es la familia de **el instrumento que no dice de qué habla**, con una arista nueva: aquí **el
documento no dice de QUIÉN**. Y muerde el doble cuando el texto acaba alimentando **una guía
externa**, donde la diferencia entre *«lo vimos fallar»* y *«falla este componente»* es la
credibilidad entera.
⇒ ⭐ **Y la lección de instrumento**: un aviso que **se ha editado varias veces** no está por eso al
día. Puede haberse actualizado **por otro sitio** y conservar el error viejo **en la parte que nadie
volvió a leer**. ⛔ Por eso **un careo por FECHAS no basta**: caza el corpus que se queda atrás, **no
el que se actualiza y conserva un error**. Son **dos enfermedades**, y la fecha sólo ve una.
**La familia, que es lo que hace que se retengan las dos**: son primas de las cicatrices del
instrumento sin sujeto —el log sin *quién*, el `uptime` sin *cuándo*, el `push` sin *de quién*—, pero
**con el sujeto movido de sitio**. Allí el dato no decía de qué hablaba; aquí **el dato es correcto y
@ -1056,6 +1104,39 @@ copia pura.)*
`sesion-ordenacion-docs.md` (capa `workflows/`)— pero vivía **en el workflow de la sesión
que LIMPIA, no en el de las que ESCRIBEN**, así que se incumplía sistemáticamente y se pagaba
después en una pasada. Por eso está aquí ahora.
**COMPROBAR QUE ALGO ESTÁ NO ES COMPROBAR QUE HACE AQUELLO PARA LO QUE EXISTE.** Y la trampa es
que **el artefacto puede ser correcto**: verificarlo sale **VERDE** y aun así el aviso sigue abierto.
*(Cicatriz 2026-08-31: un aviso pedía que el testigo de sincronía apareciera **donde mira quien
depura**. La línea se construyó, es correcta, nombra los dos identificadores y no miente… pero la
escribe un script que va a **un fichero de log distinto** del que recibe el resumen de la ejecución.
**El testigo existe y no viaja pegado a lo que se lee** — o sea, el gesto que el aviso existía para
quitar **sigue ahí**. Y lo destapó **una sola pregunta**: «¿dónde queda lo que imprime?».)*
**La pregunta que lo caza no es «¿está?», es «¿QUIÉN LO VA A VER, Y CUÁNDO?»** — un piso por encima
de comprobar la fuente: ahí la fuente declaraba y el artefacto no reconciliaba; **aquí el artefacto es
correcto y está en el sitio equivocado**.
⛔⛔ **Y UN MENSAJE DE COMMIT NO ES UNA CAPA DEL CORPUS.** Lo dicho **sólo ahí** es, a efectos de
quien decide, **invisible**: quien lee `AVISOS.md` —que es lo que se manda leer primero— lee
**«RESUELTO»**.
*(Mismo caso: la sesión que construyó **ya había medido** que el testigo caía en otro log **y lo dejó
escrito, honesta y explícitamente… en el mensaje del commit**. Una deuda **medida, dicha y aun así
invisible desde el sitio donde se decide**. La encontró su relevo **por casualidad**, mirando el
`git log` para copiar la convención de mensajes.)*
**Un mensaje de commit es el testigo de un CAMBIO, no el estado de un FRENTE.** Si lo que sabes
cambia el estado, va a su capa **además** —`AVISOS.md`, `decisiones.md`, `backlog.md` o la bitácora—
y el commit **puede** repetirlo. ⛔ **Nunca sólo en el commit**: es la quinta capa que nadie lee y que
⇒ ⛔ **Y hay un segundo filo, peor que la invisibilidad: UN AVISO CON FECHA DENTRO DE UN ARTEFACTO SIN
FECHA CADUCA SIN AVISAR.** Un mensaje de commit está **congelado**: se escribió en un instante y el
mundo siguió. Un *«esto NO está vivo todavía»* escrito a las 14:42 **era cierto**… y a las 15:10, con
la pieza construida y desplegada, **es una mentira que nadie ha tocado** — y el que lo lea mañana no
tiene forma de saber cuál de las dos cosas está leyendo.
*(Medido 2026-08-31, segundo frente en el mismo día: el aviso fue **cierto durante 28 minutos**.)*
⇒ Por eso un aviso **vive en una capa que se REVISA** —donde alguien lo cierra cuando deja de valer—
y no en un artefacto que **nadie vuelve a abrir para corregirlo**. ⭐ La prueba de si un sitio sirve
para un aviso es: **¿alguien va a volver aquí a cerrarlo?** Si la respuesta es no, ese sitio **sólo
sirve para lo que no caduca**.
además **no se puede recorrer** (§8).
**Al escribir, decide el destino UNA vez**, y los destinos son **CUATRO**: el corpus de un repo
tiene **cuatro capas**, no tres. *¿Es una decisión cerrada, de las que otra sesión no puede
contradecir sin PARAR?* → **`doc/decisiones.md`**, con su texto **íntegro**. *¿Es trabajo — un item