Commit Graph
1031 Commits
Author SHA1 Message Date
Sergio 5db1c7ec89 estado: cosecha granja 2026-09-05T14:02:07Z — avance del árbol KDE 2026-09-05 14:02:07 +00:00
Sergio 4b9f8aa392 estado: cosecha granja 2026-09-05T13:32:14Z — avance del árbol KDE 2026-09-05 13:32:14 +00:00
Sergio 323475a6f1 estado: cosecha granja 2026-09-05T13:02:07Z — avance del árbol KDE 2026-09-05 13:02:07 +00:00
Sergio af0e90ba8d estado: cosecha granja 2026-09-05T12:32:10Z — avance del árbol KDE 2026-09-05 12:32:10 +00:00
Sergio 0bda91a374 estado: cosecha granja 2026-09-05T12:02:20Z — avance del árbol KDE 2026-09-05 12:02:20 +00:00
Sergio 00910be94d SDD 26 §2.quater: abrirlo en una pantalla destapó tres fallos que la clausura no veía
Con atuq sellado y verificado, se hidrató y se abrió en waypipe. No arrancó, y los tres motivos son
justamente la diferencia entre «sellado» y «usable»: el EXDEV de hidratar a otro mount, el lanzador
que no puede ser un symlink porque los ELF no traen RPATH, y un bug del CORPUS —atk se había tragado
GObject entero por declarar la glib estática siendo una .so—.

El tercero es el que vale escribir: el síntoma (45 GLib-GObject-CRITICAL y un SIGSEGV) no nombra a
atk por ningún lado, y no se ve mirando el rootfs porque había UNA sola libgobject. Se caza
preguntando quién DEFINE el símbolo, no quién lo usa.

Y una corrección de número: firefox se reconstruye en ~50 minutos, no en las cuatro horas que este
documento venía repitiendo. Ese número era folclore de la receta, no una medición.
2026-09-05 11:47:51 +00:00
Sergio 9250f07a56 estado: cosecha granja 2026-09-05T11:01:56Z — avance del árbol KDE 2026-09-05 11:01:56 +00:00
Sergio 14fbb42834 estado: cosecha granja 2026-09-05T10:31:58Z — avance del árbol KDE 2026-09-05 10:31:58 +00:00
Sergio 6d8bb7d901 estado: cosecha granja 2026-09-05T10:02:14Z — avance del árbol KDE 2026-09-05 10:02:14 +00:00
Sergio 901ed3ea02 estado: cosecha granja 2026-09-05T09:32:20Z — avance del árbol KDE 2026-09-05 09:32:20 +00:00
Sergio 9d0ed92b60 estado: cosecha granja 2026-09-05T09:02:08Z — avance del árbol KDE 2026-09-05 09:02:09 +00:00
Sergio 1728fd65e5 firefox NO reproduce bit a bit: el BuildID es la fecha del build — medido y anotado, no arreglado de paso
Al abrir `application.ini` para el branding de atuq apareció esto:

    BuildID=20260905035306

Es la fecha y hora del build. Dos construcciones de la MISMA receta, con el mismo ArtifactHash,
producen bytes distintos. Es justo el agujero que el invariante de reproducibilidad existe para
cerrar, y no se ve en `build-state.json` porque el hash es input-addressed y no se mueve por esto.

El arreglo es conocido y lo usa Alpine: exportar `MOZ_BUILD_DATE` con un valor determinista.

NO se aplica de paso, a propósito: vive en una FASE, así que re-hashea la receta y cuesta otro build
de cuatro horas más el re-sellado de atuq, que cuelga de ella. Es su propia unidad de trabajo y
queda como 4.c en el plan del SDD 26.

El comentario se comprobó que NO mueve el hash antes de commitearlo (b3:aa90192a antes y después):
un comentario fuera de las fases no entra en `hash_inputs`, así que el firefox sellado sigue válido.

