Commit Graph
2734 Commits
Author SHA1 Message Date
Sergio 642c170b6a docs(SDD 23): §10 — la misma herida reabierta por el renombre, y el gocryptfs sin causa
Deja escrito lo de hoy donde ya vivía el diagnóstico de esta clase de fallo (§9):
el aprovisionamiento de `go` en el worker SE HIZO el 2026-08-28 y el renombre lo
deshizo el 2026-09-09 sin que nada fallara. Con el método de detección (varias
muriendo en segundos = sistémico; leer el error de UNA antes de contar deuda), la
comprobación en los dos sentidos, y las cuatro sondas de `pgrep` que el mismo
renombre dejó ciegas.

Incluye el no-determinismo de `gocryptfs` con la hipótesis REFUTADA anotada como
tal: no es el `cgo` (sq y usql también lo usan y reproducen) ni la ruta aleatoria
del temporal (las cadenas son idénticas y difieren 1.874.136 bytes, desde .rodata).
Queda abierto y sin causa; no está en ningún perfil, así que no bloquea imágenes.
2026-09-14 14:32:04 +00:00
Sergio cb101fd70b estado: KF6 tanda 3 (12/12) + 17 del worker, con el primer NO-DETERMINISMO real del frente Go
Hub, KDE Frameworks tanda 3: kglobalaccel kpackage kconfigwidgets kiconthemes
ktextwidgets kxmlgui kparts kcmutils knotifications kdeclarative ksvg kwallet.
  REPRODUCEN: 12 · DERIVA: 0 · NO-DETERMINISMO: 0 · no construyeron: 0

Worker (ya con `go` arreglado), familia Go:
  REPRODUCEN: 15 · DERIVA: 1 · NO-DETERMINISMO: 1 · no construyeron: 0

  · `checkmake` — la que antes «no construía» — REPRODUCE. Cierra el arreglo del enlace
    de `go`: no estaba rota, faltaba el binario en el PATH del host.
  · `cilium-cli` DERIVA: el artefacto guardado era viejo; las dos reconstrucciones
    coinciden entre sí ⇒ se movió el mundo, no la receta. No es un fallo.
  · `gocryptfs` NO-DETERMINISMO, y es el primero de verdad del frente Go.

La causa de gocryptfs, con los dos ejemplares guardados en `store/.divergen/`:

    usr/bin/gocryptfs  ELF, difieren [.text .rodata .data .debug_*]
      · .debug_str sólo en A: …/.gotmp/go-build3432240771/b141
      · .debug_str sólo en B: …/.gotmp/go-build2186295412/b141

El directorio temporal `go-build<aleatorio>` queda horneado en el DWARF. Hipótesis a
comprobar, no conclusión: sólo pasa con `cgo = true`, porque cgo genera fuentes C en ese
temporal y su ruta real entra en la info de depuración; con CGO off no hay fuentes
generadas y las 15 restantes reproducen. En el corpus hay exactamente cuatro recetas Go
con cgo: gitea, gocryptfs, sq y usql — ninguna verificada todavía. Se miden antes de
afirmar nada.
2026-09-14 14:23:38 +00:00
SergioandClaude Opus 5 74151a2b0c gitea 1.27.0 con sqlite y bindata: el binario sellado no podía abrir la base de datos
La mudanza de gioser pasa por levantar su gitea del otro lado — 28 repos, 26 sin copia fuera. El
corpus ya tenía `gitea` sellado (1.26.4, `b3:35bb4f04…`) y NO sirve, medido contra el artefacto:

    $ gitea --config app.ini migrate
    Error: sqlite3 requires: -tags sqlite,sqlite_unlock_notify
    this Gitea binary was not built with SQLite3 support

Construía, reproducía y no podía abrir la sqlite en la que gioser guarda TODO (`DB_TYPE = sqlite3`).
Y `gitea --version` decía `version development`. Es subcomando-sin-driver un piso más abajo.

Tres cambios, y el tercero es el que no se ve venir:

