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.
This commit is contained in:
Sergio
2026-09-05 18:17:26 +00:00
parent 59a0e56a16
commit d13af44ddb
+11 -1
View File
@@ -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);
}
}