atuq: el reloj del sello es el del LANZAMIENTO, no el de la pintura — y el piso va en el arnés

Leyendo el perfil en cada captura, el sello (`toolkit.startup.last_success`) y la limpieza del
contador llegan al disco entre +100 s y +137 s DESDE EL LANZAMIENTO, no desde el primer cuadro. Y es
UN gancho y no dos: el mismo arranque que limpia escribe el sello, con su propia hora de arranque.

Las dos cotas salen de corridas independientes, que es lo que hace al intervalo creíble:

· a los +100 s NO había sellado — la corrida S1 vivió 100 s desde el lanzamiento (primer cuadro a
  +97 s, fin del proceso tres segundos después, medido con los tiempos de sus propios ficheros);
· a los +137 s YA había sellado — la corrida con `--watch-prefs` lo ve aparecer en esa captura.

S1 parecía la excepción del modelo y resulta ser su cota inferior: si el reloj fuera el de la pintura
tendría que haber sellado, y no selló.

La consecuencia es contraintuitiva y es la que muerde: cuanto MÁS RÁPIDO pinta, más fácil es
envenenar el perfil, porque `--until-paint` corta antes. La serie de ayer no se rompió por ser larga
sino por ser rápida. Por eso la regla va en el arnés y no en un runbook: `PISO_SELLO = 180`, margen
sobre la cota alta, y `--until-paint` no corta antes de ese piso. El comentario del piso lleva los
dos números medidos al lado — un piso que se lee como elegido lo baja el próximo que lo vea.

Las corridas `cierre-1`/`cuanto-1`, el mando `--watch-prefs` y el piso los midió y escribió la otra
sesión del frente; acá van con la cota de S1 que los cierra por abajo.
This commit is contained in:
Sergio
2026-09-15 19:23:26 +00:00
parent 1de1fc31f6
commit 5b47cd596c
3 changed files with 83 additions and 22 deletions
+31 -1
View File
@@ -50,6 +50,23 @@ SMP = os.environ.get("SMP", "2")
# `screendump` de QMP fotografía UN dispositivo y hay que poder pedir cada uno por su nombre: con dos
# salidas, el compositor puede poner la ventana en la que la captura por defecto NO muestra, y eso se
# ve exactamente igual que «la ventana no aparece».
# Segundos desde el lanzamiento del navegador antes de los cuales NO se puede matar la VM sin
# envenenar el perfil: el sello del arranque (`last_success` + borrado de `recent_crashes`) aparece
# en disco entre +100 s y +137 s (medido 2026-09-15, `work/cuanto-1.txt`). 180 deja margen sobre la
# cota alta; es un piso del INSTRUMENTO y no una medida del producto.
# ⚠ EL PISO DEL SELLO, Y EL NÚMERO QUE LO JUSTIFICA — si esto se lee como elegido, el próximo que
# lo vea lo baja. Gecko da por bueno un arranque un rato DESPUÉS DEL LANZAMIENTO (no de la primera
# pintura) y ahí escribe `toolkit.startup.last_success` y limpia `recent_crashes`. Medido el
# 2026-09-15, leyendo el perfil en cada captura, y acotado por dos corridas independientes:
#
# el sello NO estaba a los +100 s (la corrida S1 vivió 100 s desde el lanzamiento y no selló)
# el sello YA estaba a los +137 s (la corrida `cuanto-1`: last_success pasó a su propia hora)
#
# ⇒ el hito cae entre +100 y +137 s, y el 180 es margen sobre la cota alta. Y la consecuencia es
# contraintuitiva: **cuanto más rápido pinta, MÁS fácil es envenenar el perfil**, porque
# `--until-paint` corta antes. Una serie sin este piso se rompe sola a la cuarta corrida.
PISO_SELLO = int(os.environ.get("PISO_SELLO", "180"))
DOS_PANTALLAS = os.environ.get("VGA") == "1"
VGA_ARGS = (["-vga", "none", "-device", "VGA,id=vga0"] if DOS_PANTALLAS else ["-vga", "none"])
PANTALLAS = ["gpu0", "vga0"] if DOS_PANTALLAS else ["gpu0"]
@@ -576,8 +593,21 @@ def main():
if primera is None and px and px > 100_000:
primera = t
print(f" +{t}s ██ PRIMERA PINTURA — {px} px de la página EN {donde}{vigilancia}", flush=True)
if a.until_paint and not a.watch_prefs:
# ⚠ NO SE CORTA ANTES DEL SELLO, Y ESTO ES MEDIDO (2026-09-15). Gecko
# marca el arranque como bueno —escribe `toolkit.startup.last_success` y
# BORRA `recent_crashes`— y eso llega al disco entre los +100 s y los +137 s
# desde el lanzamiento (`work/cuanto-1.txt`, leyendo el perfil en cada
# captura). El reloj es el del ARRANQUE, no el de la pintura: `cierre-1`
# pintó a +120 s y selló, y la S1 de la serie pintó a +97 s, se cortó con
# `--until-paint` y dejó el contador en 1. Cortar en la pintura mata la VM
# antes del sello, y CADA corrida así suma uno: cuatro y el perfil abre el
# diálogo en vez del navegador. El piso es la diferencia entre medir el
# producto y medir el daño que hace el instrumento.
if a.until_paint and not a.watch_prefs and t >= PISO_SELLO:
break
if a.until_paint and t < PISO_SELLO:
print(f" (sigo hasta +{PISO_SELLO}s: antes de eso el arranque no está "
f"sellado y matar la VM envenena el perfil)", flush=True)
else:
vivos = ser.cmd("for c in /proc/[0-9]*/comm; do cat $c 2>/dev/null; done | grep -c atuq")
v = vivos.splitlines()[1].strip() if len(vivos.splitlines()) > 1 else "?"