Commit Graph
788 Commits
Author SHA1 Message Date
Sergio b2df1fbac2 estado: cosecha granja 2026-09-06T16:32:26Z — avance del árbol KDE 2026-09-06 16:32:26 +00:00
Sergio ff9dffaff6 estado: cosecha granja 2026-09-06T16:02:19Z — avance del árbol KDE 2026-09-06 16:02:19 +00:00
Sergio 100ecc9211 estado: cosecha granja 2026-09-06T15:02:24Z — avance del árbol KDE 2026-09-06 15:02:24 +00:00
Sergio 96c71de490 estado: cosecha granja 2026-09-06T14:32:06Z — avance del árbol KDE 2026-09-06 14:32:06 +00:00
Sergio 00d305de2f estado: cosecha granja 2026-09-06T14:02:14Z — avance del árbol KDE 2026-09-06 14:02:14 +00:00
Sergio f0b8d9025e estado: cosecha granja 2026-09-06T13:32:11Z — avance del árbol KDE 2026-09-06 13:32:11 +00:00
Sergio 757f4fb26d estado: cosecha granja 2026-09-06T13:02:08Z — avance del árbol KDE 2026-09-06 13:02:08 +00:00
Sergio 8dc8bb3a3e estado: cosecha granja 2026-09-06T12:32:22Z — avance del árbol KDE 2026-09-06 12:32:22 +00:00
Sergio b086382c44 estado: cosecha granja 2026-09-06T11:31:54Z — avance del árbol KDE 2026-09-06 11:31:54 +00:00
Sergio 384d9fe793 estado: cosecha granja 2026-09-06T11:02:18Z — avance del árbol KDE 2026-09-06 11:02:18 +00:00
Sergio 624745ed5f estado: cosecha granja 2026-09-06T10:31:54Z — avance del árbol KDE 2026-09-06 10:31:54 +00:00
Sergio 5755c6c401 estado: cosecha granja 2026-09-06T10:02:22Z — avance del árbol KDE 2026-09-06 10:02:22 +00:00
Sergio 70ca353653 estado: cosecha granja 2026-09-06T09:02:08Z — avance del árbol KDE 2026-09-06 09:02:08 +00:00
Sergio 8149036e2a estado: cosecha granja 2026-09-06T08:31:56Z — avance del árbol KDE 2026-09-06 08:31:56 +00:00
Sergio 00bee2645c estado: cosecha granja 2026-09-06T08:01:54Z — avance del árbol KDE 2026-09-06 08:01:54 +00:00
Sergio 7e9c43975e estado: cosecha granja 2026-09-06T07:31:52Z — avance del árbol KDE 2026-09-06 07:31:52 +00:00
Sergio 87a86c1e45 estado: cosecha granja 2026-09-06T06:32:04Z — avance del árbol KDE 2026-09-06 06:32:04 +00:00
Sergio c6e5a0b803 estado: cosecha granja 2026-09-06T06:02:13Z — avance del árbol KDE 2026-09-06 06:02:13 +00:00
Sergio 800c80a8f7 estado: cosecha granja 2026-09-06T05:32:13Z — avance del árbol KDE 2026-09-06 05:32:14 +00:00
Sergio 96bfa8fe5d estado: cosecha granja 2026-09-06T05:02:07Z — avance del árbol KDE 2026-09-06 05:02:07 +00:00
Sergio 409eab1ffe estado: cosecha granja 2026-09-06T04:33:26Z — avance del árbol KDE 2026-09-06 04:33:26 +00:00
Sergio 1578eb16f5 estado: cosecha granja 2026-09-06T04:02:18Z — avance del árbol KDE 2026-09-06 04:02:19 +00:00
Sergio 7acdc5489b estado: cosecha granja 2026-09-06T03:32:07Z — avance del árbol KDE 2026-09-06 03:32:07 +00:00
Sergio dbd8c65282 estado: cosecha granja 2026-09-06T03:02:22Z — avance del árbol KDE 2026-09-06 03:02:22 +00:00
Sergio 1f4d2dfc05 estado: cosecha granja 2026-09-06T02:36:18Z — avance del árbol KDE 2026-09-06 02:36:18 +00:00
Sergio 292df59095 estado: cosecha granja 2026-09-06T02:02:22Z — avance del árbol KDE 2026-09-06 02:02:22 +00:00
Sergio 1e11fd330b estado: cosecha granja 2026-09-06T01:32:12Z — avance del árbol KDE 2026-09-06 01:32:12 +00:00
Sergio 78a7f87836 estado: cosecha granja 2026-09-06T01:02:16Z — avance del árbol KDE 2026-09-06 01:02:16 +00:00
Sergio 3f3653b171 estado: cosecha granja 2026-09-06T00:31:52Z — avance del árbol KDE 2026-09-06 00:31:52 +00:00
Sergio c0f94c93ac estado: cosecha granja 2026-09-06T00:02:19Z — avance del árbol KDE 2026-09-06 00:02:19 +00:00
Sergio 25cc429c9e estado: cosecha granja 2026-09-05T23:32:18Z — avance del árbol KDE 2026-09-05 23:32:18 +00:00
Sergio 0c552057e1 estado: cosecha granja 2026-09-05T23:02:27Z — avance del árbol KDE 2026-09-05 23:02:27 +00:00
Sergio 98ded1dd92 estado: cosecha granja 2026-09-05T22:31:57Z — avance del árbol KDE 2026-09-05 22:31:57 +00:00
Sergio d4e2b8f1a7 estado: cosecha granja 2026-09-05T22:02:17Z — avance del árbol KDE 2026-09-05 22:02:17 +00:00
Sergio 8a2c6fad39 repro: «no pude comparar» tampoco es no-determinismo — segundo sitio, misma lección
Una tanda volvió a llenar el libro de veredictos falsos: 47 recetas sanas anotadas como
NO-DETERMINISMO. Esta vez la cadena empezó antes de donde yo había mirado.

