Commit Graph
5 Commits
Author SHA1 Message Date
Sergio 1b56b16402 SDD 30 §4a+§4c: los 9 demonios de GNOME declarados — y aparecieron dos que no estaban en NINGÚN perfil
Lo que el script de sesión lanza con `&` ahora está declarado en las recetas y
habilitado en el perfil. Ninguna receta movió su hash: 9/9 idénticos a los que
los grafos ya registraban.

EL HALLAZGO, y no lo buscaba: la comprobación inversa del resolutor rechazó
`arje-logind-compat` y `arje-polkit-compat` porque están en CERO perfiles — y
sin embargo qemu-desktop-image.sh los copia al rootfs a mano y el de COSMIC hace
`exit 1` si falta logind-compat. Dos binarios imprescindibles, presentes en la
imagen y ausentes del destino declarado: la misma forma del agujero de `foot`,
encontrada por una comprobación en vez de por una imagen inusable. Son raíces de
escritorio-gnome (los dos) y de escritorio-cosmic (sólo logind, verificado que
sus scripts no nombran polkit).

DOS COSAS QUE NO SON TRANSCRIPCIÓN:
- `dbus-daemon --fork` no se traduce tal cual: arje supervisa al HIJO DIRECTO y
  Type=forking no existe, así que un daemon que forkea y sale deja a arje viendo
  morir al padre con éxito y reencarnándolo para siempre. La card usa --nofork.
- `scope = system|session` decide DÓNDE va la card. Las de sesión necesitan
  XDG_RUNTIME_DIR y usuario logueado; en el genesis arrancarían antes de que
  exista ninguno. Y fuera de mirada NADIE entrega cards de sesión todavía, así
  que salen con AVISO: el hueco queda contado, no omitido.

Correcciones propias: la unicidad del label es DENTRO del perfil, no del corpus
(upower vive legítimamente en dos colas); la membresía se lee de los CINCO
grafos, no sólo el del corpus; una RAÍZ manda sobre el grafo, que es derivado y
lo regenera el cron; y la flag nace en inglés (`--services`) como manda la
regla 4, aunque `--lista` sea deuda vieja del mismo fichero.

`--selftest`: 7 casos, el primero es el CONTROL que tiene que pasar en verde.
2026-09-12 11:08:58 +00:00
sergioandClaude Opus 5 346cd59706 licencias: campo license en la receta — de 0 a 228 de 1141, sin re-hashear nada
La deuda legal bloqueante del SDD 19 §2.1. Medido hoy: **0 de 1141 recetas** declaraban
licencia, no «5 de 771» como decía el informe anterior. Los dos números estaban mal: los
«5» eran falsos positivos de `grep license` (el paquete `addlicense`, el paquete
`cargo-bundle-licenses`, una línea `install .../share/licenses/` y un comentario), y las
recetas son 1141. Contar con `grep -l <palabra>` sobre TOML cuenta comentarios y nombres,
no campos; `scripts/licencias.sh` cuenta el campo de verdad (clave en la raíz, antes del
primer `[table]`).

LO QUE HACE LA DEUDA PAGABLE: `Recipe::hash_inputs` es una LISTA BLANCA — sólo entran
source, compiler, target, link, patches, flags, phases y deps. `license` no entra, igual
que `evidence` y `slots`. Por eso se puede poblar en las recetas YA SELLADAS sin mover un
solo ArtifactHash. Verificado, no supuesto: en 40 recetas modificadas se comparó el hash
con y sin la línea — 40 idénticos, 0 cambiados. Si el campo entrara al hash, declarar la
licencia costaría reconstruir el corpus entero y no se haría nunca. Clavado con el test
`licencia_round_trip_y_no_afecta_el_hash`.

TRAMPA DE TOML: una clave suelta después de un `[table]` pertenece a esa tabla. Puesta al
final del fichero, `license` acaba dentro de `[deps]` y se pierde EN SILENCIO, porque serde
ignora los campos que no conoce — no hay error, simplemente no está. Va arriba, junto a
`name` y `version`; el sembrador la inserta tras `version`.

