Commit Graph
1619 Commits
Author SHA1 Message Date
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 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 0e35652fb1 un solo NetworkManager (y KDE recupera WiFi) + upower al corpus sin arrastrar polkit
── 1. Se RETIRA incoming-kde/networkmanager.toml ───────────────────────────────────────────────
  networkmanager-qt  b3:78bbdcda00d758fb3cc3a0be7da6a67395dfbe0e4d55c5d8e5cf8afaf728ff72
  plasma-nm          b3:496a9ff7794ae5d89ac2842bdfbca38c25c91df37465a049db7cf75ee0041b82

Ayer se promovió NetworkManager al corpus CON WiFi porque la variante de KDE iba con -Dwifi=false,
y quedaron dos. Esto cierra el arco: retirada la de la cola, `networkmanager-qt` resuelve al PADRE
y la distro tiene UNO solo. Consecuencia concreta: **KDE pasa a tener WiFi**, porque su applet
hablaba con un demonio construido sin soporte inalámbrico.

Medido con `yupana radio` antes de borrar: 2 rebuilds (networkmanager-qt, plasma-nm), los dos en
la cola KDE. Y comprobado sobre el ARTEFACTO del corpus que publica lo que nm-qt pide —`libnm.pc`
y `usr/include/libnm`— antes de quitarle el suelo. Los dos sellan.

── 2. upower al corpus: COSMIC dibujaba una batería sin nadie que se la contara ────────────────
  libgudev  b3:87ca5e73…  ·  udev-pc  b3:fa880b5c…   (hash IDÉNTICO desde las dos partes ⇒ cache-hit)
  upower    b3:c82e655ff7011150f21f9413433c518f12c827c52ecf6f9fc3484f75d85c155c

Ayer escribí que esta cadena eran «3 promociones, una de ellas polkit, decisión de arquitectura».
Fui a mirar y polkit SALE de la ecuación con una perilla: la variante de KDE va `-Dpolkit=enabled`
«porque polkit YA está sellada» —cierto EN ESA COLA y falso desde el corpus—, y apagarlo cuesta
poco medido en FUNCIÓN: polkit en upower sólo gobierna las acciones privilegiadas (suspender e
hibernar por org.freedesktop.UPower, además deprecadas: hoy eso lo hace logind). Reportar batería,
carga, tiempo restante y línea de corriente NO pasa por polkit, que es justo lo que COSMIC quiere.

Se corrigió además la frase del comentario heredado que decía `-Dpolkit=enabled` al lado de un flag
que ahora dice `disabled`: una nota que desmiente al código de al lado es peor que no tener nota.
Y se le añadió su [[service]] (el corpus no lo traía; el label/id son los mismos que en GNOME a
propósito: el ULID identifica al SERVICIO, no al artefacto). No mueve el hash.

Comprobadas las NEEDED de upowerd con provee.py: libupower-glib, libffi.so.8, libz.so.1,
libudev.so.1 — las cuatro las publica el corpus y ya estaban en [deps]. Sin NEEDED colgante.

── 3. targets.toml ─────────────────────────────────────────────────────────────────────────────
  escritorio-kde     servicios += NetworkManager  (llegaba por clausura de plasma-nm y NADIE lo
                                                   arrancaba: el applet sobre un demonio apagado)
  escritorio-cosmic  paquetes  += upower · servicios += upowerd

⚠ Y se CORRIGE la nota de ayer que decía «NO declarar networkmanager en escritorio-kde porque
plasma-nm ya arrastra la variante de la cola». Ya no hay variante de cola.
2026-09-13 21:15:14 +00:00
Sergio ddfcdc7ab2 estado: cosecha granja 2026-09-13T21:04:00Z — avance del árbol KDE 2026-09-13 21:04:00 +00:00
Sergio 68dc9cc2de SDD 30 §4b: la seed de producto ya sale de la RECETA — y openssh reproduce bit a bit
El emisor lee la receta que viaja DENTRO del artefacto sellado (el sidecar
.hammer/recipe.toml) y no de recipes/, porque seal_product_rootfs sirve a las
DOS vetas —product desde recetas locales y product_from_repo desde el repo
firmado— y sólo una tiene recipes/ a mano. El sidecar es la única fuente que
ambas comparten, que es lo que sostiene que converjan al mismo product-rootfs.

