before: pinned={'radicale': 'ghcr.io/kozea/radicale:3.8.0'}
drill: cef693c DRILL radicale: {'radicale': 'ghcr.io/kozea/radicale:3.8.1'} (box proof)
  phase +0.0s backing-up | err=None
  phase +2.1s pulling | err=None
  phase +8.2s copying | err=None
  phase +9.2s verifying | err=None
  phase +14.4s done | err=None
    radicale: readback http=200 found=True (controls: no auth 401, wrong 401, absent 404)
2026/10/01 14:39:11 update.go:536: [INFO] [stacks] update radicale: accepted — guarded update started
2026/10/01 14:39:11 update.go:1375: [INFO] [stacks] update radicale: phase checking
2026/10/01 14:39:11 update.go:793: [INFO] [stacks] update radicale: ladder — the last step (1 of 1) — the catalog's current definition
2026/10/01 14:39:11 update.go:823: [INFO] [stacks] update radicale: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-10-01T14:36:55Z) (found: none) — backing up first
2026/10/01 14:39:11 update.go:1375: [INFO] [stacks] update radicale: phase backing-up
2026/10/01 14:39:12 update.go:838: [INFO] [stacks] update radicale: precondition met after the backup — Tier 2 (second drive) copy from 2026-10-01T14:39:12Z
2026/10/01 14:39:12 update.go:1375: [INFO] [stacks] update radicale: phase safety-dump
2026/10/01 14:39:12 update.go:853: [INFO] [stacks] update radicale: safety dump done (0 file(s)) []
2026/10/01 14:39:13 undo.go:287: [INFO] [stacks] update radicale: the undo copy will hold 1 named volume(s), 0.1 MiB
2026/10/01 14:39:13 update.go:1375: [INFO] [stacks] update radicale: phase pinning
2026/10/01 14:39:13 pin.go:373: [INFO] [stacks] update radicale: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/radicale/docker-compose.yml (radicale=ghcr.io/kozea/radicale:3.8.1)
2026/10/01 14:39:13 update.go:1375: [INFO] [stacks] update radicale: phase pulling
2026/10/01 14:39:19 update.go:1375: [INFO] [stacks] update radicale: phase copying
2026/10/01 14:39:19 update.go:1375: [INFO] [stacks] update radicale: phase copying
2026/10/01 14:39:20 undo.go:437: [INFO] [stacks] update radicale: copied radicale_radicale_data → radicale_radicale_data.pre-update-20261001T143919Z in 468ms
2026/10/01 14:39:20 update.go:1375: [INFO] [stacks] update radicale: phase starting
2026/10/01 14:39:20 update.go:1375: [INFO] [stacks] update radicale: phase verifying
2026/10/01 14:39:25 update.go:1004: [INFO] [stacks] update radicale: healthy after 5s (the app's health check passed)
2026/10/01 14:39:25 update.go:1040: [INFO] [stacks] update radicale: DONE in 14s

RESULT final_phase=done after={'radicale': 'ghcr.io/kozea/radicale:3.8.1'} seed_after=True verdict=proven (14.4 s)
