Commit Graph
868 Commits
Author SHA1 Message Date
SergioandClaude Opus 5 aa5bb67fd7 qorpa: nombre adoptado y el preflight que mide si una máquina puede alojar
ADR 0015 pasa de "propuesta de nombre" a `qorpa` adoptado: la frontera es
`hammer qorpa {…}` y el espacio de nombres se unifica en
/var/lib/hammer/qorpa/{imagenes,instancias}/ — un solo árbol, para que la poda
de §NO-resuelve 5 tenga un único sitio que barrer. La clase de nodo del grafo
sigue siendo `ajeno`: describe la procedencia, no el subsistema.

Y arranca el §Orden de trabajo 1 (subuid) como GUARDIÁN en vez de a mano:
scripts/qorpa/qorpa-preflight.sh mide las cinco capacidades de entorno que un
huésped necesita y que no están en ningún grafo — userns sin privilegios (+
anidado), mapeo multi-id, overlayfs sin root, los nodos del borde y disco.
Tres niveles (BLOQUEA/LIMITA/NOTA) y salida 0/1/2, porque "arranca pero sin
dnf" es una respuesta legítima, no un error.

Medido en `momento` (exit 2, 2 limitaciones):
- userns ANIDADO funciona ⇒ el "verificar, no asumir" de D6 (pressure-vessel
  creando su userns dentro del nuestro) queda verificado a nivel de primitiva.
- subuid es papel mojado acá: el rango está declarado en /etc/subuid y las
  herramientas están, pero newuidmap/newgidmap vienen sin setuid y sin
  capability ⇒ no pueden escribir el uid_map. Es exactamente la "primera cosa
  que va a fallar" del ADR, y resulta ser de PROVISIÓN, no de kernel.

El guardián ya se corrigió a sí mismo una vez: marcaba LIMITA por
CONFIG_OVERLAY_FS=m mientras tres secciones más abajo el overlay montaba de
verdad. Manda la prueba funcional, no la declarada.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U5cQtQrYNjWJVXVE6aEpQ2
2026-09-03 03:05:12 +00:00
Sergio 2fc30c4df2 estado: cosecha granja 2026-09-03T03:01:13Z — avance del árbol KDE 2026-09-03 03:01:13 +00:00
Sergio 776692d01a ADR 0015 (propuesto): imágenes ajenas — el mundo glibc entra enjaulado y no entra al store
Decide la frontera antes de escribir código. Sale de una medición incómoda: el
corpus tiene cuatro escritorios que cierran y CERO navegador, ofimática,
reproductor o editor de imagen. Al partir el «qué falta» por causa, la
intersección de «sólo X11» con «compilable desde fuente en musl» es casi vacía:
casi todo lo que se pierde por Wayland ya estaba perdido por la libc. El montón
que duele son binarios ajenos que nadie va a recompilar.

Las siete decisiones:

D1 — Una imagen ajena NO es un artefacto y no vive en el store. El store promete
     reconstrucción bit a bit desde fuente; un rootfs de Fedora no. Meterlo ahí
     sería la misma clase de error que el artefacto vacío: algo que se lee como
     garantía y no lo es. Namespace paralelo, por digest, fuera de hash_inputs.
D2 — Se cruza el borde con protocolos y nodos de dispositivo, NUNCA con
     librerías. Wayland/PipeWire son protocolos; /dev/dri y /dev/ntsync son ABI
     de kernel. Mesa va adentro de la imagen. Corolario: la jaula no sabe qué
     libc hay adentro, y por eso resuelve el montón entero de una vez.
D3 — El manifiesto es la verdad; el `upper` del overlay es CACHÉ. Misma relación
     que receta↔artefacto. De ahí se caen solas la actualización de base (se
     recrea, no se rebasea), el respaldo (KB, no GB) y la poda.
D4 — Cuatro granularidades, no una. El runtime curado inmutable (tipo 2) sigue
     siendo el preferido cuando alcanza: se sella. El rootfs con dnf existe
     porque es justo lo que el tipo 2 no permite.
D5 — Transparencia por shims GENERADOS, no por un FUSE global. Es el poder de
     Bedrock sin sus formas: cero costo en runtime, inspeccionable, revocable, y
     se exporta lo declarado (Bedrock arbitra en tiempo de exec, con heurísticas).
     Los nodos exportados entran al grafo con clase `ajeno` ⇒ no se pueden contar
     como corpus. Bedrock no puede decirte qué tenés.