LA TRAMPA QUEDA ARMADA, NO CERRADA: el sidecar no entra al ArtifactHash, así que
un artefacto anterior al bloque [[service]] es un cache-hit válido que no se
reconstruye solo. Si el emisor devolviera lista vacía sin protestar, el producto
saldría booteando, verde y SIN SSHD. Falla ruidosamente, y hay un test que exige
que el mensaje siga explicando la causa Y dando el arreglo (regla 3 del
CLAUDE.md: un ausente falla ruidosamente, un vacío llega hasta el final diciendo
que todo fue bien).

LA MIGRACIÓN, CON CONTROL, y el hecho nuevo que dejó: openssh no estaba
certificado como reproducible ("el criterio es construye y corre", dice su
receta). Manifiesto de 33 sha256+modos ANTES de tocar nada, respaldo por
hardlink, borrado, rebuild bajo flock -o, comparación. Resultado: 33/33
ficheros, modos idénticos, y la ÚNICA diferencia en todo el árbol es
.hammer/recipe.toml. openssh REPRODUCE BIT A BIT.

Gotcha que costó el primer intento: store/ es bind-mount de /dev/sdb y work/
vive en /dev/sdc ⇒ `cp -al` cruza mounts y muere con EXDEV. El respaldo va
DENTRO del mount del store; un dot-dir ahí es invisible para store-gc.sh, que
sólo mira dirs ^[0-9a-f]{64}-.
2026-09-13 21:00:57 +00:00
Sergio 0295fd6dbe estado: cosecha granja 2026-09-13T20:33:28Z — avance del árbol KDE 2026-09-13 20:33:28 +00:00
Sergio 5e5369f775 libffi-shared en base: python3 volvía a ser INERTE en servidor, cli y base — y el vigía no miraba ahí
`vigia-sonames.py` corría por defecto SÓLO sobre los cinco perfiles de escritorio
(`p.startswith("escritorio")`). O sea que `base`, `cli` y `servidor` —el objetivo de la mudanza—
**nunca se miraron**. Apuntándolo a ellos a mano:

    == servidor  147 nodos · 183 sonames provistos · 1 sin proveedor
       FALTA libffi.so.8   ← lo piden: python3

`python3` no arrancaba en las tres imágenes, por el mecanismo EXACTO que `musl-shared` y
`zlib-shared` arreglaron dos días antes: la receta canónica de libffi es `--disable-shared`, ningún
artefacto del cierre publica ese soname, y dentro del lab el agujero lo tapa el rootfs de Alpine —
así que el build pasa y la imagen sale rota. `libffi-shared` ya existía en el corpus y ya estaba
declarada en otros dos perfiles; sólo faltaba en `base`.

    servidor 148 nodos · 186 sonames · **0 sin proveedor**    (base y cli, igual)

## Y el vigía pasa a mirar TODOS los perfiles

⚠ **Es la tercera vez en dos días que un guardián de este repo mide menos de lo que su resumen
afirma**: `static-audit.sh` sólo globeaba `recipes/` y no las 5 colas (3 mentiras ocultas); el bloque
de raíces sucias sólo corría al hidratar un perfil y no veía las 649 recetas fuera de toda imagen
(qdrant con 69 M de basura); y éste dejaba fuera medio sistema. **Un «0 huecos» sobre la mitad del
sistema se imprime igual que uno sobre todo él.**

