Commit Graph
1707 Commits
Author SHA1 Message Date
Sergio eaa04a12a5 estado: cosecha granja 2026-09-01T16:01:55Z — avance del árbol KDE 2026-09-01 16:01:55 +00:00
SergioandClaude Opus 5 6558b7c8de granja: la cosecha llenaba el disco — rsync sin -H y bajando .dmerge
La bajada del store murio con "No space left on device" con 95 G libres y un
store remoto de 25 G. Dos causas que se multiplican:

- `rsync -a` NO preserva hardlinks (eso es `-H`). El store es CAS y .dmerge
  hardlinkea los artefactos, asi que los 25 G que mide `du` en el origen -que
  deduplica por inodo- se escriben en destino como copias enteras, una por enlace.
- `.dmerge` es cache pura: hammer la reconstruye sola, no aporta un artefacto y
  es la parte mas pesada del arbol (132 G en el hub, 111,7 GiB exclusivos).

Ademas el fallo a mitad deja directorios creados sin ficheros, que es un
cache-hit envenenado: `mise` se cosecho asi, como nombre vacio. Se anade un
guardian que barre los vacios al terminar la bajada y avisa de re-correr.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LykB7vw38b4Ck1Zij15RQ4
2026-09-01 15:53:35 +00:00
Sergio 95679adb6f estado: cosecha granja 2026-09-01T15:32:55Z — avance del árbol KDE 2026-09-01 15:32:55 +00:00
Sergio 914e841433 estado: cosecha granja 2026-09-01T15:21:46Z — avance del árbol KDE 2026-09-01 15:21:46 +00:00
SergioandClaude Opus 5 f2b289e6a9 harkaq: un portón de compilación para el techo de la denylist (SDD 25 T17)
`jt`/`jf` de la BPF clásica son __u8 y en la forma de poner_seccomp() el salto más largo mide n+3:
pasadas ~252 entradas el desplazamiento da la vuelta y el filtro deja de decir lo que dice el
fichero, sin error y sin aviso. Hoy son 25 y sobra sitio — el riesgo es que agregar syscalls a una
denylist es exactamente lo que uno hace sin pensarlo.

_Static_assert, o sea cero código generado: comprobado en las dos direcciones —baja el techo a 10 y
el compilador para; y la sección .text del binario es byte a byte la misma con y sin el assert—,
que es el requisito de este fichero (nada que re-hashee).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-09-01 15:08:41 +00:00
SergioandClaude Opus 5 46dba58616 tasas: T17/T18 — la jaula cobra por syscall, y el filtro largo no es lo que cobra
SDD 25 tenía medido el sandbox por namespaces (T14, ~1 ms por proceso) pero no el grano fino que
harkaq pone dentro, que cobra por SYSCALL. `bench_jaula.c` lo mide con control negativo en las dos
mitades (si la jaula no quedó puesta, sale con 2).

seccomp: el filtro de harkaq es una denylist lineal, así que toda syscall legítima recorre la
cadena entera — y aun así es PLANO en su longitud (86,9 ns con 4 entradas, 88,3 con 250, sobre un
piso de 75,0). Lo que lo hace plano es el bitmap de acción constante del kernel, y eso no se supone:
un gemelo de la misma longitud con una carga de args[0] —que hace que el analizador se rinda— sí
crece, 111,6 → 139,9 ns. La regla que sale de ahí es que un filtro es gratis mientras no mire un
argumento. El bitmap se paga al instalar (1,5 µs por entrada) y se amortiza en 2 830 syscalls, o
sea una invocación y media de gcc, una sola vez por fase de build.

landlock: el precio es ESTAR enjaulado (+473 ns por open), no cuántas reglas hay — pasar de 1 regla
a las 16 384 de una clausura fichero a fichero agrega +225 ns más. La política por-fichero de D1,
que era la decisión discutible, resulta casi gratis. Y dos negativas medidas: `stat` no paga
(Landlock no engancha getattr) y un open DENEGADO sale más barato que uno concedido, al revés de lo
que se esperaba al medirlo.

En total, la jaula le cuesta a un compilado 0,23–0,31%: una décima parte del presupuesto de <5% de
SDD 16.

