before: pinned={'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.36.1'}
drill: ae240b4 DRILL audiobookshelf: {'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.37.1'} (box proof)
  phase +0.0s backing-up | err=None
  phase +2.1s safety-dump | err=None
  phase +3.1s pulling | err=None
  phase +16.4s copying | err=None
  phase +19.5s verifying | err=None
  phase +24.6s done | err=None
    audiobookshelf: login as the seeded root http=200 ok=True
2026/09/30 12:08:28 update.go:536: [INFO] [stacks] update audiobookshelf: accepted — guarded update started
2026/09/30 12:08:28 update.go:1365: [INFO] [stacks] update audiobookshelf: phase checking
2026/09/30 12:08:28 update.go:786: [INFO] [stacks] update audiobookshelf: ladder — the last step (2 of 2) — the catalog's current definition
2026/09/30 12:08:28 update.go:816: [INFO] [stacks] update audiobookshelf: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-09-30T12:03:38Z) (found: none) — backing up first
2026/09/30 12:08:28 update.go:1365: [INFO] [stacks] update audiobookshelf: phase backing-up
2026/09/30 12:08:29 update.go:831: [INFO] [stacks] update audiobookshelf: precondition met after the backup — Tier 2 (second drive) copy from 2026-09-30T12:08:28Z
2026/09/30 12:08:29 update.go:1365: [INFO] [stacks] update audiobookshelf: phase safety-dump
2026/09/30 12:08:29 update.go:846: [INFO] [stacks] update audiobookshelf: safety dump done (0 file(s)) []
2026/09/30 12:08:30 undo.go:287: [INFO] [stacks] update audiobookshelf: the undo copy will hold 2 named volume(s), 0.5 MiB
2026/09/30 12:08:30 update.go:1365: [INFO] [stacks] update audiobookshelf: phase pinning
2026/09/30 12:08:30 pin.go:373: [INFO] [stacks] update audiobookshelf: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/audiobookshelf/docker-compose.yml (audiobookshelf=ghcr.io/advplyr/audiobookshelf:2.37.1)
2026/09/30 12:08:30 update.go:1365: [INFO] [stacks] update audiobookshelf: phase pulling
2026/09/30 12:08:44 update.go:1365: [INFO] [stacks] update audiobookshelf: phase copying
2026/09/30 12:08:45 update.go:1365: [INFO] [stacks] update audiobookshelf: phase copying
2026/09/30 12:08:46 undo.go:437: [INFO] [stacks] update audiobookshelf: copied audiobookshelf_audiobookshelf_config → audiobookshelf_audiobookshelf_config.pre-update-20260930T120845Z in 508ms
2026/09/30 12:08:46 update.go:1365: [INFO] [stacks] update audiobookshelf: phase copying
2026/09/30 12:08:46 undo.go:437: [INFO] [stacks] update audiobookshelf: copied audiobookshelf_audiobookshelf_metadata → audiobookshelf_audiobookshelf_metadata.pre-update-20260930T120845Z in 453ms
2026/09/30 12:08:46 update.go:1365: [INFO] [stacks] update audiobookshelf: phase starting
2026/09/30 12:08:46 update.go:1365: [INFO] [stacks] update audiobookshelf: phase verifying
2026/09/30 12:08:52 update.go:997: [INFO] [stacks] update audiobookshelf: healthy after 5s (the app's health check passed)
2026/09/30 12:08:52 update.go:1033: [INFO] [stacks] update audiobookshelf: DONE in 24s

RESULT final_phase=done after={'audiobookshelf': 'ghcr.io/advplyr/audiobookshelf:2.37.1'} seed_after=True verdict=proven (24.6 s)