El `mv` que APARTA el artefacto falló (el directorio de apartado no estaba) y yo nunca comprobaba que
hubiera funcionado. A partir de ahí todo lo que sigue es basura: el artefacto se queda en su sitio,
`hammer why-differs` compara contra una ruta que no existe y devuelve `Error: store: no existe…`, y
mi código leía cualquier salida no-cero como «difieren». Un error de comparación disfrazado de
veredicto, 47 veces.

Es la MISMA lección que arreglé hace un rato para el build, en un segundo sitio que no miré:
**no poder medir no es un resultado negativo**. Dos guardas nuevas:

  · el apartado se comprueba (`mv || SIN VEREDICTO`) y la receta se salta ruidosamente;
  · `why-differs` se lee, no sólo su exit code: si dice `Error:`/`no existe`, es SIN VEREDICTO, se
    restaura el artefacto y NO se anota nada.

Probadas las dos: con el apartadero sin permiso de escritura sale «no pude apartar el artefacto ⇒
SIN VEREDICTO», el artefacto queda intacto y el libro no crece.

Comprobado además que la tanda mala no perdió NADA: como el `mv` fallaba, los 47 artefactos nunca
salieron del store (`faltan: 0`). El daño fue sólo el registro, y está purgado — el libro queda con
51 verificaciones buenas.

La regla, ya por triplicado hoy: cuando un guardián no puede establecer algo, el estado es *sin
veredicto*, y eso no se escribe. Un libro que anota lo que no midió se cree igual que uno que sí.
2026-09-05 21:44:50 +00:00
Sergio 6c1f80204a repro: cobertura 92 de 1156 — la tanda sólo-C es la sostenible
18 recetas C verificadas de una, en unos nueve minutos, 15 REPRODUCEN y 3 eran DERIVA (ya al día).
Cero no-determinismos. Y `work/sources` se quedó en 4 KB toda la tanda gracias a la poda por
veredicto: antes una tanda así llevaba el disco del 95% al 98%.

Lo que hace sostenible a esta y no a la anterior es la SELECCIÓN. El filtro `MAX_SECONDS` sobre los
tiempos del worker no transfiere a Rust —`zola` se comió 40 minutos y no dio un solo veredicto— pero
en C sí: sin caché de cargo de por medio, un build de 40 s allá son 40 s acá. Lista explícita de
clase `c`, no muestreo ciego.
2026-09-05 21:41:41 +00:00
Sergio 2277d17b13 estado: cosecha granja 2026-09-05T21:32:15Z — avance del árbol KDE 2026-09-05 21:32:15 +00:00
Sergio 8b43b44c11 estado: cosecha granja 2026-09-05T21:02:03Z — avance del árbol KDE 2026-09-05 21:02:03 +00:00
Sergio a2e5ebd6d7 estado: cosecha granja 2026-09-05T20:32:01Z — avance del árbol KDE 2026-09-05 20:32:01 +00:00
Sergio d7d9cf8fd2 repro: «la 2ª reconstrucción no construyó» NO es no-determinismo — mi propio bug, y lo pagó el libro
Corriendo una tanda con `MAX_SECONDS=45` se llenó el disco a mitad, los rebuilds empezaron a morir
por ENOSPC, y la rama que yo mismo había escrito para distinguir DERIVA de NO-DETERMINISMO metió
«falló» y «difiere» en la misma condición ⇒ **21 recetas sanas quedaron anotadas como
NO-DETERMINISMO** en un libro que pretende ser autoritativo. Un registro falso y persistente es peor
que no tener registro: el propósito del libro es que nadie tenga que volver a mirar, así que una
entrada equivocada se cree para siempre.