· Pin 1.27.0 (gioser corre 1.27.0). No es cosmético: gitea migra el esquema hacia adelante y se
  planta si la DB trae migraciones más nuevas que el binario, así que el pin va por delante del
  origen, nunca por detrás.
· Tags `sqlite,sqlite_unlock_notify` (⇒ `cgo = true`, el driver de mattn es C) y `bindata`, que
  embebe `public/` y `templates/`: sin él la receta publica sólo el ejecutable y el servidor
  arrancaría sin UI.
· La fuente pasa de `repo`+`commit` al TARBALL DE RELEASE. El clon no alcanza: la UI se compila
  con Node y las deps Go no están vendoreadas en git. El `gitea-src-1.27.0.tar.gz` trae las dos
  cosas hechas — medido: `public/assets/` 764, `vendor/` 11246, `templates/` 663 — así que
  construye con el lab tal cual, sin Node y sin red. La URL es locator (ADR 0013); ancla el sha256.

Nuevo hash: `b3:391a613e…`. Declarado en `perfil.servidor` como paquete y NO en `servicios`:
arrancarlo necesita el [[service]] del SDD 30 con su app.ini, y declarar un arranque que no existe
sería la mentira que ese campo existe para no tener.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
2026-09-14 14:17:52 +00:00
Sergio 0a75414da0 estado: 12 KF6 más verificadas + 10 rescatadas del libro del worker
Tanda 2 de la familia KDE Frameworks (hub): kbookmarks kcolorscheme kcompletion
kdnssd kholidays kunitconversion kauth kpty solid sonnet prison kservice.

  REPRODUCEN: 12 · DERIVA: 0 · NO-DETERMINISMO: 0 · no construyeron: 0

Y aparte: el worker tenía su propio libro (`work/repro-worker.tsv`, fuera de la siembra)
con 13 verificaciones del 2026-09-05 que nunca volvieron al hub. Cobertura medida y
perdida. Importadas 10.

Las otras 3 NO se importan, y el motivo es el que justifica que la clave del libro sea
(receta, ArtifactHash) y no la receta sola: su hash cambió desde entonces, así que la
medición ya no habla del artefacto de hoy.
  · atuq, bzip2  — reproducían, pero a un hash superado
  · aichat       — decía NO-DETERMINISMO a `c40a15bd…`; el hash vigente es `7a515b0a…`
                   y a ÉSE el propio worker le midió «reproduce». Importar por nombre
                   habría arrastrado un no-determinismo que ya no existe.
2026-09-14 14:13:14 +00:00
Sergio d79299d351 granja: cuatro sondas quedaron ciegas tras el renombre — el informe decía «idle» compilando
Todas buscaban el proceso `release/hammer`, y desde el ADR 0016 el worker invoca
`./target/release/takana`. Ninguna daba error: simplemente no encontraban nada.

Medido hoy, no deducido: `estado-granja.sh` imprimía «moliendo: (nada — idle o entre
colas)» mientras en el worker corría
`./target/release/takana --store ./store build recipes/centrifugo.toml`. Leyendo ese
informe se concluye que la granja está seca. Tras el arreglo, el mismo informe dice
«moliendo: cilium-cli.toml» y `pgrep` allá confirma exactamente ese proceso.

Las cuatro:
  · estado-granja.sh      «moliendo» — mentía sobre si hay trabajo
  · farm-worker-loop.sh×2 detección de build en vuelo
  · deadman.sh            `hay_trabajo` — y acá el precio es un worker BORRADO a mitad
                          de un build. En el LXC no llegó a morder (sólo borra cajas
                          hcloud y su timer no está activo allá), pero la próxima caja
                          de pago sí lo habría pagado.

Se aceptan LOS DOS nombres: cargo sigue compilando `hammer` como alias, y una sonda que
sólo mira el nombre nuevo se rompería con un worker que arrastre binario viejo — que es
justo lo que pasa acá, porque la siembra excluye `/target`.

