estado: cosecha granja 2026-07-30T23:20:59Z — avance del árbol KDE

This commit is contained in:
2026-07-30 19:20:59 -04:00
parent 2430528c16
commit 7190cc48a3
6 changed files with 88 additions and 25 deletions
+16 -3
View File
@@ -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]]).
+7 -5
View File
@@ -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": [],
+7 -6
View File
@@ -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": [],
+7 -5
View File
@@ -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": [],
+28 -6
View File
@@ -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"
+23
View File
@@ -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).