gioser

sergio/takana

> 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…

TOML 188Rust 55Shell 30Markdown 281211 Sutichaykuna

atuq: el 117x70 era un DIÁLOGO — el navegador nunca abría, y el perfil venía envenenado

Cuatro secciones discutiendo por qué la ventana de atuq salía de 117x70, y no era la ventana de atuq.
Lo dice el mismo volcado de protocolo que ya se había leído, dos líneas más abajo de donde paró la
lectura:

    558  -> xdg_toplevel#58.set_title("Open atuq in Troubleshoot Mode?")

Es safeMode.xhtml, el diálogo de Modo de resolución de problemas. La cadena, cada eslabón con su
fuente y ninguno deducido:

1. el perfil del usuario traía `toolkit.startup.recent_crashes = 16` (prefs.js del 15-Sep 00:36,
   ANTES de las corridas del día; leído con debugfs sobre la partición, sin montar y sin root);
2. el umbral de NUESTRO build es 3 (browser/omni.ja -> defaults/preferences/firefox.js:831);
3. BrowserGlue.sys.mjs:389 abre el diálogo MODAL en `_beforeUIStartup()`, que por su propio
   comentario corre «before the first window is opened»: no hay navegador detrás esperando;
4. el `set_max_size(348, 16332)` sale del Fluent del diálogo (`max-width: 400px`);
5. y el proceso se va solo con `ATUQ-EXIT=0` porque el único camino de ese diálogo que termina el
   programa es `onCancel()` -> `quit(eForceQuit)`. Quién lo cancela no está medido.

El control, en los dos sentidos, mismo artefacto y mismo perfil: con el contador limpio pinta a
+123 s (704.458 px); fijado en 16, nada en 300 s y vuelve el diálogo. Y una honestidad que cambia la
fuerza del argumento: en la corrida limpia el `--crashes 0` fue un NO-OP —Gecko ya lo había
borrado—, así que la que prueba la causa es la que lo pone de vuelta y rompe de vuelta.

Cae también la sospecha del §6.10.duodecies: con `WidgetScreen:5`, Gecko ve la pantalla completa
(1280x800 de workarea) CINCO SEGUNDOS antes de crear la ventana. No había carrera con wl_output.

Y lo más caro: la serie de primera-pintura.json está contaminada por el propio andamiaje. El arnés
mata la VM con el navegador vivo, cada arranque sin terminar es una caída para Gecko y pasados 3 el
sujeto medido deja de ser el navegador. «3 de 13» y «2 de 10» midieron un perfil que se degradaba
corrida a corrida. Lo que cada corrida sume exactamente NO está medido y así queda escrito.

Queda una decisión de producto que no se mete de paso porque re-sella el artefacto: si atuq debe
traer `toolkit.startup.max_resumed_crashes = -1`.

b3ec21375e6051665b6c356a5caa6157a6b774e6 · ruwaq Sergio · (1 killa ñawpaq) · tayta 2f90d8eb4 · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

2 qillqakuna · +314 −88

diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md
index 393be936..6589e7b2 100644
--- a/docs/26-atuq-envoltorio-gecko.md
+++ b/docs/26-atuq-envoltorio-gecko.md
@@ -2031,6 +2031,173 @@ que cuando dimensiona no tiene la geometría de la salida: el primer `configure`
 la MISMA lista los eventos `wl_output` contra el `set_window_geometry`; con dos greps separados no se
 puede, porque no se pueden intercalar.
 
