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.txtquedaba vacío. - Fallo de paquete → watchdog buscaba
previous→ no encontraba → dejaba varada la instalación.
Lógica implementada
-
Reintento antes de rollback:
pkg-watchdogreintenta el mismo paquete una vez antes de degradar.- Cubre un arranque abortado transitorio sin cambiar de código.
-
Rollback sin
previous:- Si no hay
previous.txt→ borracurrent.txt. - Lanzador cae al código embebido (que está en el
.exe, seguro). - Bootstrap relanza sin errores.
- Si no hay
-
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_bootstrapen 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]]