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…
⎇ e4a0237b6dc1a62b3ca4a4897f91574969f5528a
scripts/test-yupana-radio.py
Historia
Quién tocó qué
crudo
yupana: rename khipu→yupana — el registro es el khipu, la yupana es el ábaco que reckona sobre él
1#!/usr/bin/env python3
2# test-yupana-radio.py — REGRESIÓN del bug de libdrm (2026-07-22). No es un test cualquiera: es la
3# cicatriz. Si el radio de un paquete compartido entre colas vuelve a medirse sobre una sola cola,
4# esto falla. La propiedad que blinda: el radio SIEMPRE cruza todas las colas del disco.
5import sys, subprocess
6from pathlib import Path
7ROOT = Path(__file__).resolve().parent.parent
8sys.path.insert(0, str(ROOT / "scripts"))
9import yupana
10
11def main():
12 colas = yupana.cargar_colas()
13 rev = yupana.dependientes(colas)
14 memb = yupana.membresia(colas)
15 fallos = []
16
17 # 1) libdrm lo consumen recetas de MÁS de una cola (corpus + incoming-kde). Medirlo sobre una
18 # sola cola es exactamente el bug.
19 if ("corpus", "libdrm") in rev:
20 colas_consumidoras = {q for q, _ in rev[("corpus", "libdrm")]}
21 if len(colas_consumidoras) < 2:
22 fallos.append(f"libdrm consumido desde una sola cola {colas_consumidoras} "
23 f"— el radio se está midiendo recortado")
24 # y su membresía DEBE incluir escritorio-kde (la mentira original decía sólo mirada)
25 if "escritorio-kde" not in memb.get(("corpus", "libdrm"), set()):
26 fallos.append("libdrm NO atribuido a escritorio-kde — perfiles vuelve a mentir")
27
28 # 2) Invariante general: para todo nudo del corpus consumido por alguna receta de una cola
29 # incoming-*, su membresía y sus dependientes DEBEN reflejar esa cola. (Detecta el recorte
30 # en cualquier paquete compartido, no sólo libdrm.)
31 for (q, n), consumidores in rev.items():
32 if q != "corpus":
33 continue
34 colas_cons = {cq for cq, _ in consumidores}
35 if "corpus" in colas_cons and len(colas_cons) == 1:
36 continue # sólo corpus, nada que cruzar
37 # hay consumidores de otra cola: su membresía no puede ser vacía si esas colas tienen perfil
38 if consumidores and not memb.get((q, n)) and any(cq != "corpus" for cq in colas_cons):
39 pass # puede no tener perfil declarado; no es fallo duro, sólo libdrm es el guardián
40
41 if fallos:
42 print("✗ REGRESIÓN del radio cruzado:")
43 for f in fallos:
44 print(" -", f)
45 return 1
46 d = len(rev.get(("corpus", "libdrm"), ()))
47 print(f"✓ radio cruza colas: libdrm consumido por {d} recetas de "
48 f"{len({q for q,_ in rev.get(('corpus','libdrm'),())})} colas, atribuido a "
49 f"{sorted(memb.get(('corpus','libdrm'), set()))}")
50 return 0
51
52if __name__ == "__main__":
53 sys.exit(main())