tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1543Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ 7fa12ed7ce3f7b5ee3ace68ba488ba496aef5e91 docs/plan-freebsd-aprovechables.md Markdown · 137 siq'ikuna · 8.5 KB Ñawpa willay ch'uya

piloto harkaq-trace MEDIDO en builds reales: ceguera-overlay confirmada (0 eventos de store, 206 de binds) y salida validada — marcar /proc/<pid-bwrap>/root cae en el SB del overlay y los paths salen en el idioma de la política; zlib-ng SELLADA b3:93d1da8a al 1er intento; dwarves BLOQUEADA (elfutils sellado sin libdw ⇒ pide variante elfutils-libdw) 7fa12ed7c · sergio ·

1# Plan — qué tomar de FreeBSD
2
3**Fecha:** 2026-07-16 · **Origen:** análisis de META MODE/filemon, Capsicum/casper y
4libarchive contra el estado real de hammer (harkaq Fase 2, cierres §2/§3, catálogo Etapa G).
5
6**Regla del análisis:** de otro kernel se toma *diseño*, no código. La única pieza de código
7importable es libarchive (como receta del catálogo, igual que cualquier otra). Todo lo demás
8es prior art que valida o corrige decisiones ya tomadas.
9
10---
11
12## 1. filemon / META MODE → la traza POSITIVA que a harkaq le falta
13
14**Qué tiene FreeBSD.** `filemon(4)` registra en el kernel cada acceso a fichero durante un
15build; `bmake` en META MODE escribe un `.meta` por target con *todo lo que el build tocó*,
16normalizado. Con eso hacen auto-descubrimiento de dependencias y detección de builds impuros:
17si la traza cambia, el target se reconstruye. Llevan ~12 años iterando qué normalizar (orden,
18tmpdirs, accesos que no importan).
19
20**Qué tiene hammer hoy.** harkaq mide sólo evidencia **negativa**: denegaciones Landlock bajo
21política=clausura (`harkaq-audit.c` emite JSON `{path, motivo}`, `harkaq-verdict.py` clasifica
22esperada/deuda). Lo que NO mide: **qué parte de la clausura concedida se usó de verdad**.
23
24**La brecha que eso deja.** harkaq detecta *sub*-declaración (deuda) pero no
25*sobre*-declaración: una dep declarada y jamás tocada es invisible, engorda la clausura, y esa
26grasa se hereda directo a la política runtime derivada del cierre §3 (política más ancha de lo
27necesario = evidencia más débil). La traza positiva es el dual exacto del veredicto actual.
28
29**Tareas:**
30
31- **T1.1 — sonda de uso positivo.** Un `harkaq-trace` que emita la lista de paths *abiertos*
32  por fase dentro del sandbox. Mecanismo candidato: fanotify — que ya es frente delegado por
33  arje (journal fanotify, ver handoff) ⇒ reutilizar ese trabajo, no abrir mecanismo nuevo.
34  Alternativa si fanotify dentro del userns del sandbox se complica: eBPF sobre `openat`
35  (BPF_SYSCALL ya es explícito en los kernels propios, commit 2b7c701).
36- **T1.2 — normalización estilo `.meta`.** Orden estable, dedupe, paths relativos a la jaula,
37  filtrar tmpdirs / `/out` / `/src`. Las reglas de ruido viven junto a la política — la misma
38  fuente de verdad que los `# expect` (D3: no se calla, se clasifica; el ruido se declara,
39  no se pierde). Aquí es donde la experiencia de META MODE ahorra iteraciones: readdir sin
40  orden garantizado y accesos especulativos del compilador son las dos fuentes de ruido que
41  ellos ya catalogaron.
42- **T1.3 — sellar la traza.** El `b3:` de la traza normalizada viaja junto al `of_tree` del
43  artefacto. Uso inmediato para **why-differs (cierre §2, top-2)**: dos builders que divergen
44  en hash se comparan primero por traza — diff de dos listas de texto ANTES que diff
45  estructural de binarios. El descenso por rangos de `reconcile`/`format` aplica igual.
46- **T1.4 — `harkaq-suggest --poda`.** Con traza positiva, sugerir *remover* deps
47  declaradas-no-usadas: el dual del suggest actual (que sólo sugiere añadir). Cierra el bucle
48  en ambas direcciones: la clausura converge a exactamente-lo-usado.
49
50**Riesgos.** Coste de fanotify en builds grandes (medir primero); falsos "no usados" por
51accesos condicionales entre corridas (mitigación: la poda sugiere, nunca aplica sola — mismo
52contrato que suggest). Piloto: 3 recetas ya instrumentadas (zlib, tar, brotli), en el worker
53(el laptop no compila C).
54
55**PILOTO MEDIDO (2026-07-17, worker, builds reales de zlib-ng y dwarves):**
56
571. **Ceguera-overlay — el hallazgo que corrige el diseño.** `FAN_MARK_FILESYSTEM` sobre el
58   fs del host (donde vive el store) NO ve los reads que el build hace a través del
59   `--tmp-overlay` del sandbox: el superbloque del overlay es OTRO, y overlayfs abre los
60   lower por dentro sin fsnotify en el sb de abajo. Medido: build completo de zlib-ng con
61   traza sobre el store = **0 eventos**; los binds sí aparecen (206 eventos de `/src` vía
62   `work/sources`, mismo sb) e incluso los reads host-side de hammer (`recipes/*.toml` al
63   resolver deps — la traza ya sirve para auditar el hub).
642. **La salida, validada**: marcar `--fs /proc/<pid-bwrap>/root` — el magic-link cruza al
65   mount-ns y la marca cae sobre el SB DEL OVERLAY. Test sintético en el worker (overlay en
66   mntns aparte, lector externo): la lectura del lower a través del overlay **aparece** en
67   la traza. Bonus: los paths salen EN EL NAMESPACE DEL SANDBOX (`/usr/include/zlib.h`) —
68   el mismo idioma de la política harkaq, sin traducción host↔jaula. Cero código nuevo:
69   `harkaq-trace --fs /proc/$PID/root --prefix /usr`.
703. **Pendiente de orquestación**: alguien tiene que darle al tracer el pid del bwrap en
71   vuelo (wrapper sobre `hammer build`, o hammerd). Ese es el siguiente paso de T1.1, y
72   donde toca coordinar con el harness (carril de Opus) para no duplicar lanzadores.
73
74---
75
76## 2. Capsicum / casper → la taxonomía del cierre §3 (política runtime)
77
78**La lección negativa.** Capsicum es más puro que Landlock (capabilities sobre fds,
79`cap_enter()`), y aun así FreeBSD terminó necesitando `casper`: demonios auxiliares porque
80hay una clase de necesidades — DNS, certificados TLS, syslog, random temprano, locale — que
81son *servicios del mundo*, no paths, y no caben en ninguna jaula por-fichero.
82
83**Dónde muerde en hammer.** En build: en ninguna parte — los builds son offline por
84`--unshare-all`, la clase casper es vacía por construcción. En **runtime** (cierre §3: derivar
85la política Landlock del binario instalado desde la clausura medida en build): la clausura de
86build **no contiene** esa clase ⇒ derivar a ciegas produce binarios que revientan en el primer
87`getaddrinfo`. Saber esto *antes* de arrancar Fase 3 es exactamente el valor del prior art.
88
89**Tareas (papel, cero código hoy):**
90
91- **T2.1 — sección "servicios del mundo" en SDD 16 (Fase 3).** La política runtime = clausura
92  de build **+ clases de servicio declaradas** (`dns`, `tls-certs`, `random`, `locale`,
93  `syslog`). Se declara por clase con nombre, nunca se ensancha en silencio — D3 aplica en
94  runtime igual que en build.
95- **T2.2 — mapa clase→paths para musl.** Ventaja estructural de hammer: musl no tiene
96  nsswitch ni dlopen de módulos NSS — `dns` = `/etc/resolv.conf` + socket UDP; `tls-certs` =
97  `/etc/ssl/certs`; `random` = `getrandom(2)` (ni path necesita). El mapa completo cabe en
98  media página; en glibc esto era intratable y es la mitad de por qué casper existe.
99- **T2.3 — la clase viaja en la ConcesionCapacidad.** `(blake3(binario), permisos)` gana un
100  campo de clases de servicio; `arje-absorb --attest-from` ya integra concesiones (PLAN-ATESTACION
101  §B.3) ⇒ sin formato nuevo.
102
103---
104
105## 3. libarchive / bsdtar → receta + extractor de referencia
106
107El único export de código real de FreeBSD que todo el mundo usa.
108
109- **T3.1 — `recipes/libarchive.toml`.** Receta C ⇒ worker. Nombre nuevo en el catálogo, sin
110  riesgo de colisión homónima (el gotcha de promote no aplica). Deps mínimas: zlib (xz/zstd
111  opcionales según features que se activen).
112- **T3.2 — verificación cruzada de formato.** Donde hammer serializa árboles (pack/export),
113  extraer con bsdtar y comparar el árbol resultante contra el extractor propio = **consenso de
114  implementación aplicado al FORMATO** — mismo espíritu que el consenso de reconstrucción
115  (cierre §1) aplicado a los bytes del contenedor, no al build. Barato: un script de barrido
116  sobre N artefactos sellados.
117- **T3.3 (opcional) — bsdtar como dep de build** para tarballs exóticos donde busybox tar se
118  queda corto (hoy: ninguno conocido; tener la receta lo vuelve una línea en `[deps]`).
119
120---
121
122## Lo que NO se toma (para no re-litigarlo)
123
124- **Ports como corpus de recetas** — patches y Makefiles asumen BSD userland; Alpine+nixpkgs
125  (Etapa G) dominan estrictamente para musl-Linux.
126- **FreeBSD como builder de consenso multi-kernel** — sin namespaces/bwrap/Landlock allá; el
127  consenso multi-kernel barato ya existe (kernel propio vs genérico).
128- **bectl / ZFS boot environments** — `hammer boot menu` + `activate --from-select` ya cubren
129  el concepto; como mucho, robar UX de nombres/rollback más adelante.
130- **bmake** — el mundo Linux necesita gmake; no reduce la deuda declarable de `/usr/bin/make`.
131
132## Orden propuesto
133
1341. **T2.1–T2.2** — papel, una tarde, desbloquea el diseño de Fase 3 antes de escribir código.
1352. **T1.1–T1.3** — piloto en 3 recetas en el worker; decide si fanotify o eBPF con datos.
1363. **T3.1** — receta a la próxima tanda del worker.
1374. **T1.4 y T3.2** — sólo después de validar los pilotos (la poda sin traza confiable es ruido).

