Commit Graph
1246 Commits
Author SHA1 Message Date
Sergio 13ee11826f estado: cosecha granja 2026-09-08T21:03:09Z — avance del árbol KDE 2026-09-08 21:03:09 +00:00
Sergio 3ab947102c estado: cosecha granja 2026-09-08T20:32:24Z — avance del árbol KDE 2026-09-08 20:32:24 +00:00
SergioandClaude Opus 5 71bdb5ec5b shared-mime-info: cerrar el primer hueco de la frontera
Salió de 'yupana frontera' en cuanto nix volvió a correr: kcoreaddons la pide y no había receta.
Es un hueco de RUNTIME, no de build — KDE sella 1037/1037 sin ella, y por eso NINGUNA métrica de
deuda la veía. Sin la base MIME el escritorio no resuelve asociaciones, iconos por tipo ni
'abrir con', y GIO cae a adivinar por extensión.

Va al CORPUS, no a incoming-kde: la necesitan las cuatro imágenes de escritorio, y una receta
resuelve sibling-first y después el catálogo padre, nunca una cola hermana.

Dos cosas que se comprobaron ANTES de construir, no después de que fallaran:

  · El tarball de GitLab no trae el submódulo 'xdgmime' — .gitmodules lo declara y el directorio
    llega vacío. Leyendo meson.build:26-47 se ve que sólo lo usa la suite de tests y con
    required:false, así que con build-tests=false lo único que pasa es un warning.
  · 'i18n.merge_file' corre SIEMPRE, no lo gobierna build-translations: no traduce UI, arma el
    fichero de datos desde el .in. De ahí el msgfmt, que gettext-tiny sí provee.

'--prefer-static' desde el principio, que es la lección de json-glib de hace un rato: el binario
sale ESTÁTICO con 0 NEEDED y corre en el host.

Y el artefacto trae la mime.cache ya compilada (update-mimedb=true, que upstream trae en false):
sin ella el paquete son datos crudos y alguien tendría que acordarse de correr
update-mime-database al armar cada imagen.

Verificado:
  prueba del consumidor  update-mime-database genera 157.560 bytes de cache y 26 media-types
  binario                estático, 0 NEEDED, corre fuera del sandbox
  repro                  REPRODUCE bit a bit (la caché se genera en el build: era candidata)
  mirror                 el tarball subido al Storage Box (ADR 0013)
  frontera               huecos 4 → 3

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 20:15:06 +00:00
Sergio 50c1a55a2a estado: cosecha granja 2026-09-08T20:04:11Z — avance del árbol KDE 2026-09-08 20:04:11 +00:00
SergioandClaude Opus 5 bdb5f7df9a nix instalado en gioser: la cadena frontera→triaje vuelve a correr
'yupana frontera' llevaba desde el 2026-08-10 sin poder correr acá porque el hub no tenía nix.
Instalado desde el repo de Artix (extra/nix 2.35.2). Dos cosas que costaron medirse:

  · El paquete quedó ROTO al instalarse: le faltaban libboost_{context,iostreams,url}.so.1.92.0
    porque el sistema tiene boost 1.91 y 280 paquetes sin actualizar. NO se hizo 'pacman -Syu':
    280 paquetes en un server protegido, sin backup, que hospeda la granja, gitea y el runner de
    CI no es una decisión que tome un arreglo de tooling. El ensayo en seco mostró que la
    reparación acotada eran TRES paquetes exactos (boost-libs, source-highlight, gdb) sin
    cascada, y eso sí se hizo. Control después: gdb 17.2 sigue arrancando.

  · El store por defecto iba a ~/.nixstore, o sea a '/', que tiene 21 G libres frente a los 126
    del volumen. Llenar '/' no rompe una tanda, rompe la máquina. NIX_ROOT pasa a apuntar a
    work/nixstore, que además ya es el sitio de lo pesado-y-regenerable. La caché git de nixpkgs
    (~69 M) NO la gobierna esa variable —nix la pone en XDG_CACHE_HOME— así que en gioser está
    mudada al volumen con un enlace: ~/.cache/nix -> /mnt/vvv/nix-cache.