Es el mismo renombre que dejó colgado el enlace de `go` (commit anterior). Un renombre
no rompe sólo lo que compila: rompe las cadenas que alguien escribió a mano.
2026-09-14 14:12:31 +00:00
Sergio 756ed9c6a6 atuq: el compositor NO era la causa — con cosmic-comp nesteado el navegador pinta
El §6.10.ter dejó dos variables cambiando a la vez (compositor y arranque real) y ninguna medición
que las separe. `scripts/cosmic/atuq-en-cosmic.sh` saca la primera de encima en ~2 min por vuelta,
sin QEMU y sin imagen: sway headless de andamio, cosmic-comp nesteado encima por winit, atuq adentro,
y `grim` capturando del lado de sway. El `--control` corre EL MISMO binario de atuq —el del cierre
hidratado para la imagen— directo sobre sway.

Las dos capturas coinciden al píxel en la región de la página (586331 px magenta, mismo bbox), y no
es que el navegador se escape a sway: antes de lanzarlo, la ventana de cosmic-comp ocupa 1276x637 en
ese mismo rectángulo, y el MOZ_LOG del widget ve `mode output size 1276 x 637` con cosmic contra
`1280 x 720` en el control. Las dos corridas enteras difieren en 1130 píxeles, todos en las barras
de título.

⇒ cosmic-comp no es el que impide la ventana. Queda como variable el arranque de verdad: kms/DRM
sobre virtio-gpu en vez de winit, el PID1 de arje, el seat.

De paso queda anotado el camino de buffers cuando SÍ funciona —`WaylandBufferSHM`, memoria
compartida y no dmabuf—, que es la línea de base contra la que comparar la traza de la imagen.

Y `scripts/cosmic/atuq-en-imagen.py` para medir allá: arranca la imagen, maneja el serial, lanza el
navegador con el mismo MOZ_LOG y pide capturas por QMP. La corrida del §6.10.ter fue a mano y no
dejó un solo log que se pueda releer.
2026-09-14 14:11:49 +00:00
Sergio d570a8e03f granja: el worker llevaba 5 días sin poder construir NINGUNA receta Go, en silencio
El enlace `~/.cargo/bin/go` del worker apuntaba a `/opt/hammer/.dev-fs/tools/go/bin/go`
— la ruta de ANTES del renombre a takana (ADR 0016, 2026-09-09). `/opt/hammer` ya no
existe, así que el enlace estaba COLGADO desde entonces.

Nada falló. `go` lo invoca takana DEL LADO DEL HOST (`go mod vendor` durante el fetch,
con red), fuera del sandbox, así que el rootfs no lo cubre — es el mismo modo de fallo
que `patch` en agosto, y `vps-setup.sh` ya lo tiene escrito como regla: «toda herramienta
que takana invoque HOST-SIDE va en esta lista». `go` no estaba.

Cómo se descubrió: por casualidad, verificando reproducibilidad. 16 de 25 recetas Go
murieron en SEGUNDOS. Un fallo sistémico se lee como 16 recetas rotas si nadie abre el
error — el verificador manda la salida del build a /dev/null. El error era
`spawn go mod vendor: No such file or directory (¿está `go` en el PATH del host?)`, que
lo decía todo.

Arreglado en el worker (enlaces repuestos a /opt/takana) y COMPROBADO con un build real:
`gron` no construía, ahora construye y reproduce bit a bit (why-differs: 5 entradas
idénticas, 0 divergen).

Acá va la parte que evita la repetición: el script daba «go enlazado ✓» sin comprobar
nada — `ln -sfn` crea un enlace colgado tan campante. Ahora repone un enlace colgado
preexistente (avisando) y comprueba que RESUELVE ejecutando `go version` A TRAVÉS DE ÉL;
si no ejecuta, sale 1 con el síntoma escrito. Un enlace que existe no es un `go` que corre.

Probado en los tres sentidos, con control que TIENE que pasar:
  · enlace sano                  ⇒ ok, rc=0
  · enlace colgado a /opt/hammer ⇒ avisa, lo repone, rc=0
  · destino inexistente          ⇒ falla ruidoso, rc=1