plan-freebsd-aprovechables.md

Plan — qué tomar de FreeBSD

Fecha: 2026-07-16 · Origen: análisis de META MODE/filemon, Capsicum/casper y libarchive contra el estado real de hammer (harkaq Fase 2, cierres §2/§3, catálogo Etapa G).

Regla del análisis: de otro kernel se toma diseño, no código. La única pieza de código importable es libarchive (como receta del catálogo, igual que cualquier otra). Todo lo demás es prior art que valida o corrige decisiones ya tomadas.


1. filemon / META MODE → la traza POSITIVA que a harkaq le falta

Qué tiene FreeBSD. filemon(4) registra en el kernel cada acceso a fichero durante un build; bmake en META MODE escribe un .meta por target con todo lo que el build tocó, normalizado. Con eso hacen auto-descubrimiento de dependencias y detección de builds impuros: si la traza cambia, el target se reconstruye. Llevan ~12 años iterando qué normalizar (orden, tmpdirs, accesos que no importan).

Qué tiene hammer hoy. harkaq mide sólo evidencia negativa: denegaciones Landlock bajo política=clausura (harkaq-audit.c emite JSON {path, motivo}, harkaq-verdict.py clasifica esperada/deuda). Lo que NO mide: qué parte de la clausura concedida se usó de verdad.

