harkaq: primer barrido en la granja — la deuda irreducible de la muestra es perl (§4.10)

harkaq-farm-setup.sh: provisiona un worker para barrer (idempotente; gatea por
ABI>=7 y aborta si no llega — con la golden vieja el barrido daría SinEvidencia
en TODO). Deriva el runtime base DEL ROOTFS DEL WORKER, no copia el del laptop:
es por-rootfs (§4.3) y los sonames dependen de la versión de Alpine.

Barrido: 24 recetas, 14 con veredicto. Primer número crudo: 4 irreducibles (29%).
ERA FALSO, y por dos motivos propios:

1. GAP DE POLÍTICA. Los `list` salían sólo de los ancestros de la clausura ⇒ una
   receta SIN deps (bash) no generaba ni uno y todo escaneo del árbol caía como
   denegación (/usr/lib). Listar NO es leer: Landlock separa READ_DIR de
   READ_FILE ⇒ la estructura del árbol es CONTRATO. Se puede `ls /usr/lib` sin
   leer un solo fichero no declarado; la deuda es leer lo ajeno, no saber que
   existe. Idem /var/tmp: con --tmp-overlay / es scratch descartable, como /tmp.
2. La heurística del catálogo es por NOMBRE y un fichero no se llama como su
   paquete: /usr/bin/ranlib lo trae `binutils`, /usr/bin/diff lo trae
   `diffutils`. El único que sabe la verdad es el STORE (conoce la lista de
   ficheros de cada artefacto) — y el worker tiene 103 artefactos contra los
   cientos del hub.

⇒ EL WORKER MIDE, EL HUB CLASIFICA. Misma separación que lector/clasificador: el
que tiene el privilegio —o los datos— hace lo mínimo. Reclasificado en el hub:
    bash             ranlib,/usr/lib,/var/tmp → nada (gap de política)
    doas             /usr/bin/diff            → nada (diffutils lo provee)
    ca-certificates  /usr/bin/perl            → /usr/bin/perl
    curl             /usr/bin/perl            → /usr/bin/perl

RESULTADO: la deuda irreducible de toda la muestra es UN path — /usr/bin/perl
(2 de 14 = 14%). No hay recipes/perl.toml ni artefacto: deuda genuina y nombrada.
Todo lo demás era declarable (make ×10, ranlib→binutils, diff→diffutils).

Sigue por encima del <5% del §7, pero el perfil es el que importa: NO hay cola
larga de sorpresas. La deuda de un catálogo entero se resume en "declarar make" y
"no tenemos perl".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 17:50:34 -04:00
co-authored by Claude Opus 4.8
parent ea28a3dbcc
commit 13233ee4e9
4 changed files with 153 additions and 2 deletions
+33
View File
@@ -808,6 +808,39 @@ el silencio de un lector roto.
---
### 4.10 Barrido en la granja: la deuda irreducible de la muestra es **perl**
Primer barrido sobre la granja con ABI 7 (`harkaq-farm-setup.sh` + `fase2-barrido.sh`, 24 recetas,
14 con veredicto — las 10 restantes son Go/Rust y cayeron en caché o fetch). El primer número
crudo fue **4 irreducibles (29%)**. Era falso, y por dos motivos propios:
1. **Gap de política.** Los `list` salían sólo de los ancestros de la clausura ⇒ una receta **sin
deps** (bash) no generaba ni uno, y todo escaneo del árbol caía como denegación (`/usr/lib`).
Listar no es leer: Landlock separa `READ_DIR` de `READ_FILE`, así que **la estructura del árbol
es contrato** — se puede `ls /usr/lib` sin leer un solo fichero no declarado. La deuda es leer
lo ajeno, no saber que existe. (Idem `/var/tmp`: con `--tmp-overlay /` es scratch descartable,
como `/tmp`.)
2. **La heurística del catálogo es por NOMBRE**, y un fichero no se llama como su paquete:
`/usr/bin/ranlib` lo trae `binutils`, `/usr/bin/diff` lo trae `diffutils`. El único que sabe la
verdad es el **store**, porque conoce la lista de ficheros de cada artefacto — y el worker sólo
tiene 103 artefactos contra los cientos del hub.
**El worker MIDE, el hub CLASIFICA.** Es la misma separación que lector/clasificador (§4.2): el
que tiene el privilegio —o los datos— hace lo mínimo. Reclasificado en el hub:
| receta | crudo en el worker | real |
|---|---|---|
| bash | `ranlib`, `/usr/lib`, `/var/tmp` | — (gap de política) |
| doas | `/usr/bin/diff` | — (`diffutils` lo provee) |
| ca-certificates, curl | `/usr/bin/perl` | **`/usr/bin/perl`** |
**Resultado: la deuda irreducible de toda la muestra es UN path — `/usr/bin/perl`** (2 de 14 =
14%). No hay `recipes/perl.toml` ni artefacto en el store: es deuda genuina y nombrada. Todo lo
demás era declarable — `make` ×10, `ranlib`→binutils, `diff`→diffutils.
Sigue por encima del <5% del §7, pero el perfil es el que importa: **no hay cola larga de
sorpresas**. La deuda de un catálogo entero se resume en "declarar `make`" y "no tenemos perl".
### 4.9 Matar gcc: la última milla, cerrada
El primer barrido (§4.6) dejó **un solo** caso irreducible: brotli pidiendo