Y el §2.ter del SDD queda con el estado real de atuq v0.2 y su evidencia.
2026-09-05 08:50:17 +00:00
Sergio 4843756757 estado: cosecha granja 2026-09-05T08:32:09Z — avance del árbol KDE 2026-09-05 08:32:09 +00:00
Sergio fcc99aabfb estado: cosecha granja 2026-09-05T08:02:07Z — avance del árbol KDE 2026-09-05 08:02:07 +00:00
Sergio 03f442de11 estado: cosecha granja 2026-09-05T07:32:10Z — avance del árbol KDE 2026-09-05 07:32:10 +00:00
Sergio e15be575ab estado: cosecha granja 2026-09-05T07:01:53Z — avance del árbol KDE 2026-09-05 07:01:53 +00:00
Sergio 3a0e7e7fbf estado: cosecha granja 2026-09-05T06:32:06Z — avance del árbol KDE 2026-09-05 06:32:06 +00:00
Sergio fb83528fed estado: cosecha granja 2026-09-05T06:02:10Z — avance del árbol KDE 2026-09-05 06:02:10 +00:00
Sergio 8ce3db0053 estado: cosecha granja 2026-09-05T05:32:08Z — avance del árbol KDE 2026-09-05 05:32:08 +00:00
Sergio a4af37e01d estado: cosecha granja 2026-09-05T05:01:58Z — avance del árbol KDE 2026-09-05 05:01:58 +00:00
Sergio f32fcb15d9 estado: cosecha granja 2026-09-05T04:32:12Z — avance del árbol KDE 2026-09-05 04:32:12 +00:00
Sergio 6068c4088d SDD 26 §2.ter: la fuente de atuq vive en el repo, y eso exigió un modo de [source] nuevo
El documento daba por hecho que la receta derivada se podía escribir con lo que hammer ya tenía.
No: `[source]` era obligatoriamente git o tarball. Queda escrito el muro, por qué los rodeos eran
peores (fetchear una fuente que se ignora miente sobre la identidad; un repo aparte obliga al worker
a leer algo privado) y la salida — `source.dir`, hasheado por contenido con el `of_tree` que ya
existía para Stage 2.

Y el estado real del plan: la unidad 4 tiene su v0.1 escrita, con el branding y el re-empaque de
omni.ja separados como 4.b porque los dos necesitan mirar el artefacto que `firefox` todavía no
selló.
2026-09-05 04:13:47 +00:00
Sergio 52e4dbe8cc estado: cosecha granja 2026-09-05T04:02:19Z — avance del árbol KDE 2026-09-05 04:02:19 +00:00
Sergio b38e121a6b estado: cosecha granja 2026-09-05T03:32:02Z — avance del árbol KDE 2026-09-05 03:32:02 +00:00
Sergio e5bf8da35a SDD 26 §3: corregido — la toolchain no era una receta de LLVM, era apk add lld
El documento estimó una receta `llvm-toolchain` (clang+lld+libc++ desde fuente) como la unidad de
mayor palanca del frente. Mirar el lab en vez de suponerlo la redujo a un `apk add`: clang22 y
llvm22 ya estaban, `Compiler::Clang` ya estaba cableado en hammer y ninguna receta lo usaba.

Se corrige el §3 con la evidencia y la medición de la huella (no se movió ⇒ 837 artefactos
intactos), y el plan del §8: la unidad 2 queda cerrada, la 3 pasa a ser construir, y el PGO se
separa como 3.a porque tiene sus propios dos muros (sin X11 para el profileserver, profdata no
determinista).
2026-09-05 03:14:02 +00:00
Sergio cb3ecd5a00 firefox pasa a clang+lld con LTO: la puerta de las optimizaciones costaba apk add lld, no una receta de LLVM
El SDD 26 estimó que habilitar PGO/LTO exigía una receta `llvm-toolchain` (clang+lld+libc++ desde
fuente). ERA CARO DE MÁS. Al mirar el lab en vez de suponerlo:

- `.dev-fs/alpine` YA TRAE clang22 + llvm22 22.1.8 — la MISMA major que usa el APKBUILD de Alpine
  para este mismo Firefox (`_llvmver=22`).
- `Compiler::Clang` YA EXISTE en hammer, cableado de punta a punta: `parse_compiler` lo acepta y
  `hammer-build/src/lib.rs` pone CC=clang, CXX=clang++ y AR=llvm-ar. NINGUNA receta lo usaba.
- Lo único que faltaba era `ld.lld`. `apk add lld` ⇒ lld22 22.1.8, dos paquetes, cero upgrades.

CON ESO CAEN LOS TRES MUROS QUE OBLIGABAN A gcc, sin perder lo que gcc daba: el sondeo de linker se
satisface con `--enable-linker=lld`, el `ar` lo pone hammer solo, y el `NEEDED` de la stdlib de C++
existe porque clang++ de Alpine usa la libstdc++ COMPARTIDA — la prueba no es teórica, Alpine
construye este Firefox con clang22 y sin libcxx en sus makedepends.