De paso, dos cosas del filtro que salieron de mirarlo para medirlo: la denylist tiene un techo de
~252 entradas por el __u8 de los saltos de la BPF clásica, y el jf se calcula leyendo y modificando
`k` en la misma expresión (UB en C11, benigno con gcc y clang, comprobado).

Y §9.6 queda con el experimento de PTI bien planteado: no es «el laptop daría peor» (compara dos
máquinas y mezcla cuatro variables) sino la misma máquina con pti=on y pti=off. momento no sirve ni
forzándolo: este invitado no expone PCID, así que mediría el peor caso y no el de un TigerLake.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-09-01 15:08:33 +00:00
Sergio 3e935a09c2 estado: cosecha granja 2026-09-01T15:01:57Z — avance del árbol KDE 2026-09-01 15:01:57 +00:00
Sergio b088eab4ef estado: cosecha granja 2026-09-01T14:31:55Z — avance del árbol KDE 2026-09-01 14:31:55 +00:00
Sergio bbe2285161 estado: cosecha granja 2026-09-01T14:02:03Z — avance del árbol KDE 2026-09-01 14:02:03 +00:00
Sergio 530e2a3d95 estado: cosecha granja 2026-09-01T13:31:52Z — avance del árbol KDE 2026-09-01 13:31:52 +00:00
Sergio 1d64ffca4c estado: cosecha granja 2026-09-01T13:01:58Z — avance del árbol KDE 2026-09-01 13:01:58 +00:00
Sergio ae88c0ae9c estado: cosecha granja 2026-09-01T12:31:54Z — avance del árbol KDE 2026-09-01 12:31:54 +00:00
Sergio 3479021c30 estado: cosecha granja 2026-09-01T12:02:01Z — avance del árbol KDE 2026-09-01 12:02:01 +00:00
Sergio 22d1710e5d estado: cosecha granja 2026-09-01T11:32:01Z — avance del árbol KDE 2026-09-01 11:32:01 +00:00
Sergio e4124fd0fc estado: cosecha granja 2026-09-01T11:01:55Z — avance del árbol KDE 2026-09-01 11:01:55 +00:00
Sergio 0e6fe9061f estado: cosecha granja 2026-09-01T10:31:51Z — avance del árbol KDE 2026-09-01 10:31:51 +00:00
Sergio 8ff0c23ff8 estado: cosecha granja 2026-09-01T10:01:58Z — avance del árbol KDE 2026-09-01 10:01:58 +00:00
Sergio 13bca0e980 estado: cosecha granja 2026-09-01T09:31:55Z — avance del árbol KDE 2026-09-01 09:31:55 +00:00
Sergio e19592d1fb estado: cosecha granja 2026-09-01T09:01:53Z — avance del árbol KDE 2026-09-01 09:01:53 +00:00
Sergio e05e725841 estado: cosecha granja 2026-09-01T08:31:55Z — avance del árbol KDE 2026-09-01 08:31:55 +00:00
Sergio 18b4fbf1b6 estado: cosecha granja 2026-09-01T08:01:58Z — avance del árbol KDE 2026-09-01 08:01:58 +00:00
Sergio e2d4a17bfc estado: cosecha granja 2026-09-01T07:31:52Z — avance del árbol KDE 2026-09-01 07:31:52 +00:00
Sergio e546790d35 estado: cosecha granja 2026-09-01T07:01:57Z — avance del árbol KDE 2026-09-01 07:01:57 +00:00
Sergio eb91c3a815 estado: cosecha granja 2026-09-01T06:31:54Z — avance del árbol KDE 2026-09-01 06:31:54 +00:00
Sergio 38d199543b estado: cosecha granja 2026-09-01T06:01:52Z — avance del árbol KDE 2026-09-01 06:01:52 +00:00
Sergio 84ffd096f0 estado: cosecha granja 2026-09-01T05:31:57Z — avance del árbol KDE 2026-09-01 05:31:57 +00:00
Sergio 9fbd15c30e estado: cosecha granja 2026-09-01T05:01:52Z — avance del árbol KDE 2026-09-01 05:01:52 +00:00
Sergio 25b753a0a3 estado: cosecha granja 2026-09-01T04:31:51Z — avance del árbol KDE 2026-09-01 04:31:51 +00:00
Sergio 91afe77297 estado: cosecha granja 2026-09-01T04:01:52Z — avance del árbol KDE 2026-09-01 04:01:52 +00:00
Sergio 1881ca5f9f estado: cosecha granja 2026-09-01T03:31:49Z — avance del árbol KDE 2026-09-01 03:31:49 +00:00
Sergio 7bd0631f3b estado: cosecha granja 2026-09-01T03:01:49Z — avance del árbol KDE 2026-09-01 03:01:49 +00:00
Sergio 9221f640a3 estado: cosecha granja 2026-09-01T02:31:50Z — avance del árbol KDE 2026-09-01 02:31:50 +00:00
Sergio dd5fce1584 estado: cosecha granja 2026-09-01T02:02:09Z — avance del árbol KDE 2026-09-01 02:02:09 +00:00
Sergio bb681a066e estado: cosecha granja 2026-09-01T01:31:51Z — avance del árbol KDE 2026-09-01 01:31:51 +00:00
Sergio 5662688e8c estado: cosecha granja 2026-09-01T01:02:06Z — avance del árbol KDE 2026-09-01 01:02:06 +00:00
Sergio ffbc9a9c2a estado: cosecha granja 2026-09-01T00:32:04Z — avance del árbol KDE 2026-09-01 00:32:04 +00:00
Sergio c668184419 estado: cosecha granja 2026-09-01T00:01:58Z — avance del árbol KDE 2026-09-01 00:01:58 +00:00
Sergio e77102504c estado: cosecha granja 2026-08-31T23:31:55Z — avance del árbol KDE 2026-08-31 23:31:55 +00:00
Sergio e94479bf5f estado: cosecha granja 2026-08-31T23:01:49Z — avance del árbol KDE 2026-08-31 23:01:49 +00:00
Sergio 5305e5a1e1 estado: cosecha granja 2026-08-31T22:31:56Z — avance del árbol KDE 2026-08-31 22:31:56 +00:00
Sergio f6fb674803 estado: cosecha granja 2026-08-31T22:01:49Z — avance del árbol KDE 2026-08-31 22:01:49 +00:00
Sergio 84be3c7194 estado: cosecha granja 2026-08-31T21:31:57Z — avance del árbol KDE 2026-08-31 21:31:57 +00:00
Sergio b1f56ea7e3 estado: cosecha granja 2026-08-31T21:01:49Z — avance del árbol KDE 2026-08-31 21:01:49 +00:00
SergioandClaude Opus 5 56e59b821a SDD 25 H7: BTF cuesta +14,97% de bzImage — medido construyendo, no estimado
Era el ultimo hueco medible de SDD 25 en esta maquina: H7 tenia el precio en cuatro partes
pero no el numero en bytes, que es como se pago H1.

