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…
atuq: la serie con UNA sola tarjeta — 2 de 10, y el hueco resulta real
1#!/bin/sh
2# tasa-primera-pintura.sh — corre N veces `atuq-en-imagen.py` y saca la TASA, no una anécdota.
3#
4# scripts/cosmic/tasa-primera-pintura.sh [N] (def 10)
5# VGA=0 scripts/cosmic/tasa-primera-pintura.sh 10 una sola salida (así se usa la imagen de verdad)
6#
7# ── POR QUÉ UNA TASA ───────────────────────────────────────────────────────────────────────────
8# El §6.10.sexies del SDD 26 midió cinco corridas sobre la MISMA imagen: pintó en tres (+197, +197,
9# +204 s) y no pintó en dos, siendo las dos últimas el MISMO comando. Con un fallo intermitente una
10# corrida no decide en ningún sentido —ni el ✓ ni el ✗—, así que lo que hay que publicar es cuántas
11# de cuántas. Cada corrida deja su entrada en `docs/state/primera-pintura.json` (el guion ACUMULA) y
12# `scripts/vigia-imagen.py` informa la tasa.
13#
14# ⚠ Una corrida ABORTADA no es un ✗. Si la VM muere por fuera —este repo es compartido y hay sesiones
15# que matan todos los `qemu` de la máquina— el guion no llega a anotar nada; acá se detecta mirando
16# que la salida traiga el veredicto, y se cuenta aparte. Un aborto contado como fallo infla la tasa
17# de fallo con algo que no es del producto.
18set -u
19ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
20N="${1:-10}"
21WAIT="${WAIT:-480}"; CADENCE="${CADENCE:-30}"
22# ⚠ Con `VGA=1` hay DOS salidas y la ventana cae en cualquiera (§6.10.octies): la serie de diez del
23# 2026-09-14 midió con eso puesto y su «2 de 10» era dónde apuntaba la cámara. Con `VGA=0` hay una
24# sola salida y la captura es completa ⇒ el ✗ sí significa «no está».
25VGA="${VGA:-1}"
26ok=0; fallo=0; aborto=0; i=1
27echo "== $N corridas · --as-user · VGA=$VGA · ventana ${WAIT}s · cadencia ${CADENCE}s"
28while [ "$i" -le "$N" ]; do
29 log="work/tasa-vga$VGA-$i.txt"
30 VGA="$VGA" MEM="${MEM:-2560}" SMP="${SMP:-2}" timeout 2400 \
31 python3 scripts/cosmic/atuq-en-imagen.py --as-user --until-paint \
32 --wait "$WAIT" --cadence "$CADENCE" --out "work/tasa-corrida-vga$VGA-$i" > "$log" 2>&1
33 if grep -qa "PRIMERA PINTURA" "$log"; then
34 t=$(grep -a "primera pintura:" "$log" | head -1)
35 ok=$((ok+1)); echo " [$i/$N] ✓ ${t#*✓ }"
36 elif grep -qa "el navegador NO pintó" "$log"; then
37 fallo=$((fallo+1)); echo " [$i/$N] ✗ no pintó en ${WAIT}s"
38 else
39 aborto=$((aborto+1)); echo " [$i/$N] ⚠ corrida abortada (no hay veredicto) — $log"
40 fi
41 i=$((i+1))
42done
43echo "== TASA: $ok pintaron / $((ok+fallo)) corridas válidas (abortadas: $aborto)"