=== Scenario K — no unit on ANY tier, a backup can be taken — 2026-09-13T15:25:41Z, controller 0.239.0 ===
Fixture: throwaway actualbudget (deployed 15:24:21Z, Tier 2 switched off per app). A fresh deploy gets its
Tier-1 unit within seconds (attempt 04a), so the unit is REMOVED here to make 'no unit anywhere' true.
--- BEFORE removal (helper fixed: every tier location) ---
/mnt/sys_drive/felhom-data/backups/primary/actualbudget:
  2026-09-13T15:24:22.6041945430 1017 manifest.json
  2026-09-13T15:24:22.6041945430 291 compose/app.yaml
  2026-09-13T15:24:22.6041945430 2259 compose/.felhom.yml
  2026-09-13T15:24:22.6041945430 1412 compose/docker-compose.yml
/mnt/felhom-drives/hdd_1/backups/primary/actualbudget: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/actualbudget: ABSENT
app_backup record (off-site per-app pref): {'enabled': False, 'cross_drive': {'enabled': False, 'method': 'rsync', 'destination_path': '', 'schedule': 'daily', 'user_disabled': True}}
--- remove the throwaway's own recovery unit, then POST the update with NO request in between ---
removed
ls: cannot access '/mnt/sys_drive/felhom-data/backups/primary/actualbudget': No such file or directory
--- POST /api/stacks/actualbudget/update at 2026-09-13T15:25:45Z ---
HTTP 202
{"ok":true,"data":{"accepted":true,"completed":false},"message":"Frissítés elindult – az állapot a kártyán követhető"}
end (2026-09-13T15:26:10Z, +24s): state=running updating=False phase=done err='' hold=''
--- the controller, verbatim ---
2026/09/13 15:25:45 update.go:336: [INFO] [stacks] update actualbudget: accepted — guarded update started
2026/09/13 15:25:45 update.go:763: [INFO] [stacks] update actualbudget: phase checking
2026/09/13 15:25:45 update_guard.go:173: [DEBUG] [backup] update precondition for actualbudget: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/13 15:26:00 update.go:452: [INFO] [stacks] update actualbudget: no copy younger than 24h0m0s on any tier (found: none) — backing up first
2026/09/13 15:26:00 update.go:763: [INFO] [stacks] update actualbudget: phase backing-up
2026/09/13 15:26:00 update_guard.go:287: [INFO] [backup] update pre-backup for actualbudget: starting (DB dump → volume dump → unit capture → Tier 2)
2026/09/13 15:26:00 manager.go:1199: [DEBUG] [stacks] StopStack actualbudget: current state=running deployed=true containers=1
2026/09/13 15:26:01 manager.go:1117: [DEBUG] [stacks] StartStack actualbudget: current state=stopped deployed=true
2026/09/13 15:26:01 manager.go:1127: [DEBUG] [stacks] StartStack actualbudget: prepared 8 env vars for compose
2026/09/13 15:26:02 installed.go:397: [DEBUG] [stacks] installed-images actualbudget: unchanged (1 service(s)) — app.yaml not rewritten
2026/09/13 15:26:02 update_guard.go:337: [INFO] [backup] update pre-backup for actualbudget: volume dump OK
2026/09/13 15:26:02 update_guard.go:343: [INFO] [backup] update pre-backup for actualbudget: recovery unit captured (0 database dump(s))
2026/09/13 15:26:02 tier2.go:293: [INFO] [backup] Tier 2 for actualbudget skipped — disabled by customer
2026/09/13 15:26:02 update_guard.go:352: [INFO] [backup] update pre-backup for actualbudget: complete in 1.423s
2026/09/13 15:26:02 update_guard.go:173: [DEBUG] [backup] update precondition for actualbudget: no Tier-2 copy (nincs másodlagos fájlmásolat ehhez az alkalmazáshoz)
2026/09/13 15:26:02 update.go:467: [INFO] [stacks] update actualbudget: precondition met after the backup — Tier 1 (own recovery unit) copy from 2026-09-13T15:26:02Z
2026/09/13 15:26:02 update.go:763: [INFO] [stacks] update actualbudget: phase safety-dump
2026/09/13 15:26:02 update_guard.go:403: [INFO] [backup] update safety dump for actualbudget: the app has no database — nothing to copy (no-op)
2026/09/13 15:26:02 update.go:482: [INFO] [stacks] update actualbudget: safety dump done (0 file(s)) []
2026/09/13 15:26:02 update.go:763: [INFO] [stacks] update actualbudget: phase pinning
2026/09/13 15:26:02 pin.go:362: [INFO] [stacks] update actualbudget: pin advanced to the catalog's current definition (actualbudget=actualbudget/actual-server:26.7.0)
2026/09/13 15:26:02 update.go:763: [INFO] [stacks] update actualbudget: phase pulling
2026/09/13 15:26:03 update.go:763: [INFO] [stacks] update actualbudget: phase starting
2026/09/13 15:26:03 update.go:763: [INFO] [stacks] update actualbudget: phase verifying
2026/09/13 15:26:08 healthprobe.go:153: [DEBUG] Health probe actualbudget: HTTP GET :5006/ → 200 (4ms)
2026/09/13 15:26:08 update.go:558: [INFO] [stacks] update actualbudget: healthy after 5s (the app's health check passed)
2026/09/13 15:26:08 installed.go:397: [DEBUG] [stacks] installed-images actualbudget: unchanged (1 service(s)) — app.yaml not rewritten
2026/09/13 15:26:08 update.go:564: [INFO] [stacks] update actualbudget: DONE in 23s
--- AFTER: every tier location ---
/mnt/sys_drive/felhom-data/backups/primary/actualbudget:
  2026-09-13T15:26:02.2202745980 1059 manifest.json
  2026-09-13T15:26:02.2194343050 291 compose/app.yaml
  2026-09-13T15:26:02.2194343050 2259 compose/.felhom.yml
  2026-09-13T15:26:02.2194343050 1412 compose/docker-compose.yml
  2026-09-13T15:26:01.5313724220 74240 volume-dumps/actualbudget_actualbudget_data.tar
/mnt/felhom-drives/hdd_1/backups/primary/actualbudget: ABSENT
/mnt/felhom-drives/hdd_1/backups/secondary/actualbudget: ABSENT
=== K done 2026-09-13T15:26:12Z ===