2026-09-14 14:08:55 +00:00
Sergio 6c1c316671 estado: cosecha granja 2026-09-14T14:03:05Z — avance del árbol KDE 2026-09-14 14:03:05 +00:00
Sergio bb83a4f973 estado: 12 frameworks KF6 tier 1 verificados — reproducen los 12
Barrido por FAMILIA (KDE Frameworks tier 1, todos CMake), que es lo que hace
legible el censo: si el fallo fuera del toolchain se concentraría acá y saltaría
a la vista. karchive kcodecs kconfig kdbusaddons kguiaddons ki18n kidletime
kitemmodels kplotting kwidgetsaddons kwindowsystem kcrash.

  REPRODUCEN: 12 · DERIVA: 0 · NO-DETERMINISMO: 0 · no construyeron: 0

Los 12 además CONSTRUYEN hoy, que es el otro hallazgo del verificador: `sealed`
sólo dice que alguien los construyó alguna vez con algún lab, y el lab rueda.
2026-09-14 14:01:38 +00:00
Sergio 5cb6e568d6 catálogo: wl-clipboard sube al corpus — cerraba el único orphan_dep de cuatro grafos
Estaba sólo en `recipes/incoming-wlr/`, o sea inalcanzable desde las otras
cuatro colas. `cliphist` vive en el CORPUS y la pide en `[deps] run`, así que
corpus, gnome, kde y cosmic la reportaban como `orphan_deps: ["wl-clipboard"]`.

No era cosmético: `escritorio-cosmic` declara `cliphist` de raíz, y la imagen
se habría armado con el demonio de historial y SIN `wl-copy`/`wl-paste` — el
modo de fallo silencioso que la propia receta de cliphist advierte (el binario
corre y no hace nada). La clausura no lo podía ver: decía `falta=0` en los
cinco perfiles, porque una dep que no resuelve no se cuenta, desaparece.

Solución = la que el catálogo ya usó con `mpv` y `atuq`: subirla al corpus, de
donde las colas la alcanzan (sibling-first y después el catálogo padre).

Medido antes de mover: ninguna de sus 9 deps tenía variante hermana en
`incoming-wlr`, así que el ArtifactHash no podía cambiar — y no cambió
(`b3:fc2ab7b7…` a los dos lados, comprobado con `takana hash`). Cero re-sellos.