⇒ Al leer un guardián, leer su SCOPE antes que su veredicto: el glob, el bucle, de dónde saca la
lista. Los ocho perfiles dan 0 sin proveedor, así que ampliar el alcance no mete ruido — sólo deja de
esconder.
2026-09-13 20:13:16 +00:00
Sergio 01649076da SDD 26: el paquete opcional entra al catálogo FIRMADO, y las tres cosas que sólo aparecieron al instalarlo 2026-09-13 20:11:10 +00:00
Sergio af548b8555 estado: cosecha granja 2026-09-13T20:03:48Z — avance del árbol KDE 2026-09-13 20:03:48 +00:00
Sergio 8600ba8888 qdrant: reproduce contra el protobuf de zig — 907/907 sellado, deuda 0
Tras devolver protobuf y abseil a `zig-cc`, qdrant cayó a deuda y se reconstruyó en el worker:
2 ficheros, sólo `usr/`, 70 M, `qdrant 1.19.1`. La limpieza del `/out/src` —el DESTDIR global que
heredaba el `make install` anidado de protobuf-src— aguanta el cambio de dep. REPRODUCE bit a bit.

El corpus queda en 907/907 sellado con deuda 0.
2026-09-13 19:51:43 +00:00
Sergio 057091381e estado: cosecha granja 2026-09-13T19:32:21Z — avance del árbol KDE 2026-09-13 19:32:21 +00:00
Sergio 261f1c2a61 estado: cosecha granja 2026-09-13T19:02:47Z — avance del árbol KDE 2026-09-13 19:02:47 +00:00
Sergio 2215716047 estado: cosecha granja 2026-09-13T18:32:19Z — avance del árbol KDE 2026-09-13 18:32:19 +00:00
Sergio 219594ece3 estado: cosecha granja 2026-09-13T18:02:41Z — avance del árbol KDE 2026-09-13 18:02:41 +00:00
Sergio 95a3152586 estado: cosecha granja 2026-09-13T17:32:17Z — avance del árbol KDE 2026-09-13 17:32:17 +00:00
Sergio 2cca6c3630 estado: cosecha granja 2026-09-13T17:02:08Z — avance del árbol KDE 2026-09-13 17:02:08 +00:00
Sergio 6ac8566719 estado: cosecha granja 2026-09-13T16:32:15Z — avance del árbol KDE 2026-09-13 16:32:15 +00:00
Sergio 8f507c4a67 estado: cosecha granja 2026-09-13T16:02:35Z — avance del árbol KDE 2026-09-13 16:02:35 +00:00
Sergio 7766c063ea estado: cosecha granja 2026-09-13T15:32:23Z — avance del árbol KDE 2026-09-13 15:32:23 +00:00
Sergio e56efe6c3b estado: cosecha granja 2026-09-13T15:02:37Z — avance del árbol KDE 2026-09-13 15:02:37 +00:00
Sergio 7547beb00a estado: cosecha granja 2026-09-13T14:32:15Z — avance del árbol KDE 2026-09-13 14:32:15 +00:00
Sergio 16ec87fe25 estado: cosecha granja 2026-09-13T14:02:34Z — avance del árbol KDE 2026-09-13 14:02:34 +00:00
Sergio 3851b2fd40 estado: cosecha granja 2026-09-13T13:32:16Z — avance del árbol KDE 2026-09-13 13:32:16 +00:00
Sergio f299f061b0 estado: cosecha granja 2026-09-13T13:02:35Z — avance del árbol KDE 2026-09-13 13:02:35 +00:00
Sergio 0687a4fdf6 estado: cosecha granja 2026-09-13T12:32:19Z — avance del árbol KDE 2026-09-13 12:32:19 +00:00
Sergio f35a30cf8b estado: cosecha granja 2026-09-13T12:02:59Z — avance del árbol KDE 2026-09-13 12:03:00 +00:00
Sergio 13bc744b94 estado: cosecha granja 2026-09-13T11:32:31Z — avance del árbol KDE 2026-09-13 11:32:31 +00:00
Sergio 2208e4fe09 estado: cosecha granja 2026-09-13T11:02:11Z — avance del árbol KDE 2026-09-13 11:02:11 +00:00
Sergio f54adf119b estado: cosecha granja 2026-09-13T10:32:24Z — avance del árbol KDE 2026-09-13 10:32:24 +00:00
Sergio 2074d359c5 estado: cosecha granja 2026-09-13T10:02:33Z — avance del árbol KDE 2026-09-13 10:02:33 +00:00
Sergio 184be3529e estado: cosecha granja 2026-09-13T09:32:01Z — avance del árbol KDE 2026-09-13 09:32:01 +00:00