Con eso, la frontera vuelve a dar respuesta, y es pequeña como corresponde a un corpus cerrado:
172 candidatos → 150 opcionales, 11 provistos, 5 nix-ismos, 4 HUECOS reales (polkit-qt-1,
qqc2-breeze-style, shared-mime-info, xwayland) y 2 pendientes de clasificar (mesa-libclc,
python3-3.14.7-env).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 20:01:49 +00:00
SergioandClaude Opus 5 ca2c164512 sombras: CERO — promover las 6 compartidas al corpus y barrer sus 16 copias
Las 6 que quedaban (fuse3, hwdata, icu4c, libdisplay-info, libelogind, lua) no tenían copia en
el corpus, así que borrar una habría roto su cola: la resolución es sibling-first y después el
catálogo PADRE, nunca una cola hermana. Se promueve una y se barren las 16.

Las 16 eran byte a byte IDÉNTICAS entre sí, con el mismo ArtifactHash — medido con 'hammer hash',
no deducido del nombre. Cada una la comparten entre 2 y 4 imágenes, que es exactamente el
criterio que dejó escrito xkeyboard-config al promoverse: lo que comparten varias imágenes tiene
que vivir en el corpus o no lo alcanzan.

A diferencia de aquella, acá las copias SÍ se barren en el mismo movimiento: sin copia en el
corpus no había dónde caer, y dejarlas sería mantener hasta 4 ficheros que son el mismo hash.

Verificado con la huella de las 1167 recetas antes y después:
  ficheros de receta   1167 → 1157   (16 borradas, 6 promovidas)
  hashes supervivientes  ninguno se movió ⇒ CERO rebuilds
  los cinco grafos       deuda 0, huérfanas [], sellados == recetas
  static-audit           MIENTEN 0 de 690
  duplicados             SOMBRAS REDUNDANTES: 0   ← de 14

⚠ Y una lectura que casi publico mal: mi primera comparación de hashes dijo 'CAMBIÓ ✗' en las
seis. Era el grep de la comparación, que no casaba y dejaba el valor 'antes' vacío — los hashes
nuevos eran idénticos a los medidos minutos antes. Un instrumento roto que grita es tan malo
como uno mudo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 19:47:55 +00:00
SergioandClaude Opus 5 a4a462b751 sombras: barrer 14 recetas redundantes que ya tenían copia en el corpus
Las 14 sombras marcadas 'redundante' dan el MISMO ArtifactHash en todas sus colas — no son
variantes, son el mismo artefacto declarado dos, tres, cuatro y hasta cinco veces. Medido con
'hammer hash' receta por receta, no deducido del nombre.

Se barren sólo las que YA tenían copia en el corpus, porque la resolución es sibling-first: una
dep desde incoming-kde busca incoming-kde/x y, si no está, CAE al corpus/x. Son 8 nombres, 14
ficheros: bzip2-shared, glib-shared, lcms2, mpc, pcre2-shared, sqlite-shared, xkeyboard-config
y xz-shared.

13 de los 14 eran byte a byte idénticos al del corpus. El decimocuarto, xkeyboard-config,
difiere en 14 líneas de COMENTARIO (mismo hash), y ese comentario es el permiso explícito para
esto: quien la promovió el 2026-09-05 escribió que dejaba las copias a propósito y que
'barrerlas es otra unidad de trabajo, no un efecto colateral de ésta'. Ésta es esa unidad.

Verificado con la huella de las 1181 recetas antes y después: NINGÚN hash superviviente se
movió ⇒ cero rebuilds. Y tras regenerar los cinco grafos: deuda 0, huérfanas [], y todas las
clausuras de perfil siguen completas.

⚠ Nota sobre una lectura que casi me confunde: los conteos de 'recipes' NO bajan (kde sigue en
1034) y eso es lo correcto — cuentan nodos alcanzables, no ficheros. Antes incoming-kde/x tapaba
a corpus/x; ahora el del corpus ocupa su lugar. Un nodo por otro.

