diff --git a/.metodo/CHECKSUMS b/.metodo/CHECKSUMS index 179df35..a176c0b 100644 --- a/.metodo/CHECKSUMS +++ b/.metodo/CHECKSUMS @@ -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 diff --git a/.metodo/bin/metodo b/.metodo/bin/metodo index a2847f7..99416a4 100644 --- a/.metodo/bin/metodo +++ b/.metodo/bin/metodo @@ -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 diff --git a/.metodo/metodo.md b/.metodo/metodo.md index 47ac057..00ae0d4 100644 --- a/.metodo/metodo.md +++ b/.metodo/metodo.md @@ -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