From 7190cc48a36d768c9abe4b84f7cf856f33b8995d Mon Sep 17 00:00:00 2001 From: sergio Date: Thu, 30 Jul 2026 19:20:59 -0400 Subject: [PATCH] =?UTF-8?q?estado:=20cosecha=20granja=202026-07-30T23:20:5?= =?UTF-8?q?9Z=20=E2=80=94=20avance=20del=20=C3=A1rbol=20KDE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/runbooks/gnome-qemu-desktop.md | 19 +++++++++++++--- docs/state/build-state-gnome.json | 12 +++++----- docs/state/build-state-kde.json | 13 ++++++----- docs/state/build-state.json | 12 +++++----- recipes/arje-zero.toml | 34 ++++++++++++++++++++++++----- scripts/gnome/qemu-desktop-image.sh | 23 +++++++++++++++++++ 6 files changed, 88 insertions(+), 25 deletions(-) diff --git a/docs/runbooks/gnome-qemu-desktop.md b/docs/runbooks/gnome-qemu-desktop.md index 8e7372cb..932bbfdc 100644 --- a/docs/runbooks/gnome-qemu-desktop.md +++ b/docs/runbooks/gnome-qemu-desktop.md @@ -388,9 +388,22 @@ elige `/dev/dri/card0` como primaria sin quejarse. Es el rédito directo de la c libgweather, upower, librsvg e ibus. Ojo al costo de `libelogind`: re-sellarla re-hashea todo lo que la declara (mutter, gnome-shell…) ⇒ pasar `yupana radio libelogind` ANTES de tocarla — ya pasó dos veces en esta campaña. -2. **Empaquetar la política D-Bus de login1** dentro del artefacto de arje-logind-compat (hoy la - escribe el script de imagen). -3. Arreglar el `identity mismatch` del `Announce` al bus del fractal (hoy sólo un WARN). +2. ✅ **HECHO** — la política D-Bus de login1 (y la de PolicyKit1) viaja dentro del artefacto de su + daemon, no en el script de imagen. Un servicio que no puede adueñarse de su nombre no es un + servicio: la política es parte de lo que el paquete promete. El script de imagen ahora sólo las + COPIA y **verifica que llegaron** — y esa verificación destapó de entrada que el script inyectaba + el binario del shim de polkit sin su `.conf`. +3. ✅ **HECHO, y este ítem estaba mal escrito en dos sentidos.** El `identity mismatch` no lo emite + arje-logind-compat sino el `bus_mediator` de **arje-zero**; y no había nada que arreglar acá, + porque **ya estaba arreglado río arriba** (tawasuyu `ce96cfa8d`, 2026-07-29). Lo que teníamos era + un PID1 viejo: nuestro log decía `rechazando request` y la fuente actual dice `sigo como anónimo`. + Tampoco era «sólo un WARN» — el commit del fix se llama *«apagar/reiniciar moría por un ENTE_ID + heredado, no por permisos»*: `ENTE_ID` lo hereda todo el árbol de procesos, cualquier nieto + reclamaba esa identidad con su propio pid y el mediador rechazaba la request **entera**. + Se movió el pin de `recipes/arje-zero.toml` al mismo commit que ya usan los dos compat daemons + (ver el comentario de la receta: por qué NO se cherry-pickeó, con la medición). + **La lección general: antes de arreglar un WARN, buscá quién lo emite y si ya está arreglado + upstream.** Nuestro pin estaba 3951 commits detrás y nadie lo había mirado. 4. Con la capa JS viva: validar CON PANTALLA (`DISP=gtk`), nunca sólo por serial — regla heredada de KDE ([[metal-dual-desktop-en-curso]]). diff --git a/docs/state/build-state-gnome.json b/docs/state/build-state-gnome.json index 69f0b41e..2d875ec1 100644 --- a/docs/state/build-state-gnome.json +++ b/docs/state/build-state-gnome.json @@ -3,7 +3,8 @@ "totals": { "recipes": 849, "nodes": 849, - "sealed": 843, + "sealed": 842, + "debt": 1, "never": 6 }, "by_class": { @@ -14,12 +15,13 @@ "rust": 229 }, "debt_by_class": { - "c": 3, + "c": 4, "gui": 3 }, "by_queue": { "corpus": { - "sealed": 761, + "sealed": 760, + "debt": 1, "never": 2 }, "incoming-gnome": { @@ -604,8 +606,8 @@ "deps": [], "cls": "c", "queue": "corpus", - "hash": "b3:69e2cab8ac00c33cde7680eb393952e2c7f9ae9af24c180c6593d7a86482efb9", - "state": "sealed", + "hash": "b3:e570c14824320ba5787cbcc756ea691a61c38f04ddc6dbb1eaf4b5567b2bc7fe", + "state": "debt", "blocked_by": [], "unblocks": 0, "perfiles": [], diff --git a/docs/state/build-state-kde.json b/docs/state/build-state-kde.json index 39d8a0c2..9ecc6ba7 100644 --- a/docs/state/build-state-kde.json +++ b/docs/state/build-state-kde.json @@ -3,9 +3,9 @@ "totals": { "recipes": 963, "nodes": 967, - "sealed": 914, + "sealed": 913, + "debt": 48, "never": 2, - "debt": 47, "wanted": 4 }, "by_class": { @@ -17,12 +17,13 @@ "wanted": 4 }, "debt_by_class": { - "c": 48, + "c": 49, "gui": 1 }, "by_queue": { "corpus": { - "sealed": 756, + "sealed": 755, + "debt": 1, "never": 2 }, "incoming-kde": { @@ -554,8 +555,8 @@ "deps": [], "cls": "c", "queue": "corpus", - "hash": "b3:69e2cab8ac00c33cde7680eb393952e2c7f9ae9af24c180c6593d7a86482efb9", - "state": "sealed", + "hash": "b3:e570c14824320ba5787cbcc756ea691a61c38f04ddc6dbb1eaf4b5567b2bc7fe", + "state": "debt", "blocked_by": [], "unblocks": 0, "perfiles": [], diff --git a/docs/state/build-state.json b/docs/state/build-state.json index 45b5c61d..39015f95 100644 --- a/docs/state/build-state.json +++ b/docs/state/build-state.json @@ -3,7 +3,8 @@ "totals": { "recipes": 770, "nodes": 770, - "sealed": 768, + "sealed": 767, + "debt": 1, "never": 2 }, "by_class": { @@ -14,11 +15,12 @@ "rust": 228 }, "debt_by_class": { - "c": 2 + "c": 3 }, "by_queue": { "corpus": { - "sealed": 768, + "sealed": 767, + "debt": 1, "never": 2 } }, @@ -522,8 +524,8 @@ "deps": [], "cls": "c", "queue": "corpus", - "hash": "b3:69e2cab8ac00c33cde7680eb393952e2c7f9ae9af24c180c6593d7a86482efb9", - "state": "sealed", + "hash": "b3:e570c14824320ba5787cbcc756ea691a61c38f04ddc6dbb1eaf4b5567b2bc7fe", + "state": "debt", "blocked_by": [], "unblocks": 0, "perfiles": [], diff --git a/recipes/arje-zero.toml b/recipes/arje-zero.toml index 2d6195db..6c7c5f5e 100644 --- a/recipes/arje-zero.toml +++ b/recipes/arje-zero.toml @@ -14,14 +14,36 @@ name = "arje-zero" version = "0.0.1" +# ── POR QUÉ SE MOVIÓ EL PIN (2026-07-30) ──────────────────────────────────────────────────────── +# El runbook de GNOME pedía «arreglar el `identity mismatch` del Announce al bus del fractal (hoy +# sólo un WARN)». Eran dos cosas mal: no lo emite arje-logind-compat sino el `bus_mediator` de +# arje-zero, y **no había nada que arreglar acá — ya estaba arreglado río arriba**, en tawasuyu +# `ce96cfa8d` (2026-07-29). Nuestro binario era viejo, nada más: el log de la VM decía +# `identity mismatch — rechazando request` y la fuente actual dice `sigo como anónimo`. +# +# Y no era cosmético, aunque el log lo pareciera. El commit del fix se llama «apagar/reiniciar moría +# por un ENTE_ID heredado, no por permisos»: `ENTE_ID` se inyecta en el entorno del Ente y **lo +# hereda todo el árbol de procesos**, así que cualquier nieto reclamaba esa identidad con su propio +# pid, el mediador veía pid distinto y RECHAZABA la request entera. Con el fix degrada a anónimo, que +# es lo correcto: la identidad no se prueba, pero los verbos anónimos siguen andando. +# +# EL COMMIT ELEGIDO no es nuevo: es **el mismo que ya usa `arje-polkit-compat`**, de la rama +# `selfhost/arje-zero-attest-lockfile`. Se llegó a él descartando el camino obvio: la rama vieja +# (`selfhost/arje-zero-lockfile`, 9967b02c) está **3951 commits detrás de main** y el cherry-pick del +# fix choca contra ficheros que allá ni existen — este mismo `bus_mediator.rs` creció 966 líneas en el +# medio. O sea que arje-zero se reescribió, y traer «sólo el fix» era ficción. La rama de attest, en +# cambio, ya CONTIENE `ce96cfa8d`, ya versiona el `Cargo.lock` de la raíz (lo mismo que motivaba la +# rama vieja) y ya está probada: es el árbol del que salen los dos compat daemons. Las tres recetas +# tawasuyu quedan en un solo commit, que es una propiedad que vale por sí sola. [source] -# El `commit` es el identificador inmutable (la URL es sólo locator, no entra al hash). Fijado en -# `selfhost/arje-zero-lockfile` = la migración A0 (arje-cas → BLAKE3, 35ec8ef9) + el Cargo.lock del -# workspace committeado encima: sin lock, el monorepo lo gitignora y el fetch vendorea SIN --locked -# ⇒ las deps derivan en el tiempo y arje-zero (y of_tree(stage1)) deja de ser reproducible. Con el -# lock fijo el build es --locked y bit-reproducible. +# El `commit` es el identificador inmutable (la URL es sólo locator, no entra al hash). Sin el +# `Cargo.lock` del workspace el monorepo lo gitignora, el fetch vendorea SIN --locked ⇒ las deps +# derivan en el tiempo y arje-zero (y of_tree(stage1)) deja de ser reproducible. repo = "gitea@git.tawasuyu.net:tawasuyu/tawasuyu.git" -commit = "9967b02cf597df6d065edbad8d6669b5653d4928" +commit = "98db584fd28d9ff2bf34c9cf7d7db2e1de0b3fd0" +# Este árbol COMMITEA su propio `vendor/` (la copia parcheada de smithay que mirada necesita) y el +# `cargo vendor` de hammer lo pisaría. Ver [[hammer-cargo-vendor-clobbers-project-vendor]]. +cargo_vendor_dir = ".hammer-cargo-vendor" [build] compiler = "zig-cc" diff --git a/scripts/gnome/qemu-desktop-image.sh b/scripts/gnome/qemu-desktop-image.sh index be6e68e0..2e9a936c 100755 --- a/scripts/gnome/qemu-desktop-image.sh +++ b/scripts/gnome/qemu-desktop-image.sh @@ -31,6 +31,29 @@ rm -rf "$MERGED" cp -al "$BASE" "$MERGED" cp -al --remove-destination "$GNOME"/. "$MERGED"/ +# ── PID1 DESDE EL STORE, no desde el directorio base ──────────────────────────────────────────── +# `work/metal-rootfs` se armó a mano en la campaña de metal y quedó CONGELADO: su `arje-zero` era de +# 2026-06-19. Nadie lo re-generaba al re-sellar la receta, así que cada imagen de escritorio arrancaba +# con un PID1 de hace mes y medio sin que nada lo dijera. Así se comió el fix del `identity mismatch`: +# arje-zero se había arreglado río arriba y la VM seguía imprimiendo el mensaje viejo. +# +# El síntoma es engañoso porque el directorio base es LEGÍTIMO para todo lo demás (busybox, firmware, +# el kernel EFI-stub): sólo la pieza que también es receta se queda atrás. Regla: **si algo del rootfs +# tiene receta, la imagen lo toma del artefacto sellado, no de la copia congelada.** +# +# Se elige por `hammer hash` —el artefacto que corresponde a la receta de HOY—, mismo criterio que los +# dos compat daemons de más abajo; el más reciente por fecha miente en cuanto conviven dos. +echo "==> PID1: arje-zero desde el store (no desde $BASE)" +AZ="${AZ:-store/$(./target/release/hammer --store store hash recipes/arje-zero.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-zero}" +if [ -d "$AZ" ] && [ -x "$AZ/usr/bin/arje-zero" ]; then + install -Dm755 "$AZ"/usr/bin/arje-zero "$MERGED"/usr/bin/arje-zero + echo " ✓ $(basename "$AZ" | cut -c1-12) (el de $BASE era de $(stat -c '%y' "$BASE"/usr/bin/arje-zero 2>/dev/null | cut -d' ' -f1))" +else + echo " ✗ falta arje-zero sellado en store/ — la imagen usaría el PID1 CONGELADO de $BASE" >&2 + echo " construílo: ./target/release/hammer build recipes/arje-zero.toml --store store" >&2 + exit 1 +fi + echo "==> parcheando mesa software desde $MESA" # El cierre GNOME trae mesa con SÓLO iris_dri.so (Intel real). En QEMU no hay GPU: hace falta # kms_swrast. Se copian los .so de mesa-llvmpipe ENCIMA (--remove-destination rompe el hardlink).