D6 — Steam ya ES un contenedor: se anida pressure-vessel adentro, que es la
     configuración que Valve prueba. El bwrap anidado hay que VERIFICARLO.
D7 — Es el único lugar del sistema donde la política se escribe en vez de
     derivarse. harkaq deriva `política = clausura(deps)`; una imagen ajena no
     tiene clausura declarada. Excepción nombrada y acotada, por defecto vacía.

Y lo que el ADR admite que NO resuelve, escrito para no descubrirlo en producción:
el socket de Wayland es un borde de privilegio y lo pasamos crudo (screencopy y
virtual-keyboard incluidos — Flatpak pasa un proxy filtrante, nosotros no lo
tenemos); el UID mapping va a fallar primero y las piezas ya están en el corpus
(shadow instala newuidmap/newgidmap y crea /etc/subuid vacío, falta
provisionarlo); es una segunda cadena de suministro sin garantías; y hay que
acotar por escrito el claim de bit-repro o la cultura de números honestos se
erosiona sola.

Se cae gratis: `xwayland` deja de ser deuda del corpus (va DENTRO de la imagen,
que ya lo trae, y se cuelga de kwin por el socket) ⇒ el wanted de KDE se
disolvería sin escribir la receta y sin tocar Wayland-only. GIMP e Inkscape dejan
de reabrir la deuda GTK3. Y del plan de juegos: F2 (glibc+multilib desde fuente,
«una campaña entera») queda CANCELADA y F0 (flatpak+ostree al catálogo)
innecesaria.

Lo nativo no se afloja: el montón A se sigue construyendo, en orden mpv → OBS →
Firefox.

Toca sólo documentación: el ADR nuevo, la nota de generalización en
plan-jaula-juegos.md §Capa 3, y el comentario en targets.toml que evita que
alguien escriba la receta de xwayland sin ver la decisión pendiente. Cero recetas
tocadas, cero re-hasheo: --kde sigue en 978 sealed / 1 wanted / 171-171, CIERRA.
2026-09-03 02:49:40 +00:00
Sergio 3b275f482e estado: cosecha granja 2026-09-03T02:31:12Z — avance del árbol KDE 2026-09-03 02:31:12 +00:00
Sergio f4268acfdc estado: cosecha granja 2026-09-03T01:31:07Z — avance del árbol KDE 2026-09-03 01:31:07 +00:00
Sergio 9fb0229f19 estado: cosecha granja 2026-09-03T01:01:13Z — avance del árbol KDE 2026-09-03 01:01:13 +00:00
Sergio 520f1d5279 polkit (variante KDE) + polkit-qt-1 0.201.1: Plasma ya puede pedir autorización
Tercer y cuarto hueco de RUNTIME del triaje. Sin polkit-qt-1, Plasma no puede
elevar privilegios: ni montar un disco, ni cambiar ajustes del sistema.

Son DOS recetas porque hacía falta una segunda polkit. Hammer resuelve las deps
hermano→padre —la cola propia, después recipes/— y nunca cruza a una cola hermana,
así que la polkit de incoming-gnome es invisible desde incoming-kde. Y aunque se
viera no serviría: aquélla va con -Dintrospection=true contra glib-introspected,
que es la ISLA DINÁMICA del shell de GNOME (gjs importa gi://Polkit y necesita el
typelib). KDE enlaza las libs desde C++ y el typelib le sobra; traerlo obligaría a
meter gobject-introspection entero en la cola.

La nueva es homónima a propósito, mismo patrón deliberado que dbus (incoming-kde vs
raíz) y gmp (incoming-kde vs incoming-cosmic), con el mismo coste conocido:
store-gc no puede decidir por NOMBRE cuál de los dos sellados es el vigente. No la
renombré a polkit-kde porque el .pc que busca polkit-qt-1 es polkit-gobject-1, no
el nombre del paquete: renombrar sólo movería el problema al lector.

Radio medido antes de escribirla (yupana radio polkit): la de incoming-gnome tiene
6 dependientes transitivos y no se toca; la nueva, 0. Cero daño colateral.

Nada de esto necesitó descubrirse: glib-shared ya existía en la cola KDE y su
propio encabezado nombraba a polkit como uno de los motivos por los que se escribió.

