diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md index 5b565795..cc62f26e 100644 --- a/docs/26-atuq-envoltorio-gecko.md +++ b/docs/26-atuq-envoltorio-gecko.md @@ -2629,9 +2629,9 @@ el `BuildID` sea el que `SOURCE_DATE_EPOCH` obliga. **La regla que sale de todo el día:** cuando la duda es «¿llegó al artefacto?», la respuesta no está en el log del build ni en la receta — está **dentro del artefacto**, y hay que ir a buscarla ahí. -### 2.septies Los dieciocho guardianes, en una corrida — y el sello que se había quedado atrás (2026-09-15) +### 2.septies Los diecinueve guardianes, en una corrida — y el sello que se había quedado atrás (2026-09-15) -Cada afirmación de este documento tiene quién la mida, y son **dieciocho guardianes**. Hasta hoy +Cada afirmación de este documento tiene quién la mida, y son **diecinueve guardianes**. Hasta hoy ninguno corría solo: se corrían de a uno, el día que alguien tocaba esa parte. Ya se sabe cómo termina eso —el de descargas estuvo ROJO dos días y nadie lo corrió (`29831e62`)—, así que la corrida entera es ahora **un comando**: `scripts/test-atuq-suite.sh`. @@ -2649,18 +2649,31 @@ control: contra un store vacío sale por ahí y devuelve 1. El re-sello costó **3,7 s** —`atuq` es derivado y el `firefox` vigente estaba en el store— y el ciclo que manda es el de siempre: **editar todo → resellar UNA vez → medir**. -**El cuadro, sobre `b3:e556024b` (gioser, en serie, 29 min):** +**El cuadro, sobre `b3:e556024b` (gioser, en serie, 32,2 min):** | | | |---|---| -| **16 en verde** | política, rootfs, inicio, chrome, nativo, foco, instalación, ruteo, archivo, descargas, medios, torrent, `sct`, códecs, IA y archivo semántico | +| **17 en verde** | política, rootfs, inicio, chrome, nativo, foco, instalación, ruteo, archivo, descargas, medios, torrent, `sct`, códecs, IA, archivo semántico y notificaciones | | **2 en ROJO** | `vigia-atuq-verbos` y `test-atuq-boveda-coherente`, **los dos por la misma causa**: los tres verbos de la bóveda (§7.quinquies) | +Los caros son `sct` (242 s), el archivo semántico (238 s), la instalación (180 s, tres sesiones), la +IA (182 s, levanta `llama-server`) y las notificaciones (180 s, sway headless). Los cuatro primeros +salen en **5 s** y no tocan el navegador: para «¿rompí el cruce política↔XPI?» alcanza `--only`. + O sea: **el commit de la bóveda no rompió nada más**. Los quince guardianes que no tienen nada que ver con ella siguen verdes sobre el artefacto que la trae adentro, y eso es lo que hacía falta saber antes de seguir — porque la unidad 12 tocó `atuq.cfg`, la política y el empaquetado de extensiones, que es exactamente donde un cambio se lleva puesto algo de al lado sin decirlo. +⚠ **El decimonoveno entró porque estaba nombrado como hueco, y eso envejece mal.** La primera +versión dejaba afuera al de notificaciones (`scripts/wlr/dunst-headless.sh --via-atuq`: una página +llama `new Notification(...)`, `libxul` hace `dlopen("libnotify.so.4")` —invisible para cualquier +auditor de ELF—, el bus activa `dunst` y dunst DIBUJA) con la excusa de que vive en el arnés de sway, +y lo escribía en la cabecera «para que su ausencia no se lea como cobertura». Dura tres días: al +cuarto, la lista es la cobertura y el párrafo no lo lee nadie. Se corrió aparte, salió verde en 180 s, +y entró. La lista pasó a llevar el COMANDO de cada guardián y no su nombre de fichero, que es lo que +lo tenía afuera. + ⚠ **Y el control del runner se corrigió solo en la primera corrida.** La cabecera anunciaba «17 en verde y UN rojo» —predicción escrita antes de correr— y el cuadro dijo dos: el guardián de coherencia de la bóveda lleva el mismo chequeo del cable adentro, que es justamente lo que el §7.quinquies le diff --git a/scripts/test-atuq-suite.sh b/scripts/test-atuq-suite.sh index d60f10b3..045e29f7 100755 --- a/scripts/test-atuq-suite.sh +++ b/scripts/test-atuq-suite.sh @@ -2,7 +2,7 @@ # test-atuq-suite.sh — corre TODOS los guardianes de `atuq`, en orden de coste, y da un cuadro. # # ══ POR QUÉ EXISTE ════════════════════════════════════════════════════════════════════════════ -# Los guardianes de atuq son dieciocho y ninguno corre solo. Ya pasó lo que tenía que pasar: el de +# Los guardianes de atuq son diecinueve y ninguno corre solo. Ya pasó lo que tenía que pasar: el de # descargas estuvo ROJO dos días y nadie lo corrió (commit `29831e62`), y el 2026-09-15 el artefacto # vigente estuvo SIN SELLAR desde el commit de la bóveda hasta que alguien miró — durante esas horas # ningún guardián podía medir nada y el repo se veía igual de sano. Un guardián que nadie corre es @@ -15,7 +15,7 @@ # Si falta el sello, esto NO corre nada: dice cómo construirlo y sale. # # ══ EL CONTROL DE ESTA CORRIDA ════════════════════════════════════════════════════════════════ -# Hoy (2026-09-15) el resultado CORRECTO es **16 en verde y DOS en rojo**: `vigia-atuq-verbos` y +# Hoy (2026-09-15) el resultado CORRECTO es **17 en verde y DOS en rojo**: `vigia-atuq-verbos` y # `test-atuq-boveda-coherente`, los dos por la MISMA causa —la receta de `puriy-costura` pinea un # host anterior a los verbos de la bóveda, abierto y medido en el SDD 26 §7.quinquies—. **Si esto # sale todo verde, lo roto es esto**: un cuadro entero en verde puede ser un producto sano o un @@ -27,21 +27,22 @@ # tres, cambió algo que hay que ir a ver. # # ══ LO QUE CUESTA ═════════════════════════════════════════════════════════════════════════════ -# **~29 min** en gioser, en serie (medido 2026-09-15). Los cuatro primeros salen en 10 s y no tocan +# **~32 min** en gioser, en serie (medido 2026-09-15). Los cuatro primeros salen en 10 s y no tocan # el navegador: para «¿rompí algo del cruce política↔XPI?» alcanza con `--only` y no hace falta la # media hora. Los caros son `sct` (241 s, seis cargas), `archivo-semantico` (227 s, embeddings), # `instalacion` (180 s, tres sesiones) y `ia` (180 s, levanta `llama-server`). # # ══ QUÉ NO ESTÁ ACÁ ═══════════════════════════════════════════════════════════════════════════ -# `scripts/wlr/dunst-headless.sh --via-atuq` (una página web notifica y se DIBUJA): vive en el arnés -# de sway y se corre desde ahí. Se nombra para que su ausencia no se lea como cobertura. +# Nada, hoy. El de notificaciones (`scripts/wlr/dunst-headless.sh --via-atuq`) vive en el arnés de +# sway y por eso se había quedado afuera; entra igual, porque una lista con un hueco nombrado en la +# cabecera se lee como cobertura al tercer día. Si mañana alguien saca uno, que lo nombre acá. # # NO CONSTRUYE NADA y NO TOMA EL LOCK de la granja: sólo lee artefactos ya sellados, así que se puede # correr con la granja a pleno. Va en SERIE a propósito — cada guardián levanta un navegador y esta # máquina tiene cuatro núcleos sin swap; dos a la vez es un OOM. Y cada uno escribe en SU fichero: # dos corridas sobre el mismo log se MEZCLAN y el resultado parece un pase. # -# scripts/test-atuq-suite.sh # los dieciocho, en orden de coste +# scripts/test-atuq-suite.sh # los diecinueve, en orden de coste # scripts/test-atuq-suite.sh --list # qué afirma cada uno, sin correr nada # scripts/test-atuq-suite.sh --only sct # sólo los que contengan «sct» en el nombre # scripts/test-atuq-suite.sh --store DIR --logs DIR @@ -63,33 +64,36 @@ while [ $# -gt 0 ]; do esac done -# nombre|orden de coste implícito|qué AFIRMA. El orden es de barato a caro: lo que se rompe gratis +# etiqueta|comando|qué AFIRMA. El orden es de barato a caro: lo que se rompe gratis # se descubre en el primer minuto y no después de media hora de navegadores. GUARDIANES=( - "vigia-atuq-verbos.py|el host PINEADO atiende los verbos que mandan las diez extensiones (§7)" - "test-atuq-boveda-coherente.py|la bóveda está enchufada en los CINCO lugares (SDD-BOVEDA §8)" - "test-atuq-politica.py|el cruce XPI empaquetado ↔ política, con cinco roturas a propósito" - "test-atuq-rootfs.py|el rootfs resuelve todos los NEEDED y nada se cae al LAB" - "test-atuq-inicio.py|la página de inicio y la pestaña nueva son las NUESTRAS (§4.e)" - "test-atuq-chrome.py|el JS de atuq.cfg llega al gBrowser, y la vista dividida (§4.g)" - "test-atuq-nativo.py|una extensión habla con un proceso NATIVO y le vuelve la respuesta (§7)" - "test-atuq-foco.py|el navegador MUESTRA el foco del sistema y no lo apaga (§6.5)" - "test-atuq-instalacion.py|quién instala de verdad las extensiones: el ESCANEO, no la política" - "test-atuq-ruteo.py|el contenedor sale por SU proxy — saludo SOCKS5 (§6.8)" - "test-atuq-archivo.py|congelar lo leído al CAS y buscarlo; nunca lo privado (§6.3)" - "test-atuq-descargas.py|la descarga entra al CAS con su BLAKE3 y el fichero no se toca (§6.2)" - "test-atuq-medios.py|el medio lo abre mpv, no una pestaña (§6.6)" - "test-atuq-torrent.py|magnet → daemon propio que sobrevive al navegador (§6.9)" - "test-atuq-sct.py|la cadena de sct entera: seis cargas y un servidor HTTP real (§6.1)" - "test-atuq-codecs.sh|H.264+AAC · VP9+Opus · AV1 · MP3 · FLAC REPRODUCEN (§4.f)" - "test-atuq-ia.py|la barra lateral le pregunta a un modelo de ESTA máquina (§6.7)" - "test-atuq-archivo-semantico.py|el archivo contesta por PARECIDO, no por palabra exacta (§6.3)" + "vigia-atuq-verbos|python3 scripts/vigia-atuq-verbos.py|el host PINEADO atiende los verbos que mandan las diez extensiones (§7)" + "test-atuq-boveda-coherente|python3 scripts/test-atuq-boveda-coherente.py|la bóveda está enchufada en los CINCO lugares (SDD-BOVEDA §8)" + "test-atuq-politica|python3 scripts/test-atuq-politica.py|el cruce XPI empaquetado ↔ política, con cinco roturas a propósito" + "test-atuq-rootfs|python3 scripts/test-atuq-rootfs.py|el rootfs resuelve todos los NEEDED y nada se cae al LAB" + "test-atuq-inicio|python3 scripts/test-atuq-inicio.py|la página de inicio y la pestaña nueva son las NUESTRAS (§4.e)" + "test-atuq-chrome|python3 scripts/test-atuq-chrome.py|el JS de atuq.cfg llega al gBrowser, y la vista dividida (§4.g)" + "test-atuq-nativo|python3 scripts/test-atuq-nativo.py|una extensión habla con un proceso NATIVO y le vuelve la respuesta (§7)" + "test-atuq-foco|python3 scripts/test-atuq-foco.py|el navegador MUESTRA el foco del sistema y no lo apaga (§6.5)" + "test-atuq-instalacion|python3 scripts/test-atuq-instalacion.py|quién instala de verdad las extensiones: el ESCANEO, no la política" + "test-atuq-ruteo|python3 scripts/test-atuq-ruteo.py|el contenedor sale por SU proxy — saludo SOCKS5 (§6.8)" + "test-atuq-archivo|python3 scripts/test-atuq-archivo.py|congelar lo leído al CAS y buscarlo; nunca lo privado (§6.3)" + "test-atuq-descargas|python3 scripts/test-atuq-descargas.py|la descarga entra al CAS con su BLAKE3 y el fichero no se toca (§6.2)" + "test-atuq-medios|python3 scripts/test-atuq-medios.py|el medio lo abre mpv, no una pestaña (§6.6)" + "test-atuq-torrent|python3 scripts/test-atuq-torrent.py|magnet → daemon propio que sobrevive al navegador (§6.9)" + "test-atuq-sct|python3 scripts/test-atuq-sct.py|la cadena de sct entera: seis cargas y un servidor HTTP real (§6.1)" + "test-atuq-codecs|bash scripts/test-atuq-codecs.sh|H.264+AAC · VP9+Opus · AV1 · MP3 · FLAC REPRODUCEN (§4.f)" + "test-atuq-ia|python3 scripts/test-atuq-ia.py|la barra lateral le pregunta a un modelo de ESTA máquina (§6.7)" + "test-atuq-archivo-semantico|python3 scripts/test-atuq-archivo-semantico.py|el archivo contesta por PARECIDO, no por palabra exacta (§6.3)" + "dunst-via-atuq|sh scripts/wlr/dunst-headless.sh --via-atuq|una PÁGINA WEB notifica y la notificación se DIBUJA (§6.10)" ) if [ "$LISTAR" = 1 ]; then printf '── los guardianes de atuq, de barato a caro ──\n' - for g in "${GUARDIANES[@]}"; do printf ' %-32s %s\n' "${g%%|*}" "${g#*|}"; done - printf '\n no está acá: scripts/wlr/dunst-headless.sh --via-atuq (vive en el arnés de sway)\n' + for g in "${GUARDIANES[@]}"; do + IFS='|' read -r etq cmd afirma <<<"$g" + printf ' %-30s %s\n %s\n' "$etq" "$afirma" "$cmd" + done exit 0 fi @@ -111,15 +115,14 @@ mkdir -p "$LOGS" verdes=0; rojos=0; saltados=0 RESUMEN=() for g in "${GUARDIANES[@]}"; do - nombre="${g%%|*}"; afirma="${g#*|}" + IFS='|' read -r nombre cmd afirma <<<"$g" case "$nombre" in *"$SOLO"*) : ;; *) continue ;; esac - log="$LOGS/${nombre%.*}.txt" - printf ' %-32s ' "$nombre" + log="$LOGS/$nombre.txt" + printf ' %-30s ' "$nombre" t0=$(date +%s) - case "$nombre" in - *.sh) bash "scripts/$nombre" >"$log" 2>&1 ;; - *) python3 "scripts/$nombre" >"$log" 2>&1 ;; - esac + # Cada guardián a SU fichero: dos corridas sobre el mismo log se MEZCLAN y el resultado parece un + # pase — ya pasó (se leyó «✓ SALIDA=0» de la corrida vieja con las cargas de la nueva). + $cmd >"$log" 2>&1 rc=$? t=$(( $(date +%s) - t0 )) # 77 es «no están las condiciones» (falta un rootfs, falta un modelo), no un fallo del producto.