Quedan 6 nombres (fuse3, hwdata, icu4c, libdisplay-info, libelogind, lua) sin copia en el
corpus: ésos exigen promover una primero, y van aparte.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 19:44:28 +00:00
Sergio 29cf7cc69c estado: cosecha granja 2026-09-08T19:31:11Z — avance del árbol KDE 2026-09-08 19:31:11 +00:00
SergioandClaude Opus 5 7892d50842 json-glib: --prefer-static — declaraba static y sus binarios no corrían fuera del sandbox
'-Ddefault_library=static' gobierna cómo se construye la librería PROPIA, y eso funcionaba: el
artefacto trae libjson-glib-1.0.a. Pero no dice nada de con qué se enlazan los EJECUTABLES, así
que json-glib-format y json-glib-validate salían dinámicos contra libffi.so.8, libz.so.1 y
libc.so — y ese libc.so es la musl de zig, 255 bytes de linker script en el host. O sea binarios
que NO CORREN fuera del sandbox, en una receta que declara link=static. Mismo remedio que
appstream, que ya llevaba --prefer-static.

Medido antes y después:
  json-glib-format    dinámico, 3 NEEDED  →  ESTÁTICO, 0 NEEDED
  json-glib-validate  dinámico, 3 NEEDED  →  ESTÁTICO, 0 NEEDED
  libjson-glib-1.0.a  igual (los consumidores no cambian de forma)

Y la prueba del consumidor, que es la que vale: json-glib-format sobre un JSON real corre EN EL
HOST y devuelve {"a":1}. (El ruido de libgvfsdbus.so en stderr es glib intentando dlopen
módulos GIO desde un binario estático: inocuo, la salida sale bien.)

Cascada reconstruida en orden de onda, con el cierre transitivo sacado de yupana y no de un grep
—que no veía a zathura ni a zathura-pdf-poppler por tener el array de deps multilínea, y la regla
del repo es justamente ésa—: zathura, incoming-cosmic/xdg-desktop-portal, zathura-pdf-poppler.

Verificado después, no antes:
  static-audit   MIENTEN 0 de 690    toda receta que declara link=static lo cumple
  los 5 grafos   deuda 0
  repro          REPRODUCEN 3 · DERIVA 0 · NO-DETERMINISMO 0

⚠ incoming-gnome/json-glib NO se toca: declara link="dynamic" a propósito porque el shell de
GNOME dlopea .so reales para introspección. No miente — es honesta, y su radio de 10 no se paga.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 19:26:12 +00:00
SergioandClaude Opus 5 381780aab4 fuentes: tapar el agujero de libtool y que el vigía distinga noticia de emergencia
El vigía decía 5 fuentes muertas y sólo UNA estaba en riesgo de verdad: busybox y freetype
tenían el tarball en la caché local Y en el mirror, y firefox-pgo-profile apunta a .invalid a
propósito. La que no tenía copia en ningún lado era libtool (incoming-kde), con ftpmirror.gnu.org
devolviendo 502 — o sea una receta que ya no se podía reconstruir y nadie lo sabía.

Arreglado: el tarball se bajó de ftp.gnu.org, se verificó contra el sha256 PINEADO (coincide
byte a byte), y está en la caché local y en el mirror. La URL de la receta pasa al espejo que
responde, y se midió que eso no re-hashea nada — ANTES y DESPUÉS dan el mismo
b3:5c09bff5..., que es el ADR 0013 comprobado en vez de citado.

Y el vigía ahora cruza cada fuente muerta con la caché local y el mirror, porque mezclar
'upstream caído con el blob guardado' (noticia) con 'caído y sin copia' (emergencia) hace que
el número suba, nadie lo mire, y el día que uno importe esté enterrado entre cuatro que no. A
un guardián lo mata el ruido. Ahora informa EN RIESGO aparte:

  == vivas 1175 / 1179   muertas arriba 4   EN RIESGO 0