Es la trampa de siempre —un disco lleno se lee como receta rota, y la pista es que mueren varias
seguidas— y el script ORIGINAL ya la evitaba: «no es lo mismo «no reproduce» que «no construye
acá». Distinguirlos importa: mezclarlos inventaría un problema de determinismo». Lo rompí al añadir
la segunda reconstrucción. Restituido: si la 2ª no construye, se restaura el artefacto, se cuenta
como fallo y **no se anota nada** — sin veredicto es un estado legítimo.

Reparado además el daño: las 21 entradas falsas purgadas del libro (quedan 27 verificaciones
buenas), y `angle-grinder` repuesto desde `store/.divergen/`, donde lo había dejado la clasificación
errónea. Eso sí funcionó como debía: el ejemplar estaba guardado y entero, no perdido.

Y queda anotado en el propio script el límite del filtro por tiempo que provocó todo: el sidecar de
`store/.times/` lo escribe el WORKER, así que acota el build de esa receta EN LA MÁQUINA QUE LO
MIDIÓ. Una receta Rust de 40 s allá con la caché de cargo caliente son muchos minutos acá en frío
—`angle-grinder` y `amp` entraron por el filtro y se comieron el disco— y encima el número no cuenta
la CASCADA de deps que falten en el store local, que es la misma sorpresa que dio `gjs`. Con disco
justo conviene pasar las recetas a mano.
2026-09-05 20:05:33 +00:00
Sergio 118ba2e2c3 estado: cosecha granja 2026-09-05T20:03:46Z — avance del árbol KDE 2026-09-05 20:03:46 +00:00
Sergio 4067bf817e estado: cosecha granja 2026-09-05T19:32:01Z — avance del árbol KDE 2026-09-05 19:32:01 +00:00
Sergio efe6e001d2 repro: un libro de lo verificado, y por fin un número de cobertura — era 2 de 1157
`verificar-repro.sh` sorteaba una muestra y se olvidaba. Sin registro no había forma de contestar la
pregunta que importa —¿qué fracción del corpus se comprobó alguna vez que reproduce?— y encima las
mismas recetas salían sorteadas una y otra vez mientras otras no se miraban jamás. La primera medida
con el libro puesto: **2 de 1157**. El invariante central del proyecto no se había verificado de
forma acumulativa prácticamente en nada, y eso no se veía porque cada corrida daba « PUERTA
SUPERADA» sobre su propia muestra.

`docs/state/repro-verificado.tsv` va con la misma clave auto-invalidante que el libro de fuzz:
(receta, **ArtifactHash**). El hash resume la receta MÁS su cierre de deps, así que una entrada deja
de casar en cuanto algo aguas arriba cambia. Un «ya lo verifiqué» que sobreviviera a un re-hash sería
una mentira; éste no puede serlo.

Con eso el muestreo pasa a sortear entre lo NO verificado, así que corridas sucesivas ACUMULAN
cobertura en vez de repetir (con `TODO=1` se sortea entre todas, para re-verificar a propósito), y
`--coverage` da el número sin construir nada.

Verificadas en esta tanda: itstool, markupsafe, musl-obstack, hicolor-icon-theme, musl-fts, npth,
poppler-render-check, doas, libffi y packaging REPRODUCEN; `when` derivaba y quedó al día. Cero
no-determinismos. Van 11 de 1157.

