CreaRack-SL

Rollback silencioso e infalible — Caída al embebido sin `previous.txt`

Descripción

El watchdog post-update ahora reintenta antes de degradar versión, y si no hay previous.txt (caso: primera actualización desde embebido a paquete) borra current.txt para caer al código embebido del .exe (que siempre existe), relanzando sin mostrar error alguno.

Problema que resuelve (hallazgo 2, F2):

  • Release 2.14.0 tenía código embebido.
  • Release 2.14.1 es el primer paquete (app-2.14.1.zip).
  • Al transicionar: current.txt → app-2.14.1.zip, previous.txt quedaba vacío.
  • Fallo de paquete → watchdog buscaba previous → no encontraba → dejaba varada la instalación.

Lógica implementada

  1. Reintento antes de rollback: pkg-watchdog reintenta el mismo paquete una vez antes de degradar.

    • Cubre un arranque abortado transitorio sin cambiar de código.
  2. Rollback sin previous:

    • Si no hay previous.txt → borra current.txt.
    • Lanzador cae al código embebido (que está en el .exe, seguro).
    • Bootstrap relanza sin errores.
  3. Extracción de lógica: nueva función _watchdog_script() (pura) para poder verificar la lógica en CI.

Testing

  • Tests de rollback en tests/agent/test_agent_launcher.py (+3 casos).
  • Verifica: script generado, reintento, borrado de current.txt, caída a embebido.

Impacto de usuario

  • Silencioso: sin ventanas de error.
  • Automático: sin intervención manual.
  • Infalible: siempre hay un código ejecutable (embebido en el .exe).

Limitaciones / Notas

  • Este mecanismo viaja en core/pkg_updater.py (dentro del paquete) → el updater se actualiza a sí mismo junto con el código.
  • Requiere que el bootstrap sepa extraer y verificar firmas (registrado como módulo agent_bootstrap en el paquete).

Véase también

  • [[feature—agent-lanzador—paquete-firmado-ed25519]]
  • [[concept—agent-lanzador—cadena-fallback]]
  • [[feature—agent-lanzador—bootstrap-zip]]
  • [[incident—20260707—bootstrap-2-14-0-roto]]