⚠ Y si el mirror no se puede consultar —el worker no tiene la clave del Storage Box— dice
'indeterminado', NUNCA 'EN RIESGO': un instrumento que no pudo correr no puede parecer un
hallazgo.

Probado con rotura a propósito y con los dos controles, que es lo que separa un guardián que
sirve de uno que nunca saltó:
  sha inexistente + upstream muerto → EN RIESGO        ✓ salta
  blob en caché + upstream muerto   → cache-local      ✓ no salta
  mirror inalcanzable               → indeterminado    ✓ no alarma en falso

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 19:14:21 +00:00
Sergio 45a6ce547d estado: cosecha granja 2026-09-08T19:01:35Z — avance del árbol KDE 2026-09-08 19:01:35 +00:00
Sergio 0eb353b572 estado: cosecha granja 2026-09-08T18:52:12Z — avance del árbol KDE 2026-09-08 18:52:12 +00:00
Sergio cb06a37ffa estado: cosecha granja 2026-09-08T18:48:37Z — avance del árbol KDE 2026-09-08 18:48:37 +00:00
Sergio c1d80ff8af estado: cosecha granja 2026-09-08T18:32:27Z — avance del árbol KDE 2026-09-08 18:32:27 +00:00
Sergio 813a59db89 estado: cosecha granja 2026-09-08T18:09:03Z — avance del árbol KDE 2026-09-08 18:09:03 +00:00
Sergio b44ea878ff estado: cosecha granja 2026-09-08T18:02:48Z — avance del árbol KDE 2026-09-08 18:02:48 +00:00
Sergio 6be233de09 estado: cosecha granja 2026-09-08T17:32:54Z — avance del árbol KDE 2026-09-08 17:32:54 +00:00
Sergio bf4f21e963 estado: cosecha granja 2026-09-08T17:02:52Z — avance del árbol KDE 2026-09-08 17:02:52 +00:00
SergioandClaude Opus 5 8b8bac5523 evidencia: anotar que el log de una colgada se perdió al archivarla
El cp nunca corrió: zsh aborta el comando entero cuando un glob no casa, y ese directorio no
tenía ningún .txt, así que tampoco se copió el .log — y el rm -rf siguiente se ejecutó igual.
Borrar sin comprobar que la copia existía.

Se deja un PERDIDO.md en vez de un directorio vacío, que es lo que la regla 3 de CLAUDE.md
advierte: un directorio vacío no es evidencia, es un nombre. La firma medida antes de la
pérdida (7/1/6, cero screenshot) sí está registrada en la cabecera del cazador.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 16:49:02 +00:00
SergioandClaude Opus 5 20a719f9c0 cuelgue headless: verificación A/B y evidencia — 98 segfaults contra 0
arnés viejo (sólo CONTENT)  98 segfaults · 1 colgada · 49/50 screenshots
  arnés nuevo (los cinco)      0 segfaults · 0 colgadas · 50/50 screenshots

Queda dicho en la cabecera qué prueba esto y qué no. El MECANISMO sí: 98 → 0, exactamente 2
por corrida, en el 100% de las corridas; un efecto determinista se refuta con pocas muestras.
El CUELGUE no: 1 contra 0 en 50 pares no es significativo — con la tasa medida (3 en 130 ≈
2,3%) ver cero en 50 tiene ~31% de probabilidad aunque nada hubiera cambiado, y harían falta
~200 corridas para un negativo convincente.

