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 1389Shell 137Markdown 80Rust 802602 Definiciones

atuq: la TASA — pinta 3 de 13 con el perfil del usuario, y cuando pinta siempre a ~200 s

Diez corridas idénticas con `scripts/cosmic/tasa-primera-pintura.sh` (--as-user, VGA=1, ventana 480 s,
captura cada 30 s), más las cinco anteriores, todas anotadas en docs/state/primera-pintura.json:

    perfil del usuario     3 de 13 pintaron   184, 199, 204 s
    perfil nuevo en tmpfs  2 de 2             197, 197 s

Dos cosas que la tasa dice y una anécdota no podía: cuando pinta, pinta SIEMPRE en la misma ventana
(184…204 s) y nunca a los 300, 400 ni 900 ⇒ no es una cola larga, son DOS REGÍMENES —o sale a los
~200 s o no sale—; y con el perfil del usuario falla ~3 de cada 4, mientras que con perfil nuevo en
tmpfs no falló (2 de 2, pocas corridas para afirmar que nunca, suficientes para saber dónde mirar:
qué hace el primer arranque del perfil que el perfil ya hecho no hace).

⚠ Condición de la medida, parte del número: las diez salieron con el anfitrión a load ~10 (tanda de
KDE de otro agente + una VM de otra sesión, en 4 cores). El número es un PISO, no una constante.

⚠ Y una trampa del arnés medida en las corridas 8–10: con esa carga el guest tarda más de 420 s en
llegar al shell y los `esperar` vencen. No las invalida —se verificó una por una que el navegador se
lanzó y dejó su MOZ_LOG de 1200–5000 líneas— pero una corrida abortada de verdad se ve casi igual:
por eso el guion cuenta las abortadas APARTE en vez de sumarlas a los fallos.

49b2842ddbad642fa15750098b6a426fb9555f57 · por Sergio · (hace 1 mes) · padre 390fdf2dc · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

3 archivos · +212 −1

diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md
index 76948fa2..9044e229 100644
--- a/docs/26-atuq-envoltorio-gecko.md
+++ b/docs/26-atuq-envoltorio-gecko.md
@@ -1731,7 +1731,8 @@ tal como se tecleó en el serial aquella noche. Cinco corridas sobre la MISMA im
 | 4 | perfil del usuario | `VGA=1` | 900 s | **+204 s** |
 | 5 | perfil del usuario | `VGA=1` | 900 s | ✗ **no pintó en 15 min** |
 
-⇒ **el fallo es INTERMITENTE**, y las corridas 4 y 5 son el mismo comando sobre la misma imagen. No
+⇒ **el fallo es INTERMITENTE** —con diez corridas más, la tasa quedó en **3 de 13**, ver §6.10.septies—,
+y las corridas 4 y 5 son el mismo comando sobre la misma imagen. No
 es el compositor (§6.10.quater), no es la segunda pantalla (§6.10.quinquies) y **tampoco es sólo que
 tarde**: cuando pinta, pinta siempre alrededor de los 200 s; cuando no, no pinta aunque se le den
 quince minutos.
@@ -1772,6 +1773,38 @@ buffer no llega a la pantalla. Lo próximo es mirarlo del lado del compositor 
 recibe su `configure`, en qué workspace y en qué salida quedó la ventana— y correr N veces para tener
 una tasa, no una anécdota.
 