LA HUELLA DEL LAB NO SE MOVIÓ, Y SE MIDIÓ ANTES DE TOCAR NADA. `lld` no casa ningún prefijo de
TOOLCHAIN_PREFIXES (hammer-core/src/lab.rs), así que los 43 paquetes que entran en `hash_inputs`
salieron idénticos ⇒ los 837 artefactos sellados quedan intactos. Eso es lo que hace barato el
cambio HOY, y a la vez es un agujero escrito en los dos sitios: la versión de lld no es parte de la
identidad del artefacto, y sólo expone a las recetas `compiler="clang"`, que hoy es una. Meter
"lld" en la lista de prefijos es lo correcto y cuesta re-hashear el corpus entero: próxima campaña.

En el mozconfig entran, además de lld: `--enable-lto=cross`, `--enable-packed-relative-relocs` y
`--with-unsigned-addon-scopes=app,system`. El último no es cosmético: sin él un Firefox de release
rechaza las extensiones que la distro deja en distribution/extensions/, así que la capacidad de atuq
de shipear su propio `sct` se decide ACÁ, en la base, y no en el overlay del derivado.

PGO no entra en esta pasada y el porqué queda escrito en la receta: el perfil se junta corriendo el
navegador (Alpine y Arch usan xvfb-run; nosotros no tenemos X11 ⇒ sway headless) y el profdata NO es
determinista, así que tiene que sellarse como artefacto propio y consumirse por hash.

ThinLTO se capa con la misma cuenta que -j y por la misma razón que ella no es un literal: un número
fijo ataría el ArtifactHash a la RAM de quien escribió la receta.

Nuevo ArtifactHash: b3:6f2a3b2f6db4452ed0d2d3f4e2ff7cd6562a86878d4360653859720be1c3d94d
(el firefox 154.0 sellado con gcc queda SUPERADO, no perdido).
2026-09-05 03:13:38 +00:00
Sergio 42404bc692 SDD 26 §3.bis: el diff contra Alpine dice que no es sólo PGO, y una de las diferencias es de seguridad
Pregunta del usuario: «¿firefox está sin pgo-lto-bolt? ¿eso es una desventaja frente a las otras
distros?». Sí, y para medirlo se trajeron el APKBUILD + mozconfig de community/firefox de aports y
el PKGBUILD de Arch, y se compararon línea a línea con el mozconfig de recipes/firefox.toml.

La comparación importa porque ALPINE ES NUESTRO PROPIO UPSTREAM: de ahí salen los once parches de
musl. No es una distro lejana sacándonos ventaja, es la que ya construye este mismo código con
`--enable-lto=cross` + `--enable-profile-use=cross` + jarlog. Arch hace lo mismo («Do 3-tier PGO»).

BOLT NO ES LA DESVENTAJA: cero menciones en los dos ficheros. Lo que nos separa es PGO+LTO.

Y el diff completo da más que velocidad:
- RLBOX APAGADO (`--without-wasm-sandboxed-libraries`) es una desventaja de SEGURIDAD y pesa más que
  el PGO: es la jaula wasm de graphite/ogg/expat/woff2, o sea el código que come entrada no
  confiable. Encenderlo pide wasi-sdk + wasi-compiler-rt en el corpus: receta, no flag.
- `--with-unsigned-addon-scopes=app,system` nos falta y ATUQ LO NECESITA para shipear sus propias
  extensiones ⇒ una capacidad de atuq que NO se resuelve en el overlay: exige tocar la base.
- Falta RELR; el linker es GNU ld y no lld.
- `--disable-jemalloc` NO es desviación nuestra: Alpine también lo pasa. Un fantasma menos que
  perseguir.
- Bundlear en vez de `--with-system-*` es diferencia a propósito: el corpus ES la fuente.

Corolario que ordena el plan: TODO ESO ENTRA EN UN SOLO REBUILD. Cada uno son cuatro horas y
re-sella la cola Gecko entera, así que la unidad 3 pasa a ser una pasada única y RLBox se separa
como 3.b.

Y dos muros del PGO que las distros no tienen, porque no persiguen lo que nosotros perseguimos:
- las dos corren el profileserver bajo `xvfb-run`, y NO TENEMOS X11 en el corpus (Wayland-only) ⇒ va
  bajo sway headless, que ya existe del frente wlr.
- el profdata NO ES DETERMINISTA (contadores dependientes del timing) ⇒ se genera una vez, se sella
  como artefacto propio y se consume por hash, o firefox deja de reproducir.