La brecha que eso deja. harkaq detecta sub-declaración (deuda) pero no sobre-declaración: una dep declarada y jamás tocada es invisible, engorda la clausura, y esa grasa se hereda directo a la política runtime derivada del cierre §3 (política más ancha de lo necesario = evidencia más débil). La traza positiva es el dual exacto del veredicto actual.

Tareas:

Riesgos. Coste de fanotify en builds grandes (medir primero); falsos "no usados" por accesos condicionales entre corridas (mitigación: la poda sugiere, nunca aplica sola — mismo contrato que suggest). Piloto: 3 recetas ya instrumentadas (zlib, tar, brotli), en el worker (el laptop no compila C).

PILOTO MEDIDO (2026-07-17, worker, builds reales de zlib-ng y dwarves):

  1. Ceguera-overlay — el hallazgo que corrige el diseño. FAN_MARK_FILESYSTEM sobre el fs del host (donde vive el store) NO ve los reads que el build hace a través del --tmp-overlay del sandbox: el superbloque del overlay es OTRO, y overlayfs abre los lower por dentro sin fsnotify en el sb de abajo. Medido: build completo de zlib-ng con traza sobre el store = 0 eventos; los binds sí aparecen (206 eventos de /src vía work/sources, mismo sb) e incluso los reads host-side de hammer (recipes/*.toml al resolver deps — la traza ya sirve para auditar el hub).
  2. La salida, validada: marcar --fs /proc/<pid-bwrap>/root — el magic-link cruza al mount-ns y la marca cae sobre el SB DEL OVERLAY. Test sintético en el worker (overlay en mntns aparte, lector externo): la lectura del lower a través del overlay aparece en la traza. Bonus: los paths salen EN EL NAMESPACE DEL SANDBOX (/usr/include/zlib.h) — el mismo idioma de la política harkaq, sin traducción host↔jaula. Cero código nuevo: harkaq-trace --fs /proc/$PID/root --prefix /usr.
  3. Pendiente de orquestación: alguien tiene que darle al tracer el pid del bwrap en vuelo (wrapper sobre hammer build, o hammerd). Ese es el siguiente paso de T1.1, y donde toca coordinar con el harness (carril de Opus) para no duplicar lanzadores.

2. Capsicum / casper → la taxonomía del cierre §3 (política runtime)

La lección negativa. Capsicum es más puro que Landlock (capabilities sobre fds, cap_enter()), y aun así FreeBSD terminó necesitando casper: demonios auxiliares porque hay una clase de necesidades — DNS, certificados TLS, syslog, random temprano, locale — que son servicios del mundo, no paths, y no caben en ninguna jaula por-fichero.

Dónde muerde en hammer. En build: en ninguna parte — los builds son offline por --unshare-all, la clase casper es vacía por construcción. En runtime (cierre §3: derivar la política Landlock del binario instalado desde la clausura medida en build): la clausura de build no contiene esa clase ⇒ derivar a ciegas produce binarios que revientan en el primer getaddrinfo. Saber esto antes de arrancar Fase 3 es exactamente el valor del prior art.

Tareas (papel, cero código hoy):


3. libarchive / bsdtar → receta + extractor de referencia

El único export de código real de FreeBSD que todo el mundo usa.


Lo que NO se toma (para no re-litigarlo)

Orden propuesto

  1. T2.1–T2.2 — papel, una tarde, desbloquea el diseño de Fase 3 antes de escribir código.
  2. T1.1–T1.3 — piloto en 3 recetas en el worker; decide si fanotify o eBPF con datos.
  3. T3.1 — receta a la próxima tanda del worker.
  4. T1.4 y T3.2 — sólo después de validar los pilotos (la poda sin traza confiable es ruido).