Commit Graph
1188 Commits
Author SHA1 Message Date
Sergio 0a1d087eaa estado: cosecha granja 2026-09-07T23:01:53Z — avance del árbol KDE 2026-09-07 23:01:53 +00:00
Sergio 67269a028a estado: cosecha granja 2026-09-07T22:32:00Z — avance del árbol KDE 2026-09-07 22:32:00 +00:00
Sergio 1dbaf8d85a estado: atuq sobre el firefox con PGO v2 — 860/862 y cero huecos
atuq b3:fab2fbfb, 340 M, libxul de 227.043.776 bytes: el mismo del motor con el
perfil de 46 páginas. Verificado que ARRANCA desde una hidratación limpia de
escritorio-sway, 0 errores de relocación.

El corpus queda en 860/862 sellados —los dos que faltan son `ajeno`, que es
frontera y no deuda— y el vigía de sonames en CERO huecos en los cinco perfiles.
2026-09-07 22:08:38 +00:00
Sergio 54a27b966b estado: cosecha granja 2026-09-07T22:02:23Z — avance del árbol KDE 2026-09-07 22:02:23 +00:00
Sergio 6b469a81d2 SDD 26: el corpus ampliado rinde — de -9,6% a -11,4% en maquetación
sin PGO    v1 (36 pág)      v2 (46 pág)
  DOM/maquetación       23.285 ms  21.050 (-9,6%)   20.640 (-11,4%)
  SunSpider 3d-raytrace 16.003 ms  15.846 (-1,0%)   15.857 (-0,9%)

La mejora en maquetación NO se afirma por las medianas sino por la separación:
SEIS de las siete muestras de v1 son más lentas que TODAS las de v2; sólo una
cae dentro del rango de v2.

En SunSpider v1 y v2 son INDISTINGUIBLES —los valores se entrelazan por
completo—, que es exactamente lo esperable: ese camino lo ejecuta el JIT y el
PGO no lo toca. Un corpus mejor no puede mejorar lo que el PGO no alcanza. El
-0,9% frente al -1,0% no dice que v2 sea peor ahí: dice que no se distingue.

Una de las siete corridas de v2 dio 120.029 ms contra ~20.600 de las otras seis.
La mediana lo ignora por diseño; una media lo habría convertido en «v2 es
catastróficamente peor». Fue la razón de elegir mediana antes de ver un número.

Y lo que el banco no puede afirmar, escrito: las 10 páginas nuevas ejercitan los
mismos subsistemas que la página de medición, así que el parentesco con lo que
ahora se entrena es mayor que antes. El -11,4% es real para ESTA carga;
generalizarlo a «cualquier página» sería el mismo error que cometía el corpus de
Mozilla, en la otra dirección.
2026-09-07 21:52:39 +00:00
Sergio 9769614866 estado: cosecha granja 2026-09-07T21:32:10Z — avance del árbol KDE 2026-09-07 21:32:10 +00:00
SergioandClaude Opus 5 b8865560c0 SDD 26 §8: la unidad 4.e deja de ser una afirmación y pasa a estar medida
`scripts/test-atuq-inicio.py` le pregunta al motor por sus overrides en vez de
mirar el XPI en el disco: moz-extension://…/inicio.html en las dos, contra
about:home / about:newtab cuando se le saca el XPI.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 21:03:35 +00:00
Sergio 94d7e8626f estado: cosecha granja 2026-09-07T21:02:16Z — avance del árbol KDE 2026-09-07 21:02:16 +00:00
Sergio b1f7a1813c estado: cosecha granja 2026-09-07T20:32:51Z — avance del árbol KDE 2026-09-07 20:32:51 +00:00
SergioandClaude Opus 5 1bebeab818 SDD 26 §7.bis: el camino de native messaging existe, con su sonda y su control
Antes de escribir el crate del host en tawasuyu había que saber si el mecanismo
funciona en nuestro build. Funciona, y el cuadro deja las cuatro cosas que hacen
falta para escribirlo: dónde va el manifiesto (/usr/lib/mozilla, no el appdir),
qué instala de verdad la extensión (el escaneo de distribution/extensions, NO el
install_url de la política), que el host tiene que ser un proceso largo, y que el
único error que nombra la causa es el del puerto de connectNative.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 20:27:30 +00:00
Sergio b12256eb2b estado: cosecha granja 2026-09-07T20:02:22Z — avance del árbol KDE 2026-09-07 20:02:22 +00:00
Sergio 40cf495a14 estado: cosecha granja 2026-09-07T19:33:36Z — avance del árbol KDE 2026-09-07 19:33:36 +00:00
Sergio 79bcbf49fd estado: cosecha granja 2026-09-07T19:01:49Z — avance del árbol KDE 2026-09-07 19:01:49 +00:00
SergioandClaude Opus 5 e31a36d5a4 SDD 26 §6.10: la cadena de notificaciones, probada desde la página web
Con `--via-atuq` el emisor es `new Notification(...)` dentro del navegador, o sea
las cinco piezas: libxul dlopeando libnotify.so.4 (invisible para cualquier
auditor de ELF), D-Bus, la activación y dunst dibujando. Veredicto por el
`onshow` del motor: MOSTRADA #33 con el .service, «ERROR al mostrar» sin él.