Lo que sí sostiene: las tres colgadas observadas tienen la MISMA huella exacta (7 fallos de
lanzamiento de pestaña, 1 de rdd, 6 messageManager is null, cero screenshot) y las tres
cayeron donde los ayudantes revientan. Ninguna apareció sin el mecanismo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 16:48:03 +00:00
Sergio 76bf4f39a8 estado: cosecha granja 2026-09-08T16:34:12Z — avance del árbol KDE 2026-09-08 16:34:12 +00:00
Sergio 846f2ec5a7 estado: cosecha granja 2026-09-08T16:02:43Z — avance del árbol KDE 2026-09-08 16:02:43 +00:00
Sergio cdadf5fa81 estado: cosecha granja 2026-09-08T15:33:28Z — avance del árbol KDE 2026-09-08 15:33:29 +00:00
Sergio 1ac819eff3 estado: cosecha granja 2026-09-08T15:01:44Z — avance del árbol KDE 2026-09-08 15:01:44 +00:00
SergioandClaude Opus 5 8ff6ae7b3a pgo: el control que faltaba — el arranque eran 16 s y diluía todos los porcentajes
El banco medía el ciclo COMPLETO del proceso (arrancar → renderizar → capturar → salir)
y nunca se midió cuánto de eso era arranque. Con una página vacía como control, y las 4
cargas × 2 variantes en UNA sola sesión intercalada (restar entre corridas de días
distintos no vale: la misma variante deriva ~1%):

  maquetación   trabajo 7281 → 4744 ms   -34,8%   (publicado: -10,9%)
  carga ajena   trabajo 4550 → 4634 ms    +1,8%   = cero, y es buena señal
  SunSpider     trabajo  -34 →   -6 ms   bajo el ruido

Dos correcciones al documento:

1. El -10,9% es correcto para el ciclo completo pero se leía como 'firefox 11% más
   rápido'. Sobre el trabajo de la página el PGO rinde -34,8%: tres veces más. El error
   subestimaba el propio resultado.

2. La explicación que di del SunSpider era aire. Su trabajo mide -34 ms, NEGATIVO: la
   página con el benchmark tardó menos que la vacía. No había nada que medir, y yo le
   colgué encima una teoría sobre el JIT. La teoría puede ser cierta; esta medición
   nunca la probó.

Las tablas viejas se dejan sin retocar, con un aviso arriba: el error de método enseña
más que el número corregido. Todo el rigor estadístico estaba puesto sobre una cantidad
que no era la que yo creía medir, y ninguna repetición lo habría revelado — sólo un
control, que costó siete corridas de una página vacía.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 14:57:26 +00:00
Sergio 9c491b29fc estado: cosecha granja 2026-09-08T14:31:50Z — avance del árbol KDE 2026-09-08 14:31:50 +00:00
Sergio 2e496d62e0 estado: tras aparcar el jarlog — corpus al día 2026-09-08 14:11:55 +00:00
Sergio c3413d293e jarlog APARCADO: rompe atuq, y el coste está medido mientras el beneficio no
Al reconstruir atuq sobre el firefox con jarlog, murió:

    zipfile.BadZipFile: Bad magic number for central directory  (rebrand.py)

El jarlog convierte el omni.ja al formato «jar optimizado» de Mozilla, que mueve
el directorio central al principio:

    sin jarlog:  PK\003\004    ZIP estándar — zipfile lo abre, 5306 entradas
    con jarlog:  \376\204#\0   zipfile lo rechaza

Y atuq reempaqueta el omni.ja con zipfile para su branding. O sea que el jarlog
rompe el navegador propio de la distro.

La cuenta es asimétrica: el COSTE está medido y el BENEFICIO no —el banco corre
con caché caliente, donde reordenar el omni.ja no ahorra ninguna lectura, y dio
-0,1%, por debajo del suelo de ruido del propio banco—. Cambiar algo que
funciona por una ganancia que no se pudo medir, rompiendo algo que sí
funcionaba, es mal negocio.

Revertido a los hashes YA construidos y medidos (perfil 3647c6be, firefox
3d199174, atuq fab2fbfb): cero reconstrucciones. La documentación va fuera de
los campos hasheados, verificado antes y después.

Se retoma cuando (1) se mida el arranque EN FRÍO, que es su terreno, y (2)
rebrand.py sepa leer el jar optimizado o des-optimizarlo antes. El blob
92497cdd del mirror ya trae el jarlog: retomarlo es cambiar una línea.