Se construyo una copia derivada de linux-generic con UNA sola diferencia en el .config
(DEBUG_INFO_DWARF5 + DEBUG_INFO_BTF) y todo lo demas byte a byte igual:

  bzImage sin BTF : 16 937 984 B
  bzImage con BTF : 19 473 408 B   (+2 535 424 B = +2,42 MiB = +14,97%)
  seccion .BTF    :  7 888 166 B sin comprimir, entran comprimidos 3,11x

Contra la unica vara comparable: H1 (MEMCG+PSI) costo +80 KiB / +0,49% del mismo bzImage
=> BTF cuesta 31 veces eso. No lo decide, pero lo saca de "un re-hasheo y ya".

Sobre linux-generic y no sobre linux, que es mas barato: BTF tiene depends on BPF_SYSCALL y
el .config sellado de linux lo trae APAGADO, asi que medir ahi habria mezclado dos precios.

TRES cosas que salieron construyendo y no leyendo:

1. Una QUINTA parte del precio que nadie habia nombrado: hace falta python3. BTF hace que
   kbuild descienda a tools/bpf/resolve_btfids, que compila un libbpf vendorizado cuyo
   Makefile genera bpf_helper_defs.h con un script de Python (Error 127).

2. El numero de Artix fallaba en la direccion CONTRARIA a la esperable. El doc decia que sus
   6,4 MB "no dicen nada de uno monolitico y pelado"; el nuestro sale MAS GRANDE, 7,5 MiB.
   Artix es modular y su .BTF cubre solo el core built-in; el nuestro es monolitico y los
   tipos de i915+nouveau+radeon+iwlwifi entran todos.