Y deja probado de paso que en el proceso de atuq la GLib NO se duplica — usa la
cadena `-shared` que arrastra su GTK3, la misma contra la que enlaza
libnotify.so.4. El que la duplicaba era dunstify.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 18:37:40 +00:00
SergioandClaude Opus 5 ec45c3fa97 dunst-headless: --via-atuq — la cadena entera, empezando en una página web
El modo por defecto prueba la cadena del SISTEMA (`notify-send` → bus → dunst).
Éste prueba la que motivó todo el hilo del §6.10: una página llama a
`new Notification(...)`, `libxul` hace `dlopen("libnotify.so.4")` —que no es
NEEDED de ningún ELF, o sea invisible para cualquier auditor—, eso habla D-Bus,
el bus ACTIVA dunst y dunst dibuja. Cinco piezas, y la única forma de saber que
están las cinco es verlo.

El veredicto acá no puede ser el diff de píxeles solo: el navegador ocupa la
pantalla y repinta por su cuenta. Lo decisivo es el `onshow` del objeto
Notification, que es el motor diciendo que el sistema ACEPTÓ la notificación; el
diff queda como corroboración y la captura «antes» se toma con atuq ya pintado.

    --via-atuq                     MOSTRADA #33 · 151.174 píxeles
    --via-atuq --negative-control  «ERROR al mostrar» · 0 píxeles

El control negativo también se lee distinto según el modo, y no por comodidad:
sin el .service, lo que tiene que faltar en el modo navegador es el onshow.

Captura en docs/evidencia/atuq-notificacion-web-sway-2026-09-07.png: dos globos
de dunst sobre la ventana de atuq, en sway headless, sin que nadie haya lanzado
el daemon a mano.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 18:37:24 +00:00
Sergio ca7a410b53 estado: cosecha granja 2026-09-07T18:31:59Z — avance del árbol KDE 2026-09-07 18:31:59 +00:00
SergioandClaude Opus 5 e98362925a SDD 26 §6.10: la mitad de sway queda cerrada, con la evidencia al lado
`dunst` 1.12.2 atiende `org.freedesktop.Notifications` en el cuarto escritorio.
La prueba no es que la receta selle: el bus ACTIVA al daemon y el daemon DIBUJA
—14.832 píxeles cambiados con el .service puesto, 0 sin él—.

Y queda anotada la media función que apareció de paso: dunstify segfaultea por
las dos GLib (estática del corpus + compartida que arrastra libnotify.so.4), o
sea que en este corpus quién enlaza qué GLib es parte del contrato.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 18:15:50 +00:00
SergioandClaude Opus 5 4f9ee5430f dunst: sway ya atiende las notificaciones, y hay un píxel que lo prueba
Era la única mitad que quedaba abierta del mapa del §6.10: KDE atiende
`org.freedesktop.Notifications` con plasma-workspace, GNOME con gnome-shell y
COSMIC con cosmic-notifications; sway no tenía a NADIE, así que una página que
pedía notificar mandaba el mensaje al bus y se lo comía el silencio.

`dunst` 1.12.2 y no `mako` —que es el de la casa wlroots— por dos razones
medidas: el nombre `mako` YA ESTÁ OCUPADO en el corpus por el motor de plantillas
de mesa, y el cierre del perfil incluye las herramientas de build, así que la
imagen terminaría con dos artefactos homónimos peleando por las mismas rutas; y
mako habla D-Bus por sd-bus, que en musl es una receta nueva (basu), mientras
dunst habla por GDBus, que ya está sellado. Cero dependencias nuevas.

DOS GUARDIANES EN LA PROPIA RECETA, porque las dos cosas que importan no se ven
en que compile:

