qorpa prune: la poda nace con el subsistema, no después

Paso 7 del ADR 0015, sus dos mitades.

PODA. Un rootfs son cientos de MB o varios GB y no lo alcanzan ni store-gc ni
la caché .dmerge: es un tercer montón sin dueño, como ya lo fue work/sources.
`hammer qorpa prune` barre restos de pulls a medias, imágenes que ninguna
instancia usa —se re-traen por digest, que es justo la propiedad que da el pin—
y, con --upper, las capas mutables, que por D3 siempre se pueden tirar.

Con las dos cicatrices del repo cableadas:
- SIN --yes es un simulacro. Y tras borrar COMPRUEBA que el directorio se fue,
  porque store-gc reportaba borrados que no ocurrían y eso se descubrió tarde.
  Si dice que sí y sigue ahí, sale ≠0 diciendo que el número de arriba no es lo
  que se liberó.
- El tamaño de un árbol con directorios ilegibles sale MENOR de lo que es: un
  upper con ficheros de los subuid no se puede recorrer entero. Ahora se cuentan
  los directorios ciegos y la cifra se marca con `≥`. Un número silenciosamente
  bajo es peor que ninguno cuando con él se decide borrar.

Y --upper deja la instancia USABLE: sin upper/ y work/ no vuelve a arrancar.

LICENCIAS (SDD 20). Las imágenes ajenas quedan fuera del catálogo publicable y
del reporte de licencias por escrito, y la razón no es pereza: no podemos
enumerarlas — un `pacman -S` dentro de una instancia trae paquetes que nadie
declaró acá, y afirmar una licencia sobre eso sería inventarla. Lo que sí se
hace: contarlas aparte en clase `ajeno` (el riesgo real del ADR es que en seis
meses alguien las cuente como corpus), y dejar dicho que si algún día se espejan
hay que mirar licencia Y MARCA antes, igual que con Firefox. Más el corolario
que faltaba escribir donde se lea: el claim «hammer reproduce bit a bit» hay que
acotarlo desde el día que exista una instancia.

2 tests nuevos (la poda no toca una imagen en uso y sí los restos; con --upper
la capa se va pero la instancia queda usable). 50/50.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U5cQtQrYNjWJVXVE6aEpQ2
This commit is contained in:
Sergio
2026-09-03 12:18:10 +00:00
co-authored by Claude Opus 5
parent da0186d250
commit d77ad15d01
3 changed files with 230 additions and 10 deletions
+7 -1
View File
@@ -481,7 +481,13 @@ Se escriben acá para que no se descubran en producción.
**Lo que NO se pudo, y por qué:** la máquina no tiene ninguna sesión gráfica (`/dev/dri` sí,
socket Wayland no), así que Steam no dibuja; y el runtime *sniper* sólo se baja al instalar un
juego, lo que exige credenciales. **pressure-vessel con un juego real sigue sin ejercitarse.**
7. Poda (`hammer qorpa prune`) y renglón en SDD 20 sobre licencias.
7. **HECHO 2026-09-03.** `hammer qorpa prune` + el renglón en
[SDD 20](../20-catalogo-publicable-y-completa.md#imágenes-ajenas-qorpa-fuera-del-catálogo-y-por-escrito).
Poda restos de pulls a medias, imágenes que ninguna instancia usa (se re-traen por digest: es la
propiedad que da el pin) y, con `--upper`, las capas mutables. **Sin `--yes` es un simulacro**, y
tras borrar **comprueba que el directorio se fue**: la cicatriz de `store-gc`, que reportaba
borrados que no ocurrían. Los tamaños de un árbol con directorios ilegibles se marcan con `≥`,
porque un número silenciosamente bajo es peor que ninguno cuando con él se decide borrar.
8. Proxy filtrante de Wayland — ticket propio, el más valioso de la lista.
## Nombre — ADOPTADO 2026-09-03