before: pinned={'calibre-web': 'crocodilestick/calibre-web-automated:v4.0.6'}
drill: 7fe29b9 DRILL calibre-web: {'calibre-web': 'crocodilestick/calibre-web-automated:v4.0.8'} (box proof)
  phase +0.0s backing-up | err=None
  phase +6.2s pulling | err=None
  phase +30.8s copying | err=None
  phase +44.1s verifying | err=None
  phase +64.6s done | err=None
    calibre-web: readback — listed=True download_link=True book_content_served=True
2026/09/30 15:13:56 update.go:536: [INFO] [stacks] update calibre-web: accepted — guarded update started
2026/09/30 15:13:56 update.go:1365: [INFO] [stacks] update calibre-web: phase checking
2026/09/30 15:13:56 update.go:786: [INFO] [stacks] update calibre-web: ladder — the last step (1 of 1) — the catalog's current definition
2026/09/30 15:13:56 update.go:816: [INFO] [stacks] update calibre-web: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T15:02:07Z) (found: none) — backing up first
2026/09/30 15:13:56 update.go:1365: [INFO] [stacks] update calibre-web: phase backing-up
2026/09/30 15:14:01 update.go:831: [INFO] [stacks] update calibre-web: precondition met after the backup — Tier 1 (own recovery unit) copy from 2026-09-30T15:14:01Z
2026/09/30 15:14:01 update.go:1365: [INFO] [stacks] update calibre-web: phase safety-dump
2026/09/30 15:14:01 update.go:846: [INFO] [stacks] update calibre-web: safety dump done (0 file(s)) []
2026/09/30 15:14:02 undo.go:287: [INFO] [stacks] update calibre-web: the undo copy will hold 1 named volume(s), 0.4 MiB
2026/09/30 15:14:02 update.go:1365: [INFO] [stacks] update calibre-web: phase pinning
2026/09/30 15:14:02 pin.go:373: [INFO] [stacks] update calibre-web: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/calibre-web/docker-compose.yml (calibre-web=crocodilestick/calibre-web-automated:v4.0.8)
2026/09/30 15:14:02 update.go:1365: [INFO] [stacks] update calibre-web: phase pulling
2026/09/30 15:14:27 update.go:1365: [INFO] [stacks] update calibre-web: phase copying
2026/09/30 15:14:39 update.go:1365: [INFO] [stacks] update calibre-web: phase copying
2026/09/30 15:14:40 undo.go:437: [INFO] [stacks] update calibre-web: copied calibre-web_calibre_web_config → calibre-web_calibre_web_config.pre-update-20260930T151439Z in 456ms
2026/09/30 15:14:40 update.go:1365: [INFO] [stacks] update calibre-web: phase starting
2026/09/30 15:14:40 update.go:1365: [INFO] [stacks] update calibre-web: phase verifying
2026/09/30 15:15:00 update.go:997: [INFO] [stacks] update calibre-web: healthy after 20s (the app's health check passed)
2026/09/30 15:15:01 update.go:1033: [INFO] [stacks] update calibre-web: DONE in 1m4s

RESULT final_phase=done after={'calibre-web': 'crocodilestick/calibre-web-automated:v4.0.8'} seed_after=True verdict=proven (64.6 s)