- `X11=0` es una intención; el hecho se lee en el ELF. dunst compila los dos
  backends por defecto y su config.mk avisa: sin wayland «forzará xwayland». En
  esta distro eso sella un binario que arranca, toma el bus y NO PINTA NUNCA. La
  fase exige `libwayland-client` entre los NEEDED y prohíbe `libX11`.
- El `.service` de D-Bus es la mitad que importa: sin systemd, al daemon lo
  levanta EL BUS. Se comprueba que reclame `org.freedesktop.Notifications` y se
  le saca la línea `SystemdService=`, que acá no puede significar nada.

Y `DUNSTIFY=0`: entró primero en 1 y el binario **segfaultea hasta en
`--help`** (rc=139 en las tres pruebas). La causa es el cuadro que este repo ya
tiene escrito: nuestro `libnotify.so.4` es compartido y arrastra la cadena glib
`.so`, mientras esta cola enlaza la GLib estática ⇒ dos copias de GObject en un
proceso. No se pierde nada: el emisor de la casa es `notify-send`, que viene
DENTRO del artefacto de libnotify y ya está en las cuatro imágenes. Hay un
guardián que frena el día que alguien vuelva a poner DUNSTIFY=1 sin leer.

LA PRUEBA, en `scripts/wlr/dunst-headless.sh`: sway headless + bus de sesión +
`notify-send`, y NADIE lanza dunst a mano — lo activa el bus por el .service,
que es el mismo camino de una página web en atuq. La evidencia es un diff de
píxeles antes/después acotado al cuadrante donde dunst dibuja, porque un log en
verde es compatible con una pantalla vacía y el color no distingue (swaynag pinta
su barra de error en el mismo rojo).

    positivo  14832 píxeles cambiados · servidor: dunst knopwob 1.12.2 1.2
    control   0 píxeles · ServiceUnknown · notify-send rc=1

El control negativo borra el .service dentro del overlay temporal y EXIGE que no
se dibuje nada: probado en los dos sentidos.

Captura en docs/evidencia/dunst-sway-notificacion-2026-09-07.png.
Vigía de sonames: escritorio-sway 203 → 204 nodos, 512 sonames, 0 sin proveedor.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 18:15:29 +00:00
Sergio 7d9fc96acb estado: cosecha granja 2026-09-07T18:02:07Z — avance del árbol KDE 2026-09-07 18:02:07 +00:00
Sergio 999a13cafc estado: cosecha granja 2026-09-07T17:02:16Z — avance del árbol KDE 2026-09-07 17:02:16 +00:00
Sergio 5171ea9df4 estado: cosecha granja 2026-09-07T16:32:02Z — avance del árbol KDE 2026-09-07 16:32:02 +00:00
Sergio acccbc0a2c SDD 26: la ganancia del PGO, medida — y sale al revés de lo esperable
DOM+layout+strings, FUERA del corpus:  23.540 -> 21.327 ms   -9,4%
  SunSpider 3d-raytrace, DENTRO:         16.034 -> 15.878 ms   -1,0%

Mismo rootfs, mismo script, corridas intercaladas A/B/A/B, mediana de 7,
calentamiento descartado; lo único que cambia entre variantes es un --ro-bind de
/usr/lib/firefox. Los rangos no se solapan en ninguna de las dos, así que ambas
diferencias son reales y no ruido.

Yo esperaba lo contrario: que medir sobre el conjunto de ENTRENAMIENTO inflara
la ganancia. Da el número MÁS BAJO, y la razón es mejor que la predicción:
3d-raytrace es aritmética pura en un bucle caliente, y ese bucle no lo ejecuta
el C++ de SpiderMonkey sino código máquina que el JIT genera en runtime. El PGO
optimiza el intérprete, el GC y el propio JIT — no lo que el JIT emite. Un
benchmark JIT-bound es casi ciego al PGO por construcción.

Donde se ve es en DOM/layout/arranque, que es C++ de punta a punta, y que además
es lo que el usuario percibe: la medición cubre el ciclo completo del proceso
(arrancar, renderizar, capturar, salir), no el régimen de una página cargada.