── El guardián que sí hizo falta ────────────────────────────────────────────────
polkit-qt-1 sondea polkit con check_function_exists, que COMPILA Y ENLAZA. Si ese
enlace falla por algo del sandbox —y no porque la función falte—, cmake NO da
error: imprime «You have an older polkit-1 version» y define
POLKIT_QT_1_COMPATIBILITY_MODE. El build sella, el artefacto pesa lo esperado y la
autorización queda recortada sin que nadie se entere. La fase configure ahora
aborta si HAVE_POLKIT_SYSTEM_BUS_NAME_GET_USER_SYNC no llegó a 1 en el header
generado: polkit 127 tiene esa función, así que un 0 significa «el sondeo no pudo
enlazar», no «polkit es viejo». Pasó: no hay modo compatibilidad.

También va -DQT_MAJOR_VERSION=6 explícito. El default del CMakeLists es "5", y sin
la flag construiría bindings con otros nombres (polkit-qt5-1) que el dependiente
no encontraría hasta mucho después.

── Lo que esto NO enciende, a propósito ─────────────────────────────────────────
Los dos consumidores siguen esquivando polkit igual que antes:
  · kauth construye con el backend polkit OPCIONAL apagado (cae al backend fake);
  · plasma-workspace apaga el helper de Región&Idioma con -DGLIBC_LOCALE_GEN=OFF
    -DGLIBC_LOCALE_PREGENERATED=ON, que es justo lo que evita el PolkitQt6-1
    REQUIRED.
Encenderlos es otra decisión con su propio radio (plasma-workspace arrastra medio
escritorio). La pieza está puesta; la palanca no se toca sin pedirlo.

⚠ Y con las librerías viaja la postura de seguridad que ya declaraba
arje-polkit-compat: el demonio responde is_authorized=true a TODO. Estas libs son
la INTERFAZ que el escritorio espera, no la política. Queda repetido en las dos
recetas nuevas porque son las que ponen la pieza en manos del escritorio.

Las dos REPRODUCEN bit a bit (verificar-repro.sh 2/2). Los NEEDED de
libpolkit-qt6-core-1 son exactamente los esperados: Qt6DBus, Qt6Core,
libpolkit-gobject-1, gio/gobject/glib y libc.

corpus 788/788 · escritorio-kde 171/171 · grafo CIERRA · gate --check OK
Queda 1 wanted en KDE: xwayland — y ése no es deuda técnica sino una decisión
(X11 al tacho, Xwayland = compat opcional por-imagen, no en el core).
2026-09-03 00:38:55 +00:00
Sergio 3b1d69f2a6 estado: cosecha granja 2026-09-03T00:31:06Z — avance del árbol KDE 2026-09-03 00:31:06 +00:00
Sergio f3d33b5a6e estado: cosecha granja 2026-09-03T00:01:10Z — avance del árbol KDE 2026-09-03 00:01:10 +00:00
Sergio de660fc10f qqc2-breeze-style 6.7.2: el estilo QML de Plasma sellado — KDE pasa de 3 wanted a 2
Segundo hueco de RUNTIME del triaje de la frontera. Nadie lo pide para construir
—por eso el escritorio sellaba completo sin él— pero sin este módulo los controles
QML de Plasma (botones, sliders, combos, los menús de los applets y de los KCM) se
dibujan con el estilo genérico de Qt. No lo reemplaza qqc2-desktop-style: aquél es
el estilo de escritorio integrado con KStyle; éste es la implementación QML nativa
de Breeze, la que Plasma 6 usa por defecto.

Dos cosas que no eran obvias:

1. Se llama casi igual que el vecino y viene de otro tarball. qqc2-DESKTOP-style
   sale de Frameworks 6.27.0; qqc2-BREEZE-style sale del release de Plasma 6.7.2,
   el mismo de breeze/kwin/plasma-workspace. Copiar la URL del vecino da 404.
   El sha256 va contrastado contra el .sha256 que publica KDE al lado del tarball,
   no sólo contra lo que bajó acá: la primera descarga volvió con 0 bytes y su
   sha256 era el de la cadena vacía — un vacío que se lee como éxito.