NO SE ADIVINA. Declarar mal una licencia es peor que dejarla vacía: convierte un hueco
visible en una afirmación falsa. Sólo se puebla desde una tabla curada entrada por entrada
(`docs/licencias-conocidas.tsv`); lo que no tiene evidencia queda vacío y se CUENTA.
Concretamente se descartó el atajo «k* = KDE ⇒ LGPL»: en este catálogo `kail`, `kind`,
`ko`, `kopia`, `krew`, `kustomize`, `kyverno`, `katana`, `kibi`, `kmon` y toda la familia
`kube*` son herramientas Go sin relación con KDE. El nombre no es evidencia.

Quedan 913, casi todas CLIs Go/Rust importados en masa — y ésas sí son automatizables con
evidencia real: Cargo.toml trae el campo `license` y los módulos Go traen su LICENSE en el
árbol. El cierre estructural es capturarlo en la fase de fetch, que ya descarga y extrae
cada tarball, y inyectar el texto en `hammer pack` (aguas abajo del ArtifactHash) en vez de
en la fase install (que sí re-hashearía).

De paso, respaldo-storagebox.sh reordenado por valor irreemplazable y con zstd: medido en
la oficina, el uplink da 8 Mbps iguales por cable y por wifi ⇒ 128 G no caben en una
sentada, así que sube primero el cerebro (estado + repo) y `--partial-dir` hace que cortar
a mitad de un artefacto no tire lo ya subido.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 10:24:11 -04:00
sergioandClaude Opus 5 beb2851d99 colord: el demonio ya se construye (b3:8100fa39) — arranca, abre sus DB y NO adquiere el nombre
La receta iba con `-Ddaemon=false` y el razonamiento era «mutter enlaza libcolord, no
necesita el demonio». Cierto para COMPILAR mutter y falso para el escritorio andando: el
artefacto INSTALA el `.service` de activación (`Exec=/usr/libexec/colord`) y ese binario no
existía, así que cada arranque se comía 25s de timeout. **No era «colord apagado» sino
colord roto de forma lenta** — el peor de los dos, porque no falla, tarda.

Su propio comentario marcaba la condición de vuelta: «si alguna vez hace falta el demonio
de verdad, vuelve con polkit encima». Polkit ya está (arje-polkit-compat). Y medido: prender
el demonio **no agrega una sola dep nueva** salvo polkit-gobject-1, ya sellada — el bloque
de dependency() de colord 1.4.7 es de nivel superior y pedía gusb/gudev/libudev igual con
daemon=false. El coste estaba pagado desde el 2026-07-27 sin que nadie lo cobrara.

**PERO EL TIMEOUT SIGUE**, y lo que aprendí es dónde NO está:
- El binario existe y arranca: `/usr/libexec/colord` crea sus tres bases en
  /var/lib/colord (mapping.db, storage.db) y lo dice en el log.
- Con `--verbose` NO hay una línea más después de abrir la tercera base.
- La política D-Bus SÍ permite `own` a root, y el `.service` corre como root: no es el caso
  de polkit (donde `own` estaba restringido al usuario `polkitd`).
- Los cuatro `cd_main_load_introspection` que van entre las DB y `g_bus_own_name`
  (cd-main.c:2434-2460) leen de un **GResource compilado en el binario**, no de disco, así
  que no pueden faltar. Los XML instalados en /usr/share/dbus-1/interfaces son para otros.

⇒ Queda entre `cd_main_load_introspection` y `g_main_loop_run`, y el siguiente dato es si el
proceso sigue vivo en ese momento. **Esa comprobación me faltaba en el script** — reportaba
«colord lanzado (pid N)» sin verificar nada, que es exactamente el error que yo mismo había
señalado para upowerd («un pid no es un servicio») y no apliqué acá. Ya está puesta: sin
ella, «no apareció el nombre» no distingue MURIÓ de SE COLGÓ, y son dos investigaciones
distintas.

Verificado que no hay regresión en lo que sí funciona: audio (48. HDA Intel, sink y source
reales) y vídeo (0 page-flips fallidos) siguen bien con el demonio en la imagen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 04:13:40 -04:00
sergioandClaude Opus 5 3ae40ebcfb gnome onda 3: 7 recetas selladas y mutter reducido a UN muro (la C-ABI de sd-login)
Selladas: libgudev b3:a767a231, libusb b3:a8507df1, libgusb b3:4903731d,
colord b3:a0c30aac, libei b3:0537145b, py3-jinja2 b3:e8f28561, py3-markupsafe b3:3ef224ac.