Corolario anotado: el corpus de entrenamiento está sesgado hacia JS justo donde
el PGO menos rinde. Un corpus con más maquetación probablemente daría más. Es su
propia unidad de trabajo.
2026-09-07 16:20:20 +00:00
Sergio 70026f5730 estado: cosecha granja 2026-09-07T16:02:08Z — avance del árbol KDE 2026-09-07 16:02:08 +00:00
SergioandClaude Opus 5 361a47cfc4 SDD 26: cae la última frase del §6.10 que el §6.11 desmintió, y la unidad 4.f al plan
«El más caro para el usuario es ffmpeg: sin él, un sitio que sirva H.264 no
reproduce» — el hueco más caro del mapa no existía. De los cuatro «sin receta»
quedan tres y ninguno es un códec.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 15:41:37 +00:00
SergioandClaude Opus 5 6a1343d2d2 SDD 26 §6.11: la pregunta era «¿reproduce?», y la respuesta destapó dos errores y un bug
El §6.10 preguntó «¿qué NO puede hacer?» y contestó leyendo cadenas de sonames.
Media pregunta. Al hacer la otra mitad —¿se ve el vídeo?— salieron tres cosas:

DOS ERRORES DEL MAPA, los dos por leer una etiqueta en vez de medir:

- «no hay receta de ffmpeg» era falso: la hay, sellada, y ya viajaba en la
  clausura de los cuatro escritorios por `mpv`. Lo que faltaba era la lista de
  raíces del runner.
- «VA-API sin receta» también: `libva` está y está en las cuatro imágenes. El
  hueco es real pero es el DRIVER — las tres mesa van `-Dgallium-va=disabled`.
  Y queda anotado que ahora el mapa ya no lo puede ver, porque la librería
  presente silencia el aviso sin encender la función.

UN BUG REAL: AV1 no reproducía. Gecko se come el primer elemento de
`LD_LIBRARY_PATH` al lanzar el RDD ⇒ sin appdir ⇒ ffvpx no carga ⇒ se cae al
ffmpeg del sistema, que no trae AV1 por software. Sin error, sin NEEDED
faltante, sin cadena ausente: `readyState=1` para siempre.

Y lo que quedó MEDIDO, por el lanzador de verdad y headless: H.264+AAC, VP9+Opus,
AV1, MP3 y FLAC reproducen, con el tiempo avanzando y no con «se creó el
decodificador» — que en AV1 se creaba igual y no entregaba un cuadro.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNFzrqFBEt6W7maGJKf2Xs
2026-09-07 15:40:45 +00:00
Sergio 7e65d35e57 estado: cosecha granja 2026-09-07T15:32:05Z — avance del árbol KDE 2026-09-07 15:32:05 +00:00
Sergio a9cfaef681 estado: 860/862 sellados, cero deuda y cero huecos de soname
El corpus queda entero tras la jornada: los dos únicos no sellados son `ajeno`
(steam-runtime-sniper, xwayland), que son frontera y no deuda.

atuq reconstruido sobre el firefox con PGO (b3:0acf6f58): 340 M, libxul de
227.802.816 bytes — el mismo del motor. La tesis del derivado sostenida: el
navegador propio se rehace en segundos sobre un motor nuevo.

Verificado que arranca desde una hidratación limpia de escritorio-sway, 0
errores de relocación. Y verificado que el PGO viaja EN EL ARTEFACTO y no sólo
en el configure: buildconfig.html dentro del omni.ja de atuq contiene
`profile-use`, junto a `wasi-sysroot` y `lto=cross`.

Nota de método: la CAPTURA no servía para esto. Salió byte a byte idéntica a la
de ayer porque la sección «Configure options» cae bajo el viewport — o sea que
una imagen igual no probaba que nada hubiera cambiado. El artefacto sí.
2026-09-07 15:12:22 +00:00
Sergio 4999d79b56 estado: cosecha granja 2026-09-07T15:01:59Z — avance del árbol KDE 2026-09-07 15:01:59 +00:00
Sergio a7c2aa571c estado: cosecha granja 2026-09-07T14:32:26Z — avance del árbol KDE 2026-09-07 14:32:26 +00:00
Sergio 82dfec0290 estado: cosecha granja 2026-09-07T14:02:31Z — avance del árbol KDE 2026-09-07 14:02:31 +00:00
Sergio 2c5ed6448e estado: cosecha granja 2026-09-07T13:32:04Z — avance del árbol KDE 2026-09-07 13:32:04 +00:00
Sergio 5b7b7fa59b estado: cosecha granja 2026-09-07T13:02:16Z — avance del árbol KDE 2026-09-07 13:02:16 +00:00
Sergio 3996f67d4d estado: cosecha granja 2026-09-07T12:32:07Z — avance del árbol KDE 2026-09-07 12:32:07 +00:00
Sergio fe95998675 SDD 26: el firefox con PGO reproduce bit a bit — unidad 3.a cerrada
verificar-repro.sh: REPRODUCEN 1, DERIVA 0, NO-DETERMINISMO 0.

