⛔⛔ "Ya no trabajamos en esa maquina" y "esa maquina ya no recibe lo que empujes" son cosas distintas, y la segunda gobierna el riesgo. Un nodo devuelto conserva sus roles declarados y su temporizador: lo que empujes a las plantillas le llega igual. ⇒ Antes de tocar algo compartido: no "¿hay alguien trabajando ahi?" (lo dice el semaforo y caduca en horas) sino "¿que hosts consumen esto y cuando convergen?", leyendo sus plantillas. ⚠️ CORRECTA CON EL MOTIVO EQUIVOCADO ES PEOR QUE CORRECTA A SECAS. ⚠️ Y el campo `Sesion:` NO esta normalizado —"cualquier valor vale"— asi que agrupar por el es agrupar CADENAS, no roles. Cicatriz C-184. Reparto byte a byte; nada mas que .metodo/. Sesion: superadmin Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1575 lines
90 KiB
Markdown
1575 lines
90 KiB
Markdown
# Cicatrices del Metodo
|
||
|
||
> La EVIDENCIA de cada rail de `metodo.md`, sacada aparte el 2026-09-02 para que el
|
||
> documento que se lee SIEMPRE quepa en contexto. Este viaja a los 27 repos igual que
|
||
> `metodo.md` -- el disco es gratis y el contexto no -- pero **no se lee por defecto**:
|
||
> se abre cuando alguien discute una regla o necesita el dato crudo que la produjo.
|
||
>
|
||
> ID PLANO Y PARA SIEMPRE: `C-001`, `C-002`... Se asigna UNA VEZ y **no se renumera**,
|
||
> igual que las decisiones `D`. Motivo, de Xavier: **es mucho mas resiliente** -- un id
|
||
> que codificara la seccion caducaria al primer movimiento, y este documento se
|
||
> reestructura constantemente (el 2026-09-02 se fundieron tres familias en un dia).
|
||
> Precedente medido: la numeracion de la §9 se rompio exactamente asi.
|
||
|
||
### C-001
|
||
|
||
Cutover 2026-08-19: hasta ese día la fuente
|
||
> era la copia del árbol de trabajo y esta constitución llevaba los 10 raíles base **en una línea**,
|
||
> con un puntero a una ruta que en un clon ajeno no existe. Coste medido: el raíl nuevo de §8 —«un
|
||
> fallo benigno solo protege si alguien LEE la línea»— nació el 2026-08-19 y **no estaba en ninguna
|
||
> de las 18 copias**. Ahora los raíles viajan COMPLETOS y las adiciones que estaban «pendientes de
|
||
> inlinar» viven dentro de su raíl.
|
||
|
||
### C-002
|
||
|
||
Familia de `A20`: la colisión de loopbacks era 1,9 % a 50 nodos y **26 % a 200**; lo que a escala
|
||
de banco es una anécdota, a escala de flota es el trabajo de una tarde.
|
||
|
||
### C-003
|
||
|
||
Xavier, ordenando: «no estoy diciendo
|
||
que no valore la captura de un hub — lo pondremos en el backlog por detrás, con su apartado. Ahora
|
||
estamos en el apartado de **“y si capturan un edge”**, y para eso hay una CRL y unos procedimientos
|
||
que mis equipos de hoy **ni tienen**».
|
||
|
||
### C-004
|
||
|
||
Xavier, `D7`, 2026-08-22. Estrenada el mismo día: `I11.11` salió de
|
||
su ficha a una épica propia **con su valor declarado — cero, porque no hay nadie esperándola**, que
|
||
es justo el dato que una casilla escondida dentro de otra ficha no da.
|
||
|
||
### C-005
|
||
|
||
Cicatriz 2026-09-01: un censo de dependencias filtraba **por pod**, y descartaba la línea entera si
|
||
el pod tenía **una** imagen ya pineada junto a las móviles ⇒ **dejó fuera el motor de la propia sesión
|
||
que lo estaba midiendo**. Lo cazó **sólo porque sabía que ese motor tenía que salir**. El mismo día,
|
||
un censo de tags móviles dio **4** y el bueno era **20**.
|
||
|
||
### C-006
|
||
|
||
Medido 2026-08-31, y con recurrencia en dos frentes independientes. Un frente censó **sus once
|
||
errores del día** y cómo se cazó cada uno: **4** porque otro no estuvo de acuerdo · **2** por una
|
||
predicción escrita antes de medir · **2** por una anomalía del instrumento · **1** al re-derivar una
|
||
referencia justo antes de commitear · **1** por accidente. ⛔ **Cero releyendo su propio trabajo.**
|
||
El mismo día, quien lleva el Método contó **catorce** en su bitácora —un `awk` que no insertó nada,
|
||
un `--amend` que reescribió el commit de otra, un aviso falso dado en consola, un gate publicado
|
||
roto— y **también cero**: los cazaron **contar la aparición, el `push` rechazado, otra sesión
|
||
midiendo y el `--stat` del commit**. Todos externos.
|
||
|
||
### C-007
|
||
|
||
F11.13: meter una LAN en la malla «toca el firewall, como en F9.2 que tiró el acceso de
|
||
gestión». En vez de ir con cuidado, se **predijo** que el `md5` de `uci show firewall` no cambiaría
|
||
—solo `ospfd.conf` gana una línea `network`— y se midió antes y después: idéntico. El miedo pasó a
|
||
ser un invariante verificado.
|
||
|
||
### C-008
|
||
|
||
Cicatriz
|
||
2026-07-27: un segundo hub daba **401 en toda la administración** y parecía protegida. **No lo estaba:
|
||
estaba rota.** Su Ingress reclamaba `/api`, que una imagen pre-F1 no sirve, así que el catch-all
|
||
autenticado se tragaba también **`/links/pair`** — el mismo accidente que cerraba `/admin/pair`
|
||
impedía que **ningún device pudiera emparejarse**. Se vio al medir la cara abierta: `/links/pair`
|
||
pasó de `401` a **`422` con cuerpo de la aplicación**.
|
||
|
||
### C-009
|
||
|
||
Cicatriz `R10`, 2026-07-28: la orquestadora afirmó «los espacios no chocan» mirando
|
||
el enrutador —el panel usa `/`, `/pending`, `/devices/…`; la API `/links/*`— y era cierto **para el
|
||
enrutador y falso para el guard**: `POST /devices/enroll` **casa con la plantilla**
|
||
`GET /devices/{device_id}`, que es una página del panel. Una lista pública por **prefijo** habría
|
||
abierto esa página a internet — el accidente del otro hub, en espejo: allí el catch-all cerró de más,
|
||
aquí habría abierto de más.
|
||
|
||
### C-010
|
||
|
||
Cicatriz 2026-08-18: la orquestadora puso
|
||
como testigo estrella de un despliegue que `GET /crl/afirmar` pasara de **404** a **302/401**, y
|
||
escribió que sin esa comprobación *«un “desplegado” no distingue nada»*. Medido antes de usarlo: la
|
||
ruta **no daba 404 ni antes** —daba `303 → /login`— y `/zzz-inventada` daba **exactamente lo mismo**.
|
||
El testigo habría tomado el mismo valor con la pantalla puesta y sin ella.
|
||
|
||
### C-011
|
||
|
||
F11.11b: en vez de
|
||
concluir que nadie llamaba al endpoint viejo, se enseñó que **el mismo device**, minutos después de
|
||
instalarse la versión nueva, pidió el endpoint nuevo con token y no volvió a tocar el viejo.
|
||
|
||
### C-012
|
||
|
||
Cicatriz 2026-07-27:
|
||
al ir a borrar el duplicado `/api/admin/*` apareció que las dos copias habían **derivado**, y la
|
||
correcta era **la que no llamaba nadie**. Desde el panel —la única puerta que usa un humano—
|
||
aprobar un nodo **no lo publicaba** hasta el barrido siguiente, y revocar una sede dejaba
|
||
resolviendo sus nombres **hasta 24 h**. Los tests iban por `/api/admin`, así que todo salía verde.
|
||
|
||
### C-013
|
||
|
||
Cicatriz `H35`, 2026-08-04, y salió
|
||
bien porque el build se puso ROJO: el censo de la superficie pública se escribió en `doc/`, fuera del
|
||
contexto `src/api` ⇒ dentro de la imagen **no existía**, `IndexError`, artefacto no pusheado. Se mudó
|
||
a `src/api/tests/` y en `doc/` quedó un puntero.
|
||
|
||
### C-014
|
||
|
||
Cicatriz 2026-07-28, barrido de la colección MCP: la MISMA clase apareció en los
|
||
CUATRO — la rotación del MCP de secretos daba verde por una señal pegajosa + `kv_exists` [el path ya
|
||
existía]; el `version_matches` del MCP del edge comparaba el `.ipk` con su propio `control`; el
|
||
`mint_token(git)` no probaba que el token AUTENTICARA; el `verified-ok` del MCP de build daba verde con
|
||
los pods VIEJOS sirviendo `200`; su gate A3 admitía `ungated` por ausencia de gates. Dos se cazaron
|
||
por casualidad mirando otra cosa; el barrido encontró el resto. Dos de cuatro habría sido casualidad;
|
||
cuatro de cuatro es un raíl.
|
||
|
||
### C-015
|
||
|
||
Cicatriz `I8`,
|
||
2026-07-29: la ficha estimaba —leyendo `wg_hub.py`— que un re-alta anónimo dejaba el peer WG en pie
|
||
y que la pérdida llegaría «en el siguiente reinicio de `wg-hub`». **Son 36 segundos**: la API
|
||
reescribe `wg0.conf` sin ese peer, y `gre-sync` —**un script del chart, en OTRO repo**— borra el
|
||
`grehub` y con él la adyacencia OSPF. El peer sí sobrevivía; **moría todo lo construido encima**, y
|
||
eso convertía una bomba latente en una denegación de servicio en vivo.
|
||
|
||
### C-016
|
||
|
||
Cicatriz Fase 14, 2026-07-28: `transport-spec.md` daba la derivación v2 de la
|
||
loopback por «congelado ⏳» y describía la v1 —«la teclea el operador; el hub la asigna por
|
||
`peer_index`»— con las **dos mitades falsas**. Su espejo decía lo mismo, así que **leyendo docs era
|
||
indetectable**: solo el hardware llevaba la contraria, con `10.100.203.26` en el router de campo y
|
||
`10.100.255.154` en el hub. De la misma tirada cayó un problema que **la spec inventaba**: el puerto
|
||
WG no es «443 RUTOS / 51820 OpenWrt» sino `51234` de escucha en ambas, así que el conflicto de
|
||
despliegues mixtos que describía **no existe**.
|
||
|
||
### C-017
|
||
|
||
Cicatriz `P9c`,
|
||
2026-07-28: el panel comprobaba si `zebra` corría buscándolo en `ps` — y la contraseña del VTY de
|
||
quagga **es `zebra`**, así que **cada sonda dejaba en `ps` un proceso propio que casaba**. El módulo
|
||
se veía a sí mismo: cuanto más se miraba el panel, más imposible era que arrancara.
|
||
|
||
### C-018
|
||
|
||
Cicatriz `engine`, 2026-07-30, cazada **antes
|
||
de armarla**: el `verify` del MCP de build sale por internet y el Ingress de `engine` tiene whitelist de
|
||
IP ⇒ devuelve **403 pase lo que pase**. Un `expect_status:200` habría fallado **siempre** → auto-
|
||
rollback → re-pin del digest anterior, que daba **404** → `engine` muerto y sin vuelta atrás: el
|
||
mecanismo de seguridad era el asesino. Y `expect_status:403` es **peor**: el ingress-controller
|
||
devuelve 403 **aunque el pod esté en `ImagePullBackOff`** — verde eterno sobre un servicio caído.
|
||
|
||
### C-019
|
||
|
||
Cicatriz `A16`, 2026-08-01: el MCP del edge leía la versión con `head -1` —**por posición**— y
|
||
`/api/settings` tenía **dos claves `version`**; se quedaba con la del **install-report, un fichero que
|
||
escribe el `postinst` del propio `.ipk`**. Resultado: `installed 2.1.58 · served 2.1.58 · HTTP 200 ·
|
||
4/4 enabled`, **verde entero, con el panel ejecutando 2.1.57**. El arreglo no fue reintentar: fue
|
||
esperar a **la marca de fin del instalador**, que es un observable distinto del que gatea.
|
||
|
||
### C-020
|
||
|
||
Cicatriz 2026-08-13, y la cometió la orquestadora: midió el panel
|
||
del hub del trabajo con `urllib.request.urlopen` —que sigue los `3xx` por defecto y no lo dice— y
|
||
concluyó **«la aplicación no comprueba nada, el panel está abierto dentro del cluster»**. Era
|
||
falso: contestaba `303 → /login`. Encima **tumbó un hallazgo correcto** de la sesión de
|
||
ejecución —que sí había medido con `wget -S`, que enseña la traza entera— y estuvo a punto de
|
||
cambiar el motivo de una decisión por uno inventado.
|
||
|
||
### C-021
|
||
|
||
Cicatriz `H12`,
|
||
2026-08-02: `harbor.manabo.org` es **Valhalla** desde el constructor y **Athena** desde los nodos
|
||
que tiran. Una sonda de «¿ya está la imagen?» lanzada desde el pod habría preguntado **al registro
|
||
que acababa de recibir el push** ⇒ **200 siempre**. Por eso el destino de la sonda tiene que ser un
|
||
**endpoint explícito**, no el nombre.
|
||
|
||
### C-022
|
||
|
||
Cicatriz evitada el 2026-08-02
|
||
construyendo la poda de `allowed-ips`: el peer `yomi` lo pone `wg-setup` **desde un Secret** y el API
|
||
**nunca** lo escribe en la conf. Una poda de «borro todo lo que no reconozco» se lo habría llevado —
|
||
que es el error de `H13` con el `lo` del nodo, y por eso hizo falta una lista `PRESERVE_PEERS`
|
||
explícita.
|
||
|
||
### C-023
|
||
|
||
Cicatriz 2026-08-02: un `kubectl delete ns karmada-system` lanzado con el plano de
|
||
control revuelto por los reinicios de esa misma sesión —`connection refused` contra el apiserver a la
|
||
misma hora— se llevó el objeto `Namespace` y dejó **vivos los 18 objetos de dentro**, listables y sin
|
||
`deletionTimestamp`, en un namespace que ya no existía. El `namespace-controller` **enumera por
|
||
discovery** lo que debe borrar; una enumeración vacía se leyó como «no queda nada», retiró el
|
||
finalizador y el `Namespace` desapareció antes que su contenido.
|
||
|
||
### C-024
|
||
|
||
Cicatriz 2026-08-02, cazada por Xavier antes de
|
||
ejecutarse: un aviso describía un `wg0` con **RX 0 y TX 56 MiB** como «un túnel muerto que nadie
|
||
usa», y la orquestadora ofreció «levantarlo o quitarlo» como dos opciones equivalentes. Xavier:
|
||
**«ese túnel es con el que me conecto yo a casa»** — y estaba **fuera de casa** en ese momento.
|
||
Quitarlo le habría cortado el acceso.
|
||
|
||
### C-025
|
||
|
||
El mismo
|
||
`A16`: se propuso «comprobar que el PID cambió» como prueba de reemplazo — y **el respawn de procd
|
||
también estrena PID**, así que habría salido verde sobre el árbol viejo. El testigo bueno era **la
|
||
versión que el panel SIRVE**, que es lo único que solo puede decir el árbol que corre.
|
||
|
||
### C-026
|
||
|
||
Cicatriz 2026-08-02, cluster `home`: dos reglas
|
||
—`etcdMembersDown` y `etcdInsufficientMembers`— contaban **targets de scrape** y los llamaban
|
||
«miembros». Llevaban **56 días** en rojo porque los cuatro componentes del plano de control escuchaban
|
||
sus métricas en `127.0.0.1`, con los cuatro **perfectamente sanos**.
|
||
|
||
### C-027
|
||
|
||
Cicatriz 2026-08-02, y la cometió la orquestadora: dedujo que Vault llevaba «29 días corriendo sin
|
||
el `hostAliases`» porque `currentRevision ≠ updateRevision`, y recomendó **revertirlo en git para que
|
||
la alerta se apagara sola**. Medido en el aparato: hay **12** ControllerRevisions, el pod corre la
|
||
**10**, `currentRevision` apunta a la **4** y el deseado es la **12**. Con `updateStrategy: OnDelete`
|
||
ese campo no describe nada real, y el pod **sí** llevaba el `hostAliases` — en su `/etc/hosts`.
|
||
|
||
### C-028
|
||
|
||
Cicatriz
|
||
2026-08-12: repuesto el token de ESO de `hermes`, **20 de 30 `ExternalSecret` seguían en
|
||
`SecretSyncedError`** y la lectura obvia era «no funcionó»; se estuvo a un paso de reiniciar ESO y de
|
||
reescribir la política. Lo que lo desmintió fue **la HORA del último error en el log: siete minutos
|
||
de silencio**. El campo contaba el ciclo anterior — su `refreshInterval` es de **una hora**. Forzando
|
||
el refresco de los treinta: **30/30 verdes**.
|
||
|
||
### C-029
|
||
|
||
Cicatriz al revés, 2026-08-01, hecho
|
||
BIEN: vaciando de texto las pantallas de dos paneles, el peligro era llevarse **estado** junto con los
|
||
comentarios. En vez de capturas —que **no se pueden diffear**— se volcó **el texto de todas las
|
||
pantallas antes y después** en los dos aparatos, con un clasificador prosa/medida: **0 medidas
|
||
cambiadas**, y los únicos cambios fueron los seis textos que se querían mover.
|
||
|
||
### C-030
|
||
|
||
Cicatriz 2026-08-13, y salió BIEN: una
|
||
sesión documentó el porqué de una perilla con comentarios `#`… **dentro de `spec:`**, o sea que
|
||
salen en el render. El gate de bytes se puso **rojo en los tres hubs vivos sin que cambiara un solo
|
||
valor**. Pasaron a `{{/* */}}` y volvieron los bytes exactos. Sus palabras: «el gate se ganó el
|
||
sueldo en el cambio que yo habría llamado cosmético».
|
||
|
||
### C-031
|
||
|
||
Cicatriz `F12.1`,
|
||
2026-08-02: se eligió el `md5` de `ospfd.conf` como testigo de *«esto no ha cambiado»*, y el fichero
|
||
lo escribe un bucle sobre `pairs()` de Lua, que **no ordena**. El hash bailaba sin que cambiara una
|
||
sola línea ⇒ el testigo habría gritado en cada medida, y a la tercera nadie se lo cree.
|
||
|
||
### C-032
|
||
|
||
Cicatriz
|
||
`E9`, 2026-08-03, y es la segunda vez en dos días: el `md5` de un `ospfd.conf` se movió, la sesión
|
||
pudo demostrar por reconstrucción que no era suya… pero **no pudo diffearlo**, porque había guardado
|
||
el hash y no el contenido normalizado.
|
||
|
||
### C-033
|
||
|
||
Cicatriz `H24`, 2026-07-31: la ventana
|
||
del zombi no era de 10 s fijos, iba de **~0 a ~10 s** según dónde cayera el revoke dentro del
|
||
`sleep 10` de `pq-sync`; con la rotación de Rosenpass en 131 s, acertar era un **~8%**. Tres intentos
|
||
fallaron por 50 s, 3 s y 1 s.
|
||
|
||
### C-034
|
||
|
||
Cicatriz `H16`, 2026-07-30, y es la **tercera** reincidencia de `H6` —
|
||
casillas rancias— tras el 26 y el 27 de julio. El modo de fallo nuevo: la casilla no se podía
|
||
contradecir **leyendo los docs**; hubo que entrar en el contenedor a comparar `sha256sum` contra
|
||
`git show HEAD:`.
|
||
|
||
### C-035
|
||
|
||
Cicatriz 2026-08-03, y la cometió la orquestadora: dedujo que una
|
||
LAN estaba en la malla porque el fichero de opciones DHCP existía. Cierto con el código de hoy —que
|
||
solo lo escribe para las LAN de la malla— y **falso con el que corría cuando lo midió**, que lo
|
||
escribía **incondicionalmente y sin consultar el eje**. La existencia del fichero probaba justo lo
|
||
contrario: que el eje se ignoraba.
|
||
|
||
### C-036
|
||
|
||
Cicatriz
|
||
2026-08-06: `pq-secret.sh` estaba en **CRLF en el worktree** y así ni arranca —`set -uo
|
||
pipefail\r`—, o sea que con `core.autocrlf=true` un clon en Windows deja **todos** los bancos
|
||
muertos. El censo no lo vio porque medía —bien— sobre un `git archive` en LF: **la receta correcta
|
||
tapó el defecto que la rodeaba**. Se cosió con un `.gitattributes`.
|
||
|
||
### C-037
|
||
|
||
Cicatriz 2026-09-01. Se destapó porque un `git diff` marcaba **48 líneas cambiadas** donde el cambio
|
||
real eran **13**, con líneas idénticas en `-` y `+`. Y el segundo intento también mintió: daba **9733
|
||
CR en 268 líneas**, un número imposible **que sólo se ve si compruebas la aritmética**.
|
||
|
||
### C-038
|
||
|
||
Cicatriz `H23`, 2026-07-31: `I1` decidió —bien— que re-admitir a un nodo
|
||
revocado es **«una autorización NUEVA del operador»**… y construyó solo la **negativa**. Medido en el
|
||
pod que corre: `POST /links/pair` da **403** permanente, `approve_pair` exige `pending`, y **ninguna
|
||
pantalla pinta una fila revocada** ⇒ **no hay botón que pulsar**. Hubo que tocar `status` en la base
|
||
de datos. Y lo que lo vuelve grave: el procedimiento documentado de `H21` dice **«revoca los edges
|
||
antes de renombrar un hub»** — seguirlo en el cliente dejaría sus sedes fuera **sin marcha atrás**.
|
||
|
||
### C-039
|
||
|
||
Cicatriz 2026-07-31, cazada antes de
|
||
aplicar: `hubName` gobernaba también los **paths de Vault** — con `hermes.hub` el `trimSuffix "-hub"`
|
||
no recortaba nada y el hub habría ido a buscar su clave WireGuard y su **clave Rosenpass** —la que
|
||
la `D100` del hub prohíbe regenerar; era `F13·D10` hasta que el 2026-08-22 se renumeró al
|
||
contador del hub, precisamente porque el id chocaba con el del edge— a rutas inexistentes. La
|
||
sesión partió **identidad** de **nombre público** antes de tocar nada.
|
||
|
||
### C-040
|
||
|
||
Cicatriz 2026-07-30:
|
||
el catálogo del MCP de build llevaba un CAVEAT diciendo que la suite del hub estaba
|
||
obsoleta —12/28 en rojo— y que por eso «el deploy se valida con `skip_tests`, bypass **auditado**».
|
||
Había dejado de ser cierto el **2026-07-24**: las 12 aserciones se reescribieron y la suite va a
|
||
**90 passed**. Seis días en los que la razón ya no existía y el permiso seguía escrito.
|
||
|
||
### C-041
|
||
|
||
Cicatriz 2026-08-04: bajo una cabecera marcada ✅ sobrevivía un pendiente sobre una
|
||
carrera `revoke + enroll` **que `I1` había vuelto inconstruible** —los dos `db.delete` ya no
|
||
existen—, y su arreglo propuesto era *«un SELECT+DELETE atómico»*. Quien lo hubiera cogido de buena
|
||
fe habría **reintroducido exactamente lo que `I1` quitó**, que era el borrado de la fila y toda la
|
||
vulnerabilidad con él.
|
||
|
||
### C-042
|
||
|
||
Cicatriz 2026-08-03, y la cazó la propia sesión al aplicar su propuesta, no la propuesta: al retirar
|
||
`BACKLOG-HERMES.md` —826 líneas, con el invariante de ids comprobado y cuadrado— quedaban **cuatro
|
||
ítems abiertos de la red del trabajo** que el borrado se habría llevado **en silencio**: excluir una
|
||
IP de la pool de MetalLB, identificar físicamente al okupa de un puerto de switch, renombrar un
|
||
address-object del firewall y un puerto de destino. Nada de eso tenía id; eran casillas.
|
||
|
||
### C-043
|
||
|
||
Cicatriz `A20`, 2026-08-01: la `/32` que un hub se inventó al resolver una colisión no
|
||
se quedó ahí — el edge la adoptó (`A17`), la re-declaró al otro hub (`A18`), que la aceptó, y el
|
||
nombre del router acabó resolviendo a la dirección equivocada **por los dos caminos**. Cuanto mejor
|
||
funcionaba la réplica, más lejos llegaba el error.
|
||
|
||
### C-044
|
||
|
||
Cicatriz 2026-08-28, y es la única del día que llegó a mover el orden de trabajo del usuario: un
|
||
aviso reclamaba un gesto urgente sobre la BIOS de un servidor —«la carga está armada»— y desplazó
|
||
cuatro asuntos. Un frente había medido **la conducta del SERVICIO** —un host declarado se sirve sin
|
||
menú, y el arranque por red instala solo a los 30 s— **y era cierto**. Nadie midió la **precondición**,
|
||
que es de **otro sujeto**: el orden de arranque de la **MÁQUINA**. Lo refutó el usuario en una frase:
|
||
para arrancar por red **hay que pulsar una tecla**; el disco ya era el primero. La conclusión
|
||
compuesta había viajado con fecha, contra-medidas y hasta un `User-Agent` —**todos los signos
|
||
externos de una medida**— y **tres registros la aceptaron sin pedirle la precondición**.
|
||
|
||
### C-045
|
||
|
||
Dos frentes independientes el 2026-08-28, con casos
|
||
distintos. Uno: dos sesiones afirmaban cosas **opuestas** sobre «el log del motor» — y no era un
|
||
objeto, eran **dos**, uno por stdout **sin `User-Agent`** y otro dentro del mismo pod en formato
|
||
combinado; **ninguna se equivocaba sobre su fuente, faltaba nombrarla**, y lo destapó que una
|
||
intentara reproducir el testigo de la otra y no pudiera.
|
||
|
||
### C-046
|
||
|
||
**(a)** un bloque de 14 líneas insertado
|
||
con `sed a\` entró **colapsado en UNA sola línea**; el testigo era `grep -c <marcador>` → **1**,
|
||
verde, con la forma destruida. El bueno era `git diff --numstat` (15) junto a `grep -c '^+>'` (14).
|
||
**(b)** filtrar un diff con `grep "^[+-][^+-]"` **oculta toda línea de lista Markdown** —una viñeta
|
||
empieza por `-` y da `+-`/`--`—: salió **diff vacío** sobre un fichero que sí había cambiado. En un
|
||
corpus que es casi todo viñetas, ese filtro **borra la mayoría de lo que buscas**.
|
||
|
||
### C-047
|
||
|
||
Cuatro mutantes sobre el netplan real de un host. El
|
||
`autoinstall_schema` del controlador de red de subiquity pone `ethernets: {properties: {match:
|
||
MATCH}}` con `MATCH` llevando `additionalProperties: false`, y de ahí se afirmó que un `match` con
|
||
una clave de más sería rechazado. **Falso**: ese `match` cuelga **directamente de `ethernets`**,
|
||
profundidad donde netplan **no lo pone jamás**; el de verdad vive en `ethernets.<iface>.match`, y ahí
|
||
el esquema **no mira**, porque `ethernets` no lleva `additionalProperties: false`.
|
||
|
||
### C-048
|
||
|
||
`proyectos-3c`, sobre el arranque por red:
|
||
predijo **1 rojo** en su mutante y salió **0**. Su comprobación decía medir *«el servidor que ignora
|
||
el `Range`»* y en realidad pasaba por **el magic `CD001` ausente en unos bytes de relleno**. La
|
||
arregló con un fichero que **parece correcto a la profundidad equivocada** — literalmente `A13` en
|
||
otro traje.
|
||
|
||
### C-049
|
||
|
||
Cicatriz 2026-09-02: **tres sesiones a la vez** leyeron *«el nodo conserva la ranura de recuperación
|
||
de LUKS»* como un agujero de seguridad, lo escalaron y llegó a la mesa de Xavier. Es la **definición
|
||
del estado previo**: esa ranura la retira el día 1, y a ese equipo el día 1 no se le ha aplicado. Lo
|
||
deshizo él en dos líneas: **«no se puede pretender que esté securizado antes de que se le aplique la
|
||
securización»**. Y el caso puro estaba delante: la máquina que la conservaba está **sin bastionar a
|
||
propósito**, porque es **la línea base contra la que enrojece la mitad roja de los gates** — pedirle
|
||
que no la tenga es pedirle que deje de servir para lo que existe.
|
||
|
||
### C-050
|
||
|
||
Cicatriz 2026-09-02: se corrigió la ficha que decía `.50 = ESXi / .51 = iLO` —al revés— y se dio por
|
||
cerrado. Quedaba un **tercer** fichero diciéndolo mal **dos veces más**, y la peor **no era una
|
||
descripción sino un PROCEDIMIENTO**: «asignar `.50` al VMKNIC y `.51` al iLO». ⇒ ⭐ **Un dato malo en
|
||
una descripción se LEE; en un procedimiento se EJECUTA.** Lo cazó una pregunta de otra sesión —
|
||
**«¿cuál corregiste?»**—, que es comprobar el **sujeto** de un arreglo, no su existencia.
|
||
|
||
### C-051
|
||
|
||
Cicatriz 2026-09-02: el banco de subiquity del motor de `hermes-infra` estaba commiteado con rutas
|
||
absolutas al **scratchpad de OTRA sesión** —un directorio con el UUID de una conversación que ya no
|
||
existe— más un `/mnt/c/.../sp2` de relleno. **Tenía casa en el repo y no arrancaba.**
|
||
|
||
### C-052
|
||
|
||
Cicatriz 2026-09-02: al nodo IA le faltaba la ruta por defecto tras un corte. Se propuso reponerla
|
||
apuntando al **firewall nuestro**, que da salida a internet — y **la máquina es de otro equipo**, con
|
||
su gateway propia sin internet real. Lo paró Xavier diciendo **por qué** no la quería, y sólo
|
||
entonces se leyó el documento que lo explicaba. ⇒ ⭐ **La ausencia era real y la causa también, y aun
|
||
así el arreglo habría sido un cambio no autorizado en la máquina de un tercero.**
|
||
|
||
### C-053
|
||
|
||
Cicatriz del motor de aprovisionamiento, cosecha 2026-08-15: `day1.mode` — dos modos producían **el mismo
|
||
artefacto**; y así llegó `day0.luks` a existir declarado y sin consumir, sin que nada se pusiera
|
||
rojo.
|
||
|
||
### C-054
|
||
|
||
Cicatriz F11.11b, 2026-07-27: el test de
|
||
cableado recorría `app.routes` **en plano**, pero en esa versión de FastAPI los routers incluidos
|
||
van **anidados** → el recorrido veía 8 rutas y **ninguna** `/api/…`, así que **pasaba con el
|
||
endpoint abierto de par en par**. Se delató porque la mutación dio **1 rojo donde tenían que ser
|
||
2**. Ahora las rutas se descubren por el esquema OpenAPI.
|
||
|
||
### C-055
|
||
|
||
F11.12,
|
||
2026-07-27: tal cual estaban, la primera mutación **reventaba el bloque entero** y escondía cuántas
|
||
aserciones habría tumbado — el número dejaba de ser medible justo cuando lo necesitabas.
|
||
|
||
### C-056
|
||
|
||
2026-07-27:
|
||
una quinta mutación dio 0 donde se esperaban 2 — **el arnés avisó de que el `sed` no había casado**,
|
||
así que el cero quedó explicado en vez de pasar por bueno.
|
||
|
||
### C-057
|
||
|
||
2026-08-13: una mutación apuntaba a `values-hermes.yaml` para
|
||
tocar la clase de Ingress — y esa instancia **no la declara, la toma del default** ⇒ no había nada
|
||
que mutar. El arnés dijo «mutación no aplicada» en vez de un `0 rojos` que se habría leído como
|
||
«esto no está cubierto», y la mutación se reapuntó al default, donde sí enrojece las tres.
|
||
|
||
### C-058
|
||
|
||
2026-07-28, hub `I6`: la
|
||
mutación quitaba un `{% if %}` y dejaba su `{% endif %}` → la plantilla no compilaba, la suite moría
|
||
en el fixture y salían **31 `errors` y 0 `failed`**; el arnés leía solo `N failed` ⇒ **0 rojos**,
|
||
indistinguible de «este test no cubre nada», y por poco se tira una comprobación buena.
|
||
|
||
### C-059
|
||
|
||
Misma sesión: la mutación puso `10.99.0.2` a
|
||
pelo… que era exactamente el valor contra el que afirmaba el test → **verde por coincidencia**, con
|
||
el número de rojos acertado y la identidad equivocada. Con `10.99.0.77` salieron 3.
|
||
|
||
### C-060
|
||
|
||
Cicatriz 2026-08-05, construyendo el gate de
|
||
`R14`, y lo cazó la mutación —no el gate en verde— que es la única razón por la que se sabe:*
|
||
- ***casar por SUBCADENA y no por LÍNEA***: `grep -q 'port: 444'` salía **verde contra
|
||
`port: 4440`**, o sea que la guarda del puerto decía que sí a un valor que no era. Es el
|
||
`head -1` de `A16` en otra sintaxis: *leer por posición o por trozo, nunca por identidad*.
|
||
⇒ ⭐ **Y su forma PEOR, medida el 2026-08-13: cuando las dos cadenas son valores LEGÍTIMOS del
|
||
sistema, la subcadena engaña en las DOS direcciones.** `nginx-inet` **contiene** `nginx`, y las
|
||
dos son clases de Ingress reales de instancias distintas ⇒ una guarda sin ancla `$` decía
|
||
`ok [hermes] … emiten nginx` **sobre un render que ponía `nginx-inet`**. Aquí el falso positivo no
|
||
es ruido: es *el valor de otro hub*. ⇒ Ancla siempre, y si puedes **compara la cadena exacta en
|
||
vez de buscarla** — el `pytest` de esa misma sesión aguantó justo por eso.
|
||
- ***`cmd | grep -q` bajo `set -o pipefail`***: `grep -q` sale al primer acierto y cierra la
|
||
tubería ⇒ **SIGPIPE al productor** ⇒ la tubería devuelve distinto de cero ⇒ **rojos
|
||
intermitentes**. Y lo grave no fue el caso nuevo: estaba **latente en cinco comprobaciones
|
||
preexistentes cuyo «ok» es la rama `else`** — o sea que llevaban tiempo pudiendo aprobar por el
|
||
motivo equivocado.*
|
||
|
||
### C-061
|
||
|
||
Misma sesión: un helper `quiere_linea` definido 300
|
||
líneas después de su primer uso ⇒ la cara **positiva** de esas comprobaciones no se ejecutaba y
|
||
**nadie se enteraba**.
|
||
|
||
### C-062
|
||
|
||
Cicatriz `H19`, 2026-08-05: el banco de `pq-sync.sh` llevaba **ocho
|
||
días** con la base en `17 ok / 4 fallos`, porque `62707e1` retiró del chart la semilla PQ legacy
|
||
—tocó **cinco ficheros y no tocó el banco**— y cuatro casos quedaron afirmando sobre algo que ya no
|
||
existe. Con esa base, los «más rojos de los previstos» **no eran una cascada**: N2 hacía pasar un
|
||
rancio y N4 otro. Y el aviso que lo describía prescribía **re-derivar los conteos**, o sea maquillar
|
||
la avería — §6, *un pendiente rancio trae el arreglo equivocado*.
|
||
|
||
### C-063
|
||
|
||
Misma
|
||
cicatriz, y es la mitad que asusta: `N1` era la **única** mutación en verde del banco… y lo era
|
||
**por coincidencia**. Sus dos rojos eran dos rancios, y **las dos aserciones que esa mutación existe
|
||
para romper salían VERDES** — el aviso colado por stdout subía el conjunto de 1 a 2, justo lo que se
|
||
esperaba. El número acertaba y la identidad estaba entera equivocada: no eran 4 de 5 mal, eran
|
||
**5 de 5**.
|
||
|
||
### C-064
|
||
|
||
Cicatriz 2026-08-06, y salió bien **porque la predicción iba por
|
||
nombre**: al coser seis comprobaciones de `guards.sh` se esperaban **6 `ok`** y salieron **37**. Los
|
||
31 de sobra eran `quiere_fallo` —otra familia: lee `stderr` y afirma en positivo—. Con la
|
||
predicción hecha solo con el número, la conclusión habría sido «me faltan 31» y se habrían
|
||
«arreglado» **31 comprobaciones sanas**.
|
||
|
||
### C-065
|
||
|
||
Cicatriz 2026-08-06, y apareció **al poner la base en
|
||
verde**, no antes: la mutación 4 de `pq-secret.sh` llevaba desde `R14` sin casar, porque `R14` movió
|
||
los volúmenes a `_helpers.tpl` y en `deployment.yaml` ya no queda ningún `items:`. Dos días de censo
|
||
no la vieron porque los dos rojos de la base la tapaban.
|
||
|
||
### C-066
|
||
|
||
Cicatriz
|
||
2026-07-26: comprobar si `PUT /api/config/global` pedía credencial con `{"__probe__":1}` **vació la
|
||
Global Config** del hub y disparó el `write_zones()` — el hub dejó de servir sus tres estáticos
|
||
durante ~45 s.
|
||
|
||
### C-067
|
||
|
||
Cicatriz F11.7, 2026-07-26: «Guardar cambios» no guardaba… y sí guardaba. `apply_default`
|
||
hacía `ifup lan` incondicional, y la br-lan **es la interfaz por la que se administra el panel** →
|
||
el `ifup` se llevaba el socket de **su propia respuesta**. El backend aplicaba y persistía, y se
|
||
quedaba sin poder contestar; en el navegador, `r.json()` reventaba y la promesa del handler moría
|
||
sin dueño. Silencio absoluto.
|
||
|
||
### C-068
|
||
|
||
Cicatriz 2026-09-01: se recomienda **no tocar** el quórum de
|
||
almacenamiento esa noche, con números. El usuario decide **tocar**, y da su razón: **«el sitio caído
|
||
no depende de mí, no tengo control sobre él»**. ⇒ Eso **desmontó la premisa de la recomendación** —que
|
||
trataba la vuelta del sitio como una **certeza**— y **cambió el modelo de riesgo, no la conclusión**.
|
||
Sin la razón se habría aplicado lo mismo **creyendo otra cosa**.
|
||
|
||
### C-069
|
||
|
||
Ejemplo del mismo día: se decide soltar un filtro de un
|
||
control, y la razón es «**puedo responder por mí, no por lo que hagan las demás personas**» ⇒ el sujeto
|
||
del control **no son las cuentas de hoy: son las que otro cree mañana**. Sin esa frase, el gesto es
|
||
correcto y **apunta a la cosa equivocada**.
|
||
|
||
### C-070
|
||
|
||
Cicatriz 2026-09-01: con el quórum de almacenamiento a 2 de 3, se relaja la regla que impide colocar
|
||
un tercer testigo. El orquestador, para aplicar la colocación nueva, intenta **parar uno de los dos
|
||
que quedan** — y el sistema se lo **deniega** con «no quedarían suficientes». Como actualiza los
|
||
existentes **antes** de crear el tercero, **la operación se impide a sí misma**: cuatro reintentos, el
|
||
failover parado. Se desatascó reiniciando el orquestador, que al arrancar limpio pudo actualizar
|
||
primero **el testigo caído** —que no dispara la guarda porque ya está parado—.
|
||
|
||
### C-071
|
||
|
||
Misma noche: la recomendación de **no tocar** se apoyaba en **«mañana se recompone solo»** — que
|
||
**presupone como CIERTO que el sitio caído vuelve mañana**. No lo era: **no dependía de quien decidía**,
|
||
no había acceso fuera de banda, y dependía de poder desplazarse. Se puso en la balanza un riesgo
|
||
improbable contra **algo tratado como certeza sin haberlo comprobado**: la comparación estaba viciada
|
||
de origen. Y el otro platillo decía *«de noche y al final de un día largo»* — **cuando el usuario
|
||
estaba despierto y delante**.
|
||
|
||
### C-072
|
||
|
||
Cicatriz 2026-09-01: un electricista mete un pico de tensión, salta un diferencial y reinicia **un**
|
||
servidor. Un motor de base de datos que llevaba **173 días** corriendo su versión vieja **en memoria**
|
||
tira la imagen nueva al rearrancar y muere: los datos en disco eran de la **9.6**, la imagen de hoy la
|
||
**26.7**. **El defecto se plantó el día que se movió el tag; el corte sólo lo reveló.**
|
||
|
||
### C-073
|
||
|
||
Cicatriz 2026-09-01: un cluster con `2+2+árbitro`, el árbitro en un **tercer** emplazamiento con
|
||
switch propio ⇒ sobre el papel, impecable. Medido por el `Designated Bridge` del root port: **ese
|
||
tercer sitio cuelga físicamente del switch del sitio A**, y su enlace redundante lleva **los dos
|
||
puertos caídos y sin transceptor** —diseñado y **nunca completado**—. ⇒ Apagar el sitio A **no se
|
||
lleva 2 nodos: se lleva 3**, y el quórum pasa de `3 de 5` a **`2 de 5`: se pierde**, en el plano de
|
||
control **y** en el almacenamiento. **No se degrada: se para.**
|
||
|
||
### C-074
|
||
|
||
La misma operación se había hecho **una semana antes** y salió bien —
|
||
pero sobre el **lado contrario**, que era del que **no** colgaba el árbitro. **La asimetría era
|
||
invisible desde el éxito.**
|
||
|
||
### C-075
|
||
|
||
Cicatriz 2026-08-30: una sesión de ejecución pregunta si puede quitar un campo de una plantilla
|
||
para implantar una decisión. La medida dice que **ese campo es obligatorio en el instalador ⇒
|
||
quitarlo rompe TODAS las instalaciones**, en la validación, antes de tocar el disco. Se le contesta
|
||
**a ella y sólo a ella** — pero eso **invalida media decisión**, y la decisión la llevaba su
|
||
orquestadora, que **siguió planificando horas sobre una premisa ya sabida falsa**. Salió porque el
|
||
usuario preguntó «¿esto se lo reportaste a la orquestadora?».
|
||
|
||
### C-076
|
||
|
||
Cicatriz del mismo día: un frente reporta que una plantilla de ejemplo
|
||
enseñaba una capa contra una decisión del usuario, y cede el sujeto. Se arregla y se empuja… y no se
|
||
avisa. El que lo reportó se queda con su aviso abierto, persiguiendo lo que ya estaba resuelto.
|
||
|
||
### C-077
|
||
|
||
Cicatriz 2026-08-30, **dos veces el mismo día y en direcciones opuestas**: un frente avisa al relevo
|
||
de que cierta decisión seguía apoyada en una premisa falsa… **y ya estaba corregida y sustituida**,
|
||
por él mismo, la víspera. Y la superadmin repite ese mismo aviso al día siguiente **sin volver a
|
||
mirar**. Las dos veces lo cazó la sesión nueva, que era la única que **no daba el estado por sabido**.
|
||
|
||
### C-078
|
||
|
||
Medido 2026-08-31: en un frente que entrega a un tercero, el entregable tenía medidas de las
|
||
familias construidas **hasta el 27-ago y ninguna posterior**. **No eran diez olvidos**: una familia se
|
||
daba por cerrada cuando el rol la aplicaba y el auditor la veía verde, y **el entregable no estaba en
|
||
ese ciclo** ⇒ cada familia nueva abría un hueco nuevo. Y en el mismo día, otro frente: la mitad de una
|
||
tarea **construida** y **su backlog sin saberlo**.
|
||
|
||
### C-079
|
||
|
||
Medido el mismo día, en tres frentes y en el propio gobierno del árbol: un aviso decía que un banco
|
||
vivía en un scratchpad **del que ya había salido**; un pendiente declaraba certificados RSA que
|
||
**llevaban dos días siendo ECDSA**; y cuatro premisas del corpus raíz quedaron falsas **el día que el
|
||
árbol pasó a ser un repo git** — las cuatro por una mejora, ninguna por un fallo.
|
||
|
||
### C-080
|
||
|
||
Y no es teórico: el propio linter mide **la copia sellada**, no lo que cada repo tiene de
|
||
más ⇒ **hoy un incremento es indistinguible de una deriva para el instrumento del árbol**.
|
||
|
||
### C-081
|
||
|
||
Cicatriz 2026-08-31: una
|
||
orquestadora escribió **cuatro** raíles en su propio corpus creyéndolos suyos; **tres eran generales y
|
||
uno no**, y **ella no podía distinguirlos** — sólo ve su frente. Además, de los tres, uno se paró por
|
||
un motivo que ella no habría dado: **una ocurrencia no hace un raíl**. Y quien la paró **no fue un
|
||
gate: fue el usuario**.
|
||
|
||
### C-082
|
||
|
||
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.
|
||
|
||
### C-083
|
||
|
||
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**.
|
||
|
||
### C-084
|
||
|
||
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.
|
||
|
||
### C-085
|
||
|
||
Cicatriz 2026-08-03, y es `A1` en versión nueva: `dns-malla.md` corrigió el 2026-08-01 su
|
||
modelo de resolución en un bloque «⛔ CORREGIDO»… y **dejó vivo el diagrama de arriba**, que dibujaba
|
||
la cadena vieja. Nadie lee el párrafo de enmienda: se lee **el diagrama**. Dos días después ese
|
||
diagrama era lo que Xavier tenía en la cabeza al describir el diseño, lo que la orquestadora escribió
|
||
como **premisa autoritativa** de un encargo, y lo que obligó a la sesión receptora a **parar**. El
|
||
modelo derogado sobrevivió a su propia derogación y volvió a entrar por la puerta grande.
|
||
|
||
### C-086
|
||
|
||
Cicatriz
|
||
2026-07-27: dos sesiones concluyeron «esta máquina no tiene credenciales para `git.manabo.org`» y
|
||
dejaron un chart de producción sin aterrizar. Era falso — cinco pushes ese mismo día desde ese mismo
|
||
PC. El mismo día, un push a `git.c2et.com` falló con `Recv failure: Connection was reset` y **entró
|
||
al segundo intento**.
|
||
|
||
### C-087
|
||
|
||
Cicatriz cosecha 2026-08-15: «el
|
||
camino Rocky» eran **dos** caminos y solo se había medido uno; la frase viajó por tres documentos
|
||
antes de que alguien la careara.
|
||
|
||
### C-088
|
||
|
||
Cicatriz 2026-08-18: la orquestadora editó así la ficha `I11`
|
||
durante toda una sesión y la rompió **dos veces** — un borrado se llevó la línea ⛔ *«que nadie
|
||
construya un des-aplicar»* (**el raíl que su propio encargo repetía**) y una inserción metió `I11.9`
|
||
**dentro de la viñeta de `I11.8`**, cuya cola quedó leyéndose como suya. Lo cazó la sesión siguiente
|
||
al ir a trabajar sobre la ficha; la orquestadora había «verificado» cada edición con un `grep` del
|
||
marcador nuevo, que **siempre casa** aunque el resto haya quedado hecho trizas.
|
||
|
||
### C-089
|
||
|
||
Censo 2026-09-02: **cinco párrafos partidos en la matriz**. El más viejo llevaba
|
||
**tres días** repartido a los **27 repos** —lo partió, con ironía perfecta, el commit que añadía
|
||
«**la puerta hay que escribirla de modo que ATE, no que informe**»—; **dos eran de esa misma tarde y
|
||
de quien escribe esto**; y uno estaba **en la cabecera del documento**, la primera frase que lee toda
|
||
sesión. **Nadie vio ninguno**, porque una cola varada **se lee como el principio de otro párrafo**:
|
||
el texto no se rompe, se **recompone mal** y sigue siendo texto.
|
||
|
||
### C-090
|
||
|
||
Cicatriz 2026-08-06, censo de los bancos
|
||
del chart del hub: `aip-sync.sh` y `lo-reconcile.sh` son **dos drivers del mismo directorio que hacen
|
||
lo mismo** —extraer un bloque del render, mandarlo a un host y ejecutarlo como root—. El 2026-08-02
|
||
`aip-sync.sh` se comió una extracción rota y se cosió bien: `awk`, anclas **afirmadas** y una
|
||
aserción negativa. A su hermano no lo miró nadie. Cuatro días después, en `mode: loadBalancer` el
|
||
ancla de cierre de `lo-reconcile.sh` **ya no existe** —`R14` quitó el reconciliador a propósito—
|
||
pero la de apertura sí, así que el rango del `sed` corre hasta el final del render: **893 líneas
|
||
donde son 36**, con los `ExternalSecret` dentro. Su única guarda es `[ -s ]`, que 893 líneas pasan
|
||
de sobra, y lo siguiente de ese script es `scp` + **`sudo bash`**.
|
||
|
||
### C-091
|
||
|
||
Cicatriz Hermes 2026-07-26: el sidecar Rosenpass corriendo en el
|
||
chart del hub y el backlog del hub dándolo por pendiente, con un plan que nunca ocurrió; y un fix
|
||
del hub —`F13.0-c`— que solo existía en el backlog del edge.
|
||
|
||
### C-092
|
||
|
||
Cicatriz 2026-08-30: un frente reporta a otro un testigo falso —correcto, aceptado— y **añade una
|
||
solución**: que cierto endpoint publique la fecha además del identificador. La dueña lo mide: el
|
||
endpoint devuelve el identificador **pelado**, la comparación del agente es **de cadena completa**, y
|
||
una línea de más hace que **no vuelva a coincidir nunca** ⇒ cada nodo **se re-descarga su árbol en
|
||
cada disparo, para siempre**.
|
||
|
||
### C-093
|
||
|
||
Cicatriz 2026-08-18: la orquestadora documentó cada
|
||
hallazgo de dos días en los dos sitios; la ficha `I11` llegó a **464 líneas** y Xavier dijo que
|
||
**había dejado de poder leer el backlog**. La bitácora ya lo tenía todo: lo del backlog era una
|
||
copia pura.
|
||
|
||
### C-094
|
||
|
||
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?».
|
||
|
||
### C-095
|
||
|
||
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.
|
||
|
||
### C-096
|
||
|
||
Cicatriz 2026-08-22, `D6` de Xavier: **18 decisiones distintas
|
||
llamadas `D1`** en un solo `backlog.md` — y cuatro fallos de una semana que salen de ahí: un
|
||
**resumen** que gobernó en lugar de la decisión, un «precio aceptado» que Xavier nunca pensó, dos
|
||
ids que colisionaban, y una sustitución con las **dos versiones vivas** a 90 líneas de distancia.
|
||
En sus palabras, para qué sirve la capa: «así tienes todo lo peligroso en un único documento».
|
||
|
||
### C-097
|
||
|
||
Tres ocurrencias en cuatro días, la misma forma y sitios distintos: un `workflows/metodo.md` que
|
||
llevaba **6 días** siendo máster de facto porque el repartidor no alcanzaba ese árbol y nadie era su
|
||
dueño; una entrada de buzón escrita **explícitamente** como copia de seguridad *«que se retira
|
||
cuando su dueña la coloque»* —y que sólo se retiró porque lo llevaba escrito dentro—; y un borrador
|
||
de propuesta que **su propia autora vio convertirse en derivada** en el momento de aprobarse la
|
||
entrega, con dos cambios pendientes en la mano. Las tres se vieron; la primera, seis días tarde.
|
||
|
||
### C-098
|
||
|
||
Medido 2026-08-29: arrancar una sesión de un frente maduro cuesta **1,40 MB ≈ 400 k
|
||
tokens** antes de hacer nada —`CLAUDE.md` raíz + la constitución + su corpus—, o sea **media ventana
|
||
de contexto gastada en leer**. Y ahí está la causa de que las sesiones se agoten y haya que
|
||
relevarlas: **el coste de arranque se paga en la moneda con la que se trabaja**.
|
||
|
||
### C-099
|
||
|
||
Cicatriz 2026-08-30: una sesión metió tres fechas, un `mtime` y **una cita literal del usuario**
|
||
dentro de un anexo firmado — **conociendo el principio**, que se lo habían dicho horas antes. Y el
|
||
usuario, al verlo: **«me paso el día matando historiales»** ⇒ no es un desliz de una sesión, es la
|
||
norma del sitio.
|
||
|
||
### C-100
|
||
|
||
Cicatriz 2026-08-29: el `AVISOS.md` de un frente activo tenía **1.905 caracteres de
|
||
media por línea** y una de **8.196** — y es **el fichero que se lee primero**.
|
||
|
||
### C-101
|
||
|
||
En un solo frente había **cuatro** afirmando bloqueos sobre trabajo cerrado la semana anterior —y
|
||
el propio corpus tenía escrito el patrón, aplicado a un fichero ajeno y nunca a sí mismo.
|
||
|
||
### C-102
|
||
|
||
Medido el 2026-08-29 sobre el semáforo del árbol: **14 filas no empezaban por marca de cierre y
|
||
sólo 3 estaban realmente vivas** ⇒ **11 falsos positivos**; y **dos empezaban en «viva» y acababan en
|
||
«CERRADA»**. Un censo por el principio las cuenta vivas para siempre; uno que busque «CERRADA», las
|
||
cuenta cerradas.
|
||
|
||
### C-103
|
||
|
||
Cicatriz 2026-08-29, verificando 22 filas antes de purgarlas: el primer barrido
|
||
por ids —`D12`, `A37`, `A41`…— **las dio las 22 por buenas**. Sólo el careo por **cifra** —`102 s`,
|
||
`8 h 14 m`, `suite 1621`— separó las que de verdad tenían su relato fuera.
|
||
|
||
### C-104
|
||
|
||
Cicatriz 2026-08-29: una orquestadora leyó el workflow de ordenación **entero**, tomó las medidas y
|
||
**empezó a hacerlo ella**. Lo correcto era pedir que se abriera esa sesión y pasarle el encargo. La
|
||
paró el usuario: «estaba esperando a ver si me sacabas un mensaje para que te abriera una sesión».
|
||
|
||
### C-105
|
||
|
||
Cicatriz 2026-07-27: el multi-hub existe para **sobrevivir a la caída de un
|
||
hub** — y hasta v2.1.34, **añadir el segundo tumbaba el túnel del primero ~40 s**, porque el
|
||
endpoint del hub nuevo es un **nombre** y, si no resolvía, `netifd` rehacía la interfaz WG entera.
|
||
La propiedad que existía para dar resiliencia **te costaba un hub al activarla**. Llevaba ahí desde
|
||
que existe el multi-hub, y solo apareció cuando por primera vez hubo **dos hubs vivos en el mismo
|
||
edge**.
|
||
|
||
### C-106
|
||
|
||
`A18`, 2026-07-31: con la identidad del edge divergiendo entre los dos
|
||
hubs, el nombre **seguía respondiendo 3/3** porque el tráfico rodeaba por el otro router de campo.
|
||
Con ese aparato apagado, el hub habría perdido al edge **del todo**.
|
||
|
||
### C-107
|
||
|
||
`P12`, 2026-08-02: un edge sin binario de Rosenpass se bajaba la
|
||
pubkey del hub —**524.160 B**— cada 20 s y por cada hub. En el router grande (6,8 GB) no se nota
|
||
**jamás**; en un GL-AR300M eran **1 MB sobre 212 KB libres**. Lo hizo visible el aparato pequeño,
|
||
no una búsqueda.
|
||
|
||
### C-108
|
||
|
||
Cinco cicatrices en tres días,
|
||
2026-07-27/30: los seis `postconf` del smtp-relay vivían en un contenedor · el
|
||
`argocd-image-updater` falla `unauthorized` con una **credencial cacheada**, y lo único que frenaba
|
||
que reescribiera un pin bueno era esa avería —**reiniciarlo ARMA el riesgo**— · `kernel-engine`
|
||
corre un digest **que ya no está en el registro**: 62 días arriba y un reinicio lo deja en
|
||
`ImagePullBackOff`.
|
||
|
||
### C-109
|
||
|
||
Cicatriz 2026-07-31: el
|
||
MCP de build llevaba **21 h** con el config anterior al renombrado de los hubs; el fix se commiteó a
|
||
las 00:49, pero **editar un ConfigMap no rueda el Deployment** ⇒ sondeaba un nombre hoy `NXDOMAIN` ⇒
|
||
el `verify` no respondía ⇒ **auto-rollback que deshizo un pin bueno**.
|
||
|
||
### C-110
|
||
|
||
Cicatriz 2026-08-12, y la cadena empieza en
|
||
una recomendación de la orquestadora: se propuso **quitar el root permanente de Vault** —correcto
|
||
como higiene— y se ejecutó rotándolo con `generate-root` y revocando el viejo. En Vault los tokens
|
||
son **hijos de quien los crea**, y `revoke` del padre **borra el árbol**: 14 minutos después el
|
||
`ClusterSecretStore` del cluster `hermes` pasaba a `InvalidProviderConfig` y **30 `ExternalSecret`
|
||
dejaban de refrescarse** — entre ellos la base de datos, el SMTP y el Twilio de una aplicación en
|
||
producción.
|
||
|
||
### C-111
|
||
|
||
F11.14: chronyd moría con `CAP_SYS_TIME not present`. Añadir la capacidad era el reflejo —y
|
||
le habría dado a un servicio en red la potestad de mover el reloj del NODO, y con ella TLS,
|
||
certificados y etcd. La respuesta era `-x`: **un contenedor que SIRVE hora no es uno que PONE
|
||
hora**.
|
||
|
||
### C-112
|
||
|
||
Cicatriz `E6`, 2026-08-01: el reconciliador
|
||
decidía la política de resolución a partir de `lease_rows()` —la proyección **para publicar**, que no
|
||
lleva `nat`—. «No viene `nat`» se leyó como «ninguna LAN tiene salida», así que la negativa se
|
||
encendía **en cada vuelta, con el NAT puesto**. Y el test propio lo consagraba.
|
||
|
||
### C-113
|
||
|
||
Cicatriz F11.14, 2026-07-27, cazada **en el render, antes de existir**: el
|
||
`bindaddress` de chrony salía vacío porque `serviceLoopback` lo inyecta el ApplicationSet y no está
|
||
en ningún `values`. Un `bindaddress` a secas no da error — chronyd vuelve a su default y escucha en
|
||
**todas** las direcciones, IP pública incluida: un **reflector de amplificación NTP** abierto a
|
||
internet.
|
||
|
||
### C-114
|
||
|
||
Cicatriz del motor de aprovisionamiento, cosecha 2026-08-15: un hueco de identidad rellenado con «lo de
|
||
siempre» sirvió un **kickstart destructivo** con un **HTTP 200** impecable.
|
||
|
||
### C-115
|
||
|
||
Cicatriz `V11b`: el careo `routes-*.txt` ↔ `superficie.md` del
|
||
chart del hub buscaba `repos/infrarouter/…`, carpeta renombrada la
|
||
2026-08-15. Se saltó en **todas** las corridas de cuatro días, y no en silencio: llevaba un
|
||
`warnings.warn` **además** del `pytest.skip`, puesto a propósito citando este §8, con el comentario
|
||
«*esto no se salta en silencio — se salta diciéndolo*». **Y lo decía. Y nadie lo leyó.** Mientras
|
||
tanto las cuatro capturas se quedaron atrás de una capa entera —la CRL— sin que el gate pudiera
|
||
enrojecer.
|
||
|
||
### C-116
|
||
|
||
Cicatriz 2026-08-30: un frente llevaba **16 avisos `C25`** —mensajes de commit— en rojo **varios
|
||
días**, y **ninguna de las cuatro sesiones que pasaron por él lo dijo**, teniendo el propio Método
|
||
escrito delante: «si sale rojo, no lo apagues: arréglalo o dilo». Lo cazó la quinta, **el día de
|
||
llegar**, precisamente porque **no estaba acostumbrada a verlo**.
|
||
|
||
### C-117
|
||
|
||
Mismo censo: `probe-guard-hub.js` llevaba los mismos cuatro
|
||
días roto —falla ruidoso, `MODULE_NOT_FOUND`— y nadie vio el rojo porque no lo corre ningún gate;
|
||
y `pq-sync.sh` lleva escrito de su puño que **su línea base estuvo ocho días en rojo** «porque
|
||
este banco no lo corre ningún gate». Un banco mudo y un banco muerto se leen igual desde fuera.
|
||
|
||
### C-118
|
||
|
||
Cicatriz 2026-07-26:
|
||
la orquestadora de redes escribió toda una racha de prompts sin decirlo — se asumían fríos porque
|
||
empezaban con el ritual de lecturas, y nadie lo había hecho explícito.
|
||
|
||
### C-119
|
||
|
||
Cicatriz 2026-08-29: se re-estampó el Método en el repo de un frente que trabaja **otra persona**,
|
||
sin mirar antes qué había hecho. No rompió nada —la copia quedó íntegra y su trabajo intacto— pero
|
||
**se le cambió el ritual de arranque sin decírselo**, y su frente **no tiene sesión en el canal a la
|
||
que avisar**. ⇒ **El corpus manda, pero alguien tiene que avisar de que cambió**: un cambio de método
|
||
que llega por `git pull` y nadie anuncia es exactamente lo que este mismo raíl dice que no
|
||
funciona.
|
||
|
||
### C-120
|
||
|
||
Lo procedimental —cómo se abre un mensaje, qué viaja por el canal y qué no, quién avisa a quién al
|
||
acabar— es **procedimiento, no principio**: vive en la capa `workflows/`, como el resto de la
|
||
estructura de sesión.
|
||
|
||
### C-121
|
||
|
||
Cicatriz 2026-08-28, y son **cuatro** el mismo día, en
|
||
tres frentes: «`E2.1` está bloqueado esperando un hierro prestado» —falso—; «esas dos filas son de sesiones
|
||
muertas» —una era de una sesión **viva y escribiendo en ella**—; «tiene 5 commits sin empujar» —ya
|
||
estaban empujados—; y una alarma de hierro que **movió el orden de la cola del usuario**. **Los
|
||
cuatro iban en el bloque afirmativo, ninguno marcado como inferencia.**
|
||
|
||
### C-122
|
||
|
||
Cicatriz 2026-08-29/30, y va en los dos sentidos, que es lo que la hace raíl: una sesión mandó a
|
||
otra dos datos **marcados como medidos** y los dos eran falsos —un recuento de líneas de una sección
|
||
del que se afirmó **el contenido**, y un encaje de workflow que la medida desmentía—; la receptora
|
||
los comprobó **a pesar de la marca** y los corrigió. Al día siguiente, en sentido contrario, la
|
||
receptora entregó un conteo propio que sí era falso —una ruta relativa sin resolver— y lo cazó la
|
||
otra **por no reproducirlo**. Un corte entero se habría apoyado en él.
|
||
|
||
### C-123
|
||
|
||
Cicatriz 2026-08-28: la superadmin informó todo el día citando nombres de sesión, todos
|
||
correctos, hasta que él dijo «yo no veo eso». Es `§1` —**la herramienta de diagnóstico no ve lo
|
||
mismo que el consumidor**— aplicada a hablar con quien te dirige: **darle el identificador que TÚ
|
||
usas y él no puede resolver es información inútil con aspecto de precisión**, y es peor que
|
||
omitirla.
|
||
|
||
### C-124
|
||
|
||
Cicatriz 2026-08-28:
|
||
la superadmin mandó un encargo, recibió a continuación un «sigo esperando el encargo», concluyó que
|
||
no había llegado y lo reenvió. **Sí había llegado**: entró mientras la otra sesión ejecutaba el turno
|
||
en el que escribía su aviso. Lo corrigió la propia destinataria, con su transcripción delante, y
|
||
**evitó que una hipótesis no demostrada —«una sesión parada no drena su cola»— entrara en esta
|
||
constitución**. Esa hipótesis **sigue sin medir y por eso no se escribe aquí**.
|
||
|
||
### C-125
|
||
|
||
**(a)** la sesión del incidente midió
|
||
«`srvfkvm02`/`03`: no reiniciar ni drenar, **desplegar encima es seguro**»; se retransmitió como
|
||
**tres ⛔ tajantes** y otro frente descartó trabajo por ellas. **(b)** dijo de pasada *«un arranque
|
||
tras 18 h es cuando esas bombas explotan»*; se retransmitió como «lo más importante del día».
|
||
**Medido después: cero.** La alarma la **retiró su propia autora**.
|
||
|
||
### C-126
|
||
|
||
Un parte decía «`A10` NO
|
||
bloquea, probado» refiriéndose al del motor; el `A10` de `poniente` es **la bomba de la PKI, viva y
|
||
🟠**. Quien leyera el parte junto a ese corpus **daría por descartada una bomba abierta** — y el parte
|
||
iba a **tres frentes a la vez**. Lo cazó la dueña del otro `A10`, no un gate.
|
||
|
||
### C-127
|
||
|
||
Escrita por separado **por las dos partes tras morderla cada una por su lado**,
|
||
que es lo que la manda aquí: se difundió un congelado de Ceph, se **corrigió su redacción** y **no se
|
||
avisó cuando murió**; la orquestadora que lo recibió construyó encima un plan entero sobre un muro
|
||
levantado hacía dos horas. **Corregir la redacción de una restricción no es retirarla cuando
|
||
muere.**
|
||
|
||
### C-128
|
||
|
||
Cicatriz F11.9, 2026-07-26: la Global Config del hub estaba
|
||
muerta río abajo —su payload alimentaba a un agente borrado tres semanas antes— y al ir a
|
||
arreglarla apareció que también lo estaba río arriba: el handler `POST` estaba **registrado como
|
||
`GET`**, así que el formulario devolvía **405** y «Guardar» no había guardado **nunca**. Cada mitad
|
||
tapaba a la otra: nadie echaba en falta un dato que nadie podía introducir.
|
||
|
||
### C-129
|
||
|
||
Cicatriz 2026-08-29: una sesión de ordenación reportó como ⛔ una contraseña en claro en tres
|
||
documentos, **con razón por lo que veía** — y era del banco de pruebas. Nada que arreglar salvo lo
|
||
que el corpus no decía.
|
||
|
||
### C-130
|
||
|
||
Los dos casos, el 2026-09-02: un satélite midió que su `pull` no traía
|
||
nada porque ya lo tenía; y `MOT` rechazó un `push` porque **un compañero había empujado tres
|
||
commits** desde otro sitio.
|
||
|
||
### C-131
|
||
|
||
Cicatriz 2026-08-29, y la encontró la sesión de ejecución que
|
||
purgaba el semáforo mientras la superadmin le editaba la cabecera: **paró antes de commitear**
|
||
porque vio en el `diff` 21 líneas que no eran suyas.
|
||
|
||
### C-132
|
||
|
||
Cicatriz 2026-08-30: la orquestadora de un frente corre **exactamente esta puerta**, con el raíl
|
||
escrito **el día anterior y citándola a ella**. Le sale `filas tocadas: 3 · ¿mía?: 1` esperando
|
||
`1 y 1`… **y sigue adelante**. El commit se lleva dentro la fila de otra sesión, bajo un mensaje
|
||
que hablaba de otra cosa. Nada se perdió; la atribución, sí.
|
||
|
||
### C-133
|
||
|
||
Cicatriz 2026-09-01: un gate de la matriz corrido **desde otro repo** avisaba «la MATRIZ ha
|
||
cambiado» **sin nombrarla**, justo después de listar los incrementos **de ese otro repo**. Una sesión
|
||
lo leyó como suyo y **estuvo a punto de revertir trabajo bueno**; se salvó **yendo a leer el código
|
||
del gate** para ver qué entra en la huella.
|
||
|
||
### C-134
|
||
|
||
Cicatriz 2026-08-30, y con la puerta puesta: una sesión encadena la comprobación y el
|
||
`git commit` **en la misma orden**. Sale `4 filas tocadas · 2 de 4 mías` —debía parar— pero para
|
||
cuando lee la salida **el commit ya está hecho**, y publica el bloque a medio escribir de otra
|
||
sesión bajo un mensaje que hablaba de otra cosa.
|
||
|
||
### C-135
|
||
|
||
Caso 2026-08-30, dos prescripciones hermanas y sólo una atable: **«una fila viva lleva bloque
|
||
`EN VUELO`»** es puramente sintáctico —está el marcador o no está—, así que **se ata** y pasa de
|
||
«acuérdate» a «no puedes empujar sin ponerlo». Su hermana, **«ninguna sesión se cierra con fila
|
||
viva»**, **NO se ata a propósito**: el fichero **no puede saber si el dueño respira** —medido:
|
||
`ListAgents` pasó de 13 sesiones a 6 en dos minutos, y una de 12 h apareció como recién
|
||
arrancada—, así que un gate que lo adivinara daría **rojos crónicos**, o sea la cara (b) de la
|
||
familia de arriba. Queda como **criterio humano, deliberadamente**.
|
||
|
||
### C-136
|
||
|
||
Corrección de la propia sesión que lo frenó, 2026-08-29, y lo dijo
|
||
contra su propio mérito: «no fue virtud, fue orden — medí el fichero dos veces porque los números
|
||
de la primera no cuadraban con los de la segunda, y por eso miré el `diff`; no porque tuviera
|
||
presente el raíl».
|
||
|
||
### C-137
|
||
|
||
Cicatriz 2026-08-29, y la cometió la superadmin **el mismo día que escribió este raíl**: al
|
||
re-estampar el Método en nueve repos, uno de los `push` arrastró un commit ajeno que esperaba una
|
||
decisión. Tenía **tres avisos delante** —el de otra orquestadora esa mañana, su propia fila del
|
||
semáforo, y su palabra dada— y **corrió la puerta en su repo pero no en los ajenos**: aplicó el
|
||
control donde no hacía falta y lo omitió donde sí. **Un raíl recién escrito no protege a quien
|
||
acaba de escribirlo.**
|
||
|
||
### C-138
|
||
|
||
y se escribe
|
||
así a propósito: en este árbol ya se borró un workflow por llevar «los commits van siempre,
|
||
automáticos, sin confirmar» — **una autorización sin fecha ni motivo es un agujero, no un
|
||
permiso**
|
||
|
||
### C-139
|
||
|
||
Estaban escritos como «un segundo agujero», «un
|
||
cuarto», «un sexto», «un tercer filo»… **numerados por acumulación y contradiciéndose entre sí**;
|
||
renumerados el 2026-09-02. Ninguno se ha quitado: cada uno es un modo de fallo distinto con su
|
||
cicatriz.
|
||
|
||
### C-140
|
||
|
||
2026-08-30: se commitean **dos** ficheros nombrados uno a uno; entran **tres**. El
|
||
tercero era el trabajo *staged* de otra sesión, que sobrevivió íntegro pero quedó publicado **bajo
|
||
un mensaje que hablaba de otra cosa**, perdiendo la explicación que esa sesión estaba escribiendo.
|
||
⭐ **El asunto de ese commit era, literalmente, «en este árbol git no distingue sesiones».** Lo
|
||
cometió mientras lo escribía, con su propia puerta imprimiendo `ficheros=3` habiendo nombrado 2.
|
||
|
||
### C-141
|
||
|
||
2026-08-31: una sesión corre la puerta del índice —limpia—, empuja **un fichero suyo** y publica
|
||
**tres commits ajenos** que esperaban entre el remoto y `HEAD`. Lo dio por hecho **porque veinte
|
||
minutos antes estaba a cero**: un árbol compartido cambia por debajo entre dos pushes tuyos porque
|
||
el otro **está trabajando**, que es lo normal y no la excepción.
|
||
|
||
### C-142
|
||
|
||
2026-08-31: un `--amend --no-edit` reescribió el commit de otra sesión ya empujado. **Su
|
||
único testigo fue un `push` rechazado por no-fast-forward** — o sea **un fallo que puede no llegar a
|
||
producirse**; sin él, la reescritura se habría publicado.
|
||
|
||
### C-143
|
||
|
||
2026-09-02: la superadmin avisó a un satélite de «haz `pull`, que hay commits de hace minutos».
|
||
Eran ciertos y **ya los tenía**. Lo midió el satélite: los tres rangos, vacíos.
|
||
|
||
### C-144
|
||
|
||
2026-09-01: una sesión anexó
|
||
**168 líneas** de su bitácora **al repo de otro frente**; y el mismo desliz le hizo **leer los
|
||
avisos del repo equivocado**, numerando su hallazgo `A12` donde iban por `A5`: **un identificador
|
||
inventado que habría quedado escrito**.
|
||
|
||
### C-145
|
||
|
||
2026-09-02: **cuatro colisiones sobre el mismo
|
||
fichero en un día, LAS CUATRO CON LAS TRES PUERTAS PUESTAS.** Una sesión publicó la fila de otra ·
|
||
un `awk` por número de línea borró una fila viva **40 minutos** · otra partió una fila en dos · y a
|
||
la cuarta, **entre dos comandos consecutivos**, el índice se le llenó de un fichero ajeno **y su
|
||
edición del working tree desapareció**; al commitear, «nothing to commit»: **ya lo había publicado
|
||
un tercero**. Cero pérdidas y la atribución cruzada cuatro veces.
|
||
|
||
### C-146
|
||
|
||
Medido: el gate de los mensajes de commit
|
||
selló en el punto de adopción del Método **con historia mala por detrás**, y necesitó **excepciones
|
||
nominales**; el del trailer sella **el día que llega** ⇒ **cero excepciones, por construcción**.
|
||
|
||
### C-147
|
||
|
||
`securizacion`, 2026-09-02: cinco comprobaciones publicaban un **dictamen correcto** con
|
||
`sh: 1: raiz: not found` **dentro del dato crudo**, y ya commiteado. El gate miraba el dictamen;
|
||
**el crudo no lo miraba nadie**. El veredicto era cierto y su evidencia estaba rota.
|
||
|
||
### C-148
|
||
|
||
`securizacion`, 2026-09-02: la misma sesión que **por la mañana arregló el clasificador de
|
||
credenciales** lo **reescribió mal a mano ocho horas después**, al medir otra familia. La función
|
||
existía, era correcta y estaba a mano. **El hueco no estaba en el código: estaba en el criterio que
|
||
uno lleva en la cabeza.**
|
||
|
||
### C-149
|
||
|
||
`proyectos-3c`, 2026-09-02, refutando un raíl escrito ese mismo día: *«se localiza por contenido,
|
||
nunca por número de línea»* **no basta**. Su localizador estaba **anclado a contenido** y aun así su
|
||
`perl` a medida **casó de más y siguió en silencio**. *(Y otra sesión editó el mismo fichero con un
|
||
`awk` anclado y funcionó **por suerte**, no por diseño.)*
|
||
|
||
### C-150
|
||
|
||
`hermes-infra`, 2026-09-03, medido en TRES repos a la vez: la orquestadora corre
|
||
`git log origin/main..HEAD`, ve un commit **ajeno** sin empujar y **lo declara en su mensaje**, como
|
||
manda el raíl. Commitea. Vuelve a mirar: **el commit ajeno ya no está** — alguien lo empujó **entre
|
||
sus dos comprobaciones**. Su `push` responde **«Everything up-to-date»** y `ls-remote` confirma que
|
||
**sus commits ya estaban publicados sin que ella los subiera**; en un tercer repo el remoto tenía su
|
||
commit **PRE-`--amend`**, publicado mientras ella corregía el mensaje. ⇒ Su aviso *«me llevo un
|
||
commit ajeno»* **era cierto al escribirlo y falso al publicarse**. Y lo detectó **por un síntoma
|
||
raro** —un `push` que no subía nada— **no por un control**: si el push hubiera tenido algo que
|
||
subir, no se entera. **Quien empujaba era el bucle de reparto de la superadmin**, que empuja **todo
|
||
repo con commits pendientes**, sean suyos o no.
|
||
|
||
### C-151
|
||
|
||
`hermes-infra`, 2026-09-03: `systemd-networkd-wait-online` consumía **el timeout entero de 120 s en
|
||
cada arranque, para siempre** — seis SFP en el bond y cable en dos. **No deja `failed`, no da error,
|
||
el nodo arranca y la red funciona: sólo tarda.** Lo vio **Xavier mirando la consola**, no una sonda.
|
||
⚠️ Y ya estaba resuelto **y escrito** —`optional: true`, de su puño, en el netplan de `styx`
|
||
(`asgard/doc/styx-integracion.md:126`)—: vivía en **un ejemplo**, no en el mecanismo, así que no
|
||
llegó a la plantilla y **se pagó entero otra vez**.
|
||
|
||
### C-152
|
||
|
||
`securizacion` (ejecución), 2026-09-03, sobre su propio caso: **`git commit -- <ruta>` publica el
|
||
contenido del árbol de trabajo EN EL MOMENTO DEL COMMIT, no el que verificaste antes.** Su ventana
|
||
fue de **90 segundos**, y **se la fabricó ella misma escribiendo el mensaje del commit** entre la
|
||
verificación y el commit. ⇒ El pathspec la protege del **índice**; no la protege del **árbol**.
|
||
|
||
### C-153
|
||
|
||
Este PC, medido por `securizacion` (ejecución) el 2026-09-03: **`grep -c $'\r'` miente en las DOS
|
||
direcciones** sobre ficheros CRLF, y **el `sed` de Git Bash y el de WSL no dan el mismo resultado**
|
||
sobre el mismo fichero — uno traduce el fin de línea y el otro no. Lo destapó **un gate de longitud
|
||
que midió 15 donde había 13**, o sea **sesgado en la dirección que aprueba**. El árbitro que sí
|
||
declara su semántica es **`git ls-files --eol`**.
|
||
|
||
### C-154
|
||
|
||
La superadmin, 2026-09-03, y lo destapó la orquestadora de `securizacion` en el barrido de la
|
||
mañana: `cicatrices.md` —**el artefacto nuevo más importante del día**— llegó a los 27 repos y
|
||
**ninguno lo versionaba**. La causa: el reparto commiteaba con `git commit -m … -- .metodo/`, y **un
|
||
commit con pathspec sólo recoge cambios de ficheros YA TRACKEADOS**. El fichero estaba en disco, se
|
||
leía, `C40` lo careaba **y salía verde en los 27** — comprobando un fichero que **el repo no tenía**.
|
||
|
||
### C-155
|
||
|
||
`kubernetes`, 2026-09-03. El corpus **ya avisaba**: *«parchear el DaemonSet directamente sólo
|
||
funciona en tres de los ocho. Donde manda un operador (rook CSI, KubeVirt), **el operador lo
|
||
revierte**»*. Por eso el arreglo del 25-ago se subió al **`Driver` CR**… **y rook posee también el
|
||
`Driver` CR** (`manager=rook` en los dos). Con `ROOK_USE_CSI_OPERATOR=true`, rook **crea y reescribe**
|
||
esos objetos desde `rook-ceph-operator-config`, que **no tiene `CSI_PLUGIN_TOLERATIONS`** — **0
|
||
apariciones en todo el log**. Al reiniciarse rook (los tres reinicios del diagnóstico de los MON del
|
||
1-sep) **rerenderizó sin tolerations** y el DaemonSet volvió a su plantilla **de 2025**.
|
||
⇒ **Censo del mismo día**: los **seis** arreglos que **no** dependen de un operador **siguen en pie**;
|
||
los **dos** que sí **están caídos**. ⇒ Y **latente SIETE días**: `NoSchedule` **no desaloja** y los
|
||
mounts del host **sobreviven**, así que no rompió nada **hasta que hubo que RECREAR los pods** — lo
|
||
forzó el corte eléctrico. **El corte no es la causa: es el revelador.**
|
||
|
||
### C-156
|
||
|
||
`kubernetes`, 2026-09-03, tres testigos falsos sobre el mismo fallo: **`kubectl get ds` daba `4/4
|
||
READY`**, verde impecable · el **`CSINode`** del nodo **seguía listando el driver como registrado**
|
||
—objeto rancio: el kubelet habla de su registro **local**— · y el **`VolumeAttachment`** decía
|
||
`attached: true`, que **era cierto**: el *attach* (lado controlador) funcionaba y **sólo fallaba el
|
||
mount** (lado nodo). ⇒ *«El almacenamiento está conectado»* era verdad y engañaba.
|
||
⚠️ Y una cuarta, de la superadmin al retransmitir: dio los pods por *«`Unknown`, retienen las GPU,
|
||
inocuos»*. Medido: **`.status.phase: Failed`** —un pod `Failed` no retiene nada— y los reemplazos
|
||
**ya estaban BOUND al nodo**, que es la prueba de que las GPU estaban libres. **La columna `STATUS` y
|
||
el campo `phase` no son lo mismo.**
|
||
|
||
### C-157
|
||
|
||
`securizacion` (ejecución), 2026-09-03, contándolo **en el minuto** y contra sí misma: empujó un
|
||
commit ajeno de la superadmin. **Y la puerta la había corrido**: hizo `git log origin/main..HEAD`
|
||
**y vio las dos líneas**. Lo que falló es que **encadenó la comprobación con el `push` en la misma
|
||
llamada**, así que la salida y el gesto ocurrieron **sin un instante en medio para decidir**.
|
||
⇒ Sus palabras: *«ver el dato no es la puerta; la puerta es leerlo y poder parar»*.
|
||
ⓘ Y dos de la misma jornada: **su arreglo de la fila, aplicado y verificado, desapareció del árbol
|
||
una hora después** —no lo había commiteado, y el árbol es compartido— ⇒ *un arreglo sin commitear en
|
||
un árbol que otras sesiones tocan no es un arreglo*. Y **el instrumento con el que se midió también
|
||
mentía**: contar `|` a secas **cuenta los escapados**, que el parser no ve — con esa cuenta declaró
|
||
rota una fila que estaba bien, y lo retiró.
|
||
|
||
### C-158
|
||
|
||
`securizacion` (ejecución), 2026-09-03: al actualizar su fila predijo `+1/-1` y el diffstat dio
|
||
**`+2/-1`**. La línea de más era **una fila NUEVA sin commitear** de la sesión de incidente de
|
||
`kubernetes`. Un `git add workflows/sesiones-activas.md` **habría publicado su trabajo en vuelo bajo
|
||
un mensaje ajeno** — el accidente de agosto **en la dirección contraria**: no barrer lo ajeno, sino
|
||
**firmarlo**. ⇒ Y la puerta que lo cazó fue **la predicción del diffstat**: `--name-only` **no habría
|
||
visto nada**, porque el fichero era el correcto.
|
||
|
||
### C-159
|
||
|
||
`securizacion` (ejecución), 2026-09-03: **ninguna fila viva declaraba `day1-work`** y sin embargo
|
||
otra sesión estaba empujando ahí (`c5895af`). Careó contra la fuente y **el semáforo le dio vía
|
||
libre estando el repo ocupado**. No colisionó **porque los sujetos eran distintos** —`tasks/pam.yaml`
|
||
frente a un reparto del Método—, **pero fue suerte, no diseño**.
|
||
|
||
### C-160
|
||
|
||
`kubernetes` (incidencia), 2026-09-03, **y es la otra mitad de `C-158`**: se apuntó en el semáforo a
|
||
las ~09:40 antes de escribir (308→309 líneas). Al ir a commitear al cerrar: worktree **limpio**,
|
||
`origin/main..HEAD` **vacío**, y su texto en **0 apariciones — ni en el árbol ni en ninguna
|
||
revisión** (`git log -S` sin resultados). **Su fila no estaba «sin commitear»: no existía.**
|
||
⇒ La otra sesión **hizo bien la mitad difícil** —vio la línea ajena por la predicción del diffstat y
|
||
**no la firmó**— pero **apartó el fichero entero**, y eso **la borró**.
|
||
⛔ **Y la dueña no se entera**: su worktree sale **limpio**, así que el síntoma de *«me han borrado el
|
||
trabajo»* es **indistinguible** del de *«ya estaba commiteado»*. Sólo lo vio **porque fue a commitear
|
||
y no había nada que commitear**; sin ese gesto, la fila **habría desaparecido en silencio** y el
|
||
semáforo **habría mentido sobre quién tocaba el cluster `work` durante un incidente**.
|
||
|
||
### C-161
|
||
|
||
`kubernetes` (incidencia), 2026-09-03, **el mismo día en que se escribió el raíl y teniendo el
|
||
comando correcto puesto**: publicó un commit ajeno al empujar su fila. **Corrió
|
||
`git log origin/main..HEAD` antes del `push` y VIO las dos líneas ajenas en la salida** — y las puso
|
||
**en la misma llamada que el `push`**, así que el dato **se imprimió y no pudo detener nada**.
|
||
⇒ Sus palabras: *«tener la comprobación correcta no basta si comparte turno con la acción»*.
|
||
⛔ **Y el segundo filo, que invalida el atajo obvio**: en este árbol **todos los commits llevan
|
||
`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.
|
||
|
||
### C-169
|
||
|
||
`securizacion`, 2026-09-03: la ejecución acusó a su orquestadora de haberse llevado su fila del
|
||
semáforo. **Se midió antes de aceptar o negar**, y no era ella:
|
||
```
|
||
94f610e (el suyo) -> 1 fichero, 1 linea: la fila de la ORQUESTADORA
|
||
8885f2c "sello del reparto" -> ULTIMO-REPARTO + la fila de la EJECUCION
|
||
```
|
||
⇒ ⭐ **Por qué se lo pareció**: el mensaje decía *«semaforo: securizacion en pausa»* **y su diff
|
||
contenía la palabra `PAUSADA`** — porque la había escrito **en su propia fila**. **Dos hechos ciertos
|
||
compuestos en una conclusión falsa**: ninguno mentía y **ninguno contestaba a la pregunta**.
|
||
⛔ **Por eso no lo caza mirar con más cuidado: sólo lo caza CAMBIAR LA PREGUNTA** — de *«¿este commit
|
||
encaja con lo que me pasó?»* a *«¿este commit contiene MI cambio?»*. La retiró ella con `git log -S`.
|
||
|
||
### C-170
|
||
|
||
2026-09-03, 20:15, medido por **dos sesiones distintas por separado**: en `ListAgents` **las seis
|
||
sesiones vivas aparecen como «started 1–6 m ago»** — incluida una con **21 commits ese día** y el
|
||
último seis horas antes, e incluida la propia superadmin, que llevaba la jornada entera. ⇒ **La edad
|
||
del listado es cuándo el listado la vio, no la edad de la sesión.**
|
||
⛔ **Y lo peor, que encontró `poniente`: el `[ref]` TAMPOCO es estable.** La misma sesión, **sin
|
||
reiniciar, mismo hilo, mismo día y sin ningún corte**, se vio a sí misma con **dos refs distintos**:
|
||
`[47a547]` por la mañana y `[0eb362]` por la tarde. **Y el `[ref]` es justo lo que la herramienta
|
||
ofrece para desambiguar dos sesiones con el mismo nombre.**
|
||
⚠️ La superadmin llegó a concluir que esa sesión **era otra distinta** y estuvo a punto de dejar sus
|
||
**cuatro `D` del día huérfanas** en la tabla — con otro frente pudiendo tomarlo por libre. Lo refutó
|
||
la propia sesión **con sus commits y sus horas**, no con una afirmación.
|
||
|
||
### C-171
|
||
|
||
2026-09-03: la superadmin declaró *«`coredns-admin` está caído»* midiendo `192.168.0.110` **desde
|
||
este PC** —ping sin respuesta, tcp/53 sin abrir—. **Dos errores sumados y ninguno era el servicio:**
|
||
**(a)** esa IP **no se alcanza desde fuera de la red del trabajo**, y desde `srvfkvm01` resolvía
|
||
perfectamente; **(b)** y aunque se alcanzara, **el test era categóricamente el equivocado**. Xavier
|
||
dio el mecanismo: **las IP de MetalLB no contestan a ping — se anuncian por ARP.** Una IP de
|
||
`LoadBalancer` en L2 **no es la interfaz de nadie**: la publica un *speaker* y **sólo existe para los
|
||
puertos que declara el `Service`** —aquí `53/UDP` y `53/TCP`—, así que **ICMP no tiene dónde
|
||
aterrizar**. ⇒ El mismo día, otra sesión midió `100 % de pérdida` contra esa IP **y resolución
|
||
perfecta**.
|
||
|
||
### C-172
|
||
|
||
`securizacion` (ejecución), madrugada del 2026-09-04. **⑴** Un mutante cuyo `sed` **no casaba**
|
||
producía un fichero **idéntico**. La aserción salía **verde, y con razón** —no había nada que ver— y
|
||
**el arnés lo anotaba como *«la aserción no ve su propio mutante»***. ⇒ **Acusaba a la mitad
|
||
equivocada** y mandaba a depurar una aserción sana. El arreglo: **una puerta previa que compara el
|
||
fichero antes de juzgar**; si no cambió, **el defecto es del mutante**, y se dice con esas palabras.
|
||
**⑵** Y esa puerta destapó, **en la misma pasada**, que otra aserción llevaba **dando verde falso**:
|
||
su `sed` usaba `#` de delimitador sobre un patrón que contiene `####`, así que **nunca aplicó** — y
|
||
salía verde **porque el arnés llevaba una copia vieja del criterio**, corregido esa misma noche.
|
||
⇒ ⭐⭐ **⑴ era la ÚNICA forma de encontrar ⑵**: sin la puerta que distingue *«mutante que no ocurre»*
|
||
de *«aserción ciega»*, ese verde falso **habría durado para siempre**, sobre un mutante que **nunca
|
||
se aplicó**.
|
||
|
||
### C-173
|
||
|
||
`hermes-infra` (ejecución), 2026-09-04: el hierro `jon` se renombró a **`aegon`**, y su banco lleva un
|
||
**censo sobre hosts reales** — un censo sin sujeto **aprueba sobre la nada**. Comprobado y **no se
|
||
rompió**: `b4-45-06-e9-38-67 → rhaegar.yaml` y `b4-45-06-e9-4a-79 → aegon.yaml`, los dos con dueño.
|
||
⇒ ⭐ **Y sobrevivió por diseño, no por suerte: el censo direcciona por MAC —IDENTIDAD— y no por
|
||
nombre de host, que es una ETIQUETA.** Escrito con `jon`, **habría quedado mudo con el rename sin dar
|
||
error**.
|
||
⚠️ En la misma medida, su primer `grep` salió **vacío** por buscar con comillas simples una cadena
|
||
entre dobles; lo repitió **con control positivo** (13 rutas). *Un filtro que no casa no se queja.*
|
||
|
||
### C-174
|
||
|
||
La superadmin, 2026-09-04: `hermes-infra` pidió una sesión de ejecución y **se le ofreció el encargo
|
||
a una que venía de otro frente, en frío del motor** — mientras **su propio satélite, con el contexto
|
||
del motor y el banco en la cabeza, estaba ocioso esperando encargo**. La superadmin **no lo había
|
||
identificado todavía**: lo listaba como *«sin fichar»* y le mandó la ronda **después** de haber
|
||
repartido el encargo. ⇒ **El orden estaba invertido: se asignó trabajo antes de saber quién había.**
|
||
|
||
### C-175
|
||
|
||
`hermes-infra`, 2026-09-04, corrigiendo el barrido de la superadmin tras una posible suspensión del
|
||
PC: se preguntó a las siete sesiones *«¿queda algo sin empujar que no estuviera antes?»* — y la
|
||
respuesta fue: **«yo no tengo un ANTES fiable contra el que comparar»**. ⇒ **Todas contestaron
|
||
«limpio» con la misma confianza, tuvieran razón o no.** El instrumento medía **la memoria de cada
|
||
sesión**, no el árbol. ⇒ Lo que hacía falta era **un `sha` por repo anotado ANTES**, y no existía.
|
||
|
||
### C-176
|
||
|
||
`securizacion`, 2026-09-04/05, **y la sesión que lo trajo se refutó a sí misma el mecanismo entero**.
|
||
Primero lo contó como *«una excepción declarada quita la señal y deja crecer el defecto sin
|
||
testigo»*. **Falso aquí, y lo desmiente el propio fichero que citaba**: su cabecera dice *«aquí dejan
|
||
de gatear, pero **siguen contándose e imprimiéndose en cada corrida**»*, y el `check` lo confirma
|
||
—`nota C25: 14 con EXCEPCIÓN DECLARADA`—. **El mecanismo está diseñado para no hacer lo que se le
|
||
atribuyó.** Y el «49» tampoco era el fichero: era **10 declarados + 39 commits nuevos**, *«una suma de
|
||
dos sujetos distintos vendida como censo»*.
|
||
⇒ ⭐ **Lo que pasó de verdad, medido y reproducido por la superadmin**: **45 commits en rojo, 18 del
|
||
3-sep y 27 del 4 — ninguno anterior**, sin declarar y **en rojo todo el tiempo**. *«La señal estuvo
|
||
ahí cuatro días y nadie la miró. Yo incluida: corrí `metodo check`, vi «89 avisos» y **lo leí como
|
||
deuda histórica**.»*
|
||
⇒ **No es «la excepción lo escondió»: es «el rojo era visible y se leyó como pasado».**
|
||
|
||
### C-177
|
||
|
||
`hermes-infra`, 2026-09-04, **retirando un aviso propio por falso**: se midió
|
||
`NextElapseUSecMonotonic=infinity` en un temporizador y se dedujo *«este nodo ha dejado de converger
|
||
para siempre, pintándose verde»*. Se escribió como aviso **y se mandó a otra casa con recomendación
|
||
de actuar**. ⛔ **Era falso**: ese valor **no dice que el temporizador esté muerto — dice que el
|
||
servicio que dispara está corriendo AHORA**.
|
||
✅ Lo que sobrevivió, en `A40`: **el testigo de que un nodo converge no es ninguna propiedad de la
|
||
unidad — es que el TRABAJO ESTÉ HECHO**: `/var/log/infraserver/apply.log` creciendo, con su
|
||
`PLAY RECAP` y `failed=0`. **`is-active` da `active` igual en un timer sano que en uno inútil**, y
|
||
`Persistent=` es decoración en una unidad monotónica.
|
||
|
||
### C-178
|
||
|
||
`hermes-infra`, 2026-09-05: *«el motor ya está gateado»* es **cierto y cubre mucho menos de lo que
|
||
suena**. El catálogo declara `gate_target: test` con gate `pytest`, y el pod corre el digest gateado
|
||
—medido **en el artefacto**, con `kubectl`, no en el commit—. ⛔ **Pero esa gate corre los 5 tests
|
||
unitarios de `tests/`, NO el banco de render**: `src/engine/Dockerfile` tiene **0 menciones de
|
||
`banco`**, su stage `test` hace `COPY tests/` y nada más, y `gate.sh` es `pytest tests -q`. **El banco
|
||
declara `SUELO = 86` comprobaciones y sigue fuera de la imagen y sin lanzador.** ⇒ **Lo que protege el
|
||
arranque PXE no está gateado, y ahora PARECE que sí.** *(La superadmin lo había retransmitido como
|
||
«el motor desplegado con digest gateado», sin acotar.)*
|
||
|
||
### C-179
|
||
|
||
El semáforo, 2026-09-05: la superadmin midió que la fila 244 llevaba **`🟢`** y la sucesora leyó que
|
||
estaba **cerrada**. **Las dos medidas eran correctas**: en la **misma celda** convivían
|
||
`🟢 EN VUELO (2026-09-04)` arriba y *«⚰️ CIERRE 2026-09-05, con relevo»* más abajo. **El fichero se
|
||
contradecía a sí mismo**, y **ganó el marcador** — porque es lo que se escanea. ⇒ **El fallo no fue de
|
||
nadie**: quien escribió el cierre lo escribió bien, **sólo que en el sitio que no gobierna**.
|
||
|
||
|
||
### C-180
|
||
|
||
`metodo check`, C26, 2026-09-05 — lo cazó la sesión de `poniente`, no la que escribió el código. El
|
||
check imprimía **tres líneas seguidas que se contradecían**: `nota: 3 commit(s) con EXCEPCIÓN
|
||
DECLARADA` · `AVISO: de esos, 24 son de las ULTIMAS 48 H` · `ok: 81 commit(s), todos dicen quién los
|
||
hizo`. ⛔ **«De esos» eran 3, decía 24, y la tercera línea decía que no fallaba ninguno.** Medido: los
|
||
commits sin `Sesion:` en 48 h eran **CERO**, y **24 era el total de commits recientes del repo**. La
|
||
causa: el contador de «últimas 48 h» estaba **DOS LÍNEAS FUERA** del bloque `|| { … }` que trata el
|
||
commit defectuoso, así que se ejecutaba **una vez por commit**, no una vez por fallo. ⭐ **C25 tiene el
|
||
mismo contador y NO tiene el fallo**, porque allí el camino bueno hace `continue` y aquí es un
|
||
`|| { }` del que se cae dentro por el borde: **la misma idea escrita de dos formas, y sólo una de
|
||
ellas perdona el descuido**. ⇒ Y el daño no era la cifra: esa sesión llevaba **dos días** anotando en
|
||
cada commit *«GATE: rojo por la matriz, no es de este repo»*. **Un gate que enrojece por motivos
|
||
falsos no se ignora de golpe: se ignora poco a poco, y ése es el modo en que muere.** ⚠️ El arreglo se
|
||
escribió primero **con un `perl -i -pe` de comillas dobles y el shell se comió los `${rec26}`**,
|
||
dejando el mensaje como *«C26: de los commit(s) SIN…»* — **y `bash -n` dio verde**, porque la sintaxis
|
||
era correcta y sólo el texto estaba vacío. ⇒ Reescrito con heredoc en comillas simples. **Cuatro
|
||
controles**: el defecto reproducido en laboratorio con el binario viejo (dijo «5 de las últimas 48 H»
|
||
con 5 commits buenos), el arreglado callando en el mismo repo, un commit de hoy **realmente** sin
|
||
`Sesion:` **enrojeciendo** (`1 de los 2`), y ese mismo commit **arreglado**, que apaga la línea de 48 h
|
||
**sin** apagar el rojo del defecto viejo.
|
||
|
||
### C-181
|
||
|
||
2026-09-05, **la hora siguiente a arreglar `C-180`, y es el MISMO defecto en la mano que lo arregla**.
|
||
Al estrenar el `C26` bueno sobre la matriz salió *«8 de 8 commits sin `Sesion:` en las últimas 48 h»*,
|
||
y la superadmin lo repartió a las sesiones como el tamaño del hábito. **Tres sesiones lo refutaron en
|
||
minutos, cada una con un trozo**: que `C26` mide **cada repo con `.metodo/`** y el 8 era **sólo la
|
||
matriz** (`repos/kubernetes` tenía **5 más** que no estaban en la cuenta) · que ya eran **9** porque
|
||
uno acababa de entrar **a las 08:42 de hoy**, después del arreglo · y que ninguno era suyo. **Censado
|
||
el árbol entero: 75 de 497**, con `securizacion` en **45** y `Solidaria` en **9**. ⇒ **El 8 no estaba
|
||
mal: estaba mal LEÍDO — era un suelo presentado como total.** ⭐ Y es exactamente el bicho de `C-180`
|
||
—**contar el conjunto equivocado**— cometido **por quien acababa de arreglarlo**, lo que dice que no
|
||
se cura sabiéndolo. ⚠️ Tercera cara el mismo día: una sesión propuso el mecanismo *«todos los que
|
||
fallan son commits de una sola línea, el gesto rápido `-m` no tiene sitio para el trailer»* — **limpio
|
||
y convincente sobre sus 9**, y **refutado sobre los 75: sólo 2 no tienen cuerpo, 73 SÍ lo tienen**.
|
||
⇒ ⭐ Un patrón que explica una muestra pequeña **no es una causa: es una coincidencia con buena
|
||
prensa**, y cuanto mejor suena, antes se adopta. ⓘ Lo bueno del día: **el canal funcionó como control**
|
||
— cuatro sesiones contestaron con medidas propias a un aviso que decía *«no hace falta que
|
||
contestes»*, y tres de las cuatro corrigieron a quien se lo mandó.
|
||
|
||
### C-182
|
||
|
||
2026-09-05 — una sesión de ejecución de `hermes-infra` fue a verificar su propia afirmación
|
||
(*«ninguno de esos commits sin trailer es mío»*) censando los 28 repos por **su propio**
|
||
`Sesion: ejecucion/hermes-infra`. Salieron **dos**, y **ninguno era suyo**: los había escrito **otra
|
||
sesión del mismo rol**, y uno de ellos en `day1-work`, **un repo donde ella tiene prohibido escribir**.
|
||
⇒ **`Sesion:` identifica un ROL, no una sesión**, y dentro del rol no separa nada: las dos sesiones
|
||
**son** ese rol y escriben el mismo literal. Medido en el árbol en 48 h: `superadmin` **255** commits,
|
||
`ejecucion/securizacion` **94**, `orquestadora/hermes-infra` **64** — ninguna de esas cifras es de una
|
||
sesión. ⭐ **Lo que sí funciona es el SHA**, y la misma sesión lo había hecho bien la primera vez sin
|
||
saber que importaba: nombró `3c28dbc` y `66a92d7`. ⇒ **Su respuesta era correcta por el instrumento,
|
||
no por prudencia.** ⓘ **El gate no se toca**: `C26` cuenta **ausencias**, y la ausencia es inmune a
|
||
que el valor sea compartido; se rompe sólo quien lo lee al revés. ⚠️ Y la sesión se corrigió a sí
|
||
misma en el mismo mensaje: *«nada que enmendar por mi parte»* era cierta, pero **verificada sobre un
|
||
repo y afirmada sobre el árbol** — `C-181` con el sujeto cambiado, dos horas después de leerla.
|
||
|
||
### C-183
|
||
|
||
2026-09-05, `hermes-infra` — con `jon` convergiendo cada pocos minutos, un `push` que llevara **sólo
|
||
el interruptor** le habría llegado **antes que la protección que lo salvaba**, si las dos hubieran ido
|
||
en commits separados. ⇒ **El reconciliador no espera a que acabes de pensar**: lo que a mano son *«dos
|
||
pasos seguidos»* aquí son **dos pasos con un tercero ajeno en medio**, que **no sabe que viene un
|
||
segundo commit**. ⭐ **La cifra honesta es la BAJA**: los dos tramos declarados suman una cota alta de
|
||
~3 min (`sleep 60` del sincronizador + `2min` del agente), pero **la baja es casi cero** si el push cae
|
||
justo antes de que ambos ciclos disparen. ⛔ Y **no hay UN número: hay uno por HOST y suele estar sólo
|
||
DECLARADO** — en el mismo parque, `jon` declara `2min` *(marcado como temporal de banco)* y **`cersei`
|
||
no declara nada y hereda el defecto horario**: un orden de magnitud, escrito en la plantilla de uno
|
||
solo. ⚠️ **La sesión que lo trajo marcó lo que NO midió**, y esa mitad es la que hace utilizable el
|
||
dato: nunca vio a `jon` aplicar un commit, no leyó su `apply.log`, y *«sirve el viejo, luego el
|
||
nuevo»* es **consistente** con el ciclo pero **no es una medida de él**. ⇒ Lo operativo no necesita
|
||
cifra: **interruptor y protección van en el MISMO commit, o la protección va primero y sola.**
|
||
|
||
### C-184
|
||
|
||
2026-09-05, dos correcciones al mismo raíl, una hora después de escribirlo. **(a)** La superadmin
|
||
decidió **no** empujar un cambio trivial a las plantillas compartidas *«porque `securizacion` está
|
||
trabajando en `cersei`»* — y ese dato **había caducado hacía un rato**: se la habían devuelto. ⭐ **La
|
||
decisión seguía siendo correcta, pero por otro motivo**: `cersei.yaml` declara `ccn-610-25` en
|
||
`day1.roles` **de forma permanente** y **no declara `interval`**, así que hereda el defecto horario ⇒
|
||
**el push le llega igual, con o sin nadie mirando**. ⇒ **Devolver un hierro no lo desconecta del
|
||
reconciliador.** ⛔ Y **correcta con el motivo equivocado es peor que correcta a secas**: el día que la
|
||
premisa se cumpla, el motivo escrito dice *«adelante»* y el mecanismo sigue diciendo *«espera»*.
|
||
⚠️ La sesión que lo corrigió se apuntó su parte: *«te di ese contexto hace dos horas, era verdad
|
||
entonces y te llegó sin fecha»*. **(b)** El censo con el que se probó que `Sesion:` es un rol agrupaba
|
||
por **cadena literal**: convivían `ejecucion/securizacion` y `organizadora de poniente`, y la segunda
|
||
**no infringe nada** porque el campo admite cualquier valor. ⇒ **Contar por él es contar strings, no
|
||
roles**: el día que alguien escriba `organizadora/poniente` **salen dos filas donde hay un rol y
|
||
ninguna está mal**. ⭐ Es `C-181` **un piso más abajo**: primero el universo equivocado, luego la
|
||
**clave de agrupación** equivocada — y la conclusión aguantó las dos veces, que es lo que hace que el
|
||
error no se note.
|