From db24d206dc6384369497cd2eaa0c7510d17170fb Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 15 Sep 2026 19:24:50 +0000 Subject: [PATCH] =?UTF-8?q?arn=C3=A9s=20de=20la=20imagen:=20el=20piso=20de?= =?UTF-8?q?l=20sello=20se=20COMPRUEBA=20=E2=80=94=20un=20piso=20que=20fall?= =?UTF-8?q?a=20callado=20no=20existe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Los 180 s de `PISO_SELLO` son de esta máquina (TCG sin KVM y con la carga que tenga el anfitrión, igual que los +97/+120/+137 de la pintura). Con el anfitrión cargado el mismo arranque puede no llegar al gancho que sella el éxito, y entonces la corrida suma al contador de caídas y envenena la siguiente EN SILENCIO — que es exactamente como empezó todo esto. Ahora que `toolkit.startup.last_success` se lee antes y después, eso se puede decir, así que se dice: ✓ el arranque SELLÓ el éxito (last_success X → Y): esta corrida no envenena la siguiente ⚠⚠ el sello NO se movió: este arranque no terminó ⇒ la corrida SUMA al contador. Subí PISO_SELLO Es la diferencia entre un piso confiado y un piso comprobado, y cuesta cuatro líneas porque el dato ya estaba medido y guardado. --- scripts/cosmic/atuq-en-imagen.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/cosmic/atuq-en-imagen.py b/scripts/cosmic/atuq-en-imagen.py index d2281439..436b954a 100755 --- a/scripts/cosmic/atuq-en-imagen.py +++ b/scripts/cosmic/atuq-en-imagen.py @@ -649,6 +649,20 @@ def main(): % perfil_d, 60) estado["recent_crashes_despues"] = leer_contador_de_caidas(volcado) estado["last_success_despues"] = leer_sello_de_exito(volcado) + # ⚠ EL PISO SE COMPRUEBA, NO SE CONFÍA. `PISO_SELLO` son 180 s medidos EN ESTA + # máquina (TCG sin KVM, con la carga que tenga el anfitrión): con el anfitrión + # cargado el mismo arranque puede no llegar al gancho, y entonces esta corrida + # SUMA al contador y envenena la siguiente — en silencio, que es como pasó la + # primera vez. Con el sello leído antes y después, eso se puede DECIR. + if estado["last_success_despues"] is not None and \ + estado["last_success_despues"] == estado.get("last_success_antes"): + print(" ⚠⚠ el sello NO se movió (%s): este arranque no terminó ⇒ la corrida " + "SUMA al contador de caídas. Si usaste --until-paint, subí PISO_SELLO" + % estado["last_success_despues"]) + elif estado["last_success_despues"] is not None: + print(" ✓ el arranque SELLÓ el éxito (last_success %s → %s): esta corrida " + "no envenena la siguiente" + % (estado.get("last_success_antes"), estado["last_success_despues"])) print("---- el contador de caídas, DESPUÉS ----") print(volcado.strip()) # ⚠ SÓLO LA FASE BASE SE ANOTA. La serie de `primera-pintura.json` es una TASA del