Era el riesgo real de esta unidad, no el rendimiento. El perfil es no
determinista por naturaleza; congelarlo como fuente pineada era el ARGUMENTO de
por qué el build seguiría siendo reproducible, y esto es la MEDICIÓN. Si
-fprofile-use hubiera metido cualquier decisión dependiente del orden o del
timing, habríamos cambiado velocidad por el invariante del proyecto.
2026-09-07 12:03:52 +00:00
Sergio a77373bc21 estado: cosecha granja 2026-09-07T12:02:00Z — avance del árbol KDE 2026-09-07 12:02:00 +00:00
Sergio 2010918252 estado: cosecha granja 2026-09-07T11:32:07Z — avance del árbol KDE 2026-09-07 11:32:07 +00:00
Sergio 024ebc52d2 SDD 26 §3.quinquies: el PGO encendido y los tres muros que el plan no tenía
El §3.ter daba dos muros —el display y el no-determinismo del perfil— y los dos
eran ciertos. Aparecieron tres más, ninguno visible sin construir:

  1. libclang_rt.profile.a no existía: el lab trae clang pero NINGUNA runtime de
     compiler-rt. El instrumentado murió en el minuto 38:56.
  2. Los sandboxes de Firefox matan la corrida de perfilado con signal 11: el
     proceso que renderiza no nace, 0 GET, y el .profraw que queda es el del
     padre arrancando. Un perfil de nada, con todo en verde.
  3. El worker no puede bajar del mirror: tiene mirror-env.sh pero no la clave.

Y queda escrito cómo se verificó que el PGO llegó, que NO pudo ser como RLBox.
Ahí el artefacto delata la jaula (símbolos w2c_*, cero -> 634). Acá el
discriminante análogo —las secciones .text.hot que clang emite al particionar
por temperatura— NO SIRVE: con lld y ThinLTO el enlazador las fusiona y dan cero
con PGO y sin él. La evidencia válida está un nivel bajo el configure: 189
invocaciones del compilador con -fprofile-use, llvm-profdata encontrado, cero
avisos de perfil que no cuadra, y libxul creciendo 1,7 MB.

Es evidencia de BUILD y no de ARTEFACTO, y conviene decirlo así en vez de
presentarla como si fuera lo mismo.
2026-09-07 11:16:13 +00:00
Sergio bf6e5ce5cb estado: cosecha granja 2026-09-07T11:01:55Z — avance del árbol KDE 2026-09-07 11:01:55 +00:00
Sergio d55bc6514e estado: cosecha granja 2026-09-07T10:31:56Z — avance del árbol KDE 2026-09-07 10:31:56 +00:00
Sergio 53180fa56b estado: cosecha granja 2026-09-07T10:02:29Z — avance del árbol KDE 2026-09-07 10:02:29 +00:00
Sergio 3928eebad2 estado: cosecha granja 2026-09-07T09:01:51Z — avance del árbol KDE 2026-09-07 09:01:51 +00:00
Sergio df37509623 estado: cosecha granja 2026-09-07T08:32:02Z — avance del árbol KDE 2026-09-07 08:32:02 +00:00
Sergio 24f96a34de estado: cosecha granja 2026-09-07T08:01:50Z — avance del árbol KDE 2026-09-07 08:01:50 +00:00
Sergio baba1cb7e7 estado: cosecha granja 2026-09-07T07:32:04Z — avance del árbol KDE 2026-09-07 07:32:04 +00:00
Sergio eaacc465a0 estado: cosecha granja 2026-09-07T07:01:48Z — avance del árbol KDE 2026-09-07 07:01:48 +00:00
Sergio 1a647885ee estado: cosecha granja 2026-09-07T06:32:04Z — avance del árbol KDE 2026-09-07 06:32:04 +00:00
Sergio d3c15f1033 estado: cosecha granja 2026-09-07T06:02:25Z — avance del árbol KDE 2026-09-07 06:02:25 +00:00
Sergio 6ddfad72d4 estado: cosecha granja 2026-09-07T05:32:16Z — avance del árbol KDE 2026-09-07 05:32:16 +00:00
Sergio 27603a735a estado: cosecha granja 2026-09-07T05:02:08Z — avance del árbol KDE 2026-09-07 05:02:08 +00:00
Sergio d4f9726b92 estado: cosecha granja 2026-09-07T04:32:06Z — avance del árbol KDE 2026-09-07 04:32:06 +00:00