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 604Rust 56Shell 36Markdown 281227 Definiciones

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

6cd8a0410b060eba8acbeddc364b60aaa8b201a2 · por Sergio · (hace 1 mes) · padre 0677ba26c · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

3 archivos · +89 −14

diff --git a/docs/25-tasas-del-kernel.md b/docs/25-tasas-del-kernel.md
index 5cb52330..999ce225 100644
--- a/docs/25-tasas-del-kernel.md
+++ b/docs/25-tasas-del-kernel.md
@@ -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.
diff --git a/docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt b/docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt
new file mode 100644
index 00000000..4ba1afb9
--- /dev/null
+++ b/docs/evidencia/tasas-kernel-2026-08-29/contrato-h1-pagado.txt
@@ -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
diff --git a/docs/state/kernel-contract.toml b/docs/state/kernel-contract.toml
index 504916cd..bdfe6f12 100644
--- a/docs/state/kernel-contract.toml
+++ b/docs/state/kernel-contract.toml
@@ -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"