3. Una trampa de kconfig que es CLAUDE.md §3 dentro de make: scripts/pahole-version.sh
   imprime 0 si pahole no esta en el PATH, el depends on PAHOLE_VERSION >= 122 deja de
   cumplirse, y olddefconfig BORRA la linea en silencio. El build sale OK y sella un kernel
   SIN BTF diciendo que todo fue bien. Por eso la receta comprueba el .config PRODUCIDO y
   sale 1 si no esta. Salio OK, lo que ademas paga la parte (3) del precio: el pahole
   estatico de ayer se encuentra y se ejecuta DENTRO del sandbox.

El artefacto de medicion se borro a proposito: `hammer kernel contract --sealed` lo listaba
como SIN COMPROBAR (no declara [[target]], que es lo que exige H8), o sea un aviso permanente
en un fichero que el cron commitea cada 30 min. Un aviso fijo que no corresponde a ningun
problema es como se deja de leer un vigia. La receta derivada queda en la evidencia.

Nada del corpus se re-hasheo: la derivada vive fuera de recipes/ y el catalogo se le presta
por symlinks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-08-31 20:55:26 +00:00
Sergio ad485d5a01 estado: cosecha granja 2026-08-31T20:32:54Z — avance del árbol KDE 2026-08-31 20:32:55 +00:00
SergioandClaude Opus 5 33e02bdfbc poda de fuentes: 70 G recuperados y un vigia para que no vuelvan
El volumen del store estaba al 97% (8,8 G libres) con la granja escribiendo ahi, y el gordo
NO era el store: eran 79 G de `work/sources` — 106 arboles con el `target/` de cargo y los
`.o` dentro, porque el arbol de fuentes es tambien el directorio de compilacion. `pixi` pesaba
3,5 G y siete apps cosmic pasaban de 3 G cada una.

Nadie podaba eso: store-gc mira el store, la poda de CI mira la cache de CI, y este tercer
monton crecia sin dueno desde que el store se mudo al volumen.

Borrarlo no cuesta nada, y eso es lo que lo hace seguro: los dos caminos de fetch.rs
(fetch_git:73 y fetch_tarball:234) hacen `remove_dir_all` del arbol y lo re-extraen en CADA
build, sin una sola rama que reutilice. Un arbol viejo no acelera nada; la re-extraccion ocurre
igual. Lo unico que se pierde es el post-mortem del ultimo build, de ahi el suelo de 24 h.

El script toma `work/.farm-build.lock` porque el unico dano posible es borrar el arbol que un
bwrap esta compilando (ADR 0012 en su forma mas directa), y el mtime del directorio raiz no
distingue "viejo" de "build lento". Con espera acotada: si hay algo en vuelo salta el ciclo.

Suelo en HORAS y no en dias por la leccion de cache-ci-no-envejece: aquel cron podaba a +10
dias sobre datos de horas y liberaba cero. Los 106 arboles abarcaban 3 dias.

Sin umbral por espacio libre: podar solo cerca del borde convierte una poda barata y plana en
un pico justo cuando un build puede quedarse sin disco a mitad.

Probado en las cuatro ramas: dry-run vacio, dry-run con 15 candidatos, --aplicar sobre un arbol
sintetico (borra el viejo, deja los 15 recientes) y lock tomado (salta y sale 0).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
2026-08-31 19:56:42 +00:00
Sergio b739a1fb79 estado: cosecha granja 2026-08-31T19:31:49Z — avance del árbol KDE 2026-08-31 19:31:49 +00:00
Sergio 68cf8b2612 estado: cosecha granja 2026-08-31T19:01:51Z — avance del árbol KDE 2026-08-31 19:01:51 +00:00
Sergio a187ad4c70 estado: cosecha granja 2026-08-31T18:31:57Z — avance del árbol KDE 2026-08-31 18:31:57 +00:00
Sergio 507d8de51c estado: cosecha granja 2026-08-31T18:01:58Z — avance del árbol KDE 2026-08-31 18:01:58 +00:00