tasas: H1 PAGADO — los cuatro kernels de Cards ya traen MEMCG y PSI

hammer kernel contract --sealed: 5 de 5 vigentes cumplen su perfil, exit 0. Antes eran 2 de 11.
Una Card que pide memory.max ahora encuentra el fichero en vez de dejar un warn! y correr sin
tope.

Lo medido, no lo supuesto:
- el x86_64_defconfig de 7.1 ya NO trae MEMCG=y ⇒ había que pedirlo explícito;
- MEMCG no tiene ningún depends on, así que el olddefconfig no podía tragárselo — comprobado
  igual contra el .config producido, que es la regla del guardián;
- precio: +80 KiB en linux-generic (+0,49%), +84 en linux-metal, +88 en linux-metal-dual,
  +80 en linux-gioser (+0,71%). Medio punto de kernel por contabilidad por unidad y presión.

Evidencia cruda en docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt, con el
diff-back del plan de gioser sobre su config nuevo (35 cumplidos, 0 incumplidos).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih
This commit is contained in:
Sergio
2026-08-30 04:02:10 +00:00
co-authored by Claude Opus 5
parent 0677ba26cd
commit 6cd8a0410b
3 changed files with 89 additions and 14 deletions
+34 -13
View File
@@ -26,10 +26,12 @@ El espejo de este documento para el lado tawasuyu es
`cgroup` v2 agregado, `posix_spawn`, `getdents64`, `close_range`, `openat2`. Cero código
de kernel, ganancias de 3× a 17× medidas abajo.
3. **La medición encontró un bug cruzado que no se buscaba**: los kernels de hammer se
construyen **sin `CONFIG_MEMCG`**, y arje/sandokan escriben `memory.max` ignorando el
error. Un límite de memoria pedido por una Card **no se aplica y nadie se entera**. §4.
Confirmado después sobre los **11 `.config` sellados**, no deducido del defconfig (§4.bis), y
ya vigilado por `hammer kernel contract` (§4.ter): 2 de 11 cumplen su perfil.
construían **sin `CONFIG_MEMCG`**, y arje/sandokan escriben `memory.max` ignorando el
error. Un límite de memoria pedido por una Card **no se aplicaba y nadie se enteraba**. §4.
Confirmado sobre los **11 `.config` sellados**, no deducido del defconfig (§4.bis), vigilado
por `hammer kernel contract` (§4.ter) y **PAGADO el 2026-08-30**: los cuatro kernels que
hospedan Cards se reconstruyeron con `MEMCG` y `PSI` y el barrido sale **5 de 5 vigentes en
verde** (§7-H1).
4. **Sondear `/proc` no es lento, es ciego** (§9.1): de 200 procesos de vida mínima, un sondeo
cada 100 ms vio **cero**; el proc connector, los 200. Y **el «copiar en O(1)» existe pero no en
ext4**: en xfs/btrfs un reflink de 512 MiB tarda 0,020 ms contra 512,7 ms de `read+write`
@@ -339,8 +341,10 @@ Tres decisiones que valen la pena nombrar:
qué, y **cero vigentes con superados a la vista sale ≠0**, no verde — el vacío leído como
presencia (CLAUDE.md §3) es justo el fallo que este guardián vino a arreglar.
Estado medido hoy: **2 de 11 configs sellados cumplen su perfil** (los dos `linux`), los 9 de
perfil `anfitrion-cards` fallan por `MEMCG`. El kernel vivo de esta máquina pasa las 11 exigidas.
Estado al escribirlo: **2 de 11 configs sellados cumplían su perfil** (los dos `linux`), los 9 de
perfil `anfitrion-cards` fallaban por `MEMCG`. **Estado tras pagar H1 (2026-08-30): 5 de 5 vigentes
cumplen**, y los 10 sellados que quedaron atrás salen listados como superados. El kernel vivo de
esta máquina pasa las 11 exigidas.
Lo que **sí** funciona en un kernel hammer: `cpu.weight` (CGROUP_SCHED), `pids.max`
(CGROUP_PIDS), `cpu.stat` (rstat del core) y `cgroup.freeze` — este último porque el freezer
@@ -392,13 +396,25 @@ Su precio, concreto:
## 7. Propuestas — lado hammer
- **H1 · `-e MEMCG -e PSI` en las cuatro recetas de kernel.** Cierra §4 y habilita
`memory.current` (T4) y las señales de presión. **Precio declarado**: re-hashea todos los
artefactos de kernel ⇒ hacerlo en la misma tanda que cualquier otro cambio de kernel, nunca
suelto. **Sigue PENDIENTE a propósito** — pero ya no puede olvidarse: desde §4.ter
`hammer kernel contract --sealed` sale distinto de cero mientras falte. Cuando se pague, el
mismo comando es la prueba de que se pagó. Nota de alcance: en `linux.toml` (perfil
`qemu-serial`) NO corre — su hash es el baseline del selfhost-verify y ahí no hay Cards.
- **H1 · `-e MEMCG -e PSI` en los kernels que hospedan Cards. PAGADO 2026-08-30.** Cierra §4 y
habilita `memory.current` (T4) y las señales de presión. Se hizo en **una sola tanda** —el precio
era el re-hasheo de todos los artefactos de kernel— sobre `linux-generic`, `linux-metal`,
`linux-metal-dual` y la derivada `linux-gioser`, que hubo que **regenerar**: una receta derivada
inlinea la fase `configure` de su base y sin regenerarla se queda con la vieja. En `linux.toml`
(perfil `qemu-serial`) NO corre: su hash es el baseline del selfhost-verify y ahí no hay Cards.
Tres cosas que valen para la próxima:
1. **El `x86_64_defconfig` de 7.1 ya no trae `MEMCG=y`** — de ahí que hiciera falta pedirlo. Y
`MEMCG` no tiene un solo `depends on` (sólo `select`s), así que el `olddefconfig` no se lo
podía tragar; se comprobó igual **contra el `.config` producido**, que es la regla.
2. **Precio en bytes, medido**: bzImage `linux-generic` 16 856 064 → 16 937 984 (**+80 KiB,
+0,49%**), `linux-metal` +84 KiB (+0,57%), `linux-metal-dual` +88 KiB (+0,53%), `linux-gioser`
+80 KiB (+0,71%). Contabilidad por unidad y presión, por medio punto porcentual de kernel.
3. **La prueba de que se pagó es el mismo comando**: `hammer kernel contract --sealed` sale 0 y
dice `5 de 5 config(s) VIGENTES cumplen su perfil`. La salida cruda quedó en
`docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt`, junto con el `diff-back` del
plan de gioser sobre el config nuevo (35 cumplidos, 0 incumplidos).
- **H2 · `MODULES=n` se queda.** Si algún día hace falta código de kernel, es built-in y
parcheado en la receta. Queda escrito para no rediscutirlo.
- **H3 · `harkaq` usa `openat2 RESOLVE_BENEATH|RESOLVE_NO_SYMLINKS`** donde hoy valida rutas
@@ -565,3 +581,8 @@ Se compilan igual que los otros (`bench_sqpoll` pide `-luring`) y los tres prime
**Contrato de capacidades**: `docs/state/kernel-contract.toml` (el dato) y
`hammer kernel contract --list` (la vista). Los ficheros de esta carpeta no cambian; el contrato sí
—cada vez que un consumidor nuevo usa el kernel por nombre.
**El pago de H1** (2026-08-30): `contrato-h1-pagado.txt` — el barrido entero con los cuatro kernels
reconstruidos (5 de 5 vigentes en verde, 10 superados listados) y el `diff-back` del plan de gioser
contra su `.config` nuevo. Es la única salida de esta carpeta que sí cambia si se vuelve a correr:
las demás son mediciones de un momento, ésta es un veredicto de hoy.
@@ -0,0 +1,50 @@
contrato docs/state/kernel-contract.toml
✓ linux · ./store/d2a03c29930b72c3d13a8b2931c25bbe80af289689db7fbcd029e11a9cc786cc-linux/boot/config-6.16.12
perfil qemu-serial (9 capacidad(es) miradas)
kernel Linux/x86_64 6.16.12 Kernel Configuration
· falta (no bloquea) limite-memoria — Tope de memoria por unidad [MEMCG]
✓ las 5 capacidades exigidas están
✓ linux-generic · ./store/23f1cc43ac85e0b26763ca3444258ace8d93008c6c3ec442051c4dd9a662a189-linux-generic/boot/config-7.1.2-generic
perfil anfitrion-cards (13 capacidad(es) miradas)
kernel Linux/x86_64 7.1.2 Kernel Configuration
✓ las 11 capacidades exigidas están
✓ linux-gioser · ./store/b026fe145235181614b6797b697e9ae26f680b6d04596c55e9afee155d68baa0-linux-gioser/boot/config-6.16.12-metal
perfil anfitrion-cards (13 capacidad(es) miradas)
kernel Linux/x86_64 6.16.12 Kernel Configuration
✓ las 11 capacidades exigidas están
✓ linux-metal · ./store/2ed8f54aa64e1a1db8c5a6291568e21a0f8cb9757d0d17cfe9810b369a48ab08-linux-metal/boot/config-6.16.12-metal
perfil anfitrion-cards (13 capacidad(es) miradas)
kernel Linux/x86_64 6.16.12 Kernel Configuration
✓ las 11 capacidades exigidas están
✓ linux-metal-dual · ./store/714f46d63736414b2e08816e5a08249e175d5b9eac4fe653af50fc6ab4c2eee1-linux-metal-dual/boot/config-7.1.2-metal-dual
perfil anfitrion-cards (13 capacidad(es) miradas)
kernel Linux/x86_64 7.1.2 Kernel Configuration
✓ las 11 capacidades exigidas están
· 10 sellado(s) SUPERADO(s) por la receta de hoy — no bloquean, 9 con faltas:
linux · ./store/fda2ec4a245fd97df56b0db5c66856fe9de51970af5690b02f995a6dacd2cc40-linux/boot/config-6.16.12 cumplía
linux-generic · ./store/16ac6e5e299f9200585b0c28f3b76a59e16eaaf91fb154edd6ae07a5b1821734-linux-generic/boot/config-7.1.2-generic le falta: limite-memoria
linux-generic · ./store/1c8625f7d2fe6fc574533b1f44dfd1f5fd2716fe164d8bf015a87d376e63e631-linux-generic/boot/config-7.1.2-generic le falta: limite-memoria
linux-generic · ./store/9a79714519324f72c60c367969c5d0a24b1ce7dfd602ccc179b97c5b294269b2-linux-generic/boot/config-7.1.2-generic le falta: limite-memoria
linux-gioser · ./store/8ffd57109a2f7102c1bbbbc91cf0e729047312eee1a4e3fdb8b178680cc94264-linux-gioser/boot/config-6.16.12-metal le falta: limite-memoria
linux-metal · ./store/5cb11c344347caf0f136af249e3ad8141264a0d8756a7bc3392854eea6dc23cd-linux-metal/boot/config-6.16.12-metal le falta: limite-memoria
linux-metal · ./store/bc995714b06984ae7d053af9d8263287a024afbe979565482dacbe192a5899c3-linux-metal/boot/config-6.16.12-metal le falta: limite-memoria
linux-metal · ./store/e057bf40b11cd766e4ec834e96c794ded7702cc7fc8ee4112abfc8ae5dcf4487-linux-metal/boot/config-6.16.12-metal le falta: limite-memoria
linux-metal-dual · ./store/e6e8fec7f22ab1784a7c2881350a36cb5a8c7b6f8ed99061d5bc5a7f45f8a4ae-linux-metal-dual/boot/config-7.1.2-metal-dual le falta: limite-memoria
linux-metal-dual · ./store/ef4f220225e8490fbbaa2f0736252fa7619da7ed79dd601ba9b17f9cc619c423-linux-metal-dual/boot/config-7.1.2-metal-dual le falta: limite-memoria
Siguen siendo ciertos: si una máquina arranca uno de éstos, sus Cards corren con lo que ese kernel traiga. Se reconstruyen o se podan (`scripts/store-gc.sh`).
resumen 5 de 5 config(s) VIGENTES cumplen su perfil · 10 superado(s)
--- diff-back del plan de gioser sobre el config sellado nuevo ---
plan linux-gioser (docs/state/kernel-plans/gioser-plan.json)
config ./store/b026fe145235181614b6797b697e9ae26f680b6d04596c55e9afee155d68baa0-linux-gioser/boot/config-6.16.12-metal
cumplidos 35
apagados por dependencia 4 (no aparecen porque cayeron con su raíz)
INCUMPLIDOS 0
+5 -1
View File
@@ -38,7 +38,11 @@ Sin MEMCG los ficheros NO EXISTEN. `apply_rlimits_to_cgroup` sólo emite `warn!(
failed)` y sigue: la Card corre sin tope y el resto del sistema se entera cuando el OOM killer \
elige a otro. Es el fallo de CLAUDE.md §3 — un ausente falla ruidosamente, un vacío llega hasta \
el final diciendo que todo fue bien."""
notes = "Arreglo: `-e MEMCG` en la fase configure. Re-hashea el kernel (SDD 22 §1) ⇒ va en tanda."
notes = """
PAGADO 2026-08-30 (SDD 25 §7-H1): `-e MEMCG` en la fase configure de linux-generic, linux-metal, \
linux-metal-dual y la derivada linux-gioser, en una sola tanda porque re-hashea el kernel \
(SDD 22 §1). Costó +80/84/88/80 KiB de bzImage. `linux.toml` queda fuera a propósito: perfil \
qemu-serial, sin Cards, y su hash es el baseline del selfhost-verify."""
[[capability]]
id = "peso-cpu"