tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1435Shell 145Markdown 88Rust 852973 Definitions

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

7190cc48a36d768c9abe4b84f7cf856f33b8995d · by sergio · (2 months ago) · parent 2430528c1 · browse the tree at this commit

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).