gioser

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 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

latido: el contrato del kernel se comprueba solo en cada cosecha

El gate de SDD 25 §4.ter existía y NADIE lo corría. Un kernel reconstruido sin MEMCG volvería
a pasar inadvertido — y ese fallo no se ve del lado del desarrollo, porque el kernel de la
máquina de trabajo sí trae MEMCG: sólo se ve comprobando el artefacto.

Mismo cable que el vigía de fuentes y por la misma razón que está escrita ahí arriba: lo que
nadie refresca envejece hacia el optimismo. Ahora cada ciclo deja el veredicto en
docs/state/kernel-contract.txt y el git log lo muestra como el resto del khipu.

El fichero se escribe por temporal y sólo se mueve si tiene contenido: contract sale != 0
cuando el contrato no se cumple —y ese rojo es justo lo que hay que guardar—, pero un fichero
vacío se leería como «nada que objetar».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih

19b5d51dfeb350138d3c847cc3f35993f3bf22c5 · ruwaq Sergio · (1 killa ñawpaq) · tayta 3ab74532a · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

2 qillqakuna · +60 −1

diff --git a/docs/state/kernel-contract.txt b/docs/state/kernel-contract.txt
new file mode 100644
index 00000000..11a522e2
--- /dev/null
+++ b/docs/state/kernel-contract.txt
@@ -0,0 +1,43 @@
+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 --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh
index 179cc3fb..5f75fbe7 100755
--- a/scripts/farm/cosecha-cron.sh
+++ b/scripts/farm/cosecha-cron.sh
@@ -186,6 +186,22 @@ if [ -x "$HAMMER" ]; then
   # No descarga: pide cabeceras. Primera corrida (2026-08-26): 8 muertas de 1167, y TRES de ellas
   # —busybox, freetype, freetype-shared— selladas y en uso.
   scripts/fuentes/fuentes-vigia.sh >/dev/null 2>&1 && echo "   fuentes-vigia.json ✓" || echo "   ⚠ fuentes-vigia falló"
+  # CONTRATO DE CAPACIDADES DEL KERNEL (SDD 25 §4.ter). Mismo cable que el vigía de fuentes y por la
+  # misma razón: el gate existía y NADIE lo corría. Un kernel reconstruido sin `MEMCG` volvería a
+  # pasar inadvertido, y ese fallo **no se ve del lado del desarrollo** —el kernel de esta máquina sí
+  # lo trae—, sólo comprobando el artefacto. Acá el veredicto queda en docs/state/ y el `git log` lo
+  # muestra solo, como el resto del khipu.
+  # Se escribe por temporal y sólo se mueve si tiene contenido: `contract` sale != 0 cuando el
+  # contrato NO se cumple —y ese rojo es justo lo que hay que guardar—, pero un fichero VACÍO se
+  # leería como «nada que objetar», que es el fallo de CLAUDE.md §3.
+  "$HAMMER" --store ./store kernel contract --sealed > work/.kernel-contract.tmp 2>&1
+  if [ -s work/.kernel-contract.tmp ]; then
+    mv work/.kernel-contract.tmp docs/state/kernel-contract.txt
+    echo "   kernel-contract.txt ✓ $(grep -m1 '^resumen' docs/state/kernel-contract.txt || echo '(sin resumen)')"
+  else
+    rm -f work/.kernel-contract.tmp
+    echo "   ⚠ kernel contract no produjo salida — NO piso el veredicto anterior"
+  fi
 else
   echo "   ⚠ sin binario hammer en $HAMMER — no regenero estado"
 fi
@@ -193,7 +209,7 @@ fi
 # 4. Commitear SÓLO el estado firme (el avance que el humano sigue). Recetas nuevas que YO autoré se
 # commitean aparte, a mano, para no meter autoría a medias en un commit de cron.
 if [ "${NO_COMMIT:-}" != "1" ]; then
-  git add docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json 2>/dev/null || true
+  git add docs/state/build-state.json docs/state/build-state-kde.json docs/state/build-state-gnome.json docs/state/build-state-cosmic.json docs/state/build-state-wlr.json docs/state/drenaje.json docs/state/fuentes-vigia.json docs/state/kernel-contract.txt 2>/dev/null || true
   if ! git diff --cached --quiet 2>/dev/null; then
     git commit -q -m "estado: cosecha granja $(ts) — avance del árbol KDE" 2>/dev/null \
       && { git push -q origin main 2>/dev/null && echo "==> estado commiteado+pusheado" \