Y LA LECCIÓN, que es la que más vale: el jarlog parecía GRATIS. «Es lo que hace
upstream y no cuesta nada» lo escribí yo en este mismo documento hace unas
horas. El coste no apareció midiendo el jarlog sino CONSTRUYENDO LO QUE DEPENDÍA
DE ÉL. Una función que se declara gratuita sin haber reconstruido a sus
consumidores no es gratuita: es no medida.
2026-09-08 14:08:25 +00:00
Sergio 17508043aa estado: waterfox renombrado, corpus al día 2026-09-08 14:05:18 +00:00
Sergio 824ee67f0f estado: cosecha granja 2026-09-08T14:02:27Z — avance del árbol KDE 2026-09-08 14:02:27 +00:00
Sergio 64c9e7196e estado: cosecha granja 2026-09-08T13:32:16Z — avance del árbol KDE 2026-09-08 13:32:16 +00:00
Sergio 34af57ee3f estado: cosecha granja 2026-09-08T13:02:01Z — avance del árbol KDE 2026-09-08 13:02:01 +00:00
Sergio c1eb86c83b estado: cosecha granja 2026-09-08T12:31:51Z — avance del árbol KDE 2026-09-08 12:31:51 +00:00
Sergio f06a5627e0 estado: cosecha granja 2026-09-08T12:01:47Z — avance del árbol KDE 2026-09-08 12:01:47 +00:00
Sergio 5ac6f35030 estado: cosecha granja 2026-09-08T11:32:16Z — avance del árbol KDE 2026-09-08 11:32:16 +00:00
Sergio 5d708f5225 estado: cosecha granja 2026-09-08T10:31:21Z — avance del árbol KDE 2026-09-08 10:31:21 +00:00
Sergio 59f8164b8b estado: cosecha granja 2026-09-08T10:02:10Z — avance del árbol KDE 2026-09-08 10:02:10 +00:00
Sergio 4aa3fbed66 estado: cosecha granja 2026-09-08T09:31:56Z — avance del árbol KDE 2026-09-08 09:31:56 +00:00
Sergio 01d4110241 estado: cosecha granja 2026-09-08T09:02:06Z — avance del árbol KDE 2026-09-08 09:02:06 +00:00
Sergio dce113cd3f estado: cosecha granja 2026-09-08T08:31:51Z — avance del árbol KDE 2026-09-08 08:31:51 +00:00
Sergio 613d74950b estado: cosecha granja 2026-09-08T08:01:43Z — avance del árbol KDE 2026-09-08 08:01:43 +00:00
Sergio 1ff5246667 estado: cosecha granja 2026-09-08T07:31:48Z — avance del árbol KDE 2026-09-08 07:31:49 +00:00
Sergio 57f9bf5b35 estado: cosecha granja 2026-09-08T07:01:44Z — avance del árbol KDE 2026-09-08 07:01:44 +00:00
Sergio 3306f8915d estado: cosecha granja 2026-09-08T06:31:24Z — avance del árbol KDE 2026-09-08 06:31:24 +00:00
Sergio e5b2d4e07d estado: cosecha granja 2026-09-08T06:01:46Z — avance del árbol KDE 2026-09-08 06:01:47 +00:00
Sergio d28a9313ab estado: cosecha granja 2026-09-08T05:31:26Z — avance del árbol KDE 2026-09-08 05:31:26 +00:00
Sergio c455a14611 estado: cosecha granja 2026-09-08T05:02:10Z — avance del árbol KDE 2026-09-08 05:02:10 +00:00
Sergio dd510d70e7 estado: cosecha granja 2026-09-08T04:31:59Z — avance del árbol KDE 2026-09-08 04:31:59 +00:00
Sergio 2584430a16 estado: cosecha granja 2026-09-08T04:01:28Z — avance del árbol KDE 2026-09-08 04:01:29 +00:00
Sergio 21bec8d02e estado: cosecha granja 2026-09-08T03:32:12Z — avance del árbol KDE 2026-09-08 03:32:12 +00:00