From 4a9e34129a460d82d8b59d7d2b23418805b0e546 Mon Sep 17 00:00:00 2001 From: sirxavor Date: Thu, 3 Sep 2026 14:09:42 +0200 Subject: [PATCH] =?UTF-8?q?chore(metodo):=20reparto=20=E2=80=94=20el=20cri?= =?UTF-8?q?terio=20no=20previene=20el=20conflicto,=20y=20un=20rojo=20prest?= =?UTF-8?q?ado=20entrena?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dos railes de poniente. Y arreglado el gate del reparto: si la matriz tiene trabajo sin commitear es NOTA, no rojo. Las dos ramas ejercitadas. Solo .metodo/ — byte a byte desde la matriz. Sesion: superadmin Co-Authored-By: Claude Opus 5 --- .metodo/CHECKSUMS | 4 +-- .metodo/bin/metodo | 11 +++++++ .metodo/cicatrices.md | 72 ++++++++++++++++++++++++++++++++++++++++++ .metodo/metodo.md | 73 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 2 deletions(-) diff --git a/.metodo/CHECKSUMS b/.metodo/CHECKSUMS index f70b1ba..32e35cb 100644 --- a/.metodo/CHECKSUMS +++ b/.metodo/CHECKSUMS @@ -1,5 +1,5 @@ -41997a7e81b1178a3ecfd643b56d8dcb1e106ac75c36a099c4170612e46fd53b metodo.md -1e9242642ed009b993a9ca613b1f4d438748b91eadf5af1f6dab669c87a560cb bin/metodo +0b309b932d65419946a6e9bfd7e39d164693789a90b4be75a6655c146d3fce84 metodo.md +71b3e3ace88ef15f0f18b3c0d7a4c5b6a340414a881042d0cc2bd4e8f2583d58 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 8303333..1b711a9 100644 --- a/.metodo/bin/metodo +++ b/.metodo/bin/metodo @@ -261,7 +261,18 @@ check_reparto_al_dia() { elif [ "$sello" = "$ahora" ]; then ok "la matriz ($SELF_ROOT) está repartida: lo que hay en ella es lo que se estampó" else + # ⛔ UN ROJO PRESTADO NO ES UNA DEUDA: puede ser que ALGUIEN ESTE EDITANDO LA MATRIZ AHORA. + # C11 carea contra la matriz VIVA, asi que el gate de CUALQUIER repo enrojece por algo que + # no esta en ese repo. Medido el 2026-09-03: rojo durante HORAS en los 27 mientras la + # superadmin escribia, y limpio solo al repartir. Un gate que enrojece por causa ajena + # ENTRENA A DESMENTIRLO, y quien se acostumbra deja de ver el rojo que si es suyo. + # ⇒ Dos casos distintos: matriz SUCIA = trabajo en vuelo, es NOTA. Matriz LIMPIA con el sello + # sin casar = deuda real, GATEA. + if [ -n "$(git -C "$SELF_ROOT" status --porcelain 2>/dev/null)" ]; then + warn "la matriz ($SELF_ROOT) tiene trabajo EN VUELO sin commitear — el desajuste es de otra sesión escribiendo AHORA, no deuda de este repo. Vuelve a mirar cuando cierre" + else bad "la MATRIZ ($SELF_ROOT) 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 fi } diff --git a/.metodo/cicatrices.md b/.metodo/cicatrices.md index 90a3dd8..2331c8d 100644 --- a/.metodo/cicatrices.md +++ b/.metodo/cicatrices.md @@ -1281,3 +1281,75 @@ comando correcto puesto**: publicó un commit ajeno al empujar su fila. **Corri `sirxavor` de autor**, así que **`git log --format=%an` NO distingue lo tuyo de lo ajeno**. El autor no es un discriminante: lo son **el mensaje y la fecha** — o, mejor, **no adivinar**. +### C-162 + +`kubernetes` (incidencia), 2026-09-03: su primera pasada dio **«0 consultas en los 9 minutos»** y +**estuvo a punto de reportar que el DNS de producción había estado MUERTO durante el corte**. Era +falso: **`kubectl logs --timestamps` emite hora LOCAL con offset (`+02:00`), no UTC**, así que su +`grep '^…T07:4'` **no casaba nada** mientras las líneas decían `09:4`. +⇒ ⭐ **Lo cazó la INCOHERENCIA INTERNA, no mirar más**: **6.146 líneas en la ventana y 0 en cada +minuto no pueden ser las dos verdad.** + +### C-163 + +`securizacion` (ejecución), 2026-09-03: **`systemctl is-active ufw` devuelve `active` mientras +`ufw status` devuelve `inactive`.** **La unidad cargada no es el cortafuegos encendido.** Su primera +medida usó `systemctl` y decía *«ufw active»* — **con eso habría CONFIRMADO la hipótesis de que el +bastionado tumbó el DNS**, que era falsa. ⇒ El testigo falso empujaba **en la dirección peligrosa**: +creerse protegido, o creer que has encontrado al culpable. +ⓘ Lo real, medido: `nft list ruleset` **vacío, ni una tabla**; `DEFAULT_OUTPUT_POLICY=ACCEPT`; +`ctime` de los ficheros de `ufw` del **31-ago**; **cero líneas `UFW BLOCK`**; y ni una entrada de +journal de `systemd-resolved`/`networkd`/NetworkManager en la ventana. + +### C-164 + +Superadmin y ejecución de `securizacion`, 2026-09-03: **tres lecturas seguidas del orden de commits, +las tres equivocadas.** Primero las dos creyeron que el commit de la ejecución estaba **encima**; +luego la superadmin, **habiendo corrido la puerta un minuto antes**, dijo que el remoto había quedado +**justo debajo** de él. La puerta, corrida otra vez, dijo otra cosa las tres veces. ⇒ **Entre que +corres la puerta y vuelves a mirar, otra sesión ha commiteado encima: el orden CADUCA EN MINUTOS.** + +### C-165 + +`MOT`, 2026-09-03: encargo *«copiar la configuración de un switch a otro»*, **parado antes de tocar +nada** — y por dos razones independientes. **(a)** No hay acceso: `Find-NetRoute` a `172.19.128.3` +sale por la **ruta por defecto**, **no hay ruta a `172.19.128.0/26`**, ni VPN ni interfaz. *(El ping +sería testigo débil; **la tabla de rutas no**, y la confirmación de Xavier cierra.)* **(b)** Y aunque +lo hubiera: **los dos equipos no son réplicas** — difieren en IP de gestión (`.3` vs `.4`) y +hostname, y el `.4` está etiquetado **`SWITCH_CLIENTES`**, otro papel. **Un volcado pegado en crudo +duplica la IP de gestión y corta el acceso por el que estás entrando.** +⛔ Y una tercera, del prompt que escribió la superadmin: **le dio las trampas de CLI de los Dell +N4032F** —paginador, `enable`, `terminal length 0`— **sobre unos switches cuyo modelo el repo no +documenta**; la credencial que sí hay (`manager`/`friend`) es **el par de fábrica de Allied +Telesis**. **Suposición de modelo presentada como dato.** + +### C-166 + +`MOT`, 2026-09-03: una sesión iba a commitear volcados de switch con **hash de contraseña y comunidad +SNMP RW**. **La decisión que lo impedía existía, estaba escrita y era de un día antes** —Xavier, sobre +los snapshots del cluster del trabajo, con el motivo literal *«enable secrets, communities SNMP»*— y +**estaba en el árbol que esa sesión tenía delante**. ⇒ **No se aplicó sola**: hizo falta que otra la +trajera al caso nuevo. Con el precedente delante, Xavier eligió **aplicarlo**, y los tres `.txt` +quedaron **locales e ignorados**; sólo se versiona el `README.md` sin secretos. +⭐ Y el motivo quedó en **tres sitios que sobreviven a la sesión** —el `.gitignore`, el `README` y el +mensaje del commit—, **más la excepción explícita** de que `CREDENCIALES.md` sí va a propósito. ⇒ El +que mire mañana **no ve dos reglas opuestas: ve dos casos con la misma razón**. + +### C-167 + +`poniente` y `securizacion`, 2026-09-03: Xavier contestó **la misma pregunta en dos sesiones** +(*«creo que ya lo ha hecho ella porque he respondido donde no era»*), y las dos podían registrar el +mismo hecho. **No hubo choque — y no fue por el criterio de desempate.** Lo que lo evitó es que **una +lo llevaba como ÍTEM DE BACKLOG y la otra lo elevó a `D`**. Si las dos lo hubieran registrado como +`D`, **habría habido conflicto aunque el criterio estuviera clarísimo**. +ⓘ Y lo que sí funcionó del reparto ya escrito: **citar y no reescribir**, **puntero y no copia**, y +**trasladar en las dos direcciones lo que cada una tenía y la otra no**, con autoría. + +### C-168 + +La superadmin, 2026-09-03: **el gate del reparto estuvo ROJO durante horas en los 27 repos** porque +`C11` carea la copia vendorizada contra la **matriz VIVA** — y ella llevaba toda la tarde editándola. +**Ninguno de esos rojos era del repo que los mostraba**, y se limpiaban solos al repartir. Lo +señaló `poniente`, que **lo decía en cada commit en vez de silenciarlo** — que es lo que impide +acostumbrarse. + diff --git a/.metodo/metodo.md b/.metodo/metodo.md index d08227e..98f6c6a 100644 --- a/.metodo/metodo.md +++ b/.metodo/metodo.md @@ -139,6 +139,26 @@ cuando **algo EXTERNO a ella tiene que estar de acuerdo**; y *externo* no signif vez con más cuidado»*: significa **que llegue por una RUTA DISTINTA de la que la produjo**. No volver a leerla — **volver a derivarla por otro camino**. +⛔ **UN FILTRO TEMPORAL MAL ZONIFICADO NO DA ERROR: DA CERO — y el cero se lee como AUSENCIA DEL +HECHO.** No es que la herramienta calle: **contesta que no hubo nada**, que es la respuesta más +peligrosa de todas porque cierra la investigación. *(cicatriz `C-162`)* +⇒ **Antes de concluir «no pasó nada» desde un filtro por hora, comprueba la ZONA HORARIA DEL +INSTRUMENTO** — no la del sistema, **la de la salida que estás filtrando**. Herramientas del mismo +stack no coinciden: unas emiten UTC y otras hora local con offset. +⇒ ⭐ **Y el control que lo cazó no fue mirar mejor: fue la INCOHERENCIA INTERNA.** *«Miles de líneas +en la ventana y cero en cada minuto de esa ventana»* **no pueden ser las dos verdad** — y esa +contradicción **está dentro de tus propios datos**, no exige un instrumento nuevo. ⇒ **Cuando un +recuento te dé cero, busca otro recuento del MISMO dato que tenga que cuadrar con él.** +⇒ ⛔ **Y su forma más peligrosa: EL INSTRUMENTO CONTESTA A UNA PREGUNTA PARECIDA Y CONFIRMA LO QUE +BUSCABAS.** *(cicatriz `C-163`: `systemctl is-active ufw` dice **`active`** y `ufw status` dice +**`inactive`** — **la unidad cargada no es el cortafuegos encendido**. La primera medida usó +`systemctl` y **habría confirmado una hipótesis falsa** sobre la causa de un corte en producción.)* +⇒ ⭐ **Lo que lo hace distinto de un testigo falso corriente es la DIRECCIÓN**: no te deja sin +respuesta, te da **la que esperabas**. Un testigo que niega se investiga; **uno que confirma cierra +la investigación**. ⇒ **Cuando una medida confirme tu hipótesis a la primera, pregúntale a otro +instrumento la MISMA pregunta** — y si los dos vienen del mismo subsistema, **no son dos**. + + ⇒ **Esto explica por qué «ten cuidado» no funciona, y por qué todo lo que este Método pide ES EXTERNO**: el mutante, el control negativo, la predicción escrita **antes**, el careo contra el artefacto, pedir el crudo. **No son disciplina: son un referente que no eres tú.** @@ -1079,6 +1099,26 @@ cadena única) en vez de por número de línea; los números se recalculan solos Un artefacto compartido vive en **un** sitio; los consumidores llevan copia **commiteada** (build sin red/Node) y un `--check` detecta la deriva. Nunca se edita la copia. +⛔ **EL CRITERIO DE DESEMPATE RESUELVE UN CONFLICTO; NO LO PREVIENE.** Acordar *«quién manda si +chocamos»* no impide chocar: **impide discutir después.** Lo que de verdad evita el choque es que +**sólo UN frente eleve el hecho a decisión y el otro lo lleve como PLAN hasta que se sepa.** +*(cicatriz `C-167`)* +⇒ ⭐ **Porque un backlog se reescribe sin coste y una `D` compromete.** **Dos `D` sobre el mismo +hecho ya son un problema de corpus AUNQUE LAS DOS DIGAN LO MISMO**, porque a partir de ahí +**divergen solas**: cada frente la enmienda con lo suyo y nadie carea las dos. +⇒ **Y preguntar sale más barato que arbitrar**: *«¿cuál es tu caso? el mío es éste y mi criterio de +desempate es aquél»* cuesta un mensaje; deshacer dos `D` divergentes cuesta un frente. + +⛔ **Y UN ROJO PRESTADO ENTRENA A DESMENTIRLO — quien se acostumbra deja de ver el que sí es suyo.** +Un gate que enrojece **por causa ajena** no está midiendo a quien lo corre. *(cicatriz `C-168`: el +gate del reparto estuvo rojo **horas en los 27 repos** porque la matriz se estaba editando; **ninguno +de esos rojos era del repo que lo mostraba**.)* +⇒ **Un gate que depende del estado VIVO de otro repositorio tiene que distinguir los dos casos**: +*«hay trabajo en vuelo ahí fuera»* es una **nota**; *«hay deuda real en este repo»* **gatea**. Si no +los distingue, **el rojo verdadero llega a una pantalla que ya tenía uno**. +⇒ ⭐ Y mientras no se arregle, lo correcto es **lo que hizo quien lo sufrió: decirlo en cada commit +en vez de silenciarlo.** Un rojo ajeno **anunciado** no entrena a nadie; **uno callado, sí.** + ⛔⛔ **SUBIR UN ARREGLO UN NIVEL NO BASTA SI EL OPERADOR POSEE TAMBIÉN ESE NIVEL: hay que subirlo hasta DONDE EL OPERADOR LEE SU ENTRADA.** Un operador no revierte «el objeto de abajo»: revierte **todo lo que rerenderiza**, y eso incluye los CR que parecen la capa de configuración. @@ -1624,6 +1664,31 @@ lo han usado» — es «no se puede usar». Búscala. - Si es de **producción** (p. ej. el `gre-sync` de c2et), no lo arregles a lo loco: anótalo como bomba latente y encájalo en el plan de release (ver `incidente-produccion.md`). +⛔ **«COPIAR X A Y» PRESUPONE QUE Y ES UNA RÉPLICA DE X — Y CASI NUNCA LO ES.** La frase del encargo +esconde la pregunta que importa: **qué NO se copia**. Identidad de gestión, nombre, papel, lo que el +destino ya sirve y el origen no contemplaba. *(cicatriz `C-165`)* +⇒ ⛔ **Y el modo de fallo tiene una firma reconocible: el gesto se lleva por delante EL CAMINO POR EL +QUE ESTÁS ENTRANDO.** Pegar en crudo la IP de gestión del origen sobre el destino **te deja fuera del +equipo que estabas configurando**, y a partir de ahí no hay reversión remota. +⇒ ⭐ **Segunda ocurrencia el mismo día**: la plantilla de red de un nodo nuevo **no se copia de su +gemelo** porque una decisión vigente le prohíbe la ruta por defecto que el gemelo sí tiene. **Copiar +habría violado una `D` sin que nada fallara.** +⇒ **Antes de copiar nada: escribe la lista de lo que NO viaja, y que la ratifique quien manda.** Si +esa lista sale vacía, **no estás copiando: estás clonando**, y eso es otra tarea con otro nombre. + +⛔ **UN PRECEDENTE ESCRITO NO SE APLICA SOLO: hace falta alguien que sepa que existe y lo traiga.** +Un corpus contesta preguntas; **no las hace**. La decisión que impedía publicar unos secretos estaba +escrita, era **de un día antes**, y vivía **en el árbol que la sesión tenía delante** — y aun así +**no habría entrado en la decisión** si nadie la cita. *(cicatriz `C-166`)* +⇒ ⭐ **Y por eso la pregunta útil no es «¿los saco?» sino «ayer decidiste X por ESTE motivo; ¿aplica +aquí, o este caso es distinto por ESTO?»** — la primera pide una orden, la segunda **pone la decisión +anterior a competir con el caso nuevo**, y deja al que decide la salida de decir *«aquí no»* **con +motivo**. +⇒ ⛔ **Y cuando dos casos se resuelven igual, escribe LA RAZÓN en los dos**, no sólo la regla: si sólo +viaja la regla, el que llegue verá **dos reglas** y ninguna forma de saber si son la misma. Con el +motivo, ve **un criterio y dos aplicaciones** — y sabe reconocer el tercer caso, que no estará escrito. + + ## 11. El orden de lo irreversible: añadir antes de quitar · *C14 (4 fuentes), promovido 2026-08-08* Todo lo verificable ocurre **antes** del paso que no se deshace. Se **añade antes de quitar**, se @@ -1927,6 +1992,14 @@ git commit commitear y publica **exactamente eso** —`git push origin :main`—: lo que haya llegado después **no sube**, y **no dependes de reconocerlo**. Si el remoto rechaza, es que alguien empujó en medio: **entonces miras, y entonces decides**. + ⇒ ⛔ **Y EL SHA NO BASTA SOLO: `git push origin :main` sólo es seguro si `^ == + origin/main`.** Si tu commit no cuelga **directo** del remoto, lo que haya en medio **sube con él** + — el sha acota el techo, **no el suelo**. ⇒ **Eso se comprueba, no se supone**, y si no casa, **el + de abajo no es tuyo: para de verdad.** + ⇒ ⭐ **Y el orden CADUCA EN MINUTOS.** *(cicatriz `C-164`: **tres lecturas seguidas del mismo orden, + las tres equivocadas** — incluida una hecha **un minuto después** de correr la puerta.)* Entre que + la corres y vuelves a mirar, **otra sesión ha commiteado encima**. ⇒ **La lectura de hace un rato no + vale para el `push` de ahora: se corre CADA VEZ, pegada al gesto.** ⇒ ⛔ **Y el resumen de los tres, que hay que llevar junto o se elige mal**: `-A` **se lleva otros