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 Definitions

⎇ c202d4c1d0935c9abfb91ea79c02462ede13252a scripts/test-yupana-radio.py Python · 95 lines · 5.6 KB History Who touched what raw

yupana: modelo EXTRA-GRAFO — `preflight` aprende los patrones de hueco de entorno 8c10c0a90 · sergio ·

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    # 3) INVARIANTE (c): el detector debe AGRUPAR por fuente (sha), no por nombre — la identidad de un
42    #    nudo es lo que BAJA. Ancla: itstool y gettext-tiny comparten sha (itstool le presta el tarball
43    #    como carrier). Si el detector deja de ver ese grupo, está agrupando por nombre = invariante ciego.
44    recs_f = yupana._recetas_con_fuente()
45    por_sha = {}
46    for k, r in recs_f.items():
47        if r["sha"]:
48            por_sha.setdefault(r["sha"], set()).add(k)
49    sha_it = recs_f.get(("corpus", "itstool"), {}).get("sha")
50    if not sha_it or ("corpus", "gettext-tiny") not in por_sha.get(sha_it, set()):
51        fallos.append("el detector no agrupa itstool con gettext-tiny por sha — "
52                      "¿agrupa por nombre en vez de por fuente? (invariante c ciego)")
53
54    # 3b) NO crIar lobos: itstool NO es un bug — es un CARRIER (stub que presta el tarball, no
55    #     construye la fuente). Si el detector lo llama construye_fuente=True, lo reportaría como
56    #     colisión falsa (casi se "arregla" un stub apuntándolo al itstool real que no compila en el lab).
57    if recs_f.get(("corpus", "itstool"), {}).get("construye_fuente"):
58        fallos.append("itstool marcado como que CONSTRUYE su fuente — es un carrier/stub, "
59                      "el detector lo reportaría como colisión falsa")
60    # 3c) dbus: corpus (estático) vs incoming-kde (dinámico, para Qt6DBus) — misma fuente, BUILD
61    #     distinto ⇒ variante deliberada, NO sombra redundante. Casi se borra load-bearing (2026-07-22).
62    if ("corpus", "dbus") in recs_f and ("incoming-kde", "dbus") in recs_f:
63        if recs_f[("corpus", "dbus")]["build_fp"] == recs_f[("incoming-kde", "dbus")]["build_fp"]:
64            fallos.append("corpus/dbus e incoming-kde/dbus tienen build_fp IGUAL — el detector "
65                          "los marcaría redundantes y son variantes estático/dinámico deliberadas")
66
67    # 4) MODELO EXTRA-GRAFO: el patrón de overlay debe seguir marcando kio (la cicatriz) y su
68    #    estimación seguir calibrada contra el fallo real (5315B). Si el estimador se descalibra
69    #    (p.ej. alguien cambia el prefijo del hub por el del sandbox), el pre-flight miente.
70    if ("incoming-kde", "kio") in {(q, n) for q in colas for n in colas[q]}:
71        deps_kio = colas["incoming-kde"]["kio"]
72        est = yupana._lowerdir_estimado(deps_kio)
73        if yupana.patron_overlay("kio", deps_kio) is None:
74            fallos.append("el patrón de overlay NO marca a kio — el pre-flight dejó de ver el hueco")
75        elif abs(est - 5315) > 600:  # el fallo real midió 5315B; margen por variación de nombres
76            fallos.append(f"el estimador de lowerdir se descalibró: kio={est}B vs real 5315B "
77                          f"(¿prefijo equivocado? el del hub da corto)")
78
79    if fallos:
80        print("✗ REGRESIÓN de yupana:")
81        for f in fallos:
82            print("  -", f)
83        return 1
84    d = len(rev.get(("corpus", "libdrm"), ()))
85    print(f"✓ radio cruza colas: libdrm consumido por {d} recetas de "
86          f"{len({q for q,_ in rev.get(('corpus','libdrm'),())})} colas, atribuido a "
87          f"{sorted(memb.get(('corpus','libdrm'), set()))}")
88    print(f"✓ detector agrupa por fuente (itstool↔gettext-tiny) y no cría lobos "
89          f"(itstool=carrier, dbus=variante)")
90    print(f"✓ modelo extra-grafo: preflight marca kio (lowerdir ~{yupana._lowerdir_estimado(colas['incoming-kde']['kio'])}B "
91          f"vs real 5315B, calibrado)")
92    return 0
93
94if __name__ == "__main__":
95    sys.exit(main())