docs(media): the array's write doors, and why survivors are re-verified by size

A folder-rename pass ran on the media array with no journal anywhere: no
jsonl on the array, no bash history, no cron/timer/job artifact, no other
host ever authenticating. The door was GNOME Files mounting the array over
SFTP (gvfsd-sftp -> sftp-server as dank): rename() with no shell and no
journal, bumping only the renamed directory's ctime. Copyparty cannot do
this (its bind is ro at the mount) and the *arr stack has no route to the
array at all (no SMB, no NFS, mini asleep).

Two laws fall out for the prune pipeline: re-verify survivors by size
rather than by the path a stale artifact recorded, and Plex extras rows
naming a held path survive a second section pass.
This commit is contained in:
Frank committed 2026-11-01 09:46:32 -08:00
1 parent 13830865f6
commit 7cf388367e
2 files changed
+31 -3

No files matched your search

@@ -66,3 +66,24 @@ exactly describes the year this bug survived.
volume absent they start `active (healthy)` against empty directories, which is
how a missing 91 TiB volume hides. See [[Dankserver Stack]] for the stack and
[[Storage Policy]] for what may be written here.
## Write doors
Something renamed movie folders on this array with no journal in any of the
`/mnt/entropy/*.jsonl` plans, no bash history, no cron, no timer, and no job
artifact. The census of things that can mutate it:
- **A local process** as `dank` or root. `scripts/media-apply.py` is the only
one that journals; anything else (a hand `mv`, another session's script) is
silent.
- **SFTP by a human.** GNOME Files on a workstation mounts the array through
`gvfsd-sftp`, which runs `sftp-server` on this host as `dank`. Renames and
moves are direct `rename()` calls: no shell, no history, no journal. A folder
rename bumps **only that directory's ctime** — its mtime and every child's
ctime stay at their old values, so the files look untouched while their paths
are gone. Diagnose it with `pgrep -af gvfsd-sftp` on the workstation and
`ss -tnp` for the peer.
- **Copyparty is not a door**: the bind is `ro` at the mount level, so no HTTP
or WebDAV write reaches the array regardless of account flags ([[Copyparty]]).
- **No SMB or NFS server exists here** — the `*arr` stack on FrankBook-Pro
cannot reach the array at all, so it cannot rename, import, or rescan it.