before: pinned={'grocy': 'lscr.io/linuxserver/grocy:4.6.0'}
drill: 7166c17 DRILL grocy: {'grocy': 'lscr.io/linuxserver/grocy:4.7.1'} (box proof)
  phase +0.0s backing-up | err=None
  phase +5.2s pulling | err=None
  phase +23.6s copying | err=None
  phase +28.7s verifying | err=None
  phase +330.9s undoing | err=None
  phase +346.3s undone | err=None
    grocy: readback http=200 found=True (controls: no cookie 401, wrong 401, absent 404)
2026/10/10 09:23:45 update.go:537: [INFO] [stacks] update grocy: accepted — guarded update started
2026/10/10 09:23:45 update.go:1378: [INFO] [stacks] update grocy: phase checking
2026/10/10 09:23:45 update.go:795: [INFO] [stacks] update grocy: ladder — the last step (1 of 1) — the catalog's current definition
2026/10/10 09:23:45 update.go:825: [INFO] [stacks] update grocy: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-10-10T09:22:43Z) (found: none) — backing up first
2026/10/10 09:23:45 update.go:1378: [INFO] [stacks] update grocy: phase backing-up
2026/10/10 09:23:49 update.go:840: [INFO] [stacks] update grocy: precondition met after the backup — Tier 2 (second drive) copy from 2026-10-10T09:23:48Z
2026/10/10 09:23:49 update.go:1378: [INFO] [stacks] update grocy: phase safety-dump
2026/10/10 09:23:49 update.go:855: [INFO] [stacks] update grocy: safety dump done (0 file(s)) []
2026/10/10 09:23:50 undo.go:287: [INFO] [stacks] update grocy: the undo copy will hold 1 named volume(s), 0.8 MiB
2026/10/10 09:23:50 update.go:1378: [INFO] [stacks] update grocy: phase pinning
2026/10/10 09:23:50 pin.go:373: [INFO] [stacks] update grocy: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/grocy/docker-compose.yml (grocy=lscr.io/linuxserver/grocy:4.7.1)
2026/10/10 09:23:50 update.go:1378: [INFO] [stacks] update grocy: phase pulling
2026/10/10 09:24:07 update.go:1378: [INFO] [stacks] update grocy: phase copying
2026/10/10 09:24:12 update.go:1378: [INFO] [stacks] update grocy: phase copying
2026/10/10 09:24:12 undo.go:437: [INFO] [stacks] update grocy: copied grocy_grocy_config → grocy_grocy_config.pre-update-20261010T092412Z in 512ms
2026/10/10 09:24:12 update.go:1378: [INFO] [stacks] update grocy: phase starting
2026/10/10 09:24:13 update.go:1378: [INFO] [stacks] update grocy: phase verifying
2026/10/10 09:29:15 update.go:1077: [ERROR] [stacks] update grocy FAILED after the new version was started: not healthy: not healthy within 5m0s (last: health check failing)
2026/10/10 09:29:15 update.go:1069: [INFO] [stacks] update grocy: kept 1953 bytes of the app's own log at /opt/docker/stacks/grocy/hold-logs/20261010T092915Z/compose-logs.txt before stopping it (R-621)
2026/10/10 09:29:15 update.go:1378: [INFO] [stacks] update grocy: phase undoing
2026/10/10 09:29:15 undo.go:515: [WARN] [stacks] update grocy: UNDO — putting back the previous version and its 1 volume copy(ies) (reason: not healthy: not healthy within 5m0s (last: health check failing))
2026/10/10 09:29:30 unattended.go:511: [INFO] [stacks] update grocy: step grocy=lscr.io/linuxserver/grocy:4.7.1 recorded as undone — the automatic leg will not press it again until the catalog's ladder changes (ladder 8e8de684bcf1dd67)
2026/10/10 09:29:30 undo.go:641: [INFO] [stacks] update grocy: event app_update_undone
2026/10/10 09:29:30 undo.go:569: [INFO] [stacks] update grocy: UNDONE in 15s — the previous version is running on the data from before the update (the app's health check passed)

RESULT final_phase=undone after={'grocy': 'lscr.io/linuxserver/grocy:4.6.0'} seed_after=True verdict=failed (346.3 s)
before: pinned={'grocy': 'lscr.io/linuxserver/grocy:4.6.0'}
drill: afdf57c DRILL grocy: {'grocy': 'lscr.io/linuxserver/grocy:4.7.1'} (box proof)
  phase +0.0s backing-up | err=None
  phase +5.1s pulling | err=None
  phase +22.6s copying | err=None
  phase +30.8s verifying | err=None
  phase +41.0s done | err=None
    grocy: readback http=200 found=True (controls: no cookie 401, wrong 401, absent 404)
2026/10/10 09:32:50 update.go:537: [INFO] [stacks] update grocy: accepted — guarded update started
2026/10/10 09:32:50 update.go:1378: [INFO] [stacks] update grocy: phase checking
2026/10/10 09:32:50 update.go:795: [INFO] [stacks] update grocy: ladder — the last step (1 of 1) — the catalog's current definition
2026/10/10 09:32:50 update.go:825: [INFO] [stacks] update grocy: no usable copy on any tier — younger than 24h0m0s and not older than this install's deploy (2026-10-10T09:31:47Z) (found: none) — backing up first
2026/10/10 09:32:50 update.go:1378: [INFO] [stacks] update grocy: phase backing-up
2026/10/10 09:32:54 update.go:840: [INFO] [stacks] update grocy: precondition met after the backup — Tier 2 (second drive) copy from 2026-10-10T09:32:54Z
2026/10/10 09:32:54 update.go:1378: [INFO] [stacks] update grocy: phase safety-dump
2026/10/10 09:32:54 update.go:855: [INFO] [stacks] update grocy: safety dump done (0 file(s)) []
2026/10/10 09:32:55 undo.go:287: [INFO] [stacks] update grocy: the undo copy will hold 1 named volume(s), 0.8 MiB
2026/10/10 09:32:55 update.go:1378: [INFO] [stacks] update grocy: phase pinning
2026/10/10 09:32:55 pin.go:373: [INFO] [stacks] update grocy: pin advanced to /opt/docker/felhom-controller/data/catalog-cache/templates/grocy/docker-compose.yml (grocy=lscr.io/linuxserver/grocy:4.7.1)
2026/10/10 09:32:55 update.go:1378: [INFO] [stacks] update grocy: phase pulling
2026/10/10 09:33:12 update.go:1378: [INFO] [stacks] update grocy: phase copying
2026/10/10 09:33:17 update.go:1378: [INFO] [stacks] update grocy: phase copying
2026/10/10 09:33:20 undo.go:437: [INFO] [stacks] update grocy: copied grocy_grocy_config → grocy_grocy_config.pre-update-20261010T093317Z in 3.336s
2026/10/10 09:33:20 update.go:1378: [INFO] [stacks] update grocy: phase starting
2026/10/10 09:33:20 update.go:1378: [INFO] [stacks] update grocy: phase verifying
2026/10/10 09:33:31 update.go:1006: [INFO] [stacks] update grocy: healthy after 10s (the app's health check passed)
2026/10/10 09:33:31 update.go:1043: [INFO] [stacks] update grocy: DONE in 41s

RESULT final_phase=done after={'grocy': 'lscr.io/linuxserver/grocy:4.7.1'} seed_after=True verdict=proven (41.1 s)
