estado: cosecha granja 2026-07-30T23:20:59Z — avance del árbol KDE
Semantic delta
No definition changed: this change is text, documentation or data.
6 files · +88 −25
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).