Tras regenerar los cinco grafos: `orphan_deps: []` en los cinco, y la clausura
de `escritorio-cosmic` pasa de 273 a 274, sellada.
2026-09-14 13:54:28 +00:00
Sergio d2187fda11 estado: 11 recetas KDE más verificadas reproducibles (SDD 23) 2026-09-14 13:48:34 +00:00
Sergio 98df75a8cb estado: cosecha granja 2026-09-14T13:32:34Z — avance del árbol KDE 2026-09-14 13:32:34 +00:00
Sergio 5614d8c855 estado: cosecha granja 2026-09-14T13:02:49Z — avance del árbol KDE 2026-09-14 13:02:49 +00:00
Sergio edfdda2d4d estado: cosecha granja 2026-09-14T12:32:23Z — avance del árbol KDE 2026-09-14 12:32:23 +00:00
Sergio a26780cbd8 estado: cosecha granja 2026-09-14T12:03:00Z — avance del árbol KDE 2026-09-14 12:03:00 +00:00
Sergio 658eecb9cd estado: cosecha granja 2026-09-14T11:32:56Z — avance del árbol KDE 2026-09-14 11:32:56 +00:00
Sergio 0eee35a041 estado: cosecha granja 2026-09-14T11:03:49Z — avance del árbol KDE 2026-09-14 11:03:49 +00:00
Sergio 6c45f438b0 estado: cosecha granja 2026-09-14T10:32:23Z — avance del árbol KDE 2026-09-14 10:32:23 +00:00
Sergio af2469107f estado: cosecha granja 2026-09-14T10:02:17Z — avance del árbol KDE 2026-09-14 10:02:17 +00:00
Sergio d21d69ff8f estado: cosecha granja 2026-09-14T09:32:17Z — avance del árbol KDE 2026-09-14 09:32:17 +00:00
Sergio d16018bab7 estado: cosecha granja 2026-09-14T09:01:54Z — avance del árbol KDE 2026-09-14 09:01:54 +00:00
Sergio 97a04a145b estado: cosecha granja 2026-09-14T08:31:57Z — avance del árbol KDE 2026-09-14 08:31:57 +00:00
Sergio 192b9ab652 estado: cosecha granja 2026-09-14T08:02:17Z — avance del árbol KDE 2026-09-14 08:02:17 +00:00
Sergio 804b2a4953 estado: cosecha granja 2026-09-14T07:32:15Z — avance del árbol KDE 2026-09-14 07:32:15 +00:00
Sergio 230a95e06e estado: cosecha granja 2026-09-14T07:02:26Z — avance del árbol KDE 2026-09-14 07:02:26 +00:00
Sergio 34d673ae54 estado: cosecha granja 2026-09-14T06:32:02Z — avance del árbol KDE 2026-09-14 06:32:02 +00:00
Sergio c8f0c92728 estado: cosecha granja 2026-09-14T06:02:12Z — avance del árbol KDE 2026-09-14 06:02:12 +00:00
Sergio f2cd2d70c9 estado: cosecha granja 2026-09-14T05:31:57Z — avance del árbol KDE 2026-09-14 05:31:57 +00:00
Sergio 7ef4494e33 estado: cosecha granja 2026-09-14T05:02:07Z — avance del árbol KDE 2026-09-14 05:02:07 +00:00
Sergio 6833515475 estado: cosecha granja 2026-09-14T04:31:58Z — avance del árbol KDE 2026-09-14 04:31:58 +00:00
Sergio 20b268b229 estado: cosecha granja 2026-09-14T04:02:15Z — avance del árbol KDE 2026-09-14 04:02:15 +00:00
Sergio a5c4a86ff7 estado: cosecha granja 2026-09-14T03:31:53Z — avance del árbol KDE 2026-09-14 03:31:53 +00:00
Sergio 3df51ced38 estado: cosecha granja 2026-09-14T03:02:13Z — avance del árbol KDE 2026-09-14 03:02:13 +00:00
Sergio e2e5fd2dd7 estado: cosecha granja 2026-09-14T02:31:54Z — avance del árbol KDE 2026-09-14 02:31:54 +00:00
Sergio 11cc2fd3ff estado: cosecha granja 2026-09-14T02:02:19Z — avance del árbol KDE 2026-09-14 02:02:19 +00:00
Sergio 3d79cdf98b SDD 30 4c: GNOME con los demonios supervisados por arje — y el control arregló colord
Los demonios de sistema pasan de lanzarse con `&` desde un script de 500 líneas
a ser Cards del `genesis`. El bloqueo que este frente daba por corpus se levantó
solo: otro agente selló evolution-data-server y gnome-shell mientras esto se
escribía, y escritorio-gnome quedó 309/309.

SE CORRIÓ UN CONTROL PRIMERO, y es lo único que hace interpretable el resultado:

  colord              control: `MURIÓ al arrancar`   cards: `ya vive (pid 175)`
  ColorManager        control: `NO apareció en 40s`  cards: `OK`
  login1/Accounts/UPower  OK en los dos
  compositor          wayland-0 y shell vivo en los dos

El fallo del control DESAPARECIÓ, y no lo buscaba: colord moría arrancado por el
script y vive arrancado por arje, con el bus ya listo porque la espera está
dentro de su argv. Sin el control, «ColorManager OK» sería un dato suelto en vez
de una diferencia. Los PIDs lo confirman: polkit=119, colord=175, upowerd=178,
accounts=180 — de antes de que el lanzador de sesión existiera.