Bonus para el §2: el jarlog del PGO ordena el omni.ja para el arranque. Re-empacarlo a lo bruto tira
esa optimización a la basura sin que nadie lo note.
2026-09-05 03:03:23 +00:00
Sergio 1fcad3f6de SDD 26: atuq, el envoltorio Gecko — derivado, no fork; y la puerta es clang
La pregunta era «nuestro propio envoltorio en vez de zen». La respuesta tiene tres hallazgos que
cambian el precio, y el documento los pone antes que la lista de features.

1. NO HAY ENVOLTORIO FUERA DEL CHROME. Gecko no tiene API de embebido en escritorio desde que murió
   XULRunner (GeckoView es Android) ⇒ una carcasa Llimphi con el motor adentro no es posible. El
   envoltorio es chrome-level o no es. Que es exactamente lo que Zen es.

2. ARTEFACTO DERIVADO, NO FORK DE FUENTE. Si atuq parchea el árbol, cada iteración de UI cuesta
   cuatro horas de Gecko y el diseño de chrome es iterativo por naturaleza. Como no distribuimos un
   binario sino que sellamos artefactos, atuq puede depender de `firefox` e inyectar marca, prefs,
   policies.json y omni.ja encima: itera en segundos, no mueve el ArtifactHash del corpus, y hereda
   las CVE gratis — que es lo que hundió a los forks de Firefox. Con sus dos gotchas escritos: el
   omni.ja es un zip y hay que re-empacarlo determinista, y sin invalidar el startup cache el
   overlay PARECE no agarrar.

3. LAS OPTIMIZACIONES NO SON UN FLAG, SON UNA TOOLCHAIN. PGO/LTO/BOLT son cadena de clang en Gecko,
   y el corpus no tiene clang usable como compilador: clang18.toml compila SÓLO libclang.so (para
   bindgen) y llvm18 se selló con PROJECTS="". La unidad real es una receta llvm-toolchain con
   clang+lld+libc++ musl — la misma pieza que resuelve el muro 3 de firefox.toml. Es la mayor
   palanca del frente, y por eso encabeza el plan.

Lo que NO se promete va escrito ANTES de la lista de features, con el criterio del modelo de
adversario de qullqa: atuq no es Tor Browser y no va a tener «modo Tor» — es un binario único en el
mundo (musl, wayland-only, branding propio), así que salir por Tor desde acá identifica MÁS, no
menos. Se ofrece proxy por contenedor, que es separación de tráfico y no anonimato.

Los diferenciadores van con una columna «quién más lo tiene» para no contarnos un cuento: sct
(transparencia de scripts, BLAKE3 + testigo) no lo tiene nadie y ya está escrito en tawasuyu;
torrent SÍ lo tiene Vivaldi, y lo nuestro sólo vale por dónde cae lo bajado (el CAS). Todo lo que
no es CSS pasa por UNA costura: un host de native messaging en Rust.

