Correr la comprobacion y el push encadenados produce la MISMA salida que hacerlo bien y no puede detener nada. El registro de haberlo hecho bien queda identico. Dos formas validas: decidir por programa, o llamada aparte + leer + actuar. Solo .metodo/ — byte a byte desde la matriz. Sesion: superadmin Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 KiB
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 quemetodo.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 decisionesD. 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 contraport: 4440, o sea que la guarda del puerto decía que sí a un valor que no era. Es elhead -1deA16en 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-inetcontienenginx, y las dos son clases de Ingress reales de instancias distintas ⇒ una guarda sin ancla$decíaok [hermes] … emiten nginxsobre un render que poníanginx-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 — elpytestde esa misma sesión aguantó justo por eso. cmd | grep -qbajoset -o pipefail:grep -qsale 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 ramaelse— 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ó.