QUÉ NO SE COMPROBÓ: no hay screendump; QEMU salió por timeout y el control
tampoco lo tuvo. La comparación es serial contra serial y lo que se afirma es
sobre los DEMONIOS, no sobre el pintado.

Las piezas donde corresponde: `takana service-cards` (UNA sola implementación de
receta→Card; el formato es contrato con card_core::Card), `targets.py
--service-paths` (une qué-es con si-arranca), y un inyector en FICHERO APARTE
porque anidar dos heredocs de python falló en vivo — el terminador del interno
cerró el externo y media cosa corrió como shell.

La espera del bus va DENTRO del argv de las 5 recetas de sistema: sin ella un
daemon arranca antes de que dbus escuche y queda en modo idle sin registrar su
nombre — un fallo que no se ve, porque el proceso vive y el bus no lo tiene. Los
5 hashes intactos. Y el guardia de gnome-start es por «¿está corriendo?», no por
una perilla: así es correcto venga de donde venga el proceso y la misma copia
sirve donde no se inyectaron cards.
2026-09-14 01:51:19 +00:00
Sergio 2a1cb93be5 estado: cosecha granja 2026-09-14T01:33:42Z — avance del árbol KDE 2026-09-14 01:33:42 +00:00
Sergio 73b288171c libical y evolution-data-server: dos rotas más del censo — y una cae enlazando una .so, no un binario
Segunda tanda del censo con `verificar-repro.sh`, esta vez sobre `poppler-glib` y las dos recetas
CMake de la cola de GNOME: **2 de 3 no construyen**. Con esto el censo va en **7 rotas de 18
barridas**, todas por el mismo crash del `lld` de zig con el `--dependency-file` de CMake ≥3.27.

⚠ **`libical` cae enlazando `libical.so` — una librería COMPARTIDA, no un ejecutable.** Eso termina
de enterrar el predictor barato que intenté ayer («falla la que instala binarios», 12 aciertos de
14): el crash puede estar en CUALQUIER link del build. Ni ejecutables instalados, ni sólo
ejecutables: cualquier link.

`evolution-data-server` muere en `camel-lock-helper` y `camel-gpg-photo-saver`, y necesita su propia
perilla además de la de su dep — arreglar `libical` no la arregla, porque el fallo está en SU link.

Las dos estaban selladas y rotas a la vez. El artefacto tapaba que la cola de GNOME ya no se puede
reconstruir entera.
2026-09-14 01:32:19 +00:00
Sergio d078e5285f SDD 30 §4b.2: la cadena entera probada en un arranque real — PRODUCT_SSH_OK
Los tests no eran el punto: el punto era que un servicio DECLARADO en una receta
termine supervisado por PID 1. `product-boot-test.sh` sobre el product-rootfs de
la ruta real da `ok card sshd en la seed` y `PRODUCT_SSH_OK uid=0`, sin ningún
eslabón escrito a mano:

  recipes/openssh.toml [[service]] → sidecar dentro del artefacto sellado →
  service_cards() → genesis de /ente/seed.card.json → arje-zero encarna sshd →
  la sesión SSH responde.

Y HABÍA QUE DESCARTAR QUE LO MOVIERA ESTE CAMBIO: el product-rootfs salió con
hash distinto (5011955a… → 8639894332…). No fue la seed — las dos son
BYTE-IDÉNTICAS (diff del JSON, cero diferencias). Cambiaron `netup`, que es otro
artefacto que cuando se selló el viejo, y por arrastre `ente/attest.json`, que
registra su BLAKE3. O sea: la constante y la receta producen la misma seed,
comprobado sobre el árbol real y no sólo en un test.

