> 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…
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.
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);
}
}