+#### 6.10.septies La TASA: pinta **3 de 13** con el perfil del usuario — y cuando pinta, siempre a ~200 s (2026-09-14)
+
+Diez corridas seguidas, idénticas, con `scripts/cosmic/tasa-primera-pintura.sh`: `--as-user`, `VGA=1`,
+ventana de 480 s, captura cada 30 s. Más las cinco de las secciones anteriores, todas sobre la misma
+imagen y anotadas en `docs/state/primera-pintura.json`:
+
+| lanzamiento | pintaron | primera pintura |
+|---|---|---|
+| perfil del usuario (lo que hace un usuario) | **3 de 13** | 184, 199, 204 s |
+| perfil nuevo en tmpfs | 2 de 2 | 197, 197 s |
+
+**Dos cosas que el número dice y una anécdota no podía:**
+
+1. **cuando pinta, pinta siempre en la misma ventana** —184…204 s— y nunca a los 300, 400 ni 900. O
+   sea que «tardaba» era falso: no hay una cola larga, hay **dos regímenes**. O sale a los ~200 s o no
+   sale;
+2. **la tasa con el perfil del usuario es ~1 de 4**, y con perfil nuevo en tmpfs no falló nunca (2 de
+   2 — pocas corridas para afirmar que nunca falla, pero suficientes para que la diferencia valga como
+   pista de dónde mirar: qué hace el primer arranque del perfil que el perfil ya hecho no hace).
+
+⚠ **Condición de la medida, que es parte del número:** las diez corridas salieron con la máquina
+anfitriona a **load ~10** (la tanda de KDE de otro agente más una VM de otra sesión, en 4 cores). Eso
+empuja hacia el ✗ y por eso el número es un PISO, no una constante del producto: la misma imagen en
+una máquina ociosa puede fallar menos. Lo que no cambia con la carga es lo de arriba: las que pintan
+pintan a ~200 s, no a los 400.
+
+⚠ Y una trampa del arnés, medida en las corridas 8–10: con el anfitrión así de cargado, el guest tarda
+más de 420 s en llegar al shell del serial y los `esperar` del guion vencen —«nunca llegó ‹fin de la
+ventana de observación›»—. **No las invalida** (se verificó una por una que el navegador se lanzó y
+dejó su `MOZ_LOG` de 1200–5000 líneas), pero una corrida abortada de verdad se vería casi igual: por
+eso el guion de la tasa cuenta las **abortadas aparte** en vez de sumarlas a los fallos.
+
 ### 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 7dfcd959..f0babc4c 100644
--- a/docs/state/primera-pintura.json
+++ b/docs/state/primera-pintura.json
@@ -79,6 +79,146 @@
       "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"
+    },
+    {
+      "medido": "2026-09-14T16:17:13Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T16:26:43Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": 184,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T16:39:48Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T16:48:45Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": 199,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T17:03:19Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T17:18:52Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T17:34:16Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T17:51:50Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T18:10:43Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
+    },
+    {
+      "medido": "2026-09-14T18:25:53Z",
+      "imagen": "/mnt/cosecha/takana-cosmic-qemu.img",
+      "segundos_primera_pintura": null,
+      "presupuesto_s": 420,
+      "ventana_s": 480,
+      "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"
     }
   ]
 }
diff --git a/scripts/cosmic/tasa-primera-pintura.sh b/scripts/cosmic/tasa-primera-pintura.sh
new file mode 100755
index 00000000..36f50720
--- /dev/null
+++ b/scripts/cosmic/tasa-primera-pintura.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+# 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)
+#
+# ── POR QUÉ UNA TASA ───────────────────────────────────────────────────────────────────────────
+# El §6.10.sexies del SDD 26 midió cinco corridas sobre la MISMA imagen: pintó en tres (+197, +197,
+# +204 s) y no pintó en dos, siendo las dos últimas el MISMO comando. Con un fallo intermitente una
+# corrida no decide en ningún sentido —ni el ✓ ni el ✗—, así que lo que hay que publicar es cuántas
+# de cuántas. Cada corrida deja su entrada en `docs/state/primera-pintura.json` (el guion ACUMULA) y
+# `scripts/vigia-imagen.py` informa la tasa.
+#
+# ⚠ Una corrida ABORTADA no es un ✗. Si la VM muere por fuera —este repo es compartido y hay sesiones
+# que matan todos los `qemu` de la máquina— el guion no llega a anotar nada; acá se detecta mirando
+# que la salida traiga el veredicto, y se cuenta aparte. Un aborto contado como fallo infla la tasa
+# de fallo con algo que no es del producto.
+set -u
+ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
+N="${1:-10}"
+WAIT="${WAIT:-480}"; CADENCE="${CADENCE:-30}"
+ok=0; fallo=0; aborto=0; i=1
+echo "== $N corridas · --as-user · VGA=1 · 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 \
+    python3 scripts/cosmic/atuq-en-imagen.py --as-user --until-paint \
+      --wait "$WAIT" --cadence "$CADENCE" --out "work/tasa-corrida-$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#*✓ }"
+  elif grep -qa "el navegador NO pintó" "$log"; then
+    fallo=$((fallo+1)); echo "  [$i/$N] ✗ no pintó en ${WAIT}s"
+  else
+    aborto=$((aborto+1)); echo "  [$i/$N] ⚠ corrida abortada (no hay veredicto) — $log"
+  fi
+  i=$((i+1))
+done
+echo "== TASA: $ok pintaron / $((ok+fallo)) corridas válidas   (abortadas: $aborto)"