+⚠ **Esa sospecha se midió al día siguiente y es FALSA —y además la pregunta estaba mal hecha: esa
+ventana no era la del navegador (§6.10.terdecies).** Queda escrita porque el orden importa: era una
+hipótesis razonable, y lo que la desmintió fue preguntarle al `ScreenManager` en vez de seguir
+deduciendo del protocolo.
+
+#### 6.10.terdecies **La ventana de 117×70 es un DIÁLOGO: el navegador nunca abrió** (2026-09-15)
+
+Las últimas cuatro secciones discutieron por qué la ventana de `atuq` sale de 117×70. La respuesta es
+que **no era la ventana de `atuq`**, y lo dice el mismo volcado de protocolo que ya se había leído
+—dos líneas más abajo de donde paró la lectura—:
+
+    556  -> xdg_surface#57.get_toplevel(new id xdg_toplevel#58)
+    558  -> xdg_toplevel#58.set_title("Open atuq in Troubleshoot Mode?")
+    559  -> xdg_toplevel#58.set_app_id("atuq")
+    629  -> xdg_toplevel#58.set_min_size(117, 37)
+    630  -> xdg_toplevel#58.set_max_size(348, 16332)
+    631  -> xdg_surface#57.set_window_geometry(26, 23, 117, 70)
+
+Es `chrome://browser/content/safeMode.xhtml`: el **diálogo de Modo de resolución de problemas**. Con
+eso la pregunta cambia de «¿por qué la ventana sale chica?» a «¿por qué `atuq` arranca en modo de
+resolución de problemas?», que tiene respuesta y tiene arreglo.
+
+**La cadena entera, y dónde se lee cada eslabón.** Nada de esto es deducción:
+
+1. el perfil del usuario traía el contador de caídas alto — `prefs.js` con fecha 15-Sep 00:36, o sea
+   **antes** de cualquier corrida de ese día:
+
+       user_pref("toolkit.startup.recent_crashes", 16);
+
+2. el umbral, en **nuestro** build: `browser/omni.ja → defaults/preferences/firefox.js:831` dice
+   `pref("toolkit.startup.max_resumed_crashes", 3)` ⇒ 16 > 3 ⇒ `automaticSafeModeNecessary`;
+3. quién abre el diálogo: `modules/BrowserGlue.sys.mjs:389`, en `_beforeUIStartup()`, cuyo propio
+   comentario dice *«runs on startup, before the first command line handler is invoked (i.e. before
+   the first window is opened)»*:
+
+       if (Services.appinfo.inSafeMode) {
+         Services.ww.openWindow(null, "chrome://browser/content/safeMode.xhtml", "_blank",
+                                "chrome,centerscreen,modal,resizable=no", null);
+       }
+
+   **modal y antes de la primera ventana** ⇒ no hay un navegador detrás esperando: no hay navegador;
+4. hasta el `set_max_size(348, 16332)` sale de ahí: el título del diálogo se traduce con Fluent y la
+   traducción trae el tamaño — `localization/en-US/browser/safeMode.ftl`,
+   `troubleshoot-mode-window .style = max-width: 400px`;
+5. y por qué el proceso se MUERE solo (el «`[1]+ Done`» que imprimió el shell del serial): el único camino de
+   ese diálogo que termina el programa es `onCancel()` de `safeMode.js`, que llama
+   `appStartup.quit(appStartup.eForceQuit)`. El log trae `ATUQ-EXIT=0`: se va solo, sin caerse. Quién
+   cancela el diálogo —Escape, el compositor, el cierre de la ventana— **no está medido**.
+
+**Cómo se leyó el perfil sin arrancar la imagen**, que es la única forma honesta de mirar el estado
+*previo* —arrancarla lo cambia—: el disco es un raw con tabla de particiones y `debugfs` lee la
+partición sin montarla y sin root:
+
+    debugfs -R "dump /root/.config/mozilla/firefox/<id>.default-default/prefs.js /tmp/prefs.js" \
+      "/mnt/cosecha/takana-cosmic-qemu.img?offset=$((264192*512))"
+
+##### La sospecha del §6.10.duodecies era falsa: Gecko SÍ ve la pantalla, 1280×800
+
+Se midió agregándole `WidgetScreen:5` al `MOZ_LOG` —el módulo que registra qué monitores arma el
+`ScreenManager`; que el módulo EXISTE en el `libxul` sellado se comprobó con `grep` antes de confiar
+en la variable, porque un módulo que no está se ve igual que un módulo que no tiene nada que decir—.
+La respuesta llega con hora:
+
+    17:12:29.031  D/WidgetScreen  New monitor 0 size [0,0 -> 1280 x 800] depth 24 scale 1.0 … refresh 75
+    17:12:29.031  D/WidgetScreen    workarea [0, 0] -> [1280 x 800]
+    17:12:31.377  D/WidgetScreen  (otra vez, ya en el proceso Parent)
+    17:12:34.843  D/Widget        nsWindow::Create() Initial resize to 1 x 1     ← nace de 1×1
+    17:12:35.290  D/WidgetScreen  GetScreenForWindow() [0] screen (x=0, y=0, w=1280, h=800)
+
+⇒ la pantalla está completa y a tiempo, **cinco segundos antes** de que la ventana se cree, y la
+propia ventana la resuelve bien cuando pregunta. La carrera con `wl_output` queda **refutada** y el
+`configure_bounds(0, 0)` del principio es ruido del protocolo, no información que a Gecko le falte.
+Que el 117×70 resultara ser un diálogo con `max-width` no le quita valor: era la hipótesis viva y
+hacía falta matarla con un instrumento.
+
+##### El control, en los DOS sentidos — y es el contador
+
+Dos corridas seguidas sobre la misma imagen, el mismo artefacto y el **mismo perfil**, cambiando una
+sola cosa: `toolkit.startup.recent_crashes`, fijado en el `user.js` del perfil (que gana sobre
+`prefs.js` en cada arranque). El mando es `atuq-en-imagen.py --crashes N`:
+
+| corrida | contador | qué pasó |
+|---|---|---|
+| **A** 17:31 | ausente (0) | ✓ **primera pintura +123 s**, 704 458 px de la página magenta |
+| **B** 17:44 | fijado en **16** | ✗ nada en 300 s · `set_title("Open atuq in Troubleshoot Mode?")` · `ATUQ-EXIT=0` |
+
+⚠ **Y una honestidad que cambia la fuerza del argumento:** en la corrida A el `--crashes 0` fue un
+**no-op** —el contador ya no estaba en `prefs.js`, porque Gecko lo BORRA después de mostrar el
+diálogo—, así que A sola no prueba nada: prueba tanto «lo arregló el 0» como «el perfil ya estaba
+limpio». **La que prueba la causa es B**, que lo pone de vuelta y rompe de vuelta. Una sola dirección
+habría sido una correlación con suerte.
+
+##### ⚠⚠ La serie de `primera-pintura.json` está CONTAMINADA, y por el propio andamiaje
+
+El arnés mata la VM con el navegador vivo. Un arranque que no llega a terminar es, para Gecko, una
+caída de arranque; pasados 3 el sujeto de la medición **deja de ser el navegador y pasa a ser el
+diálogo**. Con 16 acumulados, todo lo medido desde el 14-Sep cae bajo sospecha: las tasas «3 de 13»
+del §6.10.septies y «2 de 10» del §6.10.nonies no midieron intermitencia del producto sino **un
+perfil que se degradaba corrida a corrida**. El instrumento degradaba al sujeto.
+
+(**Lo que todavía NO está medido**, y se dice para que no se lea como medido: que cada corrida
+matada sume exactamente uno. La medición que lo cerraría es una corrida sin `--crashes`, matada a
+mitad, y leer el contador del arranque siguiente con `debugfs`.)
+
+Qué se hizo con eso, en vez de borrar el fichero:
+
+- **el contador viaja con cada medición**: `recent_crashes_antes`, `recent_crashes_despues` y
+  `recent_crashes_fijado` son campos de cada corrida de `docs/state/primera-pintura.json`. Antes y
+  después porque Gecko lo limpia al mostrar el diálogo: sin el «después», la corrida siguiente parece
+  arreglarse sola y la anterior parece intermitente;
+- **el vigía las APARTA y lo dice**: `scripts/vigia-imagen.py` saca de la tasa las corridas con el
+  contador > 3 y, para las 21 anteriores al campo, informa que **no se pueden clasificar** en vez de
+  contarlas como buenas. Un denominador que se marca, no que se borra.
+
+##### Tres arreglos de instrumento que salieron de la misma corrida
+
+- **el código de salida se escribe**: el lanzamiento va en un subshell que agrega `ATUQ-EXIT=$?` al
+  log. En la corrida de las 17:12 el navegador terminó a los ~25 s y el arnés siguió 420 s
+  fotografiando un escritorio sin navegador para concluir «no pintó en 420 s» — cierto y sin ningún
+  significado. «Se cayó» y «se fue solo» se ven igual en una captura y son frentes distintos;
+- **se lee el log ENTERO**, no `tail -25`: con `WAYLAND_DEBUG=1` esas 25 líneas son protocolo, y los
+  errores de JS del chrome nunca se habían leído. Ahora hay `head` y un `grep` de
+  `JavaScript error|Uncaught|NS_ERROR|###!!!`; y como el disco de la VM es persistente, el log del
+  arranque anterior se copia a `/var/log/cosmic-anterior/` antes de pisarlo;
+- **el perfil se BUSCA y se imprime**: el `find` miraba sólo `/root` a 4 niveles y el perfil está a
+  cinco (`/root/.config/mozilla/firefox/<id>.default-default`), así que la sonda salía muda con un
+  aviso de una línea. Ahora va `find / -xdev -maxdepth 7` e imprime `$HOME`: si el perfil no está
+  donde se supone, lo que hace falta es saber dónde está.
+
+Y la lista ordenada del protocolo tenía su propio agujero: **se ahogaba en los ~60 modos que anuncia
+QEMU** (`wl_output.mode(0, …)`), así que el `head -70` cortaba antes del `set_window_geometry` —la
+lista que existía para ordenar dos cosas se quedaba sin una de las dos—. Ahora excluye los modos no
+actuales y trae `set_title`/`set_app_id`, que es lo que identificó la ventana.
+
+##### ⚠ Dos agentes, una imagen — y lo que nos salvó fue el lock de QEMU
+
+Mientras se medía esto, **dos sesiones distintas** corrieron `atuq-en-imagen.py` sobre el mismo
+`takana-cosmic-qemu.img`. La segunda murió en el arranque:
+
+    qemu-system-x86_64: -drive file=…/takana-cosmic-qemu.img,format=raw,if=virtio:
+      Failed to get "write" lock. Is another process using the image?
+
+Dos VMs escribiendo el mismo raw es corrupción silenciosa del sistema de ficheros del guest, y la
+imagen **no** se abre con `snapshot=on` a propósito (las corridas se acumulan: de ahí salen los logs
+del arranque anterior). Que el candado exista es de QEMU, no nuestro — el mismo patrón del ADR 0012
+con el árbol de fuentes, pero con la mitigación ya puesta. Dos consecuencias:
+
+- **la imagen es de a uno, y quien la usa lo dice**;
+- el arnés ahora **mira si QEMU murió** en el primer segundo y muestra `qemu.log`. Sin eso, el fallo
+  se veía como diez minutos esperando una marca del serial que no iba a llegar nunca: el socket queda
+  creado, el `connect()` funciona y no falla nada.
+
+##### Lo que queda, y una decisión de producto
+
+1. **decidir si `atuq` debe traer el modo automático apagado.** `toolkit.startup.max_resumed_crashes
+   = -1` lo desactiva. A favor: en una distro que se entrega, un diálogo modal en inglés sin
+   navegador detrás es un arranque roto para el usuario, y el diálogo aparece por caídas que pueden
+   no ser suyas. En contra: es una red de seguridad de upstream, y apagarla esconde caídas de
+   arranque reales. **Es una decisión, no un arreglo que se mete de paso** — toca `recipes/atuq/` y
+   por lo tanto re-sella el artefacto (~340 M de store y todas las sondas a repetir);
+2. **rehacer la serie de la tasa con perfil sano**: hoy hay UNA corrida limpia (+123 s) y el resto
+   está marcado. «Cuánto tarda en pintar» vuelve a estar sin medir, y ahora se puede medir bien;
+3. **y la pregunta vieja sigue abierta con otra forma**: cuando el navegador abre ventana de verdad,
+   ¿respeta el `sizemode=maximized` de 1332×852 que el `xulstore.json` de ese perfil recuerda? Para
+   eso está `--xulstore ANCHOxALTO`, que corre una segunda fase en el MISMO arranque (mismo
+   compositor, misma carga) en vez de comparar dos arranques distintos.
+
 ### 6.11 Y ahora la pregunta que faltaba: ¿REPRODUCE? (2026-09-07)
 
 El §6.10 preguntó «¿qué NO puede hacer?» y contestó leyendo cadenas. Media pregunta. La otra mitad