2. La lista de deps no es la del vecino copiada: sale de la clausura de
   find_dependency de los KF6*Config.cmake que ya están en el store. Ese recorrido
   enseñó algo reutilizable: casi todo lo que esos configs piden (X11, XCB,
   Wayland, OpenSSL, BZip2, LibLZMA) vive dentro de un `if (NOT TRUE)` — la rama
   de build ESTÁTICO — y por lo tanto es código muerto en nuestro corpus, que
   compila KF6 dinámico. Por eso acá no hay libX11 ni xorgproto, coherente con
   Wayland-only. El find_package(X11) del CMakeLists raíz no es REQUIRED, así que
   falla en silencio sin romper el feature_summary(FATAL_ON_MISSING_REQUIRED).
   Confirmado a posteriori: los NEEDED del plugin son exactamente los 5 KF6 que la
   clausura predijo (KirigamiPlatform, IconThemes, ColorScheme, GuiAddons,
   ConfigCore) más Qt6 Quick/Gui/DBus/Core.

La fase install verifica por CONTENIDO, no por presencia: qmldir de org.kde.breeze
y de org.kde.breeze.impl no vacíos, Button.qml presente y el plugin de plataforma
de kirigami instalado. Un módulo QML sin su qmldir ocupa disco y arranca con el
estilo genérico sin decir nada. Salieron 83 controles y 3 .so.

Selló al primer intento y REPRODUCE bit a bit (verificar-repro.sh 1/1).

corpus 788/788 · escritorio-kde 166/166 · grafo CIERRA · gate --check OK
Quedan 2 wanted en KDE: xwayland y polkit-qt-1.

Nota sobre el diff de los cinco grafos: cambian los `dependientes_total` de las
deps de esta receta en TODAS las vistas, no sólo en --kde. Es correcto y está
documentado en build-state.py: ese campo se calcula sobre el grafo entero (todas
las colas del disco), que es la corrección del bug de libdrm.
2026-09-02 23:40:21 +00:00
Sergio 06aae8f2a8 estado: cosecha granja 2026-09-02T23:01:05Z — avance del árbol KDE 2026-09-02 23:01:05 +00:00
Sergio ed603f0749 estado: cosecha granja 2026-09-02T22:31:16Z — avance del árbol KDE 2026-09-02 22:31:16 +00:00
Sergio a6beb3b28d shared-mime-info 2.5.1: la base MIME sellada — KDE pasa de 4 wanted a 3
Primero de los cuatro huecos de RUNTIME del triaje de la frontera. Ninguna receta
lo pedía para construir (por eso escritorio-kde cerraba 163/163 sin él), pero sin
la base el escritorio no sabe qué es un fichero: ni asociaciones, ni iconos, ni
abrir-con. Qt6 y GLib lo leen los dos de /usr/share/mime.

Vive en recipes/ y no en incoming-kde: es freedesktop puro, y en la raíz lo ven
los cinco grafos (GNOME y COSMIC lo quieren igual — gdk-pixbuf hoy lo ESQUIVA con
-Dgio_sniffing=false).

Tres cosas que no eran obvias:

1. Fuente por GIT, no tarball. Freedesktop no publica downloads de release para
   este proyecto: la API sólo ofrece los -/archive/ autogenerados de GitLab, que
   no son estables byte a byte (mismo criterio ya escrito en wlr-randr). El pin
   es el tag 2.5.1 PELADO — acá el tag es objeto tag, la trampa de las 4 del
   mirror (ADR 0013).

2. i18n.merge_file de data/meson.build es INCONDICIONAL: no lo apaga
   -Dbuild-translations=false, porque es el paso que PRODUCE freedesktop.org.xml,
   el payload entero. Eso exige un msgfmt que entienda --xml. El de gettext-tiny
   sirve y no degrada nada: desde 2.x el template ya es XML válido (las
   traducciones se marcan con reglas ITS externas, cero ocurrencias de "<_"), así
   que sin catálogos la salida de un msgfmt real ES el template. Verificado a mano:
   copia byte a byte de los 384036 del template.

3. meson install deja SÓLO el XML fuente. Los consumidores no leen ese XML: leen
   los índices que genera update-mime-database (mime.cache, globs2, magic,
   aliases, subclasses). Sin ese paso el artefacto pasa toda verificación de
   presencia y el escritorio sigue sin saber qué es un .png — la regla 3 del repo
   en su forma exacta. La fase install lo corre contra /out y verifica por
   CONTENIDO: mime.cache y globs2 no vacíos, image/png en types. Salieron 1038
   tipos y 1448 globs.

Nace con strip_debug = true y REPRODUCE bit a bit (verificar-repro.sh: 1/1, cero
divergencias), caché binaria incluida. Estático, 0 NEEDED.

