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`.
This commit is contained in:
Sergio
2026-09-12 10:51:10 +00:00
parent 432a0e2561
commit 29831e6296
2 changed files with 12 additions and 3 deletions
+6 -2
View File
@@ -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
+6 -1
View File
@@ -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":