diff --git a/docs/state/primera-pintura.json b/docs/state/primera-pintura.json
index e0a658f6..7f53c290 100644
--- a/docs/state/primera-pintura.json
+++ b/docs/state/primera-pintura.json
@@ -1,93 +1,5 @@
 {
   "corridas": [
-    {
-      "medido": "2026-09-14T14:28:00Z",
-      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
-      "segundos_primera_pintura": 197,
-      "presupuesto_s": 420,
-      "ventana_s": 180,
-      "cadencia_s": 63,
-      "lanzamiento": "perfil nuevo en tmpfs",
-      "video": "virtio-gpu solo (-vga none)",
-      "mem_mb": 2560,
-      "vcpus": 2,
-      "acel": "tcg",
-      "guion": "scripts/cosmic/atuq-en-imagen.py",
-      "capturas": "work/atuq-imagen-1tarjeta",
-      "nota": "reconstruida de las capturas guardadas",
-      "pantallas_fotografiadas": 1,
-      "pantalla": "desconocida (una sola captura)"
-    },
-    {
-      "medido": "2026-09-14T14:36:00Z",
-      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
-      "segundos_primera_pintura": 197,
-      "presupuesto_s": 420,
-      "ventana_s": 240,
-      "cadencia_s": 66,
-      "lanzamiento": "perfil nuevo en tmpfs",
-      "video": "vga+virtio-gpu (dos DRM)",
-      "mem_mb": 2560,
-      "vcpus": 2,
-      "acel": "tcg",
-      "guion": "scripts/cosmic/atuq-en-imagen.py",
-      "capturas": "work/atuq-imagen-2tarjetas",
-      "nota": "reconstruida de las capturas guardadas",
-      "pantallas_fotografiadas": 1,
-      "pantalla": "desconocida (una sola captura)"
-    },
-    {
-      "medido": "2026-09-14T14:47:00Z",
-      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
-      "segundos_primera_pintura": null,
-      "presupuesto_s": 420,
-      "ventana_s": 291,
-      "cadencia_s": 71,
-      "lanzamiento": "perfil del usuario",
-      "video": "vga+virtio-gpu (dos DRM)",
-      "mem_mb": 2560,
-      "vcpus": 2,
-      "acel": "tcg",
-      "guion": "scripts/cosmic/atuq-en-imagen.py",
-      "capturas": "work/atuq-imagen-comousuario",
-      "nota": "reconstruida; el MOZ_LOG commiteaba buffers a +330 s, DESPUÉS de la última captura",
-      "pantallas_fotografiadas": 1
-    },
-    {
-      "medido": "2026-09-14T15:10:00Z",
-      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
-      "segundos_primera_pintura": 204,
-      "presupuesto_s": 420,
-      "ventana_s": 900,
-      "cadencia_s": 66,
-      "lanzamiento": "perfil del usuario",
-      "video": "vga+virtio-gpu (dos DRM)",
-      "mem_mb": 2560,
-      "vcpus": 2,
-      "acel": "tcg",
-      "guion": "scripts/cosmic/atuq-en-imagen.py",
-      "capturas": "work/atuq-imagen-usuario-largo",
-      "nota": "reconstruida de las capturas guardadas",
-      "pantallas_fotografiadas": 1,
-      "pantalla": "desconocida (una sola captura)"
-    },
-    {
-      "medido": "2026-09-14T15:58:44Z",
-      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
-      "segundos_primera_pintura": null,
-      "presupuesto_s": 420,
-      "ventana_s": 900,
-      "cadencia_s": 30,
-      "lanzamiento": "perfil del usuario",
-      "video": "vga+virtio-gpu (dos DRM)",
-      "mem_mb": 2560,
-      "vcpus": 2,
-      "acel": "tcg",
-      "guion": "scripts/cosmic/atuq-en-imagen.py",
-      "capturas": "work/atuq-imagen-medicion",
-      "nota": "NO pintó en 900 s y el MOZ_LOG commiteaba WaylandBufferSHM desde ≤ +377 s: «mapped 1» NO prueba que se vea",
-      "pantallas_fotografiadas": 1
-    },
     {
       "medido": "2026-09-14T16:17:13Z",
       "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
@@ -416,6 +328,153 @@
       "vcpus": 2,
       "acel": "tcg",
       "guion": "scripts/cosmic/atuq-en-imagen.py"
+    },
+    {
+      "medido": "2026-09-14T21:31:39Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "cadencia_s": 40,
+      "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:53:07Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "cadencia_s": 40,
+      "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-14T22:17:27Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "cadencia_s": 40,
+      "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-14T22:31:36Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "cadencia_s": 40,
+      "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-15T00:27:18Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 300,
+      "cadencia_s": 60,
+      "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-15T00:37:46Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 300,
+      "cadencia_s": 60,
+      "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-15T17:19:09Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 420,
+      "cadencia_s": 60,
+      "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-15T17:31:32Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": 123,
+      "pantalla": "gpu0",
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 420,
+      "cadencia_s": 60,
+      "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-15T17:44:06Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "pantalla": null,
+      "pantallas_fotografiadas": 1,
+      "presupuesto_s": 420,
+      "ventana_s": 300,
+      "cadencia_s": 60,
+      "lanzamiento": "perfil del usuario",
+      "video": "virtio-gpu solo (-vga none)",
+      "mem_mb": 2560,
+      "vcpus": 2,
+      "acel": "tcg",
+      "guion": "scripts/cosmic/atuq-en-imagen.py",
+      "recent_crashes_fijado": 16,
+      "recent_crashes_antes": null,
+      "recent_crashes_despues": 16
     }
   ]
 }