Files
takana/docs/state/qorpa-ajenos.toml
T
SergioandClaude Opus 5 f64859bade qorpa export: shims generados, y la clase ajeno para que nadie los cuente mal
Paso 5 del ADR 0015, sus dos mitades.

SHIMS. `hammer qorpa export <id>` genera lanzadores finos y `.desktop` en el
espacio del host, desde lo DECLARADO en `[export]` — nunca todo: exportar todo
haría que el `ls` de la imagen compita con el nuestro, que es la falla de
Bedrock (arbitra en tiempo de exec, por heurística). Gana en tres cosas contra
un FUSE: cero costo en runtime, `cat` al shim y ves qué hace, y se revoca
borrándolos.

Se GENERAN, no se copian. El `.desktop` se arma con lista BLANCA de claves, así
que `Exec`, `TryExec`, `Path` y `DBusActivatable` quedan fuera por definición y
no por enumeración — una lista negra dejaría entrar la próxima clave ejecutable
que invente el estándar. El Exec original se cita en un comentario del fichero
generado, para que se vea qué decía y qué no se copió. El icono se busca en la
vista merged (upper primero, imagen después: si no, se perdería lo que instaló
el gestor de paquetes) y se copia al host, porque un icono que el host no
resuelve se ve como un cuadrito gris. Y `exported.json` registra cada fichero
escrito, para que `--remove` borre EXACTAMENTE eso y no por patrón sobre el
~/.local/bin de alguien.

Probado de punta a punta con un .desktop ajeno real de la imagen de Arch: el
shim corre `pacman -Q` del huésped desde el host, el X-KDE-Wayland-Interfaces
quedó fuera, el icono viajó, y --remove dejó 0 ficheros con la instancia intacta.

CLASE `ajeno`. build-state.py inyecta los nodos declarados en el nuevo
docs/state/qorpa-ajenos.toml ANTES que los `wanted`, y ese orden es la mitad del
punto: un nodo que provee una imagen ajena no es una receta por escribir. Con
eso el `xwayland` de escritorio-kde deja de ser deuda y pasa a contarse aparte:

  escritorio-kde       187/188 listo   falta   1  (raíces 14, + 1 ajenas)

Dos decisiones que sostienen esa cifra: los ajenos se RESTAN del denominador (si
entraran, el número que se lee como "cuánto construimos" crecería solo cada vez
que alguien enjaula una app), y la declaración vive en el REPO y no se lee de
/var/lib/hammer — build-state.json se commitea y lo regenera el cron en dos
máquinas; si la clase saliera de las instancias instaladas, cada una diría algo
distinto y se pisarían en cada cosecha. Es el error que ya se cometió con
sealed_remoto. Qué provee una imagen ajena es diseño; qué tenés instalado, no.

Un ajeno tampoco se hashea, y no por comodidad: no tiene procedencia de fuente,
así que un hash afirmaría que lo reproducimos.

2 tests nuevos (que del .desktop ajeno no sobreviva nada ejecutable; que el shim
no se rompa con rutas raras). 47/47.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U5cQtQrYNjWJVXVE6aEpQ2
2026-09-03 06:15:19 +00:00

25 lines
1.7 KiB
TOML

# Nodos que el corpus NO provee y NO va a proveer: los trae una imagen ajena enjaulada
# (qorpa, ADR 0015 D5 capa 3). Este fichero existe para que NADIE los pueda contar mal.
#
# ── POR QUÉ ESTO ES UN FICHERO DEL REPO Y NO UNA LECTURA DE /var/lib/hammer ──────────────────────
# `build-state.json` se commitea y lo regenera el cron en dos máquinas. Si la clase `ajeno` saliera
# de las instancias que cada máquina tiene instaladas, el grafo diría cosas distintas en cada una y
# se pisarían en cada cosecha — el mismo error que ya se cometió con `sealed_remoto`. Qué provee una
# imagen ajena es una decisión de DISEÑO, compartida; qué instancias tiene tu disco, no.
#
# ── QUÉ HACE UN NODO ACÁ ────────────────────────────────────────────────────────────────────────
# Deja de ser `wanted` (deuda: receta por escribir) y pasa a `ajeno`: presente, pero SIN procedencia
# de fuente y SIN reproducibilidad. No cuenta como deuda ni como corpus. El reporte los suma aparte
# («171 nativas + 6 ajenas») precisamente para que la cifra del corpus no se infle sola.
#
# NO entran al catálogo publicable ni al reporte de licencias (SDD 20): no podemos enumerarlas.
[xwayland]
razon = """
X11 está fuera de alcance para toda la distro (Wayland-only, sin systemd) y Xwayland tampoco salva
al herramental X11, que sólo ve clientes X. Con instancias, el Xwayland vive DENTRO de la imagen
—Arch y Fedora ya lo traen— y se cuelga de nuestro kwin por el socket. La receta no se escribe.
"""
imagen = "arch"
perfiles = ["escritorio-kde"]