⚠ Y una trampa que casi me come, anotada acá porque el próximo la va a pisar: elegí candidatos «por
artefacto chico» y la lista empezó con **nodejs**, cuyo artefacto pesa 0,2 MB y cuyo build son horas
de V8. El tamaño del artefacto NO dice nada del costo de construirlo. Para elegir muestra barata hay
que mirar tiempos de build, no bytes de salida.
2026-09-05 19:31:33 +00:00
Sergio 5420d2db0d estado: cosecha granja 2026-09-05T19:02:04Z — avance del árbol KDE 2026-09-05 19:02:04 +00:00
Sergio e0dce7c4b7 estado: cosecha granja 2026-09-05T18:33:07Z — avance del árbol KDE 2026-09-05 18:33:07 +00:00
Sergio 9e6e3d5aa6 estado: cosecha granja 2026-09-05T18:02:52Z — avance del árbol KDE 2026-09-05 18:02:52 +00:00
Sergio db7fd81236 parches: los 8 FUZZ del catálogo, mirados uno por uno — y un libro que se auto-invalida
`vigia-parches.py --all` sobre las 99 aplicaciones de parche del catálogo: **0 FALLA**, y 14 líneas
FUZZ (8 pares parche/fuente distintos). FUZZ significa que `patch` metió el cambio ADIVINANDO dónde
porque el contexto no casaba, y si cayó en el sitio correcto sólo lo dice el diff. Nadie los había
mirado. Los miré todos:

  · **libxml2 / CVE-2026-6732** — el que más importaba, un parche de seguridad con fuzz 2 en sus dos
    hunks. Cayó bien: los dos dentro de `xmlParseReference()`, las 4 llamadas pasan `ctxt->userData`
    y no sobrevive ningún `sax->characters(ctxt,` en el fichero. El fuzz era por un offset de 226
    líneas, no por el sitio.
  · **doas / rowhammer** — el otro sensible, toca la decisión de privilegio. Cae dentro de
    `checkconfig()` y queda `rv=permit(...); if(rv==0)→permit`, coherente con el `if(rv!=0)→EPERM`
    de `main()`. Y el fuzz lo causa un parche ANTERIOR de la propia cadena (el `#ifdef DOAS_CONFDIR`
    que inserta `configuration-directory.patch`), no un cambio de upstream — que es una causa que no
    se me habría ocurrido sin abrirlo.
  · **wayland**, **mesa** (×3), **cairo** (×2), **firefox** (time64 y fix-rust-target): todos en su
    sitio, cada uno comprobado contra lo que el propio parche declara querer.
  · **gnupg / 0001-include-unistd** — hallazgo: el parche está OBSOLETO. Añade `#include <unistd.h>`
    y upstream YA lo trae dos líneas más abajo, así que sólo lo duplica. Inocuo (el header tiene
    guardas) y por eso el fuzz 2: cambió el contexto porque upstream lo incorporó. Quitarlo re-hashea
    gnupg, así que se paga cuando se re-selle por otro motivo.

Y para que esto no se repregunte en cada corrida —lo que vuelve ruido al vigía, y así es como se
pierde el FALLA del día que aparezca— los veredictos van a `docs/state/fuzz-verificado.tsv` con un
cuarto estado, FUZZ✓.

La clave del libro NO es (receta, parche) sino (receta, parche, HUELLA), donde la huella resume el
texto del parche MÁS el pin de la fuente. Tocá el parche o subí la versión y la huella cambia, la
entrada deja de casar y el vigía vuelve a preguntar. Es lo contrario de una lista de excepciones: no
hay forma de silenciar algo y que siga silenciado cuando cambió. Y el vigía imprime la línea lista
para pegar debajo de cada FUZZ sin verificar, porque calcular la huella a mano es justo la fricción
que hace que nadie lo anote.

Los dos FUZZ de waterfox quedan FUERA del libro a propósito: no los verifiqué en esta ronda y
waterfox está fuera de alcance. Van a seguir saliendo como FUZZ, que es lo honesto — el libro dice
lo que se miró, no lo que se supone.
2026-09-05 17:34:28 +00:00
Sergio 2a62c44b19 estado: cosecha granja 2026-09-05T17:32:08Z — avance del árbol KDE 2026-09-05 17:32:08 +00:00
Sergio 5c8d5ba956 estado: cosecha granja 2026-09-05T17:02:10Z — avance del árbol KDE 2026-09-05 17:02:11 +00:00
Sergio 3a83d2eda4 gnome: xz-shared — sin ella NINGUNA app de la imagen carga, no una
`scripts/vigia-sonames.py` sobre los cinco perfiles marcaba `liblzma.so.5` en GNOME pedido por
`libadwaita` y por `python3`. La columna de QUIÉN lo pide es la que decide, y acá decidió fuerte:
mirando el artefacto sellado, el `NEEDED` no lo lleva un binario suelto sino
**`usr/lib/libadwaita-1.so.0`**, que es la librería contra la que enlaza toda app GTK4/GNOME de la
imagen. Sin proveedor del SONAME el loader falla en TODAS, no en una.

Misma fuga de siempre —el `xz` canónico del corpus es `.a`, así que el rootfs lo resolvía contra el
sysroot Alpine DEL LAB— y por eso invisible al store: el lab no entra en `hash_inputs`.

La receta `-shared` existía sólo en `incoming-kde`. Se promueve al corpus con el mismo procedimiento
que `bzip2-shared` el 2026-09-03, y comprobando lo mismo antes de creerlo: el hash es idéntico desde
las dos rutas (b3:174289d5) ⇒ un solo artefacto y cero rebuilds. Si hubiera diferido, sería otra
receta y no valdría la promoción.

Va sólo en GNOME: en cosmic y sway ese soname lo pide únicamente `python3`, que es herramienta de
build y no viaja en la imagen.

GNOME pasa de 3 sonames sin proveedor a 2. De los dos que quedan, `libperl.so` es de `perl` (build),
y `libreadline.so.8` lo pide `usr/bin/sqlite3` —el shell de la CLI, NO `libsqlite3.so.0`—, así que
las apps están bien y lo roto es el comando. Queda anotado como verruga, no como rotura.
2026-09-05 16:39:06 +00:00