corpus 788/788 sealed · escritorio-kde 165/165 · grafo CIERRA · gate --check OK
Quedan 3 wanted en KDE: xwayland, polkit-qt-1, qqc2-breeze-style.
2026-09-02 22:28:54 +00:00
Sergio 48ce856246 estado: cosecha granja 2026-09-02T20:01:07Z — avance del árbol KDE 2026-09-02 20:01:07 +00:00
Sergio 17604b9d2c estado: cosecha granja 2026-09-02T19:31:16Z — avance del árbol KDE 2026-09-02 19:31:16 +00:00
Sergio a46236a405 estado: cosecha granja 2026-09-02T17:32:06Z — avance del árbol KDE 2026-09-02 17:32:06 +00:00
Sergio 612260007a estado: cosecha granja 2026-09-02T16:01:27Z — avance del árbol KDE 2026-09-02 16:01:28 +00:00
SergioandClaude Opus 5 390c6a5e5e llimphi-counter: pinear a v0.2.0 y arreglar el install — el corpus queda 787/787
Deja de ser una plantilla con `commit = 000…0`. Tres cosas, y las dos últimas
son el valor del commit:

1. PIN. `v0.1.0` era el tag que la versión declaraba y NO SIRVE: su `Cargo.lock`
   está desincronizado con sus manifiestos en el propio repo, y `cargo vendor
   --locked` se niega ("cannot update the lock file … because --locked"). No es
   de hammer: el vendoreo del fetch arranca bien y muere DENTRO de cargo.
   Comprobado con `cargo metadata --locked` en los tres refs — v0.1.0
   incoherente, v0.2.0 y main coherentes. Se pinea v0.2.0, PELADO con ^{commit}
   porque es objeto tag (93253cc2, no 0beb83b7).
   => Un tag no sirve como pin sólo por existir: hay que verificar que su
   lockfile cierre.

2. El requisito de `vendor/` en la fuente que pedía el comentario quedó VIEJO:
   hammer vendorea en el FETCH a partir del Cargo.lock, host-side, y por eso el
   `--offline --locked` del sandbox se cumple. El repo no trae vendor/ en ningún
   tag y aun así construye.

3. ⚠ FASE `install` PROPIA, obligatoria con `--example`. El default de Cargo hace
   `find target/release -maxdepth 1 -type f -perm -100`, y cargo deja los
   ejemplos en `target/release/examples/`. El find no encontraba nada, salía 0 y
   **hammer selló un artefacto SIN BINARIO**: 22 min de compilación y un `sealed`
   con sólo `.hammer/recipe.toml` dentro, 20K. `hash --check` decía SELLADO y el
   grafo lo habría contado como al día.
   No lo atrapa `Store::has` ni el guardián de vacíos de build-state, porque el
   directorio NO está vacío — tiene el manifiesto. Es la regla 3 del CLAUDE.md en
   su peor forma: un ausente falla a gritos, esto llegó al final diciendo que
   todo fue bien. Por eso la fase lleva un `test -x` que hace ruidosa la
   ausencia.

Verificado por contenido, no por el `sealed`: 17 M, usr/bin/llimphi-counter, ELF
pie, NEEDED = libc.so (dinámico, como la receta promete para un binario que
dlopea Vulkan/Wayland). El artefacto falso se podó y quedó en el ledger.

`version` pasa de 0.1.0 a 0.2.0 y NO mueve el hash: no está en hash_inputs (como
`license`). La identidad la da el commit.

Corpus: 787/787 SELLADAS, 0 deuda, 0 never. Gate --check OK, grafo CIERRA.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4
2026-09-02 15:51:21 +00:00
Sergio 94faf1289c estado: cosecha granja 2026-09-02T15:32:58Z — avance del árbol KDE 2026-09-02 15:32:58 +00:00
Sergio 2c8a82859f estado: cosecha granja 2026-09-02T15:02:27Z — avance del árbol KDE 2026-09-02 15:02:27 +00:00
SergioandClaude Opus 5 12c30ec9f9 gnome: la terna no es deuda, es alcance — a .deferred/ con el mapa corregido
gdm, gnome-session y gnome-settings-daemon salen de la cola y quedan aparcadas
en `recipes/incoming-gnome/.deferred/`, que es el mecanismo que el repo ya usa
(precedente: incoming-kde/.deferred/libXft.toml). El glob del worker es
TOP-LEVEL y el del grafo también, así que dejan de molerse cada ciclo y dejan de
contarse como deuda que nadie va a pagar. `targets.toml` ya no las lista desde
el 2026-08-07 («APARCADAS POR DISEÑO»); esto alinea el árbol con esa decisión.

