atuq: la serie con UNA sola tarjeta — 2 de 10, y el hueco resulta real
Con -vga none la captura ya no tiene punto ciego, asi que un ✗ significa «la ventana no esta». Clasificado el ultimo cuadro de las 10: 2 con la pagina pintada, 1 con la ventana en blanco y 7 con SOLO el escritorio. Las dos salidas explicaban los ✗ inflados de las series VGA=1, no el fenomeno. El MOZ_LOG separa los dos regimenes: las que tienen ventana escriben 952-1505 lineas hasta el apagado; las 7 sin ventana se cortan a los ~40s y quedan 6 minutos de silencio, sin crash (WebRender arranca). Quedan como hipotesis NO medida los frame callbacks que el compositor no manda. Ademas: tasa-primera-pintura.sh nombra el log por VGA (la serie nueva habia sobrescrito los crudos de la anterior).
Semantic delta
No definition changed: this change is text, documentation or data.
3 files · +230 −5
diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md
index 9eab1405..b143bec3 100644
--- a/docs/26-atuq-envoltorio-gecko.md
+++ b/docs/26-atuq-envoltorio-gecko.md
@@ -1855,7 +1855,67 @@ cada corrida, y `scripts/vigia-imagen.py` **no cuenta las ciegas** — las nombr
**Lo que sigue**, y ahora es otra pregunta: no «por qué no pinta» sino **por qué el escritorio abre la
ventana en la salida que no tiene el foco** —y si con una sola salida (`-vga none`, que es como se va
-a usar la imagen de verdad) eso desaparece—. Es barato: la misma serie con una tarjeta.
+a usar la imagen de verdad) eso desaparece—. Es barato: la misma serie con una tarjeta. **Hecha: §6.10.nonies — y el hueco es real, 2 de 10.**
+
+#### 6.10.nonies Con UNA sola salida: **2 de 10** — y el hueco resulta ser real (2026-09-14)
+
+El §6.10.octies cerró pidiendo exactamente esta serie: las mismas diez corridas pero con `-vga none`,
+una sola tarjeta (`drm: card0`), que es como se usa la imagen de verdad. Con una sola salida la
+captura es COMPLETA, así que por primera vez **un ✗ significa «la ventana no está»** y no «no está en
+la que fotografié».
+
+| vídeo | pintaron | qué dice el ✗ |
+|---|---|---|
+| `vga+virtio-gpu` (dos DRM) | 4 de 14 | nada: la cámara miraba una de dos pantallas |
+| **`virtio-gpu` solo (`-vga none`)** | **2 de 10** | **concluyente** |
+
+Y como la captura ya no tiene punto ciego, se puede clasificar **el último cuadro de cada corrida** por
+su color dominante, que separa dos fallos que hasta ahora eran el mismo ✗:
+
+| último cuadro | corridas | qué es |
+|---|---|---|
+| `#ff00ff` 68 % | 2 | ✓ la página, pintada |
+| `#f9f9fb` 68 % | 1 | la **ventana está** —misma geometría que la que pinta— pero **en blanco** |
+| `#214a87` 91 % | 7 | **sólo el escritorio**: fondo, panel y dock. **No hay ventana** |
+
+⇒ **el hueco del §6.10.ter existe y no era la cámara.** Las dos salidas explicaban el número inflado
+de ✗ de las series con `VGA=1`, no el fenómeno.
+
+**Y el `MOZ_LOG` separa los dos regímenes con un número, no con una impresión:**
+
+| | líneas de `moz.moz_log` | último apunte del log |
+|---|---|---|
+| las 3 con ventana | 952 – 1505 | sigue escribiendo hasta que se apaga la VM |
+| las 7 sin ventana | 573 – 727 | **se corta a los ~40 s del lanzamiento**, y quedan **6 minutos de silencio** |
+
+No es que dibuje invisible: **deja de trabajar**. Y no muere por un crash — `atuq.log` de una fallida
+llega hasta `WebRender - OpenGL version new 3.2` / `Renderer: Software WebRender` sin una sola línea
+de error. Las últimas líneas que escribe son justo el bucle de vsync emulado:
+
+ WaylandSurface::VSyncCallbackHandler() marked as visible & has buffer
+ WaylandSurface::SetVSyncCallbackLocked(), enabled 1 mapped 1
+ WaylandSurface::Commit() allowed [1] needs commit 1
+ fire VSync callback aEmulated [0] cb.mEmulated [1] ← y aquí se acaba
+
+Que es la forma que tiene Gecko de decir «commiteo a ciegas porque **nadie me devuelve frame
+callbacks**». La hipótesis que queda —**no medida todavía**, y hay que decirlo así— es que
+`cosmic-comp` nunca le da a esa superficie el estado de visible, así que el cliente se queda sin
+callbacks y se detiene. Lo contesta el log del compositor, no el del navegador.
+
+⚠ **Condición de la medida:** anfitrión a **load ~15** (la tanda de KDE del otro agente más VMs de
+otra sesión, en 4 cores) — más alta que el ~10 de la serie anterior. Las dos que pintaron lo hicieron
+a **+175 s** y **+319 s**, en línea con los +184…+312 de antes. Y hay un orden sospechoso que la serie
+no puede resolver sola: las 3 con ventana son las corridas 1-3 y las 7 sin ventana las 4-10, todas
+seguidas. Eso puede ser la carga subiendo o puede ser estado que dejan las corridas entre sí; **con
+diez corridas no se separa**.
+
+⚠ **Dos deudas del arnés que esta serie dejó a la vista**, ninguna barrida:
+· la cuenta de «procesos atuq» **nunca volvió**: el eco del serial se come la salida, así que no se
+ puede afirmar si el proceso seguía vivo en las fallidas (el `atuq.log` sin crash es evidencia
+ indirecta, no la misma cosa);
+· `tasa-primera-pintura.sh` quedó parametrizado por `VGA` pero **el nombre del log no**: la serie
+ nueva sobrescribió los crudos de la anterior (se salvaron 9 de 10 en `work/serie-dos-tarjetas/`).
+ Arreglado después de la serie — no durante: bash lee el guion a medida que lo ejecuta.
### 6.11 Y ahora la pregunta que faltaba: ¿REPRODUCE? (2026-09-07)
diff --git a/docs/state/primera-pintura.json b/docs/state/primera-pintura.json
index c761244c..e0a658f6 100644
--- a/docs/state/primera-pintura.json
+++ b/docs/state/primera-pintura.json
@@ -256,6 +256,166 @@
"pantallas_fotografiadas": 2,
"pantalla": "vga0",
"nota": "la ventana apareció en vga0 mientras gpu0 seguía mostrando el escritorio sin navegador"
+ },
+ {
+ "medido": "2026-09-14T19:14:09Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T19:23:09Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": 175,
+ "pantalla": "gpu0",
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T19:34:16Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": 319,
+ "pantalla": "gpu0",
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T19:47:56Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T20:02:02Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T20:15:20Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T20:28:09Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T20:41:17Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T20:53:55Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
+ },
+ {
+ "medido": "2026-09-14T21:06:15Z",
+ "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+ "segundos_primera_pintura": null,
+ "pantalla": null,
+ "pantallas_fotografiadas": 1,
+ "presupuesto_s": 420,
+ "ventana_s": 480,
+ "cadencia_s": 30,
+ "lanzamiento": "perfil del usuario",
+ "video": "virtio-gpu solo (-vga none)",
+ "mem_mb": 2560,
+ "vcpus": 2,
+ "acel": "tcg",
+ "guion": "scripts/cosmic/atuq-en-imagen.py"
}
]
}
diff --git a/scripts/cosmic/tasa-primera-pintura.sh b/scripts/cosmic/tasa-primera-pintura.sh
index 36f50720..6b69da2b 100755
--- a/scripts/cosmic/tasa-primera-pintura.sh
+++ b/scripts/cosmic/tasa-primera-pintura.sh
@@ -2,6 +2,7 @@
# tasa-primera-pintura.sh — corre N veces `atuq-en-imagen.py` y saca la TASA, no una anécdota.
#
# scripts/cosmic/tasa-primera-pintura.sh [N] (def 10)
+# VGA=0 scripts/cosmic/tasa-primera-pintura.sh 10 una sola salida (así se usa la imagen de verdad)
#
# ── POR QUÉ UNA TASA ───────────────────────────────────────────────────────────────────────────
# El §6.10.sexies del SDD 26 midió cinco corridas sobre la MISMA imagen: pintó en tres (+197, +197,
@@ -18,13 +19,17 @@ set -u
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
N="${1:-10}"
WAIT="${WAIT:-480}"; CADENCE="${CADENCE:-30}"
+# ⚠ Con `VGA=1` hay DOS salidas y la ventana cae en cualquiera (§6.10.octies): la serie de diez del
+# 2026-09-14 midió con eso puesto y su «2 de 10» era dónde apuntaba la cámara. Con `VGA=0` hay una
+# sola salida y la captura es completa ⇒ el ✗ sí significa «no está».
+VGA="${VGA:-1}"
ok=0; fallo=0; aborto=0; i=1
-echo "== $N corridas · --as-user · VGA=1 · ventana ${WAIT}s · cadencia ${CADENCE}s"
+echo "== $N corridas · --as-user · VGA=$VGA · ventana ${WAIT}s · cadencia ${CADENCE}s"
while [ "$i" -le "$N" ]; do
- log="work/tasa-$i.txt"
- VGA=1 MEM="${MEM:-2560}" SMP="${SMP:-2}" timeout 2400 \
+ log="work/tasa-vga$VGA-$i.txt"
+ VGA="$VGA" MEM="${MEM:-2560}" SMP="${SMP:-2}" timeout 2400 \
python3 scripts/cosmic/atuq-en-imagen.py --as-user --until-paint \
- --wait "$WAIT" --cadence "$CADENCE" --out "work/tasa-corrida-$i" > "$log" 2>&1
+ --wait "$WAIT" --cadence "$CADENCE" --out "work/tasa-corrida-vga$VGA-$i" > "$log" 2>&1
if grep -qa "PRIMERA PINTURA" "$log"; then
t=$(grep -a "primera pintura:" "$log" | head -1)
ok=$((ok+1)); echo " [$i/$N] ✓ ${t#*✓ }"