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 815Rust 56Shell 37Markdown 291229 Definiciones

kernel: el contrato admite capacidades de INTERFAZ — el test llevaba rojo desde el 03-09

`cargo test` del workspace fallaba en `el_contrato_del_repo_cierra_sobre_si_mismo`:
«proceso-por-descriptor no declara símbolos». No es un descuido del alta: `abda7d3` dio de alta pidfd
con `symbols = []` y dedicó ocho líneas a explicar por qué va vacío — pidfd no depende de ningún
`CONFIG_*`, es interfaz del core desde Linux 5.3. Lo que no se actualizó fue el invariante, así que
el dato quedó bien y el test quedó rojo. Dos días sin que nadie lo viera, que es lo que pasa cuando
una suite falla por algo que «ya se sabe»: deja de mirarse entera.

El invariante correcto no es «toda capacidad tiene símbolos» sino **«toda capacidad afirma algo
comprobable»**: sin símbolos vale, pero entonces hay que nombrar la INTERFAZ. Sin una ni la otra, la
capacidad no dice nada que se pueda verificar y lo más probable es que sea un campo a medias — que
es el caso que el assert original quería atrapar y sigue atrapando.

Hoy hay exactamente una capacidad así y declara `interface = ["pidfd_open(2)", "pidfd_send_signal(2)"]`.

Workspace: 541 tests en verde, 0 fallos.

d13af44ddb6bfc1554ea3bfee80ac130de44de4b · por Sergio · (hace 1 mes) · padre 59a0e56a1 · ver el árbol en este commit

Delta semántico · 1

crates/hammer-core/src/kernel/contract.rs

1 archivos · +11 −1

diff --git a/crates/hammer-core/src/kernel/contract.rs b/crates/hammer-core/src/kernel/contract.rs
index 2fdb3e4d..47350024 100644
--- a/crates/hammer-core/src/kernel/contract.rs
+++ b/crates/hammer-core/src/kernel/contract.rs
@@ -413,7 +413,17 @@ profile = "anfitrion"
             );
         }
         for cap in &c.capabilities {
-            assert!(!cap.symbols.is_empty(), "{} no declara símbolos", cap.id);
+            // Una capacidad SIN símbolos es legítima sólo si es de INTERFAZ: algo que el kernel da
+            // siempre a partir de cierta versión y que ningún `CONFIG_*` enciende ni apaga (pidfd
+            // desde 5.3). Entra al contrato igual, porque el contrato es la lista de lo que se USA
+            // —no la de lo que puede faltar— y es la línea que lo dice si mañana baja el mínimo de
+            // kernel. Pero entonces TIENE que nombrar la interfaz: sin símbolos ni interfaz, la
+            // capacidad no afirma nada comprobable y lo más probable es que sea un campo a medias.
+            assert!(
+                !cap.symbols.is_empty() || !cap.interface.is_empty(),
+                "{} no declara símbolos NI interfaz: no afirma nada comprobable",
+                cap.id
+            );
             assert!(!cap.consumer.trim().is_empty(), "{} no declara consumidor", cap.id);
         }
     }