Y el mapa que llevaban estaba mal en las dos direcciones:

1. «La terna GTK3» es un nombre engañoso: **GTK3 no es el muro**. GTK3 tiene
   backend Wayland y se construye con -Dx11_backend=false. Autorarlo no habría
   destrabado ninguna de las tres. Lo que bloquea de verdad:
     - g-s-d 48.1: gtk+-x11-3.0 / x11 / xfixes INCONDICIONALES => imposible en
       Wayland-only, no «pendiente».
     - gnome-session 48.0: dependency('libsystemd', required: true) en meson:124
       es una comprobación de pkg-config EN BUILD. arje-logind-compat no la
       satisface y es a propósito — su receta explica que GNOME consulta login1
       en RUNTIME por D-Bus y que no hace falta la C-ABI sd-login. Único camino:
       parchear ese required a false, que es una decisión, no un arreglo.
     - gdm: cuelga de gnome-session, y con mirada-greeter probablemente sobra.

2. La lista «FRONTERA» estaba VIEJA: ya existen libX11, libXfixes, xorgproto,
   libXau/Xcursor/Xdmcp/Xext/Xi/Xrender/Xtst, libxcb (casi todas por KDE) y
   polkit, upower, geocode-glib, libgweather. Cuatro de las ocho líneas de g-s-d
   habían dejado de ser ciertas. Faltan de verdad: gtk3, libnotify y una
   variante libcanberra-gtk3.

Verificado contra el TARBALL (sha256 = el del pin), no contra el comentario.

incoming-gnome queda en 79 recetas, sellado=79 deuda=0 nunca=0.
Gate --check OK, grafo CIERRA, escritorio-gnome sigue 119/119.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4
2026-09-02 14:46:37 +00:00
Sergio 28611dabf0 estado: cosecha granja 2026-09-02T14:32:36Z — avance del árbol KDE 2026-09-02 14:32:36 +00:00
SergioandClaude Opus 5 c29a4fcb9e gnome: retirar 8 copias de cola que sellan igual que el corpus
`fontconfig-shared`, `freetype-shared`, `libjpeg-turbo-shared`, `libpng-shared`,
`libtiff-shared`, `libxml2-shared`, `libyaml-shared` y `zlib-shared` existían a
la vez en `incoming-gnome/` y en `recipes/`, y las ocho daban el MISMO
ArtifactHash que su gemela del corpus. Como la resolución de deps cae al padre
cuando no hay hermano, quitarlas deja a las consumidoras resolviendo contra
`recipes/` y con el mismo hash.

Medido, no supuesto: se hashearon las 1144 recetas antes y las 1136 después, y
de las 1136 supervivientes **0 cambiaron de hash**. No hay rebuild.

Lo que NO se toca, y conviene que quede dicho porque se parece:

- Las variantes de la ISLA DINÁMICA (glib, gtk4, gdk-pixbuf, pango, harfbuzz,
  graphene, libadwaita, json-glib, libusb, libxcvt, pipewire, pulseaudio,
  wireplumber, xdg-desktop-portal): mismo nombre, hash DISTINTO. Son sombras a
  propósito — la introspección de GNOME exige .so reales.
- Las copias entre COLAS (alsa-lib, hwdata, xkeyboard-config, libdisplay-info,
  lcms2, icu4c, lua, nasm, fuse3, libsndfile, libelogind, hicolor-icon-theme,
  dbus-shared): también dan el mismo hash, pero NO sobran. Cada cola necesita su
  propio hermano para cerrar su clausura; borrar la de una rompe esa cola. No es
  el caso de onda-2, donde la cola entera duplicaba a otra.

Y el criterio, otra vez: `pipewire` y `pulseaudio` son TEXTUALMENTE idénticas a
las de COSMIC y sellan distinto, porque sus deps resuelven distinto según la
cola. El fichero no dice la verdad; el hash sí.

