From 29831e6296a6816874c32705e9d6231bcaf085f8 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 12 Sep 2026 10:51:10 +0000 Subject: [PATCH] =?UTF-8?q?descargas:=20el=20guardi=C3=A1n=20estaba=20ROJO?= =?UTF-8?q?=20hace=20dos=20d=C3=ADas=20y=20nadie=20lo=20corr=C3=ADa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 `/descargas-cas` y el host lo escribe en `/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`. --- recipes/atuq/README.md | 8 ++++++-- scripts/test-atuq-descargas.py | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) 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 `/descargas-cas`. El precio, dicho: + `GcCas` se la llevaría, en silencio.** Por eso van a `/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":