Y atuq no abandona a puriy: el host, el testigo y el archivo con RAG son agnósticos del motor, así
que cuando puriy madure se enchufan del mismo lado. atuq es su andamio, no su desvío.
2026-09-05 02:54:23 +00:00
Sergio 1a3b62b1f6 estado: cosecha granja 2026-09-05T02:33:35Z — avance del árbol KDE 2026-09-05 02:33:35 +00:00
Sergio ad01dea4c2 estado: cosecha granja 2026-09-05T02:02:02Z — avance del árbol KDE 2026-09-05 02:02:02 +00:00
Sergio fb917cbb79 estado: cosecha granja 2026-09-05T01:31:49Z — avance del árbol KDE 2026-09-05 01:31:49 +00:00
Sergio 067631fa52 estado: cosecha granja 2026-09-05T01:02:18Z — avance del árbol KDE 2026-09-05 01:02:18 +00:00
Sergio db0767b3cc estado: cosecha granja 2026-09-05T00:31:44Z — avance del árbol KDE 2026-09-05 00:31:44 +00:00
Sergio cd6181df94 estado: cosecha granja 2026-09-05T00:01:57Z — avance del árbol KDE 2026-09-05 00:01:57 +00:00
Sergio 6673a5b34c estado: cosecha granja 2026-09-04T23:32:09Z — avance del árbol KDE 2026-09-04 23:32:09 +00:00
Sergio 7083a0edfc estado: cosecha granja 2026-09-04T23:00:02Z — avance del árbol KDE 2026-09-04 23:00:02 +00:00
Sergio 688ea27f40 estado: cosecha granja 2026-09-04T22:31:53Z — avance del árbol KDE 2026-09-04 22:31:53 +00:00
Sergio caeee204a6 estado: cosecha granja 2026-09-04T22:02:03Z — avance del árbol KDE 2026-09-04 22:02:03 +00:00
Sergio 5776f63aed estado: cosecha granja 2026-09-04T21:31:52Z — avance del árbol KDE 2026-09-04 21:31:52 +00:00
Sergio e1f081b06b estado: cosecha granja 2026-09-04T20:32:59Z — avance del árbol KDE 2026-09-04 20:32:59 +00:00
Sergio e7e008e126 estado: cosecha granja 2026-09-04T20:03:06Z — avance del árbol KDE 2026-09-04 20:03:06 +00:00
Sergio 4ec49e9962 estado: cosecha granja 2026-09-04T19:33:12Z — avance del árbol KDE 2026-09-04 19:33:12 +00:00
Sergio 9f908090d5 estado: cosecha granja 2026-09-04T19:03:00Z — avance del árbol KDE 2026-09-04 19:03:00 +00:00
Sergio 8c15c2eaf4 estado: cosecha granja 2026-09-04T18:32:49Z — avance del árbol KDE 2026-09-04 18:32:49 +00:00
Sergio 188a45b1d5 estado: cosecha granja 2026-09-04T18:05:16Z — avance del árbol KDE 2026-09-04 18:05:16 +00:00
Sergio dc8aa7367e plataforma Gecko: cbindgen sube al corpus
Genera las cabeceras C++ de los componentes Rust de Gecko (Stylo, WebRender) y el
build de Firefox la exige. Mudanza gratis: [deps] vacío ⇒ no hay cierre que
cambiar, mismo ArtifactHash (b3:bd2e6ca6) en las dos rutas, radio 0.
2026-09-04 17:54:17 +00:00
Sergio 027d3a25ef plataforma Gecko: clang18 sube al corpus — bindgen necesita libclang
El build de Firefox corre bindgen sobre los headers de C++ y bindgen carga
libclang.so en RUNTIME. La receta ya existía —nació en incoming-cosmic por un
crate *-sys del portal, y su commit de origen dice «sólo libclang.so»— pero desde
el corpus no se alcanza una cola hermana. Sin esto no hay Firefox, ni Waterfox,
ni Zen.

Mudanza medida ANTES, no después: sus cinco deps (cmake, samurai, python3,
pkgconf, llvm18) viven sólo en el corpus, así que incoming-cosmic ya las resolvía
por caída al padre y el cierre no cambia. hammer hash dio el MISMO ArtifactHash
(b3:25d95279) en las dos rutas.
Verificado que xdg-desktop-portal-cosmic —su único dependiente— sigue SELLADO y
que la cola cosmic queda en 36/36 sin deuda: cero rebuilds.

Se MUEVE y no se copia: dos ficheros para un artefacto es el cuadro de las dos
glib esperando a que uno de los dos derive.
2026-09-04 17:53:03 +00:00
Sergio e684c26e52 targets: obs-studio entra al perfil escritorio-kde (274/274)
Una receta sellada que ningún perfil declara NO ESTÁ EN NINGUNA IMAGEN, y la
métrica de clausura no lo puede ver porque mide lo declarado — la lección que este
fichero ya aprendió con foot en sway y con las 22 apps KDE. OBS estaba sellado y
en ninguna imagen.

Entra SÓLO en escritorio-kde, y no por preferencia: su frontend es Qt6 y las 13
recetas Qt viven sólo en esa cola. Verificado con `yupana perfiles obs-studio`.
El perfil pasa de 263/263 a 274/274 — arrastra 11 nodos a la clausura, todos ya
sellados, y el grafo sigue cerrando.

De paso: el aviso de los «tres huecos de mpv» estaba repetido en los CUATRO
perfiles de escritorio y hoy quedó vencido en los cuatro (ALSA/PipeWire, Lua/OSC
y vaapi están cerrados). Corregidos los cuatro; el assert de count==1 fue lo que
destapó que no era uno solo.
2026-09-04 17:42:47 +00:00
Sergio 461f677368 estado: cosecha granja 2026-09-04T17:32:11Z — avance del árbol KDE 2026-09-04 17:32:11 +00:00
Sergio 554c59b1b5 estado: corpus 831/831 y KDE 1010/1010 tras OBS y sus 7 deps nuevas
Entran libglvnd, uthash, nlohmann-json, jansson, x264, simde, pciutils-shared y
mbedtls al corpus, y obs-studio a incoming-kde. Cero en deuda en los 7 perfiles.
2026-09-04 17:18:18 +00:00