Y queda escrito por qué el ESCRITORIO no se puede arrancar supervisado todavía,
que es corpus y no diseño: gnome-shell en deuda (bloqueado sólo por
evolution-data-server, que tiene blocked_by vacío) y sway sin sellar. Sin
compositor no hay sesión. NO se cablearon los scripts de imagen a ciegas: inyectar
cards en un genesis que no se puede bootear es escribir código que nadie puede
contradecir, y este mismo doc ya tiene el ejemplo de qué pasa entonces (el SDD 06
afirmando meses un lector que no existía).
2026-09-14 01:24:11 +00:00
Sergio 8fd653c0d0 estado: cosecha granja 2026-09-14T01:02:27Z — avance del árbol KDE 2026-09-14 01:02:27 +00:00
Sergio 60202bf526 imagen: el navegador arranca en la imagen booteada y NO PINTA VENTANA — medido, con lo descartado
Primera prueba de `atuq` dentro de una imagen de disco arrancada, y el resultado no es el de la
jaula. La cadena previa funcionó, y eso también es medición: el perfil `escritorio-cosmic` hidratado
con el cierre de hoy (275 nodos, 8,4 G) trae `/usr/bin/atuq`, `/usr/bin/llama-server` y el modelo —
declarar en el perfil SÍ pone las cosas en la imagen—, la imagen EFI de 12 G arranca en QEMU y COSMIC
pinta panel y dock en ~2 min.

Y `atuq` arranca —sus extensiones inician, la del foco sondea cada minuto, WebRender inicializa— sin
que la ventana aparezca nunca. Descartado, para que nadie lo repita: no es el sandbox de Gecko
(relanzado con los cinco MOZ_DISABLE_* puestos, idéntico), no es que el proceso muera (sigue
ejecutando el JS de las extensiones), y no es la IA (pasa con about:blank).

La pista: bajo sway headless el MISMO artefacto pinta perfecto y hay capturas del panel contestando.
La diferencia son el compositor (cosmic-comp+llvmpipe contra sway+pixman) y el arranque real contra
bwrap. Es su propia unidad de trabajo, no un parche apurado.

⚠ La lección del método: quince guardianes en verde, `vigia-imagen.py` en ✓, y el navegador igual no
se puede usar en la imagen. «Sella», «hidrata» y «los tests pasan» son tres cosas distintas de
«arranca y se ve».

De paso, `metal-iso.sh` acepta ahora STORE y AUG por entorno, porque en esta máquina no funcionaba:
arma el rootfs con `cp -al` desde el store y el store es un BIND-MOUNT del volumen — `linkat` rechaza
cruzar mounts aunque sea el mismo disco, así que hay que nombrar los dos lados dentro del mismo
mount. Es la cuarta vez que aparece el mismo EXDEV hoy.
2026-09-14 00:54:47 +00:00
Sergio 28fcd77cf2 estado: cosecha granja 2026-09-14T00:32:31Z — avance del árbol KDE 2026-09-14 00:32:31 +00:00
Sergio 13872f38d5 estado: cosecha granja 2026-09-14T00:02:28Z — avance del árbol KDE 2026-09-14 00:02:29 +00:00
Sergio af26cbc43b estado: cosecha granja 2026-09-13T23:32:00Z — avance del árbol KDE 2026-09-13 23:32:00 +00:00
Sergio 4db3e76e60 estado: cosecha granja 2026-09-13T23:02:10Z — avance del árbol KDE 2026-09-13 23:02:10 +00:00
Sergio 402d557763 estado: cosecha granja 2026-09-13T22:32:10Z — avance del árbol KDE 2026-09-13 22:32:10 +00:00
Sergio 6fadab1814 estado: cosecha granja 2026-09-13T22:02:42Z — avance del árbol KDE 2026-09-13 22:02:42 +00:00
Sergio 2b884a86a2 estado: cosecha granja 2026-09-13T21:34:43Z — avance del árbol KDE 2026-09-13 21:34:43 +00:00
Sergio 5e056b6177 atuq: una CAPTURA de la barra lateral — y la barra ya no se abre sola
`scripts/atuq-captura-ia.py`: el arnés de sway headless de los guardianes + `grim` + un PNG. No es un
guardián (los veredictos siguen saliendo del `dump`); es la evidencia que ningún log puede dar: que
el panel se pinta y que la respuesta está ahí.

