before: pinned={'radicale': 'ghcr.io/kozea/radicale:3.8.1'}
drill: 6a1531e DRILL radicale: {'radicale': 'alpine:3.20'} (box proof)
  phase +0.0s safety-dump | err=None
  phase +1.0s pulling | err=None
  phase +2.1s copying | err=None
  phase +3.1s verifying | err=None
  phase +305.5s undoing | err=None
  phase +311.6s undone | err=None
    radicale: readback http=200 found=True (controls: no auth 401, wrong 401, absent 404)
2026/10/01 14:26:10 update.go:536: [INFO] [stacks] update radicale: accepted — guarded update started
2026/10/01 14:26:10 update.go:1375: [INFO] [stacks] update radicale: phase checking
2026/10/01 14:26:10 update.go:793: [INFO] [stacks] update radicale: ladder — the last step (2 of 2) — the catalog's current definition
2026/10/01 14:26:10 update.go:821: [INFO] [stacks] update radicale: precondition met — Tier 2 (second drive) copy from 2026-10-01T14:25:16Z (1m0s old, limit 24h0m0s)
2026/10/01 14:26:10 update.go:1375: [INFO] [stacks] update radicale: phase safety-dump
2026/10/01 14:26:10 update.go:853: [INFO] [stacks] update radicale: safety dump done (0 file(s)) []
2026/10/01 14:26:11 undo.go:287: [INFO] [stacks] update radicale: the undo copy will hold 1 named volume(s), 0.1 MiB
2026/10/01 14:26:11 update.go:1375: [INFO] [stacks] update radicale: phase pinning
2026/10/01 14:26:11 pin.go:373: [INFO] [stacks] update radicale: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/radicale/docker-compose.yml (radicale=alpine:3.20)
2026/10/01 14:26:11 update.go:1375: [INFO] [stacks] update radicale: phase pulling
2026/10/01 14:26:12 update.go:1375: [INFO] [stacks] update radicale: phase copying
2026/10/01 14:26:12 update.go:1375: [INFO] [stacks] update radicale: phase copying
2026/10/01 14:26:13 undo.go:437: [INFO] [stacks] update radicale: copied radicale_radicale_data → radicale_radicale_data.pre-update-20261001T142612Z in 447ms
2026/10/01 14:26:13 update.go:1375: [INFO] [stacks] update radicale: phase starting
2026/10/01 14:26:13 update.go:1375: [INFO] [stacks] update radicale: phase verifying
2026/10/01 14:31:15 update.go:1074: [ERROR] [stacks] update radicale FAILED after the new version was started: not healthy: not healthy within 5m0s (last: state restarting)
2026/10/01 14:31:15 update.go:1066: [INFO] [stacks] update radicale: kept 672 bytes of the app's own log at /opt/docker/stacks/radicale/hold-logs/20261001T143115Z/compose-logs.txt before stopping it (R-621)
2026/10/01 14:31:15 update.go:1375: [INFO] [stacks] update radicale: phase undoing
2026/10/01 14:31:15 undo.go:515: [WARN] [stacks] update radicale: UNDO — putting back the previous version and its 1 volume copy(ies) (reason: not healthy: not healthy within 5m0s (last: state restarting))
2026/10/01 14:31:22 unattended.go:511: [INFO] [stacks] update radicale: step radicale=alpine:3.20 recorded as undone — the automatic leg will not press it again until the catalog's ladder changes (ladder 512182cb568d5928)
2026/10/01 14:31:22 undo.go:641: [INFO] [stacks] update radicale: event app_update_undone
2026/10/01 14:31:22 undo.go:569: [INFO] [stacks] update radicale: UNDONE in 7s — the previous version is running on the data from before the update (the app's health check passed)

RESULT final_phase=undone after={'radicale': 'ghcr.io/kozea/radicale:3.8.1'} seed_after=True verdict=failed (311.6 s)