Gate --check OK, grafo CIERRA, escritorio-gnome sigue 119/119. La cola queda en
82 recetas (79 selladas + la terna GTK3) y sus 5 parches, todos en uso.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4
2026-09-02 14:10:56 +00:00
Sergio 9ab5464a6b estado: cosecha granja 2026-09-02T14:03:32Z — avance del árbol KDE 2026-09-02 14:03:32 +00:00
Sergio 62899432f6 estado: cosecha granja 2026-09-02T13:33:10Z — avance del árbol KDE 2026-09-02 13:33:10 +00:00
Sergio a575e8ea9f estado: cosecha granja 2026-09-02T13:02:52Z — avance del árbol KDE 2026-09-02 13:02:52 +00:00
Sergio 0fc2ce3b0b estado: cosecha granja 2026-09-02T12:32:59Z — avance del árbol KDE 2026-09-02 12:32:59 +00:00
Sergio e647f05a54 estado: cosecha granja 2026-09-02T12:02:05Z — avance del árbol KDE 2026-09-02 12:02:05 +00:00
Sergio 1960cadcba estado: cosecha granja 2026-09-02T10:31:51Z — avance del árbol KDE 2026-09-02 10:31:51 +00:00
Sergio 4706c93434 estado: cosecha granja 2026-09-02T10:01:53Z — avance del árbol KDE 2026-09-02 10:01:53 +00:00
Sergio bfd58d4cf7 estado: cosecha granja 2026-09-02T09:32:15Z — avance del árbol KDE 2026-09-02 09:32:15 +00:00
Sergio a59e23bcc2 estado: cosecha granja 2026-09-02T09:02:32Z — avance del árbol KDE 2026-09-02 09:02:32 +00:00
Sergio 85c2ddf034 estado: cosecha granja 2026-09-02T08:31:54Z — avance del árbol KDE 2026-09-02 08:31:54 +00:00
Sergio 3027ab5e2c estado: cosecha granja 2026-09-02T08:02:09Z — avance del árbol KDE 2026-09-02 08:02:09 +00:00
Sergio 2c8cd351c6 estado: cosecha granja 2026-09-02T07:31:59Z — avance del árbol KDE 2026-09-02 07:32:00 +00:00
Sergio 8338edee8c estado: cosecha granja 2026-09-02T07:01:58Z — avance del árbol KDE 2026-09-02 07:01:58 +00:00
Sergio cbe07af0cf estado: cosecha granja 2026-09-02T06:31:57Z — avance del árbol KDE 2026-09-02 06:31:57 +00:00
Sergio 0fa2ae8bba estado: cosecha granja 2026-09-02T06:02:02Z — avance del árbol KDE 2026-09-02 06:02:02 +00:00
Sergio 04d174bf6c estado: cosecha granja 2026-09-02T05:31:53Z — avance del árbol KDE 2026-09-02 05:31:53 +00:00
Sergio d6bfa475e3 estado: cosecha granja 2026-09-02T04:31:55Z — avance del árbol KDE 2026-09-02 04:31:55 +00:00
Sergio ee1a658328 estado: cosecha granja 2026-09-02T04:01:56Z — avance del árbol KDE 2026-09-02 04:01:56 +00:00
Sergio a72190b169 estado: cosecha granja 2026-09-02T01:01:49Z — avance del árbol KDE 2026-09-02 01:01:49 +00:00
Sergio 56bf168cce estado: cosecha granja 2026-09-02T00:31:48Z — avance del árbol KDE 2026-09-02 00:31:49 +00:00
Sergio 9afe0bb9d4 estado: cosecha granja 2026-09-02T00:02:07Z — avance del árbol KDE 2026-09-02 00:02:07 +00:00
Sergio aee9e55c54 estado: cosecha granja 2026-09-01T23:33:01Z — avance del árbol KDE 2026-09-01 23:33:01 +00:00
Sergio 1d06fce140 estado: cosecha granja 2026-09-01T23:02:08Z — avance del árbol KDE 2026-09-01 23:02:08 +00:00
Sergio 987aad25af estado: cosecha granja 2026-09-01T22:31:51Z — avance del árbol KDE 2026-09-01 22:31:51 +00:00
Sergio aa55981ad2 estado: cosecha granja 2026-09-01T22:02:10Z — avance del árbol KDE 2026-09-01 22:02:10 +00:00
Sergio 683eaeb79b estado: cosecha granja 2026-09-01T21:31:51Z — avance del árbol KDE 2026-09-01 21:31:51 +00:00
Sergio e29a1f2ebc estado: cosecha granja 2026-09-01T21:01:49Z — avance del árbol KDE 2026-09-01 21:01:49 +00:00