Media all drives, S5/S6 on Tester 1: a pulled drive stops nothing, the guest keeps a dead mount; on return nothing sees it until stop+start, FileBrowser cannot be restarted (R-1038); 15 §5 written; final report
gates / gates (push) Successful in 6m37s

This commit is contained in:
2026-10-14 20:49:49 +02:00
parent 56f613807d
commit 4ce351ab7b
17 changed files with 598 additions and 21 deletions
+31 -4
View File
@@ -5,7 +5,7 @@
> learn. **No document covered this before 2026-10-14** — itself a finding: the four templates were written one by one
> and never tested together (R-1014). Rulings: `09` §3 decisions 237–241. Measured on Tester 1:
> `audits/media-all-drives-2026-10-14/`. Marks as in `01`: **[DESIGN]** a decision or proposal; **[FACT]** read in a
> named file or measured. **Status: DRAFT** — §5 waits on S5/S6 (after the operator's test).
> named file or measured. **Status: DRAFT** — measured end to end on Tester 1; the operator's layout decision (§2, STATUS D9) is open.
## 1. The problem
@@ -79,10 +79,37 @@ decisions 238–239 needs a real restart (`up -d --force-recreate` once the per-
that came back. Each drive card carries „apps restarted since this drive was added: yes/no" with the button
(decision 239).
## 5. A drive is pulled / comes back — PENDING (S5/S6, after the operator's test)
## 5. A drive is pulled / comes back [FACT, measured on Tester 1 2026-10-14, `audits/media-all-drives-2026-10-14/S5-S6/`]
Predictions written: a pulled drive B stops nothing (no media app has `HDD_PATH` on B); the apps keep a dead view of B;
Plex/Jellyfin may mark items unavailable; on return, running containers do not see B until recreated.
**S5 — Media B's disk detached at 20:10:23 while six media apps ran** (Sonarr, Radarr, qBittorrent, Transmission,
Plex, Jellyfin; all with `HDD_PATH` on Media A):
- **The host** saw the disk go in 2 s and unmounted its own mount, but the **guest kept a dead ext4 mount** of
`/mnt/felhom-drives/media_b`: `mountpoint` = yes, every read = Input/output error (not an empty folder — so nothing can
be written onto the guest's own disk there, which the brief feared).
- **The controller** marked the drive disconnected at 20:10:47, **stopped 0 apps** (none keys on Media B), pushed
`storage_disconnected` (error); the hub got it the same second and mailed the operator; `health_degraded` followed at
20:13. It also tried to rebuild the skeleton ON the dead mount („chmod … input/output error") — the gate asks „is it a
mountpoint?", and a dead mount says yes (R-1038).
- **The dashboard**: the card reads „Media B — Leválasztva 2026. 10. 14. 20:10" with „Csatlakoztatás"; it does not say
that six apps use the drive. No banner on the start page.
- **The apps** did not crash; all read I/O errors on B. Sonarr/Radarr mark root folder B `accessible=false` but their
own health page stays EMPTY. qBittorrent's B torrents sat queued and did not notice.
- **Plex and Jellyfin removed nothing in 30 minutes.** Plex scans only when asked (R-1037); Jellyfin's real-time monitor
got errors, not deletions. A scan during an outage is the risk; with Plex's „empty trash after every scan" on by default
such a scan would drop B's items — not measured, deliberately.
**S6 — the same volume re-attached to the same slot at 20:41:00:** the agent re-mounted it (`sde`) and bound it under
the parent within 24 s, ON TOP of the dead mount (two stacked mounts); the controller logged „drive RETURNED …
restarted gate-stopped apps" (there were none) and `storage_reconnected`. **Every running container still saw the dead
mount**, FileBrowser included („ensured running without recreate"). The dashboard's app „restart" changed nothing
(same start time, still I/O error — R-1026). **Stop + start fixed all six apps at once**; files and all 13 hardlink pairs
intact. FileBrowser is protected — the household cannot stop or start it (403), so it stays broken (R-1038).
**What the restart notice (decisions 238–239) must therefore cover [DESIGN]:** a drive added, a drive removed, **and a
drive that came back** — the last is the one where the household is told nothing today and the apps are silently half
blind. The restart is stop + start (or `up -d --force-recreate`) of every container that binds the drive, FileBrowser
included, and the box — not Sonarr — says that a root folder is unreachable.
## 6. The links [FACT, measured calls in `audits/media-all-drives-2026-10-14/tools/wire.py`]
@@ -0,0 +1,12 @@
== radarr: 3 import(s)
movie Hope: root=media_a tags=['drive-a']
movie Matchbox the Movie: root=media_b tags=['drive-b']
movie WHO: root=media_b tags=['drive-a']
Matchbox the Movie Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5. client=qBittorrent drive-b download=media_b library=media_b HARDLINK
WHO Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB- client=Transmission drive-a download=media_a library=media_b COPY
/mnt/felhom-drives/media_a/userdata/media/transmission/movies/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY links=3 inode=4194407
/mnt/felhom-drives/media_a/userdata/media/transmission/movies/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY/Sample/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY-Sample.mkv links=1 inode=4194411
/mnt/felhom-drives/media_a/userdata/media/transmission/movies/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY.mkv links=1 inode=4194408
/mnt/felhom-drives/media_a/userdata/media/transmission/movies/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY.nfo links=1 inode=4194409
/mnt/felhom-drives/media_b/userdata/media/movies/WHO (2026)/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY.mkv links=1 inode=2097156
@@ -22,3 +22,6 @@ Predictions were written before each measurement: `A-drives/PREDICTIONS-A4-A6.md
| — | **17:25 CEST: demo-hp was power-cut by another session's Immich drill** (`plugcut.py --plug hp`) — Tester 1 went down with it and came back by itself; the boot gate recreated the four media apps onto drive A; all test films then removed (0 files left) | `AFTER-power-cut-1725.txt` |
| H | Prowlarr (drill-only template `b0fd3a0`, `version-2.6.5.5623`, config volume only) deployed through the dashboard; `wire.py` adds Sonarr and Radarr as Prowlarr apps with „Full Sync” (both pass Prowlarr's test; the sync completes; 0 indexers so far). Sonarr now refuses a bare IP (the operator set „Allowed hosts”) — `wire.py` sends `Host: <app>` | `H-*.txt` |
| G | Sign-in with „Disabled for Local Addresses”: outsiders ARE asked (the public address arrives in `X-Forwarded-For`; Sonarr/Radarr redirect to `/login`); the home network and other containers are not (200 + API key) — R-1030. The box's setup gate also blocks outsiders until setup is marked done | `G-auth/` |
| E1 | The operator's test: 18 imports from Sonarr and Radarr. Every show/film whose tag matched its drive → a hardlink on that drive (13), through both download apps on both drives; the two mismatches (Slow Horses ×5, „Who") → a full copy on B while A seeds. Plex was empty until one manual scan (R-1037) | `E1-*.txt`, `E3-who.txt`, `K-plex-empty.txt` |
| S5 | Media B pulled 20:10:23 for 30 min: 0 apps stopped; the guest kept a DEAD mount (I/O errors); hub event + operator mail in 24 s; Plex/Jellyfin removed nothing; Sonarr/Radarr health silent | `S5-S6/` |
| S6 | Re-attached 20:41:00: the host re-mounted in 24 s; every running container — FileBrowser too — kept the dead view; „restart" did nothing; stop+start fixed the six apps; FileBrowser is protected and stays broken (R-1038) | `S5-S6/` |
@@ -19,3 +19,7 @@ S6 — the same volume is re-attached to the same slot (`qm set 341 --scsi3 nvme
apps IT stopped — none.
- So the running media containers still do NOT see B until they are recreated (their bind was made at start).
Expected: the restart notice of decision 238 must also cover „a drive came back".
## S5 outcome (written before S6): stable 30 min; 0 apps stopped; Plex/Jellyfin removed nothing; the guest kept a DEAD
## mount of media_b (I/O errors, not an empty folder) — so the predicted „writes onto the guest rootfs" cannot happen,
## and for S6 the question is whether the agent REPLACES that dead mount.
@@ -0,0 +1,61 @@
Adattárolók
Külső meghajtók kezelése alkalmazásadatok tárolásához.
Megőrzött adatok
Eltávolított alkalmazások lemezen maradt adatai
Adatlemez
/mnt/felhom-drives/adatlemez
Alapértelmezett
Aktív
0,2 GB / 48,9 GB
ext4 · /dev/sdb[/felhom-data] · QEMU HARDDISK
1 alkalmazás használja
Paperless-ngx
6,3 KB
Mozgatás
Új telepítések letiltása
Áthelyezés ide…
Media A (/mnt/felhom-drives/media_a)
Összes adat áthelyezése
Végleges leszerelés
Media A
/mnt/felhom-drives/media_a
Aktív
27,8 GB / 97,9 GB
ext4 · /dev/sdc[/felhom-data] · QEMU HARDDISK
6 alkalmazás használja
Jellyfin
Mozgatás
Plex
Mozgatás
Radarr
Mozgatás
Sonarr
Mozgatás
Transmission
Mozgatás
qBittorrent
Mozgatás
Legyen alapértelmezett
Új telepítések letiltása
Áthelyezés ide…
Adatlemez (/mnt/felhom-drives/adatlemez)
Összes adat áthelyezése
Végleges leszerelés
Media B
/mnt/felhom-drives/media_b
Leválasztva
Leválasztva: 2026. 10. 14. 20:10
Csatlakoztatás
Adatok áthelyezése
…
Új meghajtó inicializálása
Meglévő meghajtó csatolása
Nem regisztrált meghajtók
az ügynök által észlelt, még nem regisztrált adatmeghajtók
Rendszermeghajtók
védett — csak operátori aláírással módosíthatók
Már csatlakoztatott tárhely hozzáadása kézzel
Elérési út
Pl. /mnt/hdd_1 — a meghajtónak már csatolva kell lennie
Megnevezés (opcionális)
--- banners on the start page: []
@@ -0,0 +1,2 @@
2026/10/14 20:10:47 [INFO] Event from tester-1: storage_disconnected (error) — Meghajtó váratlanul leválasztva: Media B
2026/10/14 20:10:47 [INFO] Operator email sent for tester-1/storage_disconnected
@@ -0,0 +1,28 @@
2026-10-14T20:10:23+02:00
scsi3: nvme-scratch:341/vm-341-disk-4.raw,backup=0,size=100G
update VM 341: -delete scsi3
rc=0
scsi0: nvme-scratch:341/vm-341-disk-1.raw,size=200G
scsi1: nvme-scratch:341/vm-341-disk-2.raw,size=50G
scsi2: nvme-scratch:341/vm-341-disk-3.raw,backup=0,size=100G
scsihw: virtio-scsi-single
unused0: nvme-scratch:341/vm-341-disk-4.raw
-rw-r----- 1 root root 107374182400 Oct 14 20:10 /mnt/hdd_1/images/341/vm-341-disk-4.raw
2026-10-14T20:10:48+02:00
sdc 100G /mnt/media_a
/dev/sdd on /mnt/felhom-drives/media_b type ext4 (rw,relatime,shutdown)
Oct 14 20:10:25 felhom kernel: JBD2: I/O error when updating journal superblock for sdd-8.
Oct 14 20:10:25 felhom kernel: EXT4-fs (sdd): shut down requested (2)
Oct 14 20:10:25 felhom kernel: sd 3:0:0:3: [sdd] Synchronizing SCSI cache
Oct 14 20:10:25 felhom kernel: sd 3:0:0:3: [sdd] Synchronize Cache(10) failed: Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
Oct 14 20:10:25 felhom systemd[1]: Unmounting mnt-media_b.mount - Felhom storage mount e15652d5-0aa7-4eb8-93a1-afb2839d527c...
Oct 14 20:10:25 felhom systemd[1]: mnt-media_b.mount: Deactivated successfully.
Oct 14 20:10:25 felhom systemd[1]: Unmounted mnt-media_b.mount - Felhom storage mount e15652d5-0aa7-4eb8-93a1-afb2839d527c.
Oct 14 20:10:28 felhom felhom-agent[1201]: time=2026-10-14T20:10:28.265+02:00 level=INFO msg="storage: watchdog — known drive went absent; clearing any eject intent (replug will auto-mount)" target=e15652d5-0aa7-4eb8-9
Oct 14 20:10:43 felhom felhom-agent[1201]: time=2026-10-14T20:10:43.988+02:00 level=INFO msg="storage: enrolled drive absent by UUID — not re-asserting (will retry when it enumerates)" name=e15652d5-0aa7-4eb8-93a1-afb2
Oct 14 20:10:44 felhom sudo[334609]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/felhom-drives
Oct 14 20:10:44 felhom sudo[334658]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/felhom-drives/media_a
Oct 14 20:10:44 felhom felhom-agent[1201]: time=2026-10-14T20:10:44.603+02:00 level=INFO msg="reconcile: enrolled drive bound under shared parent (live, no reboot)" vmid=9201 where=/mnt/media_a guest_path=/mnt/felhom-dri
Oct 14 20:10:44 felhom sudo[334670]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/felhom-drives/adatlemez
Oct 14 20:10:44 felhom felhom-agent[1201]: time=2026-10-14T20:10:44.670+02:00 level=INFO msg="reconcile: enrolled drive bound under shared parent (live, no reboot)" vmid=9201 where=/mnt/adatlemez guest_path=/mnt/felhom-d
Oct 14 20:10:44 felhom felhom-agent[1201]: time=2026-10-14T20:10:44.670+02:00 level=WARN msg="reconcile: enrolled drive not present (durable-id absent) — skipping" vmid=9201 durable_id=uuid:e15652d5-0aa7-4eb8-93a1-afb2
@@ -0,0 +1 @@
Counter({('tv-drive-b', 'queuedUP'): 4, ('tv-drive-a', 'queuedUP'): 3, ('tv-drive-a', 'stalledUP'): 2, ('movies-drive-b', 'queuedUP'): 1, ('movies-drive-a', 'stalledUP'): 1})
@@ -0,0 +1,24 @@
2026-10-14T20:41:00+02:00
update VM 341: -scsi3 nvme-scratch:341/vm-341-disk-4.raw,backup=0
rc=0
scsi3: nvme-scratch:341/vm-341-disk-4.raw,backup=0,size=100G
2026-10-14T20:41:48+02:00
sdc 100G /mnt/media_a
sde 100G /mnt/media_b
|-/mnt/media_b /dev/sde ext4 rw,relatime
| `-/mnt/felhom-drives/media_b /dev/sde[/felhom-data] ext4 rw,relatime
Oct 14 20:41:24 felhom felhom-agent[1201]: time=2026-10-14T20:41:24.762+02:00 level=INFO msg="reconcile: enrolled drive bound under shared parent (live, no reboot)" vmid=9201 where=/mnt/media_b guest_path=/mnt/felhom-dri
Oct 14 20:41:44 felhom sudo[401123]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/felhom-drives
Oct 14 20:41:44 felhom sudo[401200]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/felhom-drives/media_a
Oct 14 20:41:44 felhom felhom-agent[1201]: time=2026-10-14T20:41:44.579+02:00 level=INFO msg="reconcile: enrolled drive bound under shared parent (live, no reboot)" vmid=9201 where=/mnt/media_a guest_path=/mnt/felhom-dri
Oct 14 20:41:44 felhom sudo[401212]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/felhom-drives/adatlemez
Oct 14 20:41:44 felhom felhom-agent[1201]: time=2026-10-14T20:41:44.646+02:00 level=INFO msg="reconcile: enrolled drive bound under shared parent (live, no reboot)" vmid=9201 where=/mnt/adatlemez guest_path=/mnt/felhom-d
Oct 14 20:41:44 felhom sudo[401218]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/media_b/felhom-data
Oct 14 20:41:44 felhom sudo[401221]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/chown 100000:100000 /mnt/media_b/felhom-data
Oct 14 20:41:44 felhom sudo[401225]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/bin/mkdir -p /mnt/felhom-drives/media_b
Oct 14 20:41:44 felhom felhom-agent[1201]: time=2026-10-14T20:41:44.710+02:00 level=INFO msg="reconcile: enrolled drive bound under shared parent (live, no reboot)" vmid=9201 where=/mnt/media_b guest_path=/mnt/felhom-dri
Oct 14 20:41:46 felhom sudo[401300]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/sbin/smartctl -a -j /dev/sde
Oct 14 20:41:47 felhom sudo[401340]: felhom-agent : PWD=/ ; USER=root ; COMMAND=/usr/sbin/smartctl -a -j /dev/sde
`-/mnt/felhom-drives/media_b /dev/sde[/felhom-data]
|-/mnt/felhom-drives/media_b /dev/sde[/felhom-data]
@@ -0,0 +1,29 @@
20:42:20 sonarr before restart button: 2026-10-14T15:46:33.691456Z | ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error |
20:42:20 dashboard restart sonarr -> 200 {'ok': True, 'data': {'state': 'running'}, 'message': 'Stack sonarr re
20:42:45 sonarr after restart button: 2026-10-14T15:46:33.691456Z | ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error |
20:42:48 sonarr stop -> 200
20:42:52 radarr stop -> 200
20:42:54 qbittorrent stop -> 200
20:42:59 transmission stop -> 200
20:43:08 plex stop -> 200
20:43:08 jellyfin stop -> 200
20:43:24 sonarr start -> 200
20:43:25 radarr start -> 200
20:43:26 qbittorrent start -> 200
20:43:27 transmission start -> 200
20:43:28 plex start -> 200
20:43:30 jellyfin start -> 200
20:44:49 sonarr after stop+start: 2026-10-14T18:43:24.157626948Z | American Horror Story |
20:44:52 radarr after stop+start: 2026-10-14T18:43:25.147093183Z | American Horror Story |
20:44:55 qbittorrent after stop+start: 2026-10-14T18:43:25.950203755Z | American Horror Story |
20:44:58 transmission after stop+start: 2026-10-14T18:43:26.870494477Z | American Horror Story |
20:45:02 plex after stop+start: 2026-10-14T18:43:28.207524035Z | American Horror Story |
20:45:05 jellyfin after stop+start: 2026-10-14T18:43:29.327411356Z | American Horror Story |
started=2026-10-14T15:28:04.13026562Z
ls: /srv/media_b/media/tv: I/O error
20:46:09 filebrowser stop -> 403 {'ok': False, 'error': 'cannot stop protected stack filebrowser'}
20:46:17 filebrowser start -> 403 {'ok': False, 'error': 'cannot start protected stack filebrowser'}
started=2026-10-14T15:28:04.13026562Z healthy
ls: /srv/media_b/media/tv: I/O error
@@ -0,0 +1,101 @@
== drive adatlemez (/mnt/felhom-drives/adatlemez/userdata/media)
== drive media_a (/mnt/felhom-drives/media_a/userdata/media)
-- movies/ (1 file(s))
4697.5 MB links=2 inode=4194391 movies/Hope (2026)/Hope.2026.720p.AMZN.WEB-DL.DDP5.1.Atmos.H.264-N1H4L.mkv
-- torrents/ (16 file(s))
909.5 MB links=2 inode=4194364 torrents/tv/Avatar.Seven.Havens.S01E01.1080p.WEB.h264-GRACE/Avatar.Seven.Havens.S01E01.1080p.WEB.h264-GRACE.mkv
0.0 MB links=1 inode=4194376 torrents/tv/Avatar.Seven.Havens.S01E01.1080p.WEB.h264-GRACE/avatar.seven.havens.s01e01.1080p.web.h264-grace.nfo
35.2 MB links=1 inode=4194366 torrents/tv/Avatar.Seven.Havens.S01E01.1080p.WEB.h264-GRACE/Sample/avatar.seven.havens.s01e01.1080p.web.h264-grace.sample.mkv
3789.5 MB links=1 inode=4194398 torrents/tv/Slow.Horses.S06E05.Sayonara.1080p.ATVP.WEB-DL.DDP5.1.H.264-NTb/Slow.Horses.S06E05.Sayonara.1080p.ATVP.WEB-DL.DDP5.1.H.264-NTb.mkv
0.0 MB links=1 inode=4194400 torrents/tv/Slow.Horses.S06E05.Sayonara.1080p.ATVP.WEB-DL.DDP5.1.H.264-NTb/Slow.Horses.S06E05.Sayonara.1080p.ATVP.WEB-DL.DDP5.1.H.264-NTb.nfo
3931.2 MB links=1 inode=4194385 torrents/tv/Slow.Horses.S06E03.1080p.WEB.H264-CAKES/slow.horses.s06e03.1080p.web.h264-cakes.mkv
0.0 MB links=1 inode=4194367 torrents/tv/Slow.Horses.S06E03.1080p.WEB.H264-CAKES/slow.horses.s06e03.1080p.web.h264-cakes.nfo
85.8 MB links=1 inode=4194392 torrents/tv/Slow.Horses.S06E03.1080p.WEB.H264-CAKES/Sample/slow.horses.s06e03.1080p.web.h264-cakes-sample.mkv
0.0 MB links=1 inode=4194397 torrents/tv/Slow.Horses.S06E02.PROPER.1080p.WEB.h264-ETHEL/slow.horses.s06e02.proper.1080p.web.h264-ethel.nfo
3758.3 MB links=1 inode=4194369 torrents/tv/Slow.Horses.S06E02.PROPER.1080p.WEB.h264-ETHEL/Slow.Horses.S06E02.PROPER.1080p.WEB.h264-ETHEL.mkv
77.7 MB links=1 inode=4194383 torrents/tv/Slow.Horses.S06E02.PROPER.1080p.WEB.h264-ETHEL/Sample/slow.horses.s06e02.proper.1080p.web.h264-ethel.sample.mkv
720.3 MB links=2 inode=4194368 torrents/tv/Avatar.Seven.Havens.S01E03.1080p.WEB.h264-GRACE/Avatar.Seven.Havens.S01E03.1080p.WEB.h264-GRACE.mkv
0.0 MB links=1 inode=4194377 torrents/tv/Avatar.Seven.Havens.S01E03.1080p.WEB.h264-GRACE/avatar.seven.havens.s01e03.1080p.web.h264-grace.nfo
21.7 MB links=1 inode=4194370 torrents/tv/Avatar.Seven.Havens.S01E03.1080p.WEB.h264-GRACE/Sample/avatar.seven.havens.s01e03.1080p.web.h264-grace.sample.mkv
0.0 MB links=1 inode=4194405 torrents/movies/Hope.2026.720p.AMZN.WEB-DL.DDP5.1.Atmos.H.264-N1H4L/Hope.2026.720p.AMZN.WEB-DL.DDP5.1.Atmos.H.264-N1H4L.nfo
4697.5 MB links=2 inode=4194391 torrents/movies/Hope.2026.720p.AMZN.WEB-DL.DDP5.1.Atmos.H.264-N1H4L/Hope.2026.720p.AMZN.WEB-DL.DDP5.1.Atmos.H.264-N1H4L.mkv
-- transmission/ (12 file(s))
4039.9 MB links=1 inode=4194396 transmission/tv/Slow.Horses.S06E04.1080p.WEB.H264-CAKES/slow.horses.s06e04.1080p.web.h264-cakes.mkv
0.0 MB links=1 inode=4194399 transmission/tv/Slow.Horses.S06E04.1080p.WEB.H264-CAKES/slow.horses.s06e04.1080p.web.h264-cakes.nfo
94.2 MB links=1 inode=4194395 transmission/tv/Slow.Horses.S06E04.1080p.WEB.H264-CAKES/Sample/slow.horses.s06e04.1080p.web.h264-cakes-sample.mkv
3859.1 MB links=1 inode=4194387 transmission/tv/Slow.Horses.S06E01.1080p.WEB.H264-CAKES/slow.horses.s06e01.1080p.web.h264-cakes.mkv
0.0 MB links=1 inode=4194388 transmission/tv/Slow.Horses.S06E01.1080p.WEB.H264-CAKES/slow.horses.s06e01.1080p.web.h264-cakes.nfo
104.1 MB links=1 inode=4194390 transmission/tv/Slow.Horses.S06E01.1080p.WEB.H264-CAKES/Sample/slow.horses.s06e01.1080p.web.h264-cakes-sample.mkv
0.0 MB links=1 inode=4194374 transmission/tv/Avatar.Seven.Havens.S01E02.1080p.WEB.h264-GRACE/avatar.seven.havens.s01e02.1080p.web.h264-grace.nfo
829.6 MB links=2 inode=4194375 transmission/tv/Avatar.Seven.Havens.S01E02.1080p.WEB.h264-GRACE/Avatar.Seven.Havens.S01E02.1080p.WEB.h264-GRACE.mkv
31.2 MB links=1 inode=4194373 transmission/tv/Avatar.Seven.Havens.S01E02.1080p.WEB.h264-GRACE/Sample/avatar.seven.havens.s01e02.1080p.web.h264-grace.sample.mkv
2819.9 MB links=1 inode=4194408 transmission/movies/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY.mkv
0.0 MB links=1 inode=4194409 transmission/movies/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY.nfo
22.7 MB links=1 inode=4194411 transmission/movies/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY/Sample/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY-Sample.mkv
-- tv/ (3 file(s))
909.5 MB links=2 inode=4194364 tv/Avatar - Seven Havens/Season 1/Avatar.Seven.Havens.S01E01.1080p.WEB.h264-GRACE.mkv
720.3 MB links=2 inode=4194368 tv/Avatar - Seven Havens/Season 1/Avatar.Seven.Havens.S01E03.1080p.WEB.h264-GRACE.mkv
829.6 MB links=2 inode=4194375 tv/Avatar - Seven Havens/Season 1/Avatar.Seven.Havens.S01E02.1080p.WEB.h264-GRACE.mkv
== drive media_b (/mnt/felhom-drives/media_b/userdata/media)
-- movies/ (2 file(s))
3393.8 MB links=2 inode=1048578 movies/Matchbox the Movie (2026)/Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5.1.Atmos.H.264-FLUX.mkv
2819.9 MB links=1 inode=2097156 movies/WHO (2026)/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY.mkv
-- torrents/ (10 file(s))
3393.8 MB links=2 inode=1048578 torrents/movies/Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5.1.Atmos.H.264-FLUX/Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5.1.Atmos.H.264-FLUX.mkv
0.0 MB links=1 inode=1048579 torrents/movies/Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5.1.Atmos.H.264-FLUX/Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5.1.Atmos.H.264-FLUX.nfo
0.0 MB links=1 inode=131101 torrents/tv/American.Horror.Story.S13E01.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E01.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.nfo
1314.1 MB links=2 inode=131100 torrents/tv/American.Horror.Story.S13E01.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E01.13.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
813.6 MB links=2 inode=131110 torrents/tv/American.Horror.Story.S13E03.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E03.Rauhnacht.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
0.0 MB links=1 inode=131113 torrents/tv/American.Horror.Story.S13E03.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E03.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.nfo
956.5 MB links=2 inode=393221 torrents/tv/American.Horror.Story.S13E07.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E07.The.Baddest.Witch.of.Them.All.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
0.0 MB links=1 inode=393223 torrents/tv/American.Horror.Story.S13E07.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E07.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.nfo
969.7 MB links=2 inode=393218 torrents/tv/American.Horror.Story.S13E05.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E05.Date.Night.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
0.0 MB links=1 inode=393220 torrents/tv/American.Horror.Story.S13E05.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E05.Date.Night.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.nfo
-- transmission/ (8 file(s))
1274.2 MB links=2 inode=131103 transmission/tv/American.Horror.Story.S13E02.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E02.1.13.AM.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
0.0 MB links=1 inode=131104 transmission/tv/American.Horror.Story.S13E02.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E02.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.nfo
1164.1 MB links=2 inode=131107 transmission/tv/American.Horror.Story.S13E04.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E04.Is.That.All.There.Is.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
0.0 MB links=1 inode=131108 transmission/tv/American.Horror.Story.S13E04.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E04.Is.That.All.There.Is.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.nfo
1149.4 MB links=2 inode=262146 transmission/tv/American.Horror.Story.S13E08.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E08.Hell.No.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
0.0 MB links=1 inode=262147 transmission/tv/American.Horror.Story.S13E08.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E08.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.nfo
913.5 MB links=2 inode=131112 transmission/tv/American.Horror.Story.S13E06.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E06.The.Return.of.Devils.Night.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv
0.0 MB links=1 inode=131114 transmission/tv/American.Horror.Story.S13E06.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB/American.Horror.Story.S13E06.The.Return.of.Devils.Night.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.nfo
-- tv/ (13 file(s))
1164.1 MB links=2 inode=131107 tv/American Horror Story/Season 13/American.Horror.Story.S13E04.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
1314.1 MB links=2 inode=131100 tv/American Horror Story/Season 13/American.Horror.Story.S13E01.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
913.5 MB links=2 inode=131112 tv/American Horror Story/Season 13/American.Horror.Story.S13E06.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
956.5 MB links=2 inode=393221 tv/American Horror Story/Season 13/American.Horror.Story.S13E07.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
813.6 MB links=2 inode=131110 tv/American Horror Story/Season 13/American.Horror.Story.S13E03.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
1274.2 MB links=2 inode=131103 tv/American Horror Story/Season 13/American.Horror.Story.S13E02.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
969.7 MB links=2 inode=393218 tv/American Horror Story/Season 13/American.Horror.Story.S13E05.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
1149.4 MB links=2 inode=262146 tv/American Horror Story/Season 13/American.Horror.Story.S13E08.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
3789.5 MB links=1 inode=524295 tv/Slow Horses/Season 6/Slow.Horses.S06E05.Sayonara.1080p.ATVP.WEB-DL.DDP5.1.H.264-NTb.mkv
3859.1 MB links=1 inode=524298 tv/Slow Horses/Season 6/Slow.Horses.S06E01.1080p.WEB.H264-CAKES.mkv
4039.9 MB links=1 inode=524299 tv/Slow Horses/Season 6/Slow.Horses.S06E04.1080p.WEB.H264-CAKES.mkv
3758.3 MB links=1 inode=524296 tv/Slow Horses/Season 6/Slow.Horses.S06E02.PROPER.1080p.WEB.h264-ETHEL.mkv
3931.2 MB links=1 inode=524297 tv/Slow Horses/Season 6/Slow.Horses.S06E03.1080p.WEB.H264-CAKES.mkv
== 65 file(s) on 3 drive(s)
== ONE FILE, TWO NAMES (hardlink — no extra copy):
drive media_a inode 4194391 (4697.5 MB): movies/…/Hope.2026.720p.AMZN.WEB-DL.DDP5.1.Atmos.H.264-N1H4L.mkv <-> torrents/…/Hope.2026.720p.AMZN.WEB-DL.DDP5.1.Atmos.H.264-N1H4L.mkv
drive media_a inode 4194364 (909.5 MB): torrents/…/Avatar.Seven.Havens.S01E01.1080p.WEB.h264-GRACE.mkv <-> tv/…/Avatar.Seven.Havens.S01E01.1080p.WEB.h264-GRACE.mkv
drive media_a inode 4194368 (720.3 MB): torrents/…/Avatar.Seven.Havens.S01E03.1080p.WEB.h264-GRACE.mkv <-> tv/…/Avatar.Seven.Havens.S01E03.1080p.WEB.h264-GRACE.mkv
drive media_a inode 4194375 (829.6 MB): transmission/…/Avatar.Seven.Havens.S01E02.1080p.WEB.h264-GRACE.mkv <-> tv/…/Avatar.Seven.Havens.S01E02.1080p.WEB.h264-GRACE.mkv
drive media_b inode 1048578 (3393.8 MB): movies/…/Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5.1.Atmos.H.264-FLUX.mkv <-> torrents/…/Matchbox.The.Movie.2026.720p.ATVP.WEB-DL.DDP5.1.Atmos.H.264-FLUX.mkv
drive media_b inode 131100 (1314.1 MB): torrents/…/American.Horror.Story.S13E01.13.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E01.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
drive media_b inode 131110 (813.6 MB): torrents/…/American.Horror.Story.S13E03.Rauhnacht.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E03.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
drive media_b inode 393221 (956.5 MB): torrents/…/American.Horror.Story.S13E07.The.Baddest.Witch.of.Them.All.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E07.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
drive media_b inode 393218 (969.7 MB): torrents/…/American.Horror.Story.S13E05.Date.Night.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E05.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
drive media_b inode 131103 (1274.2 MB): transmission/…/American.Horror.Story.S13E02.1.13.AM.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E02.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
drive media_b inode 131107 (1164.1 MB): transmission/…/American.Horror.Story.S13E04.Is.That.All.There.Is.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E04.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
drive media_b inode 262146 (1149.4 MB): transmission/…/American.Horror.Story.S13E08.Hell.No.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E08.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
drive media_b inode 131112 (913.5 MB): transmission/…/American.Horror.Story.S13E06.The.Return.of.Devils.Night.1080p.DSNP.WEB-DL.DD5.1.H.264-playWEB.mkv <-> tv/…/American.Horror.Story.S13E06.1080p.DSNP.WEB-DL.DDP5.1.H.264-PlayWEB.mkv
13 pair(s)
== LIBRARY FILES WITH LINK COUNT 1 (a copy, or its download is gone):
drive media_b: media_b/userdata/media/movies/WHO (2026)/Who.2026.720p.DSNP.WEB-DL.DDP5.1.H.264.HuNSUB-TRiNiTY.mkv (2819.9 MB)
drive media_b: media_b/userdata/media/tv/Slow Horses/Season 6/Slow.Horses.S06E05.Sayonara.1080p.ATVP.WEB-DL.DDP5.1.H.264-NTb.mkv (3789.5 MB)
drive media_b: media_b/userdata/media/tv/Slow Horses/Season 6/Slow.Horses.S06E01.1080p.WEB.H264-CAKES.mkv (3859.1 MB)
drive media_b: media_b/userdata/media/tv/Slow Horses/Season 6/Slow.Horses.S06E04.1080p.WEB.H264-CAKES.mkv (4039.9 MB)
drive media_b: media_b/userdata/media/tv/Slow Horses/Season 6/Slow.Horses.S06E02.PROPER.1080p.WEB.h264-ETHEL.mkv (3758.3 MB)
drive media_b: media_b/userdata/media/tv/Slow Horses/Season 6/Slow.Horses.S06E03.1080p.WEB.H264-CAKES.mkv (3931.2 MB)
@@ -0,0 +1,178 @@
===== BEFORE 2026-10-14T18:10:11+0000
guest: is media_b a mountpoint: yes | ls B: audiobooks books comics
guest rootfs under media_b (only if not a mountpoint):
sonarr running healthy started=2026-10-14T15:46:33.691456Z | B/tv: American Horror Story Slow Horses
radarr running healthy started=2026-10-14T15:46:34.33316681Z | B/tv: American Horror Story Slow Horses
qbittorrent running healthy started=2026-10-14T15:46:32.525118942Z | B/tv: American Horror Story Slow Horses
transmission running healthy started=2026-10-14T15:46:33.100564276Z | B/tv: American Horror Story Slow Horses
plex running healthy started=2026-10-14T16:04:53.476264772Z | B/tv: American Horror Story Slow Horses
jellyfin running healthy started=2026-10-14T17:34:00.700911891Z | B/tv: American Horror Story Slow Horses
filebrowser running healthy started=2026-10-14T15:28:04.13026562Z | B/tv: adatlemez beolvasas media_a media_b
sonarr health (200): []
sonarr root folders: [('media_a', True), ('media_b', True)]
sonarr series: [('Avatar: Seven Have', 3), ('American Horror St', 8), ('Slow Horses', 5)]
radarr health (200): [('RemotePathMappingCheck', 'You are using docker; download client qBittorrent drive-a places downloads in /mnt/felhom-')]
radarr root folders: [('media_a', True), ('media_b', True)]
radarr movie: [('Hope', True), ('Matchbox the Movie', True), ('WHO', True)]
plex section 1 (200): ['Hope', 'Matchbox the Movie', 'Who']
plex section 2 (200): ['American Horror Story', 'Avatar: Seven Havens', 'Slow Horses']
plex episodes: 16
jellyfin: {'Series': 3, 'Movie': 3, 'Episode': 16} ['Amerikai Horror Story', 'Avatar: Seven Havens', 'Hope - Remény', 'Matchbox', 'Roger nyúl a pácban', 'Utolsó befutók']
controller log (last 10 min, gate/storage/event):
0
===== S5-plus-1min 2026-10-14T18:11:17+0000
guest: is media_b a mountpoint: yes | ls B: ls: reading directory '/mnt/felhom-drives/media_b/userdata/media': Input/output error
guest rootfs under media_b (only if not a mountpoint):
sonarr running healthy started=2026-10-14T15:46:33.691456Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
radarr running healthy started=2026-10-14T15:46:34.33316681Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
qbittorrent running healthy started=2026-10-14T15:46:32.525118942Z | B/tv: ls: /mnt/felhom-drives/media_b/userdata/media/tv: I/O error
transmission running healthy started=2026-10-14T15:46:33.100564276Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
plex running healthy started=2026-10-14T16:04:53.476264772Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
jellyfin running healthy started=2026-10-14T17:34:00.700911891Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
filebrowser running healthy started=2026-10-14T15:28:04.13026562Z | B/tv: adatlemez beolvasas media_a media_b
sonarr health (200): []
sonarr root folders: [('media_a', True), ('media_b', False)]
sonarr series: [('Avatar: Seven Have', 3), ('American Horror St', 8), ('Slow Horses', 5)]
radarr health (200): [('RemotePathMappingCheck', 'You are using docker; download client qBittorrent drive-a places downloads in /mnt/felhom-')]
radarr root folders: [('media_a', True), ('media_b', False)]
radarr movie: [('Hope', True), ('Matchbox the Movie', True), ('WHO', True)]
plex section 1 (200): ['Hope', 'Matchbox the Movie', 'Who']
plex section 2 (200): ['American Horror Story', 'Avatar: Seven Havens', 'Slow Horses']
plex episodes: 16
jellyfin: {'Series': 3, 'Movie': 3, 'Episode': 16} ['Amerikai Horror Story', 'Avatar: Seven Havens', 'Hope - Remény', 'Matchbox', 'Roger nyúl a pácban', 'Utolsó befutók']
controller log (last 10 min, gate/storage/event):
2026/10/14 18:10:47 [INFO] [settings] Storage path /mnt/felhom-drives/media_b disconnected=true
2026/10/14 18:10:47 [WARN] [gate] drive ABSENT /mnt/felhom-drives/media_b — stopped+blocked 0 app(s): []
2026/10/14 18:10:47 [WARN] [web] FileBrowser: could not ensure userdata skeleton on /mnt/felhom-drives/media_b: chmod /mnt/felhom-drives/media_b/userdata: input/output error
2026/10/14 18:10:47 [INFO] Event pushed: storage_disconnected (error) [hu-only] — Meghajtó váratlanul leválasztva: Media B
2026/10/14 18:10:47 [INFO] [web] FileBrowser sync — no config/compose change, ensured running without recreate (3 storage path(s))
===== S5 +5 min (pulled 20:10:23) 2026-10-14T18:15:26+0000
guest: is media_b a mountpoint: yes | ls B: ls: reading directory '/mnt/felhom-drives/media_b/userdata/media': Input/output error
guest rootfs under media_b (only if not a mountpoint):
sonarr running healthy started=2026-10-14T15:46:33.691456Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
radarr running healthy started=2026-10-14T15:46:34.33316681Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
qbittorrent running healthy started=2026-10-14T15:46:32.525118942Z | B/tv: ls: /mnt/felhom-drives/media_b/userdata/media/tv: I/O error
transmission running healthy started=2026-10-14T15:46:33.100564276Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
plex running healthy started=2026-10-14T16:04:53.476264772Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
jellyfin running healthy started=2026-10-14T17:34:00.700911891Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
filebrowser running healthy started=2026-10-14T15:28:04.13026562Z | B/tv: adatlemez beolvasas media_a media_b
sonarr health (200): []
sonarr root folders: [('media_a', True), ('media_b', False)]
sonarr series: [('Avatar: Seven Have', 3), ('American Horror St', 8), ('Slow Horses', 5)]
radarr health (200): [('RemotePathMappingCheck', 'You are using docker; download client qBittorrent drive-a places downloads in /mnt/felhom-')]
radarr root folders: [('media_a', True), ('media_b', False)]
radarr movie: [('Hope', True), ('Matchbox the Movie', True), ('WHO', True)]
plex section 1 (200): ['Hope', 'Matchbox the Movie', 'Who']
plex section 2 (200): ['American Horror Story', 'Avatar: Seven Havens', 'Slow Horses']
plex episodes: 16
jellyfin: {'Series': 3, 'Movie': 3, 'Episode': 16} ['Amerikai Horror Story', 'Avatar: Seven Havens', 'Hope - Remény', 'Matchbox', 'Roger nyúl a pácban', 'Utolsó befutók']
controller log (last 10 min, gate/storage/event):
2026/10/14 18:10:47 [INFO] [settings] Storage path /mnt/felhom-drives/media_b disconnected=true
2026/10/14 18:10:47 [WARN] [gate] drive ABSENT /mnt/felhom-drives/media_b — stopped+blocked 0 app(s): []
2026/10/14 18:10:47 [WARN] [web] FileBrowser: could not ensure userdata skeleton on /mnt/felhom-drives/media_b: chmod /mnt/felhom-drives/media_b/userdata: input/output error
2026/10/14 18:10:47 [INFO] Event pushed: storage_disconnected (error) [hu-only] — Meghajtó váratlanul leválasztva: Media B
2026/10/14 18:10:47 [INFO] [web] FileBrowser sync — no config/compose change, ensured running without recreate (3 storage path(s))
2026/10/14 18:13:44 [INFO] Event pushed: health_degraded (warning) [hu-only] — Rendszer állapot romlott (volt: ok)
===== S5 +15 min (pulled 20:10:23) 2026-10-14T18:25:30+0000
guest: is media_b a mountpoint: yes | ls B: ls: reading directory '/mnt/felhom-drives/media_b/userdata/media': Input/output error
guest rootfs under media_b (only if not a mountpoint):
sonarr running healthy started=2026-10-14T15:46:33.691456Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
radarr running healthy started=2026-10-14T15:46:34.33316681Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
qbittorrent running healthy started=2026-10-14T15:46:32.525118942Z | B/tv: ls: /mnt/felhom-drives/media_b/userdata/media/tv: I/O error
transmission running healthy started=2026-10-14T15:46:33.100564276Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
plex running healthy started=2026-10-14T16:04:53.476264772Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
jellyfin running healthy started=2026-10-14T17:34:00.700911891Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
filebrowser running healthy started=2026-10-14T15:28:04.13026562Z | B/tv: adatlemez beolvasas media_a media_b
sonarr health (200): []
sonarr root folders: [('media_a', True), ('media_b', False)]
sonarr series: [('Avatar: Seven Have', 3), ('American Horror St', 8), ('Slow Horses', 5)]
radarr health (200): [('RemotePathMappingCheck', 'You are using docker; download client qBittorrent drive-a places downloads in /mnt/felhom-')]
radarr root folders: [('media_a', True), ('media_b', False)]
radarr movie: [('Hope', True), ('Matchbox the Movie', True), ('WHO', True)]
plex section 1 (200): ['Hope', 'Matchbox the Movie', 'Who']
plex section 2 (200): ['American Horror Story', 'Avatar: Seven Havens', 'Slow Horses']
plex episodes: 16
jellyfin: {'Series': 3, 'Movie': 3, 'Episode': 16} ['Amerikai Horror Story', 'Avatar: Seven Havens', 'Hope - Remény', 'Matchbox', 'Roger nyúl a pácban', 'Utolsó befutók']
controller log (last 10 min, gate/storage/event):
===== S5 +30 min (pulled 20:10:23) 2026-10-14T18:40:34+0000
guest: is media_b a mountpoint: yes | ls B: ls: reading directory '/mnt/felhom-drives/media_b/userdata/media': Input/output error
guest rootfs under media_b (only if not a mountpoint):
sonarr running healthy started=2026-10-14T15:46:33.691456Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
radarr running healthy started=2026-10-14T15:46:34.33316681Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
qbittorrent running healthy started=2026-10-14T15:46:32.525118942Z | B/tv: ls: /mnt/felhom-drives/media_b/userdata/media/tv: I/O error
transmission running healthy started=2026-10-14T15:46:33.100564276Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
plex running healthy started=2026-10-14T16:04:53.476264772Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
jellyfin running healthy started=2026-10-14T17:34:00.700911891Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
filebrowser running healthy started=2026-10-14T15:28:04.13026562Z | B/tv: adatlemez beolvasas media_a media_b
sonarr health (200): []
sonarr root folders: [('media_a', True), ('media_b', False)]
sonarr series: [('Avatar: Seven Have', 3), ('American Horror St', 8), ('Slow Horses', 5)]
radarr health (200): [('RemotePathMappingCheck', 'You are using docker; download client qBittorrent drive-a places downloads in /mnt/felhom-')]
radarr root folders: [('media_a', True), ('media_b', False)]
radarr movie: [('Hope', True), ('Matchbox the Movie', True), ('WHO', True)]
plex section 1 (200): ['Hope', 'Matchbox the Movie', 'Who']
plex section 2 (200): ['American Horror Story', 'Avatar: Seven Havens', 'Slow Horses']
plex episodes: 16
jellyfin: {'Series': 3, 'Movie': 3, 'Episode': 16} ['Amerikai Horror Story', 'Avatar: Seven Havens', 'Hope - Remény', 'Matchbox', 'Roger nyúl a pácban', 'Utolsó befutók']
controller log (last 10 min, gate/storage/event):
===== S6 +1 min (re-attached 20:41:00), BEFORE any app restart 2026-10-14T18:41:56+0000
guest: is media_b a mountpoint: yes | ls B: audiobooks books comics
guest rootfs under media_b (only if not a mountpoint):
sonarr running healthy started=2026-10-14T15:46:33.691456Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
radarr running healthy started=2026-10-14T15:46:34.33316681Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
qbittorrent running healthy started=2026-10-14T15:46:32.525118942Z | B/tv: ls: /mnt/felhom-drives/media_b/userdata/media/tv: I/O error
transmission running healthy started=2026-10-14T15:46:33.100564276Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': I/O error
plex running healthy started=2026-10-14T16:04:53.476264772Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
jellyfin running healthy started=2026-10-14T17:34:00.700911891Z | B/tv: ls: cannot access '/mnt/felhom-drives/media_b/userdata/media/tv': Input/output error
filebrowser running healthy started=2026-10-14T15:28:04.13026562Z | B/tv: adatlemez beolvasas media_a media_b
sonarr health (200): []
sonarr root folders: [('media_a', True), ('media_b', False)]
sonarr series: [('Avatar: Seven Have', 3), ('American Horror St', 8), ('Slow Horses', 5)]
radarr health (200): [('RemotePathMappingCheck', 'You are using docker; download client qBittorrent drive-a places downloads in /mnt/felhom-')]
radarr root folders: [('media_a', True), ('media_b', False)]
radarr movie: [('Hope', True), ('Matchbox the Movie', True), ('WHO', True)]
plex section 1 (200): ['Hope', 'Matchbox the Movie', 'Who']
plex section 2 (200): ['American Horror Story', 'Avatar: Seven Havens', 'Slow Horses']
plex episodes: 16
jellyfin: {'Series': 3, 'Movie': 3, 'Episode': 16} ['Amerikai Horror Story', 'Avatar: Seven Havens', 'Hope - Remény', 'Matchbox', 'Roger nyúl a pácban', 'Utolsó befutók']
controller log (last 10 min, gate/storage/event):
2026/10/14 18:41:18 [INFO] [gate] drive RETURNED /mnt/felhom-drives/media_b — re-attached + restarted gate-stopped apps
2026/10/14 18:41:18 [INFO] Event pushed: storage_reconnected (info) [hu-only] — Meghajtó újra csatlakoztatva: Media B
2026/10/14 18:41:18 [INFO] [web] FileBrowser sync — no config/compose change, ensured running without recreate (3 storage path(s))
===== S6 after stop+start of the six media apps 2026-10-14T18:45:17+0000
guest: is media_b a mountpoint: yes | ls B: audiobooks books comics
guest rootfs under media_b (only if not a mountpoint):
sonarr running healthy started=2026-10-14T18:43:24.157626948Z | B/tv: American Horror Story Slow Horses
radarr running healthy started=2026-10-14T18:43:25.147093183Z | B/tv: American Horror Story Slow Horses
qbittorrent running healthy started=2026-10-14T18:43:25.950203755Z | B/tv: American Horror Story Slow Horses
transmission running healthy started=2026-10-14T18:43:26.870494477Z | B/tv: American Horror Story Slow Horses
plex running healthy started=2026-10-14T18:43:28.207524035Z | B/tv: American Horror Story Slow Horses
jellyfin running healthy started=2026-10-14T18:43:29.327411356Z | B/tv: American Horror Story Slow Horses
filebrowser running healthy started=2026-10-14T15:28:04.13026562Z | B/tv: adatlemez beolvasas media_a media_b
sonarr health (200): []
sonarr root folders: [('media_a', True), ('media_b', True)]
sonarr series: [('Avatar: Seven Have', 3), ('American Horror St', 8), ('Slow Horses', 5)]
radarr health (200): []
radarr root folders: [('media_a', True), ('media_b', True)]
radarr movie: [('Hope', True), ('Matchbox the Movie', True), ('WHO', True)]
plex section 1 (200): ['Hope', 'Matchbox the Movie', 'Who']
plex section 2 (200): ['American Horror Story', 'Avatar: Seven Havens', 'Slow Horses']
plex episodes: 16
jellyfin: {'Series': 3, 'Movie': 3, 'Episode': 16} ['Amerikai Horror Story', 'Avatar: Seven Havens', 'Hope - Remény', 'Matchbox', 'Roger nyúl a pácban', 'Utolsó befutók']
controller log (last 10 min, gate/storage/event):
2026/10/14 18:41:18 [INFO] [gate] drive RETURNED /mnt/felhom-drives/media_b — re-attached + restarted gate-stopped apps
2026/10/14 18:41:18 [INFO] Event pushed: storage_reconnected (info) [hu-only] — Meghajtó újra csatlakoztatva: Media B
2026/10/14 18:41:18 [INFO] [web] FileBrowser sync — no config/compose change, ensured running without recreate (3 storage path(s))
2026/10/14 18:43:44 [INFO] Event pushed: health_recovered (info) [hu-only] — Rendszer állapot helyreállt: ok (volt: warn)
@@ -0,0 +1,72 @@
#!/usr/bin/env python3
"""snap.py <label> — S5/S6: one snapshot of what every layer says about the drives, run INSIDE the guest.
Plex's token and Jellyfin's password are read at runtime (Plex: its Preferences.xml; Jellyfin: substituted into the
box's copy of this file by the runner, deleted after) and never printed."""
import json, os, re, subprocess, sys, time, urllib.parse, urllib.request
JFPW = "__JF_PW__"
L = sys.argv[1] if len(sys.argv) > 1 else "snap"
B = "/mnt/felhom-drives/media_b/userdata/media"
def sh(c, t=20):
try:
return subprocess.run(c, shell=True, capture_output=True, text=True, timeout=t).stdout.strip()
except subprocess.TimeoutExpired:
return "<timeout>"
def ip(c):
return sh(f"docker inspect {c} -f '{{{{range .NetworkSettings.Networks}}}}{{{{.IPAddress}}}}{{{{end}}}}'")
def get(url, h=None, t=20):
try:
with urllib.request.urlopen(urllib.request.Request(url, headers=h or {}), timeout=t) as r:
return r.status, json.loads(r.read() or b"null")
except urllib.error.HTTPError as e:
return e.code, None
except Exception as e:
return 0, str(e)[:80]
print(f"===== {L} {time.strftime('%Y-%m-%dT%H:%M:%S%z')}")
print("guest: is media_b a mountpoint:", sh(f"mountpoint -q /mnt/felhom-drives/media_b && echo yes || echo NO"),
"| ls B:", sh(f"timeout 10 ls {B} 2>&1 | head -3 | tr '\\n' ' '"))
print("guest rootfs under media_b (only if not a mountpoint):", sh("mountpoint -q /mnt/felhom-drives/media_b || du -sh /mnt/felhom-drives/media_b 2>&1"))
for c in ("sonarr", "radarr", "qbittorrent", "transmission", "plex", "jellyfin", "filebrowser"):
st = sh(f"docker inspect {c} -f '{{{{.State.Status}}}} {{{{.State.Health.Status}}}} started={{{{.State.StartedAt}}}}' 2>&1")
view = sh(f"docker exec {c} sh -c 'timeout 8 ls /mnt/felhom-drives/media_b/userdata/media/tv 2>&1 | head -2 | tr \"\\n\" \" \"' 2>&1") if c != "filebrowser" else sh("docker exec filebrowser sh -c 'ls /srv 2>&1 | tr \"\\n\" \" \"'")
print(f" {c:12} {st[:60]:60} | B/tv: {view[:110]}")
for app, port in (("sonarr", 8989), ("radarr", 7878)):
k = re.search(r"<ApiKey>([^<]+)", open(f"/var/lib/docker/volumes/{app}_{app}_config/_data/config.xml").read()).group(1)
H = {"X-Api-Key": k, "Host": app}
c, h = get(f"http://{ip(app)}:{port}/api/v3/health", H)
print(f" {app} health ({c}):", [(x['source'], x['message'][:90]) for x in (h or [])])
c, r = get(f"http://{ip(app)}:{port}/api/v3/rootfolder", H)
print(f" {app} root folders:", [(x['path'].split('/')[3], x.get('accessible')) for x in (r or [])])
kind = "series" if app == "sonarr" else "movie"
c, s = get(f"http://{ip(app)}:{port}/api/v3/{kind}", H)
print(f" {app} {kind}:", [(x['title'][:18], (x.get('statistics') or {}).get('episodeFileCount', x.get('hasFile'))) for x in (s or [])])
P = "/var/lib/docker/volumes/plex_plex_config/_data/Library/Application Support/Plex Media Server"
T = re.search(r'PlexOnlineToken="([^"]+)', open(f"{P}/Preferences.xml").read()).group(1)
for sec in (1, 2):
c, d = get(f"http://{ip('plex')}:32400/library/sections/{sec}/all?X-Plex-Token={T}", {"Accept": "application/json"})
mc = (d or {}).get("MediaContainer", {}) if isinstance(d, dict) else {}
print(f" plex section {sec} ({c}):", [m.get("title") for m in mc.get("Metadata", [])])
c, d = get(f"http://{ip('plex')}:32400/library/sections/2/allLeaves?X-Plex-Token={T}", {"Accept": "application/json"})
mc = (d or {}).get("MediaContainer", {}) if isinstance(d, dict) else {}
print(" plex episodes:", mc.get("size"))
A = 'MediaBrowser Client="felhom-test", Device="snap", DeviceId="felhom-snap-1", Version="1"'
try:
jb = f"http://{ip('jellyfin')}:8096"
rq = urllib.request.Request(jb + "/Users/AuthenticateByName", data=json.dumps({"Username": "admin", "Pw": JFPW}).encode(),
headers={"Content-Type": "application/json", "Authorization": A}, method="POST")
tok = json.load(urllib.request.urlopen(rq, timeout=20))["AccessToken"]
c, d = get(jb + "/Items?Recursive=true&IncludeItemTypes=Series,Movie,Episode", {"X-Emby-Token": tok})
items = (d or {}).get("Items", [])
print(" jellyfin:", {t: len([i for i in items if i["Type"] == t]) for t in ("Series", "Movie", "Episode")},
sorted(i["Name"] for i in items if i["Type"] in ("Series", "Movie")))
except Exception as e:
print(" jellyfin: error", str(e)[:100])
print(" controller log (last 10 min, gate/storage/event):")
print(" " + sh("docker logs --since 10m felhom-controller 2>&1 | grep -iE 'gate|storage|disconnect|absent|Event pushed|FileBrowser' | grep -v DEBUG | tail -10 | cut -c1-200").replace("\n", "\n "))
@@ -0,0 +1,15 @@
#!/bin/bash
# snaprun.sh <label> — run snap.py in the Tester 1 guest (stdin, no file args) with Jellyfin's password substituted into
# the piped copy; the guest copy is deleted. Output appended to ../S5-S6/snapshots.txt.
cd "$(dirname "$0")"
python3 - "$1" <<'PY' | sed -E 's/X-Plex-Token=[A-Za-z0-9_-]+/X-Plex-Token=<redacted>/g' | tee -a ../S5-S6/snapshots.txt
import json,os,sys
sys.path.insert(0,"/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
os.environ.setdefault("SC",os.path.expanduser("~/.felhom-tester1")); os.environ.setdefault("TARGET","tester-1")
import box_walk as w
pw=json.load(open(os.path.expanduser("~/.felhom-tester1/secrets.json")))["jellyfin"]["admin"]
src=open("snap.py").read().replace("__JF_PW__",pw)
lab=sys.argv[1].replace('"','')
r=w.sh(w.ssh_args()+[f'pct exec 9201 -- sh -c "cat > /root/.snap.py; timeout 200 python3 /root/.snap.py \'{lab}\' 2>&1; rm -f /root/.snap.py"'],timeout=240,inp=src)
print(r.stdout); print(r.stderr[-800:]) if r.returncode else None
PY
+3 -2
View File
@@ -193,14 +193,15 @@ stopping line that lies.
| **R-878** | Backup & restore | P4 | **A catch-up (R-871) runs the database-dump leg in the DAY, and that leg stops an app with a volume for its copy — the household may notice the stop, and a large volume makes it longer.** MEASURED 2026-10-05 on demo-felhom: the catch-up at 08:25:02 stopped opengist, copied 182.5 KB, started it again — about 1 s, then a few seconds of `health: starting`; the night does exactly the same, unseen. Nothing measured for a large volume. Fix direction (if it matters): skip the volume copy of a running app in a DAYTIME catch-up and leave it to the next night, or warn. `audits/catchup-2026-10-05/partA/live-demo-felhom.txt` | **READY — owner: CC** **2026-10-05 (burn-down night): NEEDS A LIVE MEASUREMENT** — a timed catch-up on 9202 for an app with a multi-GB volume, then the skip-or-warn choice. | — | measure a large volume first | CC |
| **R-32** | Backup & restore | P4 | **[P2-HIGH] RESET must purge the customer base dir; the orphan card must stay honest; unattributed bytes must be visible.** The rehearsal's S7 said in advance that an orphan card would BE a finding — and one appeared (16:58:14). Cause: RESET's `"hetzner":"ok"` leg destroys the sub-account, but **a Hetzner sub-account is an access-control object, not a data object** — its directory survives, so re-enabling offsite recreated an account over the previous lifecycle's ciphertext, encrypted under a key that same RESET had destroyed. **MIGRATED FROM `ROADMAP.md` 2026-08-22 (R-369) — originally filed 2026-07-21, size M, roadmap state `idea`.** Moved verbatim; nothing added or reinterpreted. The roadmap keeps its copy as history, marked moved. | **OPEN — migrated from ROADMAP 2026-08-22, rank unchanged** **2026-10-06 night: design written** (`audits/night-burndown-2026-10-06/design-R-32.md`) — pick A: purge the repo + set-aside copies through the sub-account's own password login BEFORE deleting it (no main-account credential); the „repo data destroyed" comment at `hub/internal/offsite/offsite.go:276-280` is false for the shared tier; part (3) waits on a read-only measurement (`du` on port 23). Operator: agree to route A. **2026-10-07 07:58: `09` §3 decision 167 — option A yes, and delete the old RESET leftovers once.** **2026-10-07 (Part D step 2, read only):** the hub shows bx11 holding 3.3 GB of data while the four live customers account for ~0.6 GB → **~2.7 GB belongs to no live customer**; no live customer shows a set-aside folder, so the leftovers are in homes whose sub-account is gone, reachable only by the pool box's MAIN account. **The one-time clean-up is STOPPED:** no main-account login for bx11 is held on DooPlex (the API token in the credentials file sees no box). Needs: the main-account login, or the operator lists and deletes in the Hetzner console (`audits/day-2026-10-07/D/D2-listing-readonly.txt`). **2026-10-07: option A DELIVERED (hub 0.142.0):** RESET purges the repo and every `.orphaned-*` through the sub-account's own login before deleting it, and keeps the sub-account if the purge fails (red-proved, `audits/day-2026-10-07/D/`). Not yet seen live (no scratch RESET today). **The one-time clean-up of the ~2.7 GB of leftovers is STOPPED:** it needs the pool box's main-account login (see above). **2026-10-07 14:43 — `09` §3 decision 173: leave the ~2.7 GB of old leftovers for now; re-ranked P2 → P4.** Option A itself is delivered (hub 0.142.0). What stays open is ONLY the leftovers: they were computed (box total minus live customers), never listed, and deleting them needs the pool box's MAIN login, which reaches every customer's data. **Blocker: a safe main-account path.** | — | **Ruling from the run (three parts, deliberately separate):** (1) because RESET destroys custody, the ciphertext it leaves behind is unrecoverable **BY DESIGN** → RESET gains a **main-account purge of the customer base dir** (the existing operator ack already covers it); (2) the **move-aside guard STAYS** for reinstall-*without*-RESET — there custody survives and the card's "history recoverable" promise is true (R-26 depends on exactly that); (3) the operator **Restic tab shows per-customer directory bytes vs attributed snapshot bytes**, so dead data cannot hide. Measured on the pool box that night: **49 M attributed** (2 snapshots, 48.717 MiB) against **1.4 G + 3.0 M unattributed** across TWO `.orphaned-*` dirs. Evidence `restic-and-pool.txt` | CC |
## Storage & devices — 7 rows (P2 4, P3 2, P4 1)
## Storage & devices — 8 rows (P2 5, P3 2, P4 1)
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|---|---|---|---|---|---|---|---|
| **R-1027** | Storage & devices | P2 | **„Delete my data too” deletes every bind under the app's drive — read-only and shared ones included.** MEASURED 2026-10-14 on Tester 1: removing a throwaway Plex (drill template: `/mnt/felhom-drives/media_a/userdata/media` bound `:ro`, `HDD_PATH=/mnt/felhom-drives/media_a`) with `remove_hdd_data:true` logged „Removed HDD data: /mnt/felhom-drives/media_a/userdata/media (80K)” — the WHOLE media folder of the drive, which four other apps were using. `ParseComposeHDDMounts` counts a literal path under `HDD_PATH` as the app's own data, and `ProtectedHDDPaths` does not protect `userdata/media` (R-1032). Only an empty test skeleton was lost; it was rebuilt by the controller's next file-browser sync and the apps restarted (`audits/media-all-drives-2026-10-14/``D-plex-remove-deleted.txt`). Today's LIVE templates bind `${USERDATA_PATH}` and are not hit (R-800); **the media-library build (R-1023) would be, unless removal learns that a shared library is never one app's data.** The note „literal binds are never removed” in this session's first draft was WRONG and is retracted. | **READY** — filed 2026-10-14 | — | Removal: never delete a `:ro` bind nor anything under `userdata/`; a test that removes a reader app and asserts the shared folder survives (red-proof first); `15` §8 | CC |
| **R-1023** | Storage & devices | P2 | **Build: media apps see every drive, and the box says when they must restart (operator rulings 2026-10-14, `09` §3).** Scope from `architecture/15-media-library.md`: one bind per drive of `userdata/media/<library folders>` at the same path; the drive-absent gate per bind (today it keys on the app's one `HDD_PATH`, and the boot gate waits only for THAT drive — measured after the 17:25 power cut); the restart notice after a drive is added, removed or comes back, with „restart now” / „later” and a per-drive „apps restarted since” mark; removal, export and backup classes taught that a shared library is no app's own (R-1027, R-1019). | **OPEN** — filed 2026-10-14; design in `15` (S5/S6 results pending the operator's test) | the operator's test on Tester 1 („done”), then S5/S6 | Finish `15` with S5/S6; then a build task | CC |
| **R-1023** | Storage & devices | P2 | **Build: media apps see every drive, and the box says when they must restart (operator rulings 2026-10-14, `09` §3).** Scope from `architecture/15-media-library.md`: one bind per drive of `userdata/media/<library folders>` at the same path; the drive-absent gate per bind (today it keys on the app's one `HDD_PATH`, and the boot gate waits only for THAT drive — measured after the 17:25 power cut); the restart notice after a drive is added, removed or comes back, with „restart now” / „later” and a per-drive „apps restarted since” mark; removal, export and backup classes taught that a shared library is no app's own (R-1027, R-1019). **S5/S6 measured 2026-10-14:** a pulled drive stops none of the media apps (they key on another drive), they keep a dead view; on return nothing restarts them — so the restart notice MUST also cover „a drive came back”, the restart must be stop+start, and Sonarr/Radarr's own health page says nothing about an unreachable root folder, so the box must say it. | **OPEN** — filed 2026-10-14; design in `15` (S5/S6 results pending the operator's test) | the operator's test on Tester 1 („done”), then S5/S6 | Finish `15` with S5/S6; then a build task | CC |
| **R-1031** | Storage & devices | P2 | **The build must not ask a media app for one drive.** Today every media template carries a required `HDD_PATH` field („Médiatár útvonal”, `locked_after_deploy`), so the wizard makes the household pick ONE drive — the opposite of `09` §3 decision 237 — and the drive gate, removal and backup key on that one drive (`15` §4, §8). The test rig kept the field only because the deploy needs it. | **READY** — filed 2026-10-14 | R-1023 | In the build: a media app (`15` §3 marker) has no drive field; its own config stays on the system SSD; its library binds come from the enrolled drives | CC |
| **R-1032** | Storage & devices | P2 | **The delete safety list still names the old folder layout.** `ProtectedHDDPaths` (`felhom-controller/controller/internal/stacks/delete.go:240`) protects `<drive>/media` and `<drive>/Dokumentumok` — the layout before `userdata/` — and NOT `<drive>/userdata`, `userdata/media` or `userdata/documents`. That is why removing a Plex deleted `userdata/media` (R-1027). It touches every app with a drive bind, not only media apps. | **READY** — filed 2026-10-14 | — | Protect the current skeleton roots (`userdata` and its top folders) and keep the old names; a test that fails when a skeleton root is missing from the list (red-proof first). Fix with R-1027 | CC |
| **R-1038** | Storage & devices | P2 | **After a drive comes back, the file browser (and every app that binds it) still shows the DEAD drive: „I/O error”.** MEASURED 2026-10-14 on Tester 1 (`audits/media-all-drives-2026-10-14/S5-S6/`): Media B's disk was pulled at 20:10:23 and re-attached at 20:41:00. The guest kept a dead ext4 mount of `/mnt/felhom-drives/media_b` the whole time (`mountpoint` = yes, `ls` = Input/output error); on return the agent bound the new disk ON TOP of it (two stacked mounts), the controller logged „drive RETURNED … restarted gate-stopped apps” and „FileBrowser sync — no config/compose change, ensured running without recreate” — so FileBrowser kept the dead mount: `ls /srv/media_b/media/tv` → I/O error, 4 minutes after the drive was back. The same was true for all six media apps until they were stopped and started. During the pull the box also tried to rebuild the skeleton ON the dead mount („chmod … input/output error”), because the drive-absent gate asks „is it a mountpoint?” and a dead mount answers yes. Today's product: any household whose USB drive drops and returns hits this in FileBrowser. **And the household cannot fix it:** FileBrowser is a protected stack — the dashboard answers `POST /api/stacks/filebrowser/stop` and `/start` with 403 „cannot stop protected stack filebrowser” (measured 20:46) — so only a restart of the whole box clears it. | **READY** — filed 2026-10-14 | — | On drive return, recreate FileBrowser (and every container that binds the drive) — stop+start, not `up -d` (R-1026); on drive loss, make the guest's mount go away (or treat an I/O-error mount as absent) so the gate and the skeleton see the truth; a test with a dead mount | CC |
| **R-330** | Storage & devices | P3 | **Disk health Phase 2 — the three SMART attributes the wire does not carry.** The failing drive's most telling counter was **187 `Reported_Uncorrect`**, sitting at normalized **1** against threshold **0** with a raw count of **1001** — one point from failing and structurally unable to get there. Also wanted: **199 `UDMA_CRC_Error_Count`** (cabling) and **188 `Command_Timeout`**. None are on the agent→controller wire today, so v0.215.0's ladder could not use them. Phase 2 also persists periodic SMART **samples** (the right home is `metrics.MetricsStore`, NOT the Phase-1 state file, which is one record per disk and must stay that way). **This is a declared WIRE change, so under the G-1 gate the hub must model the new fields in the SAME session** — that is precisely why it was kept out of Phase 1, where it would have turned a one-word severity fix into a three-repo change | **READY** — **2026-10-12: the wire half is CLOSED in this row** — released in agent v0.150.0 (boxes run 0.154.0), controller and hub decode 187/188/199. **Only open work:** the verdict slice (use the three counters in the disk verdict and the household's words) and persisting samples. **READY (M) — NEW 2026-08-14** **2026-10-06 night: the wire half BUILT on main (unreleased):** the agent sends SMART 187 `reported_uncorrect`, 188 `command_timeout` (raw, vendor-packed on some drives — carried as reported), 199 `udma_crc_errors` (pointer + omitempty: unknown is absent, never 0); the controller decodes them and the hub's host-report mirror models them (G-1 wire gate green; it convicted the agent half alone). **Carried only** — no verdict, banner, mail or alarm reads them (`TestR330_CountersChangeNoVerdictYet`); using them changes what a household is told and is the next slice, with persisting samples. Red-proofs `audits/night-burndown-2026-10-06/r330/`. Ships with agent v0.150.0 and the next controller and hub releases. | R-328 (closed) | The verdict slice: 187/188/199 into the disk verdict with tests; then persist samples | CC |
| **R-332** | Storage & devices | P3 | **The new Hiba-from-counters path has never fired on real hardware.** v0.215.0's whole point is a verdict the product could not previously reach, and it is proven only against the committed fixture's values in unit tests (12 scenario groups, 11 of 12 red-proofs failing as required). The live validation on demo-hp proved the **negative** — three healthy disks still read Rendben across the deploy, no false alert — and the **severity wire** end to end, but no live disk has actually reached Hiba. **This is the honest gap and it must not be closed by pointing at the fixture tests**: the drive that produced the fixture is in DooPlex, which is Tier 2 and never a drill target, and the demo boxes are all-flash and healthy | **WATCHING — NEW 2026-08-14, NARROWED same day.** One item originally in this gap is now PROVEN LIVE: the **persisted state surviving a controller restart**. The v0.215.0→v0.216.0 redeploy destroyed and rebuilt the container, and the new one read back a `changed_at` written by the PREVIOUS version (`2026-08-14T07:23:14.640216851Z`, still intact at 09:31:35Z) instead of re-baselining — Scenario L on real hardware, not just the production-path unit test. **What remains unproven is the verdict itself, plus the stronger restart half: an already-ALERTED disk not re-alerting** | a real degrading disk, or an injection harness | **Closing condition:** a live disk reaching Hiba from counters, OR a deliberate injection through the REAL pipeline (agent `/disks` → controller check → hub event), not a hand-set verdict | CC |
| **R-331** | Storage & devices | P4 | **Disk health Phase 3 — growth-rate detection, and retiring the static 64.** The v0.215.0 count backstop (64 unreadable sectors → Hiba) is **a judgement from ONE drive**: the observed benign excursion peaked at 16 and cleared inside an hour, and the terminal run passed 64 at 13 Aug 11:28 and never came back. It is deliberately a backstop BEHIND the sustain rule, not the primary signal, but it is still a magic number tuned on a single sample and it will be wrong for some drive. With Phase 2's history the box can ask the question that actually matters — *is this count climbing, and how fast* — which distinguishes a drive with eight stable aging sectors from one adding forty a day, something no static threshold can do. Revisit 64 when that exists | **READY (M) — NEW 2026-08-14** | R-330 | Growth-rate rule over persisted samples; re-derive or delete the static 64 | CC |