Encontró tres cosas, ninguna visible en un log:

1. **la barra lateral se abría SOLA** en el primer arranque, ocupando un tercio de la ventana. Gecko
   lo hace al instalar una extensión con `sidebar_action`, y para un navegador que la trae de fábrica
   eso es imponerle un panel a todo el mundo. `"open_at_install": false`, con captura del después;
2. el diálogo «Close Firefox» en la segunda corrida — el arnés mataba el navegador sin despedirse y
   quedaba el `.parentlock`. Arreglado en el arnés;
3. dos barras de notificación VACÍAS en el arranque. El atajo era reportarlas como fuga de marca, y
   era falso: instrumentando una copia del artefacto para volcar el DOM salieron
   `sandbox-content-disabled` (lo apaga el propio arnés) y `startup-restore-session-suggestion` (por
   el cierre abrupto anterior). El texto está en el DOM y no en los píxeles — comprobado además
   quitando nuestro CSS, con el mismo resultado ⇒ es el render por software de la jaula.

⇒ Una captura muestra síntomas; el DOM dice de quién son. Sin ese segundo paso, dos de los tres
habrían entrado al SDD como bugs nuestros.

El log del navegador viaja junto a la foto, siempre: una captura muestra que algo se ve raro y no por
qué. Y `test-atuq-ia.py` + `test-atuq-archivo-semantico.py` siguen verdes tras el cambio.
2026-09-13 21:29:29 +00:00
Sergio bdecd1c479 mesa-llvmpipe: la campaña de glvnd, probada donde no le cuesta a nadie — y SALE QUE SÍ
mesa-llvmpipe  b3:7662f5ec25c42cd679da1679c8c6ed7c53cd49d57fa781493ab7ff433d51b9b0

En vez de lanzar 153 rebuilds a ciegas, la campaña se prueba en la única de las tres mesa que tiene
**radio 0 y cero imágenes** (`yupana radio mesa-llvmpipe`: 0 dependientes, «(ninguna declarada)»).
Cambiarla no tira un solo sellado ajeno, así que es el laboratorio exacto.

LA PREGUNTA, que hasta hoy nadie tenía contestada: con `-Dglvnd=true`, ¿mesa produce de verdad el
VENDOR que al despacho le falta? RESPUESTA MEDIDA SOBRE EL ARTEFACTO:

  usr/lib/libEGL_mesa.so.0                     ← el vendor (hoy no existe en ningún lado)
  usr/share/glvnd/egl_vendor.d/50_mesa.json    ← su registro, que es lo que glvnd busca
  usr/lib/libgbm.so.1 · libglapi.so.0 · dri/{swrast,kms_swrast}_dri.so

…y **deja de instalar libEGL.so.1 y libGLESv2.so.2** (los dos `ls` fallan).

⇒ La colisión de sonames del rootfs de KDE —dos libEGL.so.1 distintos en la misma ruta— DESAPARECE
POR CONSTRUCCIÓN con la campaña: mesa ya no reclama esas rutas y el dueño pasa a ser glvnd, que es
exactamente lo que su partición quiere. La campaña deja de ser una apuesta: se sabe qué produce.
Lo que queda por decidir es CUÁNDO pagar, no SI funciona.

EL PRECIO, medido antes de empezar y sin cambiar: `yupana radio mesa` = 148 directos, 154
transitivos, **153 sellados que caen a deuda**, las CINCO imágenes, 123 de ellos en incoming-kde —
la cola que otro agente está moliendo ahora mismo. Por eso esto es una prueba, no la campaña.

⚠ Y cubre SÓLO la mitad de mesa. La otra es que `libglvnd` vuelva a instalar su libEGL.so.1 de
despacho (hoy va `-Degl=false` justamente para no colisionar). Las dos mitades van en la MISMA
campaña o el resultado es el de hoy con otro disfraz. Queda escrito en las dos recetas.
2026-09-13 21:20:05 +00:00