EL HALLAZGO DE LA TANDA — colord destapó una regla que vale para todo el frente:
su meson construye libcolord/libcolorhug como shared_library() pase lo que pase, y con
--prefer-static cada .so se tragaba una copia de la glib ESTÁTICA ⇒ una tabla de GType por
objeto compartido. Síntoma: las herramientas que el propio build compila (cd-create-profile,
cd-it8) enlazaban, arrancaban, y morían con `assertion 'G_IS_FILE (file)' failed` + SIGSEGV.
Yo había anotado a lcms2 como sospechoso; era falso y quedó corregido en la receta. Pasar
colord a la ISLA DINÁMICA (glib .so, un solo registro de tipos) lo selló con CERO segfaults
y los 9 perfiles ICC generándose bien. mutter va por el mismo camino: gnome-shell dlopea
libmutter vía gjs, así que también es isla dinámica.

Lecciones menores, todas medidas:
- -Dremote_desktop=false NO evita libei: mutter 48.8 la pide incondicional (meson.build:130),
  y del lado SERVIDOR (libeis). Sólo se llevó pipewire.
- libusb necesita --with-pic para poder vivir dentro de un .so — mismo remedio y misma razón
  que recipes/libffi.toml, que lo aprendió con Mesa.
- La cadena de build más larga y menos obvia: mutter → libei → jinja2 → markupsafe.
- gvdb NO es frontera: viene dentro del tarball de mutter como subproyecto.
- La mesa del corpus es EGL/GLES sin GL de escritorio (coherente con Wayland-only) ⇒
  mutter va con -Dopengl=false.
- gnome-desktop-4.pc arrastra xkeyboard-config/iso-codes/libseccomp: patrón .pc Requires →
  [deps].build.

MURO QUE QUEDA, uno solo y bien delimitado: mutter exige un proveedor de logind POR C-ABI
(libsystemd o libelogind por pkg-config), no por D-Bus. Usa ~10 funciones de sd-login:
sd_pid_get_session/get_cgroup/get_user_unit, sd_session_get_type/is_active/get_class,
sd_uid_get_sessions/get_display. Y no se puede esquivar: -Dudev=false exige -Dlogind=false
(meson.build:257) y sin udev+logind no hay backend nativo KMS, o sea no hay compositor real.
Esto CORRIGE lo anotado en el frente ("no hace falta la C-ABI sd-login, los escritorios
consultan login1 por D-Bus"): cierto para los clientes, falso para mutter.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-27 21:34:36 -04:00
sergioandClaude Opus 5 64bc2bade0 gnome onda 3: atk SELLADO + mutter feature-minimal + colord medido hasta su muro real
atk (b3:506acb89): mutter la exige sin perilla (meson.build:127) porque Cally, la
accesibilidad de Clutter, habla ATK. 2.38.0 es la última release independiente —
después upstream la fundió en at-spi2-core. Se autora suelta a propósito: es glib y
nada más, mientras at-spi2-core arrastra dbus y el bus de accesibilidad entero.
Queda escrito en la receta el choque futuro: cuando entre at-spi2-core (lo pide
gnome-shell) las dos instalan atk-1.0.pc.

mutter: -Dremote_desktop=false mata pipewire Y libei de un saque; también x11, glx,
libwacom, sound_player, startup_notification y sm apagados. Con atk+json-glib+lcms2+
libdisplay-info declaradas, el configure avanza hasta colord.

colord: receta escrita y medida. El comentario que yo mismo puse (que -Ddaemon=false
adelgazaría las deps) es FALSO y queda corregido en la receta: en 1.4.7 el bloque de
dependency() es de nivel superior, sin `if daemon`. Pide sqlite3 (ya estaba, declarada),
gusb, gudev-1.0 y libudev. Faltan tres ⇒ la próxima tanda es libusb → libgusb + libgudev,
y libgudev no se paga sólo por colord: mutter la exige por su opción udev, la del
backend nativo KMS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-27 19:28:15 -04:00