#!/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) # 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, # +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}" # ⚠ 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=$VGA · ventana ${WAIT}s · cadencia ${CADENCE}s" while [ "$i" -le "$N" ]; do 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-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#*✓ }" 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)"