> 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…
descargas: el guardián estaba ROJO hace dos días y nadie lo corría
La barrida de regresión del frente (14 guardianes tras rehacer host y navegador) encontró uno en
rojo: `test-atuq-descargas.py` buscaba el CAS en `<estado>/descargas-cas` y el host lo escribe en
`<estado>/cas` desde el commit del archivo personal (357791a85, 2026-09-10) — el §6.3 UNIFICÓ los dos
CAS, que es justo lo que hace que una página archivada y un fichero bajado con el mismo contenido
sean un solo objeto. Lo renombré yo y no actualicé este guardián.
Lo que importa no es el renombre: es que el guardián estuvo rojo dos días sin que nadie se enterara,
porque **un guardián que no se ejecuta no protege de nada** — la misma familia que el cache-hit que
congela regresiones. Los otros 13 pasan.
Arreglado el path, y el README dice ahora por qué el directorio se llama `cas` y no `descargas-cas`.
diff --git a/recipes/atuq/README.md b/recipes/atuq/README.md
index e0281861..e2e0ca8b 100644
--- a/recipes/atuq/README.md
+++ b/recipes/atuq/README.md
@@ -179,11 +179,15 @@ No es un almacén nuevo: es `arje-cas`, el mismo formato y el mismo hash que usa
⚠ **Tres cosas que hay que saber, y las tres están medidas:**
-1. **La raíz del CAS de descargas NO es la del sistema.** `arje_cas::gc` borra todo blob que no esté
+1. **La raíz del CAS del navegador NO es la del sistema.** `arje_cas::gc` borra todo blob que no esté
en el set `reachable` de su llamador, y el único que existe hoy (`arje-brain`, `GcCas`) lo arma con
la cadena de audit y las raíces vivas del grafo. Una descarga no está en ninguno: **el primer
- `GcCas` se la llevaría, en silencio.** Por eso van a `<estado>/descargas-cas`. El precio, dicho:
+ `GcCas` se la llevaría, en silencio.** Por eso van a `<estado>/cas`. El precio, dicho:
`tejido` sirve el CAS por defecto, así que compartir una descarga hoy exige apuntarlo a esa raíz.
+ ⚠ Se llamaba `descargas-cas` hasta que entró el §6.3: ahora el archivo personal y las descargas
+ comparten **un** CAS, que es lo que hace que una página archivada y un fichero bajado con el mismo
+ contenido sean **un solo objeto**. El guardián de descargas se quedó mirando el nombre viejo y
+ estuvo rojo dos días sin que nadie lo corriera.
2. **El fichero que bajaste no se toca.** Se copia al CAS y se deja donde estaba. El guardián lo
comprueba byte a byte.
3. **La extensión observa, no intercepta.** Se entera cuando la descarga terminó. Meterse en el medio
diff --git a/scripts/test-atuq-descargas.py b/scripts/test-atuq-descargas.py
index edab148f..609a4997 100755
--- a/scripts/test-atuq-descargas.py
+++ b/scripts/test-atuq-descargas.py
@@ -247,7 +247,12 @@ def main():
return None
uno, dos = ingerido(bajadas[0]), ingerido(bajadas[1])
- cas = os.path.join(salida, "hogar", ".local", "state", "puriy-costura", "descargas-cas")
+ # ⚠ El directorio es `cas` y no `descargas-cas` desde que el §6.3 entró: el archivo personal
+ # y las descargas comparten UN CAS, que es justo lo que hace que una página archivada y un
+ # fichero bajado con el mismo contenido sean un solo objeto. Este guardián se quedó mirando
+ # el nombre viejo y estuvo ROJO dos días sin que nadie lo corriera — la prueba de que un
+ # guardián que no se ejecuta no protege de nada.
+ cas = os.path.join(salida, "hogar", ".local", "state", "puriy-costura", "cas")
indice = os.path.join(salida, "hogar", ".local", "state", "puriy-costura", "descargas.json")
if uno["dedup"] != "false" or uno["veces"] != "1":