From fae8064557de1a22a962e281499d5169c859cebf Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Sat, 17 Oct 2026 11:58:18 +0200 Subject: [PATCH] Register: R-1022, R-1116, R-977 closed; R-1123..R-1128 filed; R-994 narrowed; duplicate ids fixed b9c4f73b (the cc-creds session) committed this session's uncommitted register edits together with its own R-1118..R-1122, so main carried two rows each for R-1118..R-1122. This session's five move to R-1124..R-1128 (R-1123 stays); the CLOSED-ITEMS section for the three closed rows lands here. Evidence: audits/tester1-limits-filebrowser-2026-10-17/. Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS --- .../P1/6c-tester-1.txt | 12 ++++ .../P1/A0-before-box.txt | 19 +++++++ .../P1/A0-before-host.txt | 35 ++++++++++++ .../P1/A3-config-diff-keys.txt | 5 ++ .../P1/A3-repoint-restore.txt | 22 ++++++++ .../P1/A4-detach.txt | 16 ++++++ .../P1/A4-free.txt | 56 +++++++++++++++++++ .../P1/A4-vm-inside-before.txt | 38 +++++++++++++ .../P1/A7-drill-reset.txt | 1 + .../P1/A7-who-follows-drill.txt | 4 ++ .../P1/A8-box-walk.txt | 10 ++++ .../P1/t1-console.txt | 54 ++++++++++++++++++ .../P2-P4-redproofs/r977-redproof.txt | 3 + .../P2-P4-redproofs/r977-wait-redproof.txt | 1 + .../P2-P4-redproofs/r994-redproof.txt | 2 + .../P3/C4-9201-docmost-limit.txt | 11 ++++ .../P3/requests-proposed.txt | 31 ++++++++++ .../P4/D2-9202-before.txt | 1 + .../P4/D2-9202-recreate-on-0.324.0.txt | 12 ++++ .../P4/D3-9202-fix-on-0.326.0-rc.1.txt | 10 ++++ .../P4/D4-9202-recreate-on-0.326.0-rc.1.txt | 14 +++++ .../P4/D5-9202-recreate-on-0.326.0-rc.2.txt | 16 ++++++ .../release/box-walk.txt | 15 +++++ .../release/global-floor-readback.txt | 4 ++ .../release/global-floor.txt | 5 ++ .../release/https-only.txt | 33 +++++++++++ .../release/per-box-floors.txt | 3 + .../tools/fbprobe.sh | 22 ++++++++ .../tools/t1teardown.py | 54 ++++++++++++++++++ documentation/backlog/CLOSED-ITEMS.md | 8 +++ documentation/backlog/OPEN-ITEMS.md | 12 ++-- 31 files changed, 523 insertions(+), 6 deletions(-) create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/6c-tester-1.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-box.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-host.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-config-diff-keys.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-repoint-restore.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-detach.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-free.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-vm-inside-before.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-drill-reset.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-who-follows-drill.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A8-box-walk.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/t1-console.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-redproof.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-wait-redproof.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r994-redproof.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/C4-9201-docmost-limit.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/requests-proposed.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-before.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-recreate-on-0.324.0.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D3-9202-fix-on-0.326.0-rc.1.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D4-9202-recreate-on-0.326.0-rc.1.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D5-9202-recreate-on-0.326.0-rc.2.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/release/box-walk.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor-readback.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/release/https-only.txt create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/release/per-box-floors.txt create mode 100755 documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/fbprobe.sh create mode 100644 documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/t1teardown.py diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/6c-tester-1.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/6c-tester-1.txt new file mode 100644 index 00000000..882d86ef --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/6c-tester-1.txt @@ -0,0 +1,12 @@ +10:59:59 POST /api/sync -> 200 {'ok': True, 'data': {'ok': True, 'message': 'Sablonok naprakészek — nincs változás'}, 'message': 'Sablonok naprakészek — nincs változás'} +11:00:09 == paperless-ngx before: +compose: command: redis-server --appendonly no| command: redis-server --appendonly no| +container: 2026-10-17T02:33:00.206620166Z ["redis-server","--appendonly","yes"] Up 6 hours (healthy) +dbsize: 2 rdb_last_bgsave_status:ok aof_enabled:1 +/data: appendonlydir dump.rdb +11:00:27 POST /api/stacks/paperless-ngx/restart -> 200 {'ok': True, 'data': {'state': 'starting'}, 'message': 'Stack paperless-ngx restart requested — state now: starting'} +11:01:26 == paperless-ngx after (state=running hold=None): +compose: command: redis-server --appendonly no| command: redis-server --appendonly no| +container: 2026-10-17T09:00:09.719659658Z ["redis-server","--appendonly","no"] Up About a minute (healthy) +dbsize: 4 rdb_last_bgsave_status:ok aof_enabled:0 +/data: appendonlydir dump.rdb diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-box.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-box.txt new file mode 100644 index 00000000..09f4d712 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-box.txt @@ -0,0 +1,19 @@ +deployed apps: [('bookstack', 'running'), ('jellyfin', 'running'), ('paperless-ngx', 'running'), ('plex', 'running'), ('privatebin', 'running'), ('prowlarr', 'running'), ('qbittorrent', 'running'), ('radarr', 'running'), ('sonarr', 'running'), ('transmission', 'running')] +storage paths: 404 {"_raw": "404 page not found\n"} +gitea.dooplex.hu/admin/felhom-controller:0.325.0 +gitea.dooplex.hu/admin/felhom-controller:0.325.0 Up 30 minutes (healthy) +24: repo_url: file:///opt/docker/felhom-controller/drill-catalog.git +-rw------- 1 root root 3042 Oct 14 14:04 controller.yaml +-rw------- 1 root root 3044 Oct 4 19:41 controller.yaml.pre-media-2026-10-14 +drwxr-xr-x 7 root root 4096 Oct 15 07:59 drill-catalog.git +NAME SIZE MOUNTPOINT +sda 200G +|-sda1 1007K +|-sda2 1G +`-sda3 199G +sdb 50G /mnt/felhom-drives/adatlemez +sdc 100G /mnt/felhom-drives/media_a +sdd 100G /mnt/felhom-drives/media_b +sde 50G /mnt/felhom-drives/media_c +sdf 20G /mnt/felhom-drives/media_d + diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-host.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-host.txt new file mode 100644 index 00000000..6cea1a85 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A0-before-host.txt @@ -0,0 +1,35 @@ +== qm config 341 (before) 2026-10-17T08:50:52Z +bios: ovmf +boot: order=scsi0 +cores: 4 +cpu: host +efidisk0: nvme-scratch:341/vm-341-disk-0.raw,efitype=4m,pre-enrolled-keys=0,size=528K +machine: q35 +memory: 8192 +meta: creation-qemu=11.0.0,ctime=1791141969 +name: night1004-tester1 +net0: virtio=BC:24:11:AC:E3:F9,bridge=vmbr0 +onboot: 1 +ostype: l26 +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 +scsi3: nvme-scratch:341/vm-341-disk-4.raw,backup=0,size=100G +scsi4: nvme-scratch:341/vm-341-disk-5.raw,backup=0,size=50G +scsi5: nvme-scratch:341/vm-341-disk-6.raw,backup=0,size=20G +scsihw: virtio-scsi-single +smbios1: uuid=451c8d94-abf2-46e4-a278-b579a9f315b5 +vga: std +vmgenid: acdf89db-a810-445c-9d88-7bccd688d3c1 +== pvesm list nvme-scratch (before) +Volid Format Type Size VMID +nvme-scratch:341/vm-341-disk-0.raw raw images 540672 341 +nvme-scratch:341/vm-341-disk-1.raw raw images 214748364800 341 +nvme-scratch:341/vm-341-disk-2.raw raw images 53687091200 341 +nvme-scratch:341/vm-341-disk-3.raw raw images 107374182400 341 +nvme-scratch:341/vm-341-disk-4.raw raw images 107374182400 341 +nvme-scratch:341/vm-341-disk-5.raw raw images 53687091200 341 +nvme-scratch:341/vm-341-disk-6.raw raw images 21474836480 341 +nvme-scratch:9202/vm-9202-disk-2.raw raw rootdir 34359738368 9202 +nvme-scratch:9202/vm-9202-disk-3.raw raw rootdir 75161927680 9202 +nvme-scratch:9401/vm-9401-disk-0.raw raw rootdir 64424509440 9401 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-config-diff-keys.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-config-diff-keys.txt new file mode 100644 index 00000000..5c49a645 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-config-diff-keys.txt @@ -0,0 +1,5 @@ +--- saved ++++ current +@@ -24 +24 @@ +- repo_url (repo_url value: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git) ++ repo_url (repo_url value: file:///opt/docker/felhom-controller/drill-catalog.git) diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-repoint-restore.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-repoint-restore.txt new file mode 100644 index 00000000..77d16dc0 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A3-repoint-restore.txt @@ -0,0 +1,22 @@ +RESTORED-IDENTICAL +24: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git + +2026/10/17 08:57:35 [INFO] [sync] Updated vikunja/.felhom.yml +2026/10/17 08:57:35 [INFO] [sync] Updated wanderer/.felhom.yml +2026/10/17 08:57:35 [INFO] [sync] Updated wger/.felhom.yml +2026/10/17 08:57:35 [INFO] [sync] Updated wishlist/.felhom.yml +2026/10/17 08:57:35 [INFO] [sync] Updated zipline/.felhom.yml +2026/10/17 08:57:35 [INFO] [sync] catalog moved 6589376258d9 -> 5d9450b0660a (0 new, 64 stack dir(s) changed) +2026/10/17 08:57:35 [INFO] [sync] Catalog sync complete +2026/10/17 08:57:35 [INFO] [sync] Initial sync: Sablonok frissítve — frissítve: actualbudget, adventurelog, audiobookshelf, bentopdf, bookstack, calcom, calibre-web, claper, code-server, crafty-controller, dawarich, docmost, ghost, gitea, glance, gokapi, grafana, gramps-web, grimmory, grocy, home-assistant, homebox, homepage, immich, jellyfin, karakeep, kimai, komga, lubelogger, mealie, metube, n8n, navidrome, nextcloud, nzbget, onlyoffice, opengist, outline, paperless-ngx, papra, plant-it, plex, privatebin, prowlarr, qbittorrent, radarr, radicale, rallly, recipe-importer, romm, sabnzbd, seerr, sonarr, sparkyfitness, tandoor, termix, transmission, uptime-kuma, vaultwarden, vikunja, wanderer, wger, wishlist, zipline + +24: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git +25: sync_interval: 15m +-rw------- 1 root root 3044 Oct 4 19:41 /var/lib/docker/volumes/felhom-controller-data/_data/controller.yaml.pre-media-2026-10-14 +mirror main 65893762 DRILL media build: the seven media templates = live + the media_library marker (per-drive binds by the controller, no literal drive paths); Plex: no code at install, accept-JSON probe, ADVERTISE_IP; Transmission incomplete folder off at start — drill catalog only (Tester 1 proof, Part G) +cache HEAD 5d9450b Redis snapshots, not append-only, on five apps (R-1096); gate redis-persistence +https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git + +11M /var/lib/docker/volumes/felhom-controller-data/_data/drill-catalog.git +ls: cannot access '/var/lib/docker/volumes/felhom-controller-data/_data/drill-catalog.git': No such file or directory +no-drill-left diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-detach.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-detach.txt new file mode 100644 index 00000000..fb797dbd --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-detach.txt @@ -0,0 +1,16 @@ +== inside Tester 1: clean unmount of the four test mounts 2026-10-17T08:58:51Z +stopped mnt-media_a.mount +stopped mnt-media_b.mount +stopped mnt-media_c.mount +stopped mnt-media_d.mount +no /mnt/media_* mounted +== demo-hp: qm set 341 --delete scsi2,scsi3,scsi4,scsi5 +update VM 341: -delete scsi2,scsi3,scsi4,scsi5 +rc=0 +scsi0: nvme-scratch:341/vm-341-disk-1.raw,size=200G +scsi1: nvme-scratch:341/vm-341-disk-2.raw,size=50G +scsihw: virtio-scsi-single +unused0: nvme-scratch:341/vm-341-disk-3.raw +unused1: nvme-scratch:341/vm-341-disk-4.raw +unused2: nvme-scratch:341/vm-341-disk-5.raw +unused3: nvme-scratch:341/vm-341-disk-6.raw diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-free.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-free.txt new file mode 100644 index 00000000..13f63105 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-free.txt @@ -0,0 +1,56 @@ +pvesm free nvme-scratch:341/vm-341-disk-3.raw +Removed volume 'nvme-scratch:341/vm-341-disk-3.raw' +rc=0 +pvesm free nvme-scratch:341/vm-341-disk-4.raw +Removed volume 'nvme-scratch:341/vm-341-disk-4.raw' +rc=0 +pvesm free nvme-scratch:341/vm-341-disk-5.raw +Removed volume 'nvme-scratch:341/vm-341-disk-5.raw' +rc=0 +pvesm free nvme-scratch:341/vm-341-disk-6.raw +Removed volume 'nvme-scratch:341/vm-341-disk-6.raw' +rc=0 +== qm config 341 (after free) +bios: ovmf +boot: order=scsi0 +cores: 4 +cpu: host +efidisk0: nvme-scratch:341/vm-341-disk-0.raw,efitype=4m,pre-enrolled-keys=0,size=528K +machine: q35 +memory: 8192 +meta: creation-qemu=11.0.0,ctime=1791141969 +name: night1004-tester1 +net0: virtio=BC:24:11:AC:E3:F9,bridge=vmbr0 +onboot: 1 +ostype: l26 +scsi0: nvme-scratch:341/vm-341-disk-1.raw,size=200G +scsi1: nvme-scratch:341/vm-341-disk-2.raw,size=50G +scsihw: virtio-scsi-single +smbios1: uuid=451c8d94-abf2-46e4-a278-b579a9f315b5 +unused0: nvme-scratch:341/vm-341-disk-3.raw +unused1: nvme-scratch:341/vm-341-disk-4.raw +unused2: nvme-scratch:341/vm-341-disk-5.raw +unused3: nvme-scratch:341/vm-341-disk-6.raw +vga: std +vmgenid: acdf89db-a810-445c-9d88-7bccd688d3c1 +== pvesm list nvme-scratch (after) +Volid Format Type Size VMID +nvme-scratch:341/vm-341-disk-0.raw raw images 540672 341 +nvme-scratch:341/vm-341-disk-1.raw raw images 214748364800 341 +nvme-scratch:341/vm-341-disk-2.raw raw images 53687091200 341 +nvme-scratch:9202/vm-9202-disk-2.raw raw rootdir 34359738368 9202 +nvme-scratch:9202/vm-9202-disk-3.raw raw rootdir 75161927680 9202 +nvme-scratch:9401/vm-9401-disk-0.raw raw rootdir 64424509440 9401 +update VM 341: -delete unused0,unused1,unused2,unused3 +disk image '/mnt/hdd_1/images/341/vm-341-disk-3.raw' does not exist +disk image '/mnt/hdd_1/images/341/vm-341-disk-4.raw' does not exist +disk image '/mnt/hdd_1/images/341/vm-341-disk-5.raw' does not exist +disk image '/mnt/hdd_1/images/341/vm-341-disk-6.raw' does not exist +rc=0 +== qm config 341 (final) +efidisk0: nvme-scratch:341/vm-341-disk-0.raw,efitype=4m,pre-enrolled-keys=0,size=528K +memory: 8192 +scsi0: nvme-scratch:341/vm-341-disk-1.raw,size=200G +scsi1: nvme-scratch:341/vm-341-disk-2.raw,size=50G +scsihw: virtio-scsi-single +status: running diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-vm-inside-before.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-vm-inside-before.txt new file mode 100644 index 00000000..fdd1f73f --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A4-vm-inside-before.txt @@ -0,0 +1,38 @@ +NAME SIZE SERIAL MOUNTPOINTS +sda 200G drive-scsi0 +|-sda1 1007K +|-sda2 1G /boot/efi +`-sda3 199G + |-pve-swap 7.7G [SWAP] + |-pve-root 59.8G /mnt/felhom-drives + | / + |-pve-data_tmeta 1.2G + | `-pve-data-tpool 113.2G + | |-pve-data 113.2G + | |-pve-vm--9201--disk--0 32G + | `-pve-vm--9201--disk--1 70G + `-pve-data_tdata 113.2G + `-pve-data-tpool 113.2G + |-pve-data 113.2G + |-pve-vm--9201--disk--0 32G + `-pve-vm--9201--disk--1 70G +sdb 50G drive-scsi1 /mnt/felhom-drives/adatlemez + /mnt/adatlemez +sdc 100G drive-scsi2 /mnt/media_a +sdd 100G drive-scsi3 /mnt/media_b +sde 50G drive-scsi4 /mnt/media_c +sdf 20G drive-scsi5 /mnt/media_d +/mnt/media_c /dev/sde +/mnt/media_a /dev/sdc +/mnt/media_d /dev/sdf +/mnt/adatlemez /dev/sdb +/mnt/media_b /dev/sdd +/mnt/felhom-drives /dev/mapper/pve-root[/mnt/felhom-drives] +/mnt/felhom-drives/adatlemez /dev/sdb[/felhom-data] +Name Type Status Total (KiB) Used (KiB) Available (KiB) % +felhom-pbs pbs active 0 0 0 0.00% +local dir active 61429556 19311648 38965012 31.44% +local-lvm lvmthin active 118673408 15273267 103400140 12.87% +mp0: local-lvm:vm-9201-disk-1,mp=/var/lib/felhom,backup=1,size=70G +mp8: /mnt/felhom-drives,mp=/mnt/felhom-drives +mp9: /var/lib/felhom-agent/guests/9201/bootstrap,mp=/etc/felhom-bootstrap,ro=1 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-drill-reset.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-drill-reset.txt new file mode 100644 index 00000000..8b63752c --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-drill-reset.txt @@ -0,0 +1 @@ +6723057 DRILL: tree = live main 5d9450b — R-1022 teardown; no box follows the drill (2026-10-17) diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-who-follows-drill.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-who-follows-drill.txt new file mode 100644 index 00000000..1ecd3cfb --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A7-who-follows-drill.txt @@ -0,0 +1,4 @@ +hp guest 9201: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git +hp guest 9202: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git +felhom-pve guest 9201: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git +-J hp root@192.168.0.154 guest 9201: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A8-box-walk.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A8-box-walk.txt new file mode 100644 index 00000000..00964b2e --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/A8-box-walk.txt @@ -0,0 +1,10 @@ +== guest 9201 +containers: 10 not healthy/running: none +bookstack bookstack-db cloudflared felhom-controller filebrowser paperless-postgres paperless-redis paperless-webserver privatebin traefik +gitea.dooplex.hu/admin/felhom-controller:0.325.0 +== host: failed units, agent warnings since the detach +Oct 17 10:58:56 felhom felhom-agent[1278]: time=2026-10-17T10:58:56.627+02:00 level=WARN msg="storage: watchdog detected target state change" target=4ebfd36d-87d3-4b63-839e-a5a710fc799a from=attached to=disconnected +Oct 17 10:58:56 felhom felhom-agent[1278]: time=2026-10-17T10:58:56.627+02:00 level=WARN msg="storage: watchdog detected target state change" target=e15652d5-0aa7-4eb8-93a1-afb2839d527c from=attached to=disconnected +Oct 17 10:58:56 felhom felhom-agent[1278]: time=2026-10-17T10:58:56.627+02:00 level=WARN msg="storage: watchdog detected target state change" target=86f33f9c-1022-43d8-95eb-f9a6ec9eb923 from=attached to=disconnected +Oct 17 10:58:56 felhom felhom-agent[1278]: time=2026-10-17T10:58:56.627+02:00 level=WARN msg="storage: watchdog detected target state change" target=8a31a462-ff15-4be2-9aeb-9620b99c7f77 from=attached to=disconnected +dashboard /login: 200 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/t1-console.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/t1-console.txt new file mode 100644 index 00000000..1c6c1cf9 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P1/t1-console.txt @@ -0,0 +1,54 @@ +10:52:02 deployed apps: ['bookstack', 'jellyfin', 'paperless-ngx', 'plex', 'privatebin', 'prowlarr', 'qbittorrent', 'radarr', 'sonarr', 'transmission'] +10:52:06 gitea.dooplex.hu/admin/felhom-controller:0.325.0 +24: repo_url: file:///opt/docker/felhom-controller/drill-catalog.git +/mnt/felhom-drives +/mnt/felhom-drives +/mnt/felhom-drives/media_a +/mnt/felhom-drives/media_a +/mnt/felhom-drives/adatlemez +/mnt/felhom-drives/adatlemez +/mnt/felhom-drives/media_c +/mnt/felhom-drives/media_c +/mnt/felhom-drives/media_d +/mnt/felhom-drives/media_d +/mnt/felhom-drives/media_b +/mnt/felhom-drives/media_b +storage paths: [('/mnt/felhom-drives/adatlemez', 'live'), ('/mnt/felhom-drives/media_a', 'live'), ('/mnt/felhom-drives/media_b', 'live'), ('/mnt/felhom-drives/media_c', 'live'), ('/mnt/felhom-drives/media_d', 'live')] + +10:52:46 sonarr: stop -> 200; remove (keep data, keep backups) -> 200 {"ok": true, "data": {"removed": "sonarr", "volumes_removed": ["sonarr_sonarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/media_a/userdata/media (30G)"], "verified": true}, "message": "Stack sonarr remove +10:53:24 radarr: stop -> 200; remove (keep data, keep backups) -> 200 {"ok": true, "data": {"removed": "radarr", "volumes_removed": ["radarr_radarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/media_a/userdata/media (30G)"], "verified": true}, "message": "Stack radarr remove +10:53:58 qbittorrent: stop -> 200; remove (keep data, keep backups) -> 200 {"ok": true, "data": {"removed": "qbittorrent", "volumes_removed": ["qbittorrent_qbittorrent_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/media_a/userdata/media/torrents (19G)"], "verified": true}, "messag +10:54:34 transmission: stop -> 200; remove (keep data, keep backups) -> 200 {"ok": true, "data": {"removed": "transmission", "volumes_removed": ["transmission_transmission_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/media_a/userdata/media/transmission (12G)", "/mnt/felhom-drives/ +10:55:15 plex: stop -> 200; remove (keep data, keep backups) -> 200 {"ok": true, "data": {"removed": "plex", "volumes_removed": ["plex_plex_config", "plex_plex_transcode"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/media_a/userdata/media (30G)"], "verified": true}, "message": "St +10:55:48 jellyfin: stop -> 200; remove (keep data, keep backups) -> 200 {"ok": true, "data": {"removed": "jellyfin", "volumes_removed": ["jellyfin_jellyfin_cache", "jellyfin_jellyfin_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": ["/mnt/felhom-drives/media_a/userdata/media (30G)"], "verified": true} +10:56:26 prowlarr: stop -> 200; remove (keep data, keep backups) -> 200 {"ok": true, "data": {"removed": "prowlarr", "volumes_removed": ["prowlarr_prowlarr_config"], "hdd_paths_removed": [], "hdd_paths_preserved": [], "userdata_kept": [], "verified": true}, "message": "Stack prowlarr removed"} +10:56:26 deployed apps: ['bookstack', 'paperless-ngx', 'privatebin'] +10:56:30 gitea.dooplex.hu/admin/felhom-controller:0.325.0 +24: repo_url: file:///opt/docker/felhom-controller/drill-catalog.git +/mnt/felhom-drives +/mnt/felhom-drives +/mnt/felhom-drives/media_a +/mnt/felhom-drives/media_a +/mnt/felhom-drives/adatlemez +/mnt/felhom-drives/adatlemez +/mnt/felhom-drives/media_c +/mnt/felhom-drives/media_c +/mnt/felhom-drives/media_d +/mnt/felhom-drives/media_d +/mnt/felhom-drives/media_b +/mnt/felhom-drives/media_b +storage paths: [('/mnt/felhom-drives/adatlemez', 'live'), ('/mnt/felhom-drives/media_a', 'live'), ('/mnt/felhom-drives/media_b', 'live'), ('/mnt/felhom-drives/media_c', 'live'), ('/mnt/felhom-drives/media_d', 'live')] + +10:56:38 decommission media_a -> 200 {"data": {"decommissioned": true, "stopped_apps": null, "where": "/mnt/felhom-drives/media_a"}, "ok": true} +10:56:46 decommission media_b -> 200 {"data": {"decommissioned": true, "stopped_apps": null, "where": "/mnt/felhom-drives/media_b"}, "ok": true} +10:56:54 decommission media_c -> 200 {"data": {"decommissioned": true, "stopped_apps": null, "where": "/mnt/felhom-drives/media_c"}, "ok": true} +10:57:01 decommission media_d -> 200 {"data": {"decommissioned": true, "stopped_apps": null, "where": "/mnt/felhom-drives/media_d"}, "ok": true} +10:57:06 deployed apps: ['bookstack', 'paperless-ngx', 'privatebin'] +10:57:10 gitea.dooplex.hu/admin/felhom-controller:0.325.0 +24: repo_url: file:///opt/docker/felhom-controller/drill-catalog.git +/mnt/felhom-drives +/mnt/felhom-drives +/mnt/felhom-drives/adatlemez +/mnt/felhom-drives/adatlemez +storage paths: [('/mnt/felhom-drives/adatlemez', 'live'), ('/mnt/felhom-drives/media_a', 'decommissioned'), ('/mnt/felhom-drives/media_b', 'decommissioned'), ('/mnt/felhom-drives/media_c', 'decommissioned'), ('/mnt/felhom-drives/media_d', 'decommissioned')] + diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-redproof.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-redproof.txt new file mode 100644 index 00000000..ab87a491 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-redproof.txt @@ -0,0 +1,3 @@ +--- FAIL: TestFileBrowserAdmin_R977_DefaultBackOnANewRunIsReplaced (0.00s) + filebrowser_password_test.go:183: the default login came back on a new run and was left +FAIL diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-wait-redproof.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-wait-redproof.txt new file mode 100644 index 00000000..0e2834e1 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r977-wait-redproof.txt @@ -0,0 +1 @@ +--- FAIL: TestFileBrowserAdmin_R977_NewRunIsWaitedForInTheSameTick (0.00s) diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r994-redproof.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r994-redproof.txt new file mode 100644 index 00000000..7857b2bb --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P2-P4-redproofs/r994-redproof.txt @@ -0,0 +1,2 @@ +REFUSED: docmost: .felhom.yml mem_limit "896M" is not the sum of the compose limits 768+256+128=1152M +mem-limit-sum: 1 of 65 template(s) refused — set .felhom.yml resources.mem_limit to the sum of the compose limits (and show the arithmetic in a comment, like paperless-ngx) diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/C4-9201-docmost-limit.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/C4-9201-docmost-limit.txt new file mode 100644 index 00000000..51cc677c --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/C4-9201-docmost-limit.txt @@ -0,0 +1,11 @@ +POST /api/sync -> 429 +before: memory: 512M +/docmost 536870912 +restart -> 200 +after: /docmost 536870912 healthy +/docmost-postgres 268435456 healthy +/docmost-redis 134217728 healthy state: running +POST /api/sync -> 200 {'ok': True, 'data': {'ok': True, 'updated': ['docmost', 'grafana', 'romm', 'tandoor', 'termix', 'uptime-kuma'], 'messag +applied: memory: 768M +restart -> 200 +after: /docmost 805306368 healthy state: running diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/requests-proposed.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/requests-proposed.txt new file mode 100644 index 00000000..fffa122b --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P3/requests-proposed.txt @@ -0,0 +1,31 @@ +R-1119 — proposed mem_request per app (typical use from sizing-2026-10-13 catalog-check.json, rounded up: +under 100 MB to 10, under 500 MB to 50, else to 100). NOT applied — operator: limits now, requests wait. + +app now typical new source +adventurelog 100MB 361MB 400MB telemetry +bookstack 150MB 159MB 200MB telemetry +calcom 200MB 800MB 800MB onboarding +claper 100MB 248MB 250MB onboarding +docmost 200MB 415MB 450MB telemetry +grafana 100MB 220MB 250MB onboarding +home-assistant 256MB 318MB 350MB onboarding +homepage 50MB 82MB 90MB measured +kimai 100MB 163MB 200MB telemetry +komga 200MB 442MB 450MB onboarding +mealie 200MB 273MB 300MB onboarding +nextcloud 256MB 314MB 350MB onboarding +outline 200MB 282MB 300MB onboarding +paperless-ngx 500MB 568MB 600MB telemetry +papra 256MB 266MB 300MB onboarding +privatebin 30MB 40MB 40MB telemetry +recipe-importer 30MB 63MB 70MB measured +romm 300MB 528MB 600MB telemetry +seerr 100MB 166MB 200MB measured +tandoor 512MB 868MB 900MB onboarding +termix 30MB 102MB 150MB measured +uptime-kuma 50MB 103MB 150MB onboarding +zipline 100MB 196MB 200MB onboarding + +Effect on the smallest supported box (8 GB: guest 4,096 MiB, reserved 384 → 3,712 MB usable; stacks/deploy.go:1549): +household set (immich, jellyfin, nextcloud, home-assistant, vaultwarden, paperless-ngx): 3,622 MB now → 3,910 MB +whole catalog (65 apps): 15,028 MB now → 18,608 MB; the largest single new request: 900 MB (tandoor) — every app alone fits. diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-before.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-before.txt new file mode 100644 index 00000000..6f2bb978 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-before.txt @@ -0,0 +1 @@ +default login -> HTTP 401 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T06:54:56.265230678Z diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-recreate-on-0.324.0.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-recreate-on-0.324.0.txt new file mode 100644 index 00000000..901165d1 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D2-9202-recreate-on-0.324.0.txt @@ -0,0 +1,12 @@ +volume before: 1 +removed filebrowser + filebrowser_filebrowser_data at 09:08:51 ++1m: default login: (filebrowser not running) ++2m: default login: (filebrowser not running) ++3m: default login: (filebrowser not running) ++4m: default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++5m: default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++6m: default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++7m: default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++8m: default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++9m: default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++10m: default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D3-9202-fix-on-0.326.0-rc.1.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D3-9202-fix-on-0.326.0-rc.1.txt new file mode 100644 index 00000000..909423cd --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D3-9202-fix-on-0.326.0-rc.1.txt @@ -0,0 +1,10 @@ +default login -> HTTP 200 | box state: generated 2026-09-15T08:16:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z +controller -> 0.326.0-rc.1 at 09:19:34 ++30s: default login -> HTTP 401 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++60s: default login -> HTTP 401 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++90s: default login -> HTTP 401 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++120s: default login -> HTTP 401 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++150s: default login -> HTTP 401 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z ++180s: default login -> HTTP 401 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:12:31.362830472Z +2026/10/17 09:19:35 filebrowser_password.go:121: [WARN] [infra] filebrowser: admin/admin logs in again on a new FileBrowser run (recorded state "generated") — its data was re-created; replacing it (R-977) +2026/10/17 09:19:35 filebrowser_password.go:178: [INFO] [infra] filebrowser: admin/admin replaced by a generated password (value never logged); verified new=200 admin=401 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D4-9202-recreate-on-0.326.0-rc.1.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D4-9202-recreate-on-0.326.0-rc.1.txt new file mode 100644 index 00000000..096b50af --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D4-9202-recreate-on-0.326.0-rc.1.txt @@ -0,0 +1,14 @@ +volume before: 1 +removed filebrowser + filebrowser_filebrowser_data at 09:22:44 ++1m: default login: (filebrowser not running) ++2m: default login -> HTTP 200 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++3m: default login -> HTTP 200 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++4m: default login -> HTTP 200 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++5m: default login -> HTTP 200 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++6m: default login -> HTTP 200 | box state: generated 2026-10-17T09:19:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++7m: default login -> HTTP 401 | box state: generated 2026-10-17T09:29:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++8m: default login -> HTTP 401 | box state: generated 2026-10-17T09:29:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++9m: default login -> HTTP 401 | box state: generated 2026-10-17T09:29:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z ++10m: default login -> HTTP 401 | box state: generated 2026-10-17T09:29:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z +2026/10/17 09:29:35 filebrowser_password.go:121: [WARN] [infra] filebrowser: admin/admin logs in again on a new FileBrowser run (recorded state "generated") — its data was re-created; replacing it (R-977) +2026/10/17 09:29:35 filebrowser_password.go:178: [INFO] [infra] filebrowser: admin/admin replaced by a generated password (value never logged); verified new=200 admin=401 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D5-9202-recreate-on-0.326.0-rc.2.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D5-9202-recreate-on-0.326.0-rc.2.txt new file mode 100644 index 00000000..201a5cdf --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/P4/D5-9202-recreate-on-0.326.0-rc.2.txt @@ -0,0 +1,16 @@ +controller: gitea.dooplex.hu/admin/felhom-controller:0.326.0-rc.2 Up 40 seconds (healthy) +default login -> HTTP 401 | box state: generated 2026-10-17T09:29:35Z | filebrowser started 2026-10-17T09:24:35.302615766Z +volume before: 1 +removed filebrowser + filebrowser_filebrowser_data at 09:42:54 ++1m: default login: (filebrowser not running) ++2m: default login: (filebrowser not running) ++3m: default login: (filebrowser not running) ++4m: default login: (filebrowser not running) ++5m: default login -> HTTP 401 | box state: generated 2026-10-17T09:47:15Z | filebrowser started 2026-10-17T09:47:15.109818275Z ++6m: default login -> HTTP 401 | box state: generated 2026-10-17T09:47:15Z | filebrowser started 2026-10-17T09:47:15.109818275Z ++7m: default login -> HTTP 401 | box state: generated 2026-10-17T09:47:15Z | filebrowser started 2026-10-17T09:47:15.109818275Z ++8m: default login -> HTTP 401 | box state: generated 2026-10-17T09:47:15Z | filebrowser started 2026-10-17T09:47:15.109818275Z ++9m: default login -> HTTP 401 | box state: generated 2026-10-17T09:47:15Z | filebrowser started 2026-10-17T09:47:15.109818275Z ++10m: default login -> HTTP 401 | box state: generated 2026-10-17T09:47:15Z | filebrowser started 2026-10-17T09:47:15.109818275Z +2026/10/17 09:47:17 filebrowser_password.go:149: [WARN] [infra] filebrowser: admin/admin logs in again on a new FileBrowser run (recorded state "generated") — its data was re-created; replacing it (R-977) +2026/10/17 09:47:17 filebrowser_password.go:206: [INFO] [infra] filebrowser: admin/admin replaced by a generated password (value never logged); verified new=200 admin=401 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/box-walk.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/box-walk.txt new file mode 100644 index 00000000..8cfa51a6 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/box-walk.txt @@ -0,0 +1,15 @@ +=== hp +containers: 24 not healthy/running: none +2026/10/17 09:54:23 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.325.0 → 0.326.0) +filebrowser state: generated +=== felhom-pve +containers: 9 not healthy/running: none +2026/10/17 09:54:12 [INFO] [selfupdate] Post-update startup: update successful (0.325.0 → 0.326.0) +filebrowser state: generated +=== -J hp root@192.168.0.154 +containers: 10 not healthy/running: none +2026/10/17 09:54:22 [INFO] [selfupdate] Post-update startup: update successful (0.325.0 → 0.326.0) +filebrowser state: generated +felhom.enkisfelhom.hu /login: 200 +felhom.demo-felhom.eu /login: 200 +felhom.enkicsifelhom.hu /login: 200 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor-readback.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor-readback.txt new file mode 100644 index 00000000..baf45af1 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor-readback.txt @@ -0,0 +1,4 @@ +integrity: ok +('min_controller_version', '0.326.0') +('min_controller_version_declared_min_agent', '0.326.0=0.158.1') +per-box floors still set: [] diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor.txt new file mode 100644 index 00000000..7d2b1d99 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/global-floor.txt @@ -0,0 +1,5 @@ +global floor 2026-10-17T09:55:58Z: HTTP/1.1 303 See Other Location: /configuration?flash=floor_set +clear per-box tester-1: HTTP/1.1 303 See Other Location: /customers/tester-1?flash=floor_set +clear per-box demo-hp: HTTP/1.1 303 See Other Location: /customers/demo-hp?flash=floor_set +clear per-box demo-felhom: HTTP/1.1 303 See Other Location: /customers/demo-felhom?flash=floor_set +hub /configuration page: 5 0.158.1 3 0.326.0 diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/https-only.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/https-only.txt new file mode 100644 index 00000000..8682d689 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/https-only.txt @@ -0,0 +1,33 @@ +control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -) +== tester-1 (enkicsifelhom.hu): 6 public name(s) + OK control POSITIVE http://felhom.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkicsifelhom.hu/r1033-check?q=1 + OK http://files.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://files.enkicsifelhom.hu/r1033-check?q=1 + OK http://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 + OK http://paperless.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paperless.enkicsifelhom.hu/r1033-check?q=1 + OK http://paste.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paste.enkicsifelhom.hu/r1033-check?q=1 + OK http://wiki.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkicsifelhom.hu/r1033-check?q=1 +== demo-hp (enkisfelhom.hu): 14 public name(s) + OK http://arcade.enkisfelhom.hu/r1033-check?q=1 -> 301 https://arcade.enkisfelhom.hu/r1033-check?q=1 + OK http://books.enkisfelhom.hu/r1033-check?q=1 -> 301 https://books.enkisfelhom.hu/r1033-check?q=1 + OK http://docs.enkisfelhom.hu/r1033-check?q=1 -> 301 https://docs.enkisfelhom.hu/r1033-check?q=1 + OK http://felhom.enkisfelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkisfelhom.hu/r1033-check?q=1 + OK http://files.enkisfelhom.hu/r1033-check?q=1 -> 301 https://files.enkisfelhom.hu/r1033-check?q=1 + OK http://gist.enkisfelhom.hu/r1033-check?q=1 -> 301 https://gist.enkisfelhom.hu/r1033-check?q=1 + OK http://ha.enkisfelhom.hu/r1033-check?q=1 -> 301 https://ha.enkisfelhom.hu/r1033-check?q=1 + OK http://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 + OK http://papir.enkisfelhom.hu/r1033-check?q=1 -> 301 https://papir.enkisfelhom.hu/r1033-check?q=1 + OK http://paste.enkisfelhom.hu/r1033-check?q=1 -> 301 https://paste.enkisfelhom.hu/r1033-check?q=1 + OK http://pdf.enkisfelhom.hu/r1033-check?q=1 -> 301 https://pdf.enkisfelhom.hu/r1033-check?q=1 + OK http://plex.enkisfelhom.hu/r1033-check?q=1 -> 301 https://plex.enkisfelhom.hu/r1033-check?q=1 + OK http://travel.enkisfelhom.hu/r1033-check?q=1 -> 301 https://travel.enkisfelhom.hu/r1033-check?q=1 + OK http://wiki.enkisfelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkisfelhom.hu/r1033-check?q=1 +== demo-felhom (demo-felhom.eu): 8 public name(s) + OK http://felhom.demo-felhom.eu/r1033-check?q=1 -> 301 https://felhom.demo-felhom.eu/r1033-check?q=1 + OK http://files.demo-felhom.eu/r1033-check?q=1 -> 301 https://files.demo-felhom.eu/r1033-check?q=1 + OK http://gist.demo-felhom.eu/r1033-check?q=1 -> 301 https://gist.demo-felhom.eu/r1033-check?q=1 + OK http://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 -> 301 https://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 + OK http://prowlarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://prowlarr.demo-felhom.eu/r1033-check?q=1 + OK http://radarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://radarr.demo-felhom.eu/r1033-check?q=1 + OK http://sonarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://sonarr.demo-felhom.eu/r1033-check?q=1 + OK http://torrent.demo-felhom.eu/r1033-check?q=1 -> 301 https://torrent.demo-felhom.eu/r1033-check?q=1 +== every public name redirects http -> https diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/per-box-floors.txt b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/per-box-floors.txt new file mode 100644 index 00000000..e97f041d --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/release/per-box-floors.txt @@ -0,0 +1,3 @@ +per-box tester-1 2026-10-17T09:54:10Z: HTTP/1.1 303 See Other Location: /customers/tester-1?flash=floor_set +per-box demo-hp 2026-10-17T09:54:10Z: HTTP/1.1 303 See Other Location: /customers/demo-hp?flash=floor_set +per-box demo-felhom 2026-10-17T09:54:10Z: HTTP/1.1 303 See Other Location: /customers/demo-felhom?flash=floor_set diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/fbprobe.sh b/documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/fbprobe.sh new file mode 100755 index 00000000..f8ca9c43 --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/fbprobe.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# fbprobe.sh — R-977, run INSIDE a guest. Prints only HTTP status codes and the box's recorded state — never a password. +# The default credential is FileBrowser's public default; it goes to curl on STDIN as a header, never on a command line. +# fbprobe.sh probe the default login's status + the box's recorded state + FileBrowser's start time +# fbprobe.sh recreate remove FileBrowser AND its data volume (what a lost volume looks like), then wait up to +# 10 min for the box itself to bring FileBrowser back (no hand start), probing each minute +set -u +S=/var/lib/docker/volumes/felhom-controller-data/_data/data/settings.json +state() { python3 -c "import json;d=json.load(open('$S'));print(d.get('filebrowser_admin_state'), d.get('filebrowser_admin_decided_at'))"; } +probe() { + ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' filebrowser 2>/dev/null | awk '{print $1}') + if [ -z "$ip" ]; then echo "default login: (filebrowser not running)"; return; fi + code=$(printf 'X-Password: admin\n' | curl -s -o /dev/null -w '%{http_code}' --max-time 10 -X POST -H @- "http://$ip:80/api/auth/login?username=admin") + echo "default login -> HTTP $code | box state: $(state) | filebrowser started $(docker inspect -f '{{.State.StartedAt}}' filebrowser)" +} +case "$1" in + probe) probe ;; + recreate) + echo "volume before: $(docker volume ls -q | grep -c '^filebrowser_filebrowser_data$')" + docker stop filebrowser >/dev/null && docker rm filebrowser >/dev/null && docker volume rm filebrowser_filebrowser_data >/dev/null && echo "removed filebrowser + filebrowser_filebrowser_data at $(date -u +%T)" + for i in $(seq 1 10); do sleep 60; echo "+${i}m: $(probe)"; done ;; +esac diff --git a/documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/t1teardown.py b/documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/t1teardown.py new file mode 100644 index 00000000..ccd356bb --- /dev/null +++ b/documentation/audits/tester1-limits-filebrowser-2026-10-17/tools/t1teardown.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""t1teardown.py — R-1022 on Tester 1 through its dashboard's own endpoints (operator word 2026-10-17 10:47). + +Env: SC (0600 dir with .ctlpw = Tester 1's dashboard password), EV, TARGET=tester-1. Steps: + apps stop + remove each test app WITHOUT „delete data" (remove_hdd_data=false, remove_backups=false) + drives decommission media_a..media_d („anyway", type-to-confirm = the mount name), the dashboard's call + state deployed apps, storage paths, the controller image and repo_url (read-only) +""" +import json, os, sys, time +sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts") +import box_walk as w # noqa: E402 +EV = os.environ["EV"] +LOG = open(os.path.join(EV, "t1-console.txt"), "a", buffering=1) +_say = w.say +def say(*a): + _say(*a); LOG.write(time.strftime("%H:%M:%S ") + " ".join(str(x) for x in a) + "\n") +w.say = say +APPS = ["sonarr", "radarr", "qbittorrent", "transmission", "plex", "jellyfin", "prowlarr"] +DRIVES = ["media_a", "media_b", "media_c", "media_d"] + +def state(): + c, d = w.ctl("GET", "/api/stacks") + dep = sorted(s.get("name") for s in (d.get("data") or []) if s.get("deployed")) + say(f"deployed apps: {dep}") + say(w.guest("cat /etc/felhom-controller-image; grep -n repo_url /var/lib/docker/volumes/felhom-controller-data/_data/controller.yaml; " + "findmnt -rn -o TARGET | grep felhom-drives; python3 -c \"import json;d=json.load(open('/var/lib/docker/volumes/felhom-controller-data/_data/data/settings.json'));" + "print('storage paths:', [(p.get('path'), 'decommissioned' if p.get('decommissioned') else 'live') for p in d.get('storage_paths') or []])\"")) + +def main(): + step = sys.argv[1] + w.login() + if step == "apps": + for a in APPS: + st = w.stack(a) + if not st.get("deployed"): + say(f"{a}: not deployed — skipped"); continue + c1, d1 = w.ctl("POST", f"/api/stacks/{a}/stop") + for _ in range(36): + time.sleep(5) + if w.stack(a).get("state") != "running": + break + c2, d2 = w.ctl("POST", f"/api/stacks/{a}/remove", {"remove_hdd_data": False, "remove_backups": False}) + say(f"{a}: stop -> {c1}; remove (keep data, keep backups) -> {c2} {json.dumps(d2, ensure_ascii=False)[:260]}") + state() + elif step == "drives": + for m in DRIVES: + c, d = w.ctl("POST", "/api/storage/decommission", {"where": f"/mnt/felhom-drives/{m}", "mode": "anyway", "mount_name": m}) + say(f"decommission {m} -> {c} {json.dumps(d, ensure_ascii=False)[:300]}") + time.sleep(5) + state() + elif step == "state": + state() + +main() diff --git a/documentation/backlog/CLOSED-ITEMS.md b/documentation/backlog/CLOSED-ITEMS.md index a96656ea..1e2f44d1 100644 --- a/documentation/backlog/CLOSED-ITEMS.md +++ b/documentation/backlog/CLOSED-ITEMS.md @@ -26,6 +26,14 @@ --- +## 2026-10-17 — Tester 1 on the live catalog, decoy suites in every runner, memory limits, FileBrowser (controller v0.326.0, catalog `bff82f9`) + +| Row | What | Closed | Evidence | +|---|---|---|---| +| **R-977** | **FileBrowser's default password can come back if its data volume is ever re-created, because the box checks it only once; and the tunnel can start before the box is claimed.** (P3) | CLOSED 2026-10-17 for the FileBrowser part — **controller v0.326.0**: the default login is probed once per FileBrowser RUN (StartedAt), not once per box. Measured first on scratch 9202 with 0.324.0: FileBrowser + its data volume removed, the box brought it back by itself, the default login answered 200 for 10 minutes while the box kept „generated”; with 0.326.0-rc.1 it was replaced in 1 s and verified (default 401), and again after a second re-create under the new controller. `TestFileBrowserAdmin_R977_*`, red-proved. The code comment „before a claim there is no tunnel” was false and is corrected. **The tunnel before the claim is a design question, not changed → R-1126.** | `audits/tester1-limits-filebrowser-2026-10-17/` | +| **R-1022** | **Tester 1 follows the drill catalog and carries two test drives — teardown owed (operator ruling (e), 2026-10-14).** (P3) | CLOSED 2026-10-17 — operator word „yes” 10:47. Through Tester 1's dashboard: Sonarr, Radarr, qBittorrent, Transmission, Plex, Jellyfin, Prowlarr removed WITHOUT „delete data” (their drive tags and clients went with them); bookstack, paperless-ngx, privatebin stay. Media A–D decommissioned (200 each). `repoint.py restore`: RESTORED-IDENTICAL, `repo_url` = the live catalog (`5d9450b` synced), `drill-catalog.git` removed (11 MB). demo-hp: the four test mounts stopped cleanly inside the VM, `qm set 341 --delete scsi2,scsi3,scsi4,scsi5`, `pvesm free` of `vm-341-disk-3/-4/-5/-6.raw` BY NAME, the four stale `unused` lines removed; `qm config 341`: scsi0 + scsi1 only, memory 8192. Controller 0.325.0 by the floor (no hand pin). Drill repo tree = live main (`6723057`, a normal commit — no force-push); no box follows it. paperless-ngx restarted: `aof_enabled:0`. Box walk green. **Left for the operator:** remove „plex-k6” on plex.tv (Settings → Authorized Devices). The kept mount units → R-1124. | `audits/tester1-limits-filebrowser-2026-10-17/` | +| **R-1116** | **The controller, agent and felhom.eu gate runners do not run their own decoy suites — the shape that let R-1115 fail unseen for a night.** (P4) | CLOSED 2026-10-17 — controller (`55868cb`, 53 cases, 22 s) and agent (`c52d591`, 30 cases, 21 s; script only) run their decoy suite as the full-run gate `gate-decoys`, count tests updated, each red-proved (one decoy flipped → the runner CONVICTED). felhom.eu already ran its suite through `script-tests` (R-885, 86 cases, 56 s) — the row overstated that part. Residuals → R-1127 (no automatic full run), R-1128 (the controller suite edits real files with no lock). | `audits/tester1-limits-filebrowser-2026-10-17/` | + ## 2026-10-17 — burndown 3: limiters, family fingerprints, samba label, path guard, gates in a worktree, Redis RDB (controller v0.325.0, catalog `33a4b3b` + `5d9450b`) | Row | What | Closed | Evidence | diff --git a/documentation/backlog/OPEN-ITEMS.md b/documentation/backlog/OPEN-ITEMS.md index a7b7665c..da8a5d4f 100644 --- a/documentation/backlog/OPEN-ITEMS.md +++ b/documentation/backlog/OPEN-ITEMS.md @@ -133,7 +133,7 @@ stopping line that lies. | **R-981** | Apps & catalog | P3 | **The homepage app gets the Docker socket (that is root in the guest) and has no login, no setup gate and no family gate.** Fix: remove the socket mount, or put homepage behind the family gate. Security review 2026-10-12 (`audits/security-review-2026-10-12/`); detail held off-git for the operator (`/mnt/5_hdd/felhom.eu/evidence/security-review-2026-10-12-PRIVATE/`). | OPEN | — | Change the catalog template; prove on 9202 | CC | | **R-971** | Apps & catalog | P2 | **A change pushed to the catalog's `main` reaches the installed apps on every box within about 15 minutes, and nothing on the box refuses dangerous container settings (privileged mode, the Docker socket, host mounts, host namespaces); so whoever can push to the catalog repository can take every guest.** Design-shaped: installed apps take catalog fixes on purpose. Decision for the operator in `STATUS.md`. Fix options: a privilege allow-list check on the box before any compose is written (and in catalog CI), and later signed catalog releases. Security review 2026-10-12 (`audits/security-review-2026-10-12/`); detail held off-git for the operator (`/mnt/5_hdd/felhom.eu/evidence/security-review-2026-10-12-PRIVATE/`). | WAITING-ON-OPERATOR — confirmed by a second reader | operator decision | Decide; then build the box-side check | operator | | **R-676** | Apps & catalog | P3 | **[P3-LOW] Watch: immich's first start restarted 12 times — decision 28's crash-loop stop (6 in 10 min) would stop it.** From the 2026-09-17 chaos night (DB connection dropped during the first-start geocoding import on a 6 GB guest; it did not recover that night). No healthy app in any drill evidence restarts on a first start (1831 samples, 40 live containers), so the threshold stands; this row exists so the first immich install under v0.269.x is watched. `audits/night-2026-09-24/A3/40-first-start-restarts.txt` **2026-09-25 night (read from source, v0.271.0): a DEPLOY's first start is NOT covered by decision 28's suppression** — `Deploying` clears when `compose up -d` returns (`deploy.go` "Clear deploying flag"), and `ObserveUnhealthy` then samples the app; an automatic update's step, verify and undo ARE covered (`Updating`, pinned by `TestD28_NoCrashLoopStopDuringAnAutomaticStep`). So a first start that restarts ≥ 6 times in 10 min is stopped — which R-676 already accepts for a broken first start; a healthy slow first start would be stopped too. **-- 2026-09-30: the first-start restarts are explained.** immich's first-start geodata import OOM-kills its database at 512M on a guest with no swap (R-732, measured: 61–104 kills); the 2026-09-17 chaos-night case (DB connection dropped during the import on a 6 GB guest) fits it. Fixed in the catalog (`56c4888`, 768M). The watch itself (decision 28 on a DEPLOY's first start) is unchanged. | **OPEN — P3; owner: CC (watch)** | — | — | CC | -| **R-994** | Apps & catalog | P3 | **Seven apps peak above 80 % of a memory limit, and 23 apps' typical use is above their catalog `mem_request`.** MEASURED 2026-10-13 (`documentation/audits/sizing-2026-10-13/SIZING.md` §3, `evidence/catalog-check.json`). Near a limit — risk: the container is stopped for using too much memory: docmost (container 475 of 512 MB), romm (703 of 768), termix (117 of 128), uptime-kuma (227 of 256, tester-1 telemetry), grafana (435 of 512), immich (`immich-server` 1,665 of 2,048 during a 200-photo import), tandoor (827 of 1,024). No container was killed during the bench. Under-stated request (typical ÷ request): calcom ×4.0, adventurelog ×3.6, termix ×3.4, claper ×2.5, grafana ×2.2, komga ×2.2, docmost ×2.1, recipe-importer ×2.1, uptime-kuma ×2.1, zipline ×2.0, and 13 more ≤ ×1.8. Templates NOT changed (read-only run). | **NARROWED 2026-10-17** — the six other limits raised (catalog `bff82f9`: docmost 768M, romm 1024M, termix 256M, uptime-kuma 384M, grafana 768M, tandoor 1280M; peaks now 46–69 %; live on 9201: docmost 805306368 bytes); the 23 requests → R-1119 (operator: wait). **Left: Immich** (`immich-server` 1,665 of 2,048 MB on a 200-photo import; tester-1's real library peaked at 2.9 GB) — raise after a measurement with a larger library. | — | Measure Immich with a larger library (bench), then its limit | CC | +| **R-994** | Apps & catalog | P3 | **Seven apps peak above 80 % of a memory limit, and 23 apps' typical use is above their catalog `mem_request`.** MEASURED 2026-10-13 (`documentation/audits/sizing-2026-10-13/SIZING.md` §3, `evidence/catalog-check.json`). Near a limit — risk: the container is stopped for using too much memory: docmost (container 475 of 512 MB), romm (703 of 768), termix (117 of 128), uptime-kuma (227 of 256, tester-1 telemetry), grafana (435 of 512), immich (`immich-server` 1,665 of 2,048 during a 200-photo import), tandoor (827 of 1,024). No container was killed during the bench. Under-stated request (typical ÷ request): calcom ×4.0, adventurelog ×3.6, termix ×3.4, claper ×2.5, grafana ×2.2, komga ×2.2, docmost ×2.1, recipe-importer ×2.1, uptime-kuma ×2.1, zipline ×2.0, and 13 more ≤ ×1.8. Templates NOT changed (read-only run). | **NARROWED 2026-10-17** — the six other limits raised (catalog `bff82f9`: docmost 768M, romm 1024M, termix 256M, uptime-kuma 384M, grafana 768M, tandoor 1280M; peaks now 46–69 %; live on 9201: docmost 805306368 bytes); the 23 requests → R-1125 (operator: wait). **Left: Immich** (`immich-server` 1,665 of 2,048 MB on a 200-photo import; tester-1's real library peaked at 2.9 GB) — raise after a measurement with a larger library. | — | Measure Immich with a larger library (bench), then its limit | CC | | **R-1018** | Apps & catalog | P3 | **The OnlyOffice links (FileBrowser, Nextcloud) have no recorded live proof since the move to Proxmox.** `controller/internal/integrations/` holds two handlers; no audit after the Proxmox move shows a document opened from FileBrowser or Nextcloud in OnlyOffice (searched 2026-10-14). The media-app links of `15` §6 will copy this code, including its revoke-on-stop rule (`lifecycle.go:10-13`). | **OPEN** — filed 2026-10-14 | — | One live walk on a Tier-0 box: install OnlyOffice + FileBrowser, open a document, save, read it back; then stop one app and record what the link does | CC | | **R-1028** | Apps & catalog | P3 | **Plex's claim code can run out during the install, and the box cannot recover it.** plex.tv's code lives 4 minutes from the moment the household copies it; the clock covers the wizard, the image pull (`plexinc/pms-docker` is 351 MB, measured) and the first start. Plex reads `PLEX_CLAIM` only on its first run, and the field is `locked_after_deploy` — so a late code leaves an unclaimed server and the only way back is remove + install again. Reported by the operator during the 2026-10-14 test; on Tester 1's line the pull+start took 8.5 s and the claim worked (`audits/media-all-drives-2026-10-14/``G-auth/G3-plex-claim.txt`), so it bites on a slow line or a slow hand. **K6, 2026-10-14 night (`audits/media-drive-events-2026-10-14/``K6-1-unclaimed-plex.txt`):** an unclaimed Plex starts with no code at all, and `POST /myplex/claim?token=` on the RUNNING server reaches plex.tv (a wrong code → 500 after plex.tv's 401). So the box can pull + start first and ask for the code after: no race. A real claim needs the household's code — the morning step on the throwaway `plex-k6` on Tester 1. Narrowed 2026-10-14 night. **PROVEN 2026-10-15 morning (`K6-2-claim-after-start.txt`):** the operator's real code, given to the RUNNING unclaimed `plex-k6` → 200, `claimed` 0→1, `PlexOnlineToken` written, and the open door closed (no token → 401). `ADVERTISE_IP` was unset and the claim did not need it; whether clients find the server without it was not measurable (the throwaway had no published port). **BUILT 2026-10-15 (v0.313.0):** `after_start` field — not asked at install; the Plex page asks for the code once Plex runs and claims the running server; the gate opens only when Plex says claimed. Proven up to the code on 9201 (G5). | **NARROWED** — the dashboard claim with a real code is the last step | a household Plex code | Claim through the Plex page with a real code (G5c); then close | CC | | **R-1029** | Apps & catalog | P3 | **Plex's folder picker shows the drives as identical „media” folders.** With one bind per drive at the same path (`/mnt/felhom-drives//userdata/media`), the leaf of every library folder is `media`; the drive's name sits two levels up, so in Plex's picker the household sees several folders all called „media” (reported by the operator during the 2026-10-14 test on Tester 1). It conflicts with `15` §2 reason 2 (the same path everywhere). | **READY** — filed 2026-10-14 | the layout decision (STATUS D9) | Decide in `15` §2: the players (`:ro`, never linked) may get a readable path per drive (e.g. `/media/`) without breaking the hardlink rule, which binds only the download/library apps | CC | @@ -148,7 +148,7 @@ stopping line that lies. | **R-1100** | Apps & catalog | P3 | **One sign-in for the dashboard and FileBrowser (proxy auth) — spike first.** Since controller 0.320.0 every app with a folder has „Fájlok ↗", and the box can show FileBrowser's password — but FileBrowser still asks for its OWN login the first time, so the household signs in twice. FileBrowser Quantum has a proxy-auth method (`auth.methods.proxyAuth`, header-trusted) that could take the dashboard session through traefik; nobody has measured it. Design: `architecture/02-controller-module-map.md` „Logins and folders". | OPEN — filed 2026-10-16 (task logins-folders). | — | Spike on demo-hp: proxy auth at the pinned tag (source + measured), a forwardAuth in traefik that answers only for a dashboard session, what a stranger reaching `files.` with a forged header gets, and what happens to FileBrowser's shares. | CC | | **R-1099** | Apps & catalog | P4 | **The N100 may hold RomM games in the old upload place, now shown under a fake „roms” platform.** Until 2026-10-16 RomM's own upload wrote to the drive's `roms/roms//`; after the mapping fix (catalog `fb18471`, R-1089) those files are at RomM's `library/roms/roms/…`. Measured on 9201: such a game showed as missing in its platform and again under a platform „roms” (`audits/romm-ghost-2026-10-16/B/b-after.txt`). Files put in with the file manager are not affected — they are now found. The N100 runs RomM (hub `/apps/romm`); CC does not log in to the lived-in box. | OPEN — filed 2026-10-16 | Operator: look at `roms/roms/` on the N100's drive in the file manager | If it holds platform folders: move them up one level into `roms/`, then run „Scan” in RomM; if it is empty, close | Operator | | **R-1117** | Apps & catalog | P4 | **Immich's and Nextcloud's Redis keep a volume they do not need** (upstream runs both without one; queues and caches only). Deferred from R-1096 on purpose: removing a volume from the compose leaves the old volume on installed boxes, and the nightly dump / an old backup's restore for a volume the compose no longer declares is unchecked. The RDB switch (catalog `5d9450b`) already removed the full-disk danger. | DEFERRED — filed 2026-10-17 | — | Measure the dump and an old-backup restore without the volume on 9202; then the template change + an orphan-volume note | CC | -| **R-1119** | Apps & catalog | P3 | **23 apps' `mem_request` is below their measured typical use (R-994's second half), and the requests feed the box's install check** (`controller` `stacks/deploy.go:1549` `memoryVerdict`: committed requests + the new one > guest memory − 384 MB → refused). The measured values (rounded up) would raise the household set (Immich, Jellyfin, Nextcloud, Home Assistant, Vaultwarden, paperless-ngx) from 3,622 to 3,910 MB of the 3,712 MB an 8 GB box can use, so its sixth app would be refused on the smallest supported box. The website estimator is not affected (it reads the measurement). Values ready: `audits/tester1-limits-filebrowser-2026-10-17/P3/`. | WAITING-ON-OPERATOR — filed 2026-10-17 (operator: „limits now, requests wait”) | the operator's decision: raise the requests (the box's check gets truer; 8 GB no longer takes the full household set) or keep them | Apply the decision through the catalog | CC | +| **R-1125** | Apps & catalog | P3 | **23 apps' `mem_request` is below their measured typical use (R-994's second half), and the requests feed the box's install check** (`controller` `stacks/deploy.go:1549` `memoryVerdict`: committed requests + the new one > guest memory − 384 MB → refused). The measured values (rounded up) would raise the household set (Immich, Jellyfin, Nextcloud, Home Assistant, Vaultwarden, paperless-ngx) from 3,622 to 3,910 MB of the 3,712 MB an 8 GB box can use, so its sixth app would be refused on the smallest supported box. The website estimator is not affected (it reads the measurement). Values ready: `audits/tester1-limits-filebrowser-2026-10-17/P3/`. | WAITING-ON-OPERATOR — filed 2026-10-17 (operator: „limits now, requests wait”) | the operator's decision: raise the requests (the box's check gets truer; 8 GB no longer takes the full household set) or keep them | Apply the decision through the catalog | CC | ## App updates — 4 rows (P3 4) @@ -210,7 +210,7 @@ stopping line that lies. | **R-1076** | Storage & devices | P4 | **A cheap SSD reports a vendor-less WWN, so a WWN-first disk key may not be unique.** MEASURED 2026-10-15 on the N100's system SSD (AirDisk 512 GB): `ID_WWN=0x5000000123456f1f` — NAA-5 with OUI `000000`, a pattern that looks like a placeholder; its serial `QDF922W009654S30EX` looks real. The agent's wipe binding prefers `wwn-` links (A/internal/storage/durable_device.go:32). Not known whether two units share the WWN. Evidence: `audits/storage-identity-2026-10-15/B-n100.txt`. | OPEN | — | Check a second unit of the same model (or vendor data); if shared, make the agent skip OUI-000000 WWNs (the design already keys on model+serial, `architecture/16-storage-physical-identity.md` §3). | CC | | **R-1077** | Storage & devices | P4 | **No USB enclosure that hides or fakes a disk's serial has been measured.** The storage-identity spike (2026-10-15) had none at hand and found none in earlier evidence; the design's `usb_bridge` unknown rule (`architecture/16-storage-physical-identity.md` §3) is therefore an assumption. Cheap single- and dual-bay bridges are known to report one bridge serial for any disk. Evidence: `audits/storage-identity-2026-10-15/README.md` case 4b. | OPEN | — | Buy or borrow one cheap USB enclosure (single and dual bay), run `tools/physdisk_probe.py` against it, and set the rule from what it reports. | Operator (a device) then CC | | **R-1094** | Storage & devices | P4 | **The whole-disk format refusal tells the household to format the free part — which is refused while the other part is in use.** SEEN 2026-10-16 (controller 0.318.0): 409 „Ezen a lemezen egy használatban lévő meghajtó van, ezért a teljes lemez nem formázható. Csak a szabad részét formázhatod." — since agent 0.158.1 a part next to a mounted part can only be USED (the root wrapper trusts no „Felhom's own" claim). Evidence: `audits/storage-identity-buildB-2026-10-15/live/14-samedisk-refusal-offer.txt`. | READY | — | Reword `err.web.meghajto_hasznalatban_formazas` (hu + en): „… nem formázható. A szabad részét használatba veheted." Next controller release; the copy gates run. | CC | -| **R-1118** | Storage & devices | P4 | **A drive decommissioned and then unplugged keeps its agent mount unit enabled on the host** (`mnt-.mount`, „Managed by felhom-agent”, `WantedBy=multi-user.target`), so every later boot waits for a device that is gone, and the agent's watchdog reports it „disconnected”. Decommission retires the drive logically (agent: „logical retire, data untouched”) and releases only the guest bind; no product path releases the host mount or forgets the drive. Seen on Tester 1 at the R-1022 teardown 2026-10-17 (four units left; the boot delay is read from the unit, NOT measured). | OPEN — filed 2026-10-17 | — | Decide „forget a decommissioned drive” (unit disabled + removed when the drive is absent), with a test | CC | +| **R-1124** | Storage & devices | P4 | **A drive decommissioned and then unplugged keeps its agent mount unit enabled on the host** (`mnt-.mount`, „Managed by felhom-agent”, `WantedBy=multi-user.target`), so every later boot waits for a device that is gone, and the agent's watchdog reports it „disconnected”. Decommission retires the drive logically (agent: „logical retire, data untouched”) and releases only the guest bind; no product path releases the host mount or forgets the drive. Seen on Tester 1 at the R-1022 teardown 2026-10-17 (four units left; the boot delay is read from the unit, NOT measured). | OPEN — filed 2026-10-17 | — | Decide „forget a decommissioned drive” (unit disabled + removed when the drive is absent), with a test | CC | ## Security & access — 22 rows (P1 1, P2 2, P3 13, P4 6) @@ -237,7 +237,7 @@ stopping line that lies. | **R-1119** | Security & access | P3 | **`RESEND_API` is exported into CC's own environment from `~/.bashrc` (line 88), so every Bash call CC makes carries it, and a plain `printenv`, `env` or `set` prints it into the transcript.** MEASURED 2026-10-17 (SPIKE Q6, names only): present in the parent `claude` process environment and in the Bash tool environment. | OPEN | R-1118's broker, for the clean fix (the value lives in the store and reaches only the command that names it) | Until then: find what reads it (memory: the Resend checks run it via `bash -ic`), then move the export out of `~/.bashrc` into that one script — the operator's shell file, so the operator's word | operator | | **R-1120** | Security & access | P3 | **`homelab-manifests/.claude/settings.json` allows `Bash(kubectl get:*)` without a prompt, and that pattern includes `kubectl get secret -o yaml`, which prints every value (base64) into the transcript.** Read 2026-10-17 at `origin/main` `e8e595a`, line 6; nothing in the file asks for Secret reads to skip the prompt. The local clone `~/git/homelab-manifests` is behind origin and has uncommitted edits to that same file (not touched). | OPEN | — | Add `Bash(kubectl get secret:*)` and `Bash(kubectl get secrets:*)` to `ask` (ask wins over allow), or a PreToolUse refusal like the spike's `kubectl-read-secret` rule. A permission change, so the operator's word (`.claude/rules/unprompted-work.md` §5) | operator | | **R-1121** | Security & access | P3 | **`~/rotated-secrets-2026-10-09.txt` still exists on DooPlex** — 632 bytes, modified 2026-10-09 13:08 +0200, mode 600 (SPIKE Q6: `test -e` + `stat` only, not opened). Left by the R-925 rotation work. If any value in it is still valid, it is one more plaintext secrets file in the home folder, readable by every CC session. | WAITING-ON-OPERATOR | what the file holds — only the operator knows | Operator: confirm every value in it is revoked, then `shred -u` it; or move the live ones into the R-1118 store | operator | -| **R-1120** | Security & access | P3 | **The Cloudflare tunnel runs before the box is claimed, and no document says whether that is intended.** The claim needs it: the claim mail links `https://felhom.` (`hub/internal/notify/templates.go:27`); `cloudflared` is started from the token with no claim check (`controller` `stacks/infra.go:85-90`; `01-topology-and-trust.md:119`, `:248`). Reachable before the claim: the dashboard serves only the claim page (code: 72 h life, 5 tries, 15 min lockout — `web/claim.go:22-33`), and `files.` — FileBrowser on its default login from its first start until the next base-stack tick sets a password (seconds; v0.326.0 re-checks every run). Options: (A) keep the tunnel; route FileBrowser publicly only after its default is replaced — small, no promise changes; (B) start the tunnel only after a LAN claim — the claim flow and its mail change, the household must be at home. Recommended A. From R-977. | WAITING-ON-OPERATOR — filed 2026-10-17 | the operator's choice A or B | Write the choice into `01` §5; build A (or B) | CC | +| **R-1126** | Security & access | P3 | **The Cloudflare tunnel runs before the box is claimed, and no document says whether that is intended.** The claim needs it: the claim mail links `https://felhom.` (`hub/internal/notify/templates.go:27`); `cloudflared` is started from the token with no claim check (`controller` `stacks/infra.go:85-90`; `01-topology-and-trust.md:119`, `:248`). Reachable before the claim: the dashboard serves only the claim page (code: 72 h life, 5 tries, 15 min lockout — `web/claim.go:22-33`), and `files.` — FileBrowser on its default login from its first start until the next base-stack tick sets a password (seconds; v0.326.0 re-checks every run). Options: (A) keep the tunnel; route FileBrowser publicly only after its default is replaced — small, no promise changes; (B) start the tunnel only after a LAN claim — the claim flow and its mail change, the household must be at home. Recommended A. From R-977. | WAITING-ON-OPERATOR — filed 2026-10-17 | the operator's choice A or B | Write the choice into `01` §5; build A (or B) | CC | ## Box system & updates — 12 rows (P2 1, P3 7, P4 4) @@ -343,8 +343,8 @@ stopping line that lies. | **R-1025** | Process & tooling | P4 | **A power drill on demo-hp cuts Tester 1 too, and nothing warns the session using it.** 2026-10-14 17:25 CEST another session cut demo-hp's plug (`plugcut.py --plug hp`, the Immich drill) while this session ran downloads on Tester 1 (VM 341 runs on demo-hp); Tester 1 rebooted and came back by itself. The drill's fence checks Tester 1 for backups and package jobs only. | **OPEN** — filed 2026-10-14 | — | Add „a test runs on Tester 1” to the fence (a marker file the testing session writes), or name the rule in `runbooks/target-selection.md` | CC | | **R-1039** | Process & tooling | P4 | **qBittorrent stalls on the LAST piece of an archive.org torrent; Transmission does not.** Seen three times on 2026-10-14 (Tester 1 S2 and S3, demo-hp 9201 live read-back): the film reaches 99.994 %, the piece shared with archive.org's side files (`__ia_thumb.jpg`, `_meta.sqlite`, `_meta.xml`) never arrives, qBittorrent's log shows „500 Internal Server Error” from the archive.org web seed, while Transmission finishes the same torrent and curl range requests on the same files answer 206. A household that uses archive.org torrents with qBittorrent hits it too; our tests finish only with a local peer. | **OPEN** — filed 2026-10-14 | — | Note it in qBittorrent's onboarding record; for test films use Transmission, or a public-domain torrent with real peers | CC | | **R-1078** | Process & tooling | P4 | **A controller comment still describes `mp1 /mnt/sys_drive` as a separate volume.** `C/cmd/controller/main.go:2546` („the SYSTEM-DATA volume (`mp1`, `/mnt/sys_drive`)…”) — `mp1` was removed by R-165; `sys_drive` is a folder of `mp0` (measured on all three boxes, `audits/storage-identity-2026-10-15/README.md`). The same stale cell in `07-backup-architecture.md` §6.1 was corrected in this session. Not fixed here: this run allowed no product-repo change. | READY | — | Correct the comment in the next controller change. | CC | -| **R-1121** | Process & tooling | P4 | **The controller's and the catalog's decoy suites run only when someone starts a full gate run by hand** — neither the pre-push hook nor CI (`--fast`) runs them (too slow, or they edit real files), so a decoy that goes quiet is again seen only by chance (R-1115's shape). The agent's runs in CI. Found by the R-1116 helper 2026-10-17. | OPEN — filed 2026-10-17 | — | A scheduled full run (CI cron or the nightly), with a mail on failure | CC | -| **R-1122** | Process & tooling | P4 | **The controller's decoy suite edits real tracked files (`handler_debug.go`, `update.go`, the locale bundles, templates) and plants `.go` files, with no lock** — a full run while another session edits the controller tree can overwrite that session's edits. felhom.eu's suite took an `flock` after the 2026-10-08 clobber. Found by the R-1116 helper 2026-10-17. | OPEN — filed 2026-10-17 | — | Run the suite in a scratch copy of the tree, or take the felhom.eu-style lock | CC | +| **R-1127** | Process & tooling | P4 | **The controller's and the catalog's decoy suites run only when someone starts a full gate run by hand** — neither the pre-push hook nor CI (`--fast`) runs them (too slow, or they edit real files), so a decoy that goes quiet is again seen only by chance (R-1115's shape). The agent's runs in CI. Found by the R-1116 helper 2026-10-17. | OPEN — filed 2026-10-17 | — | A scheduled full run (CI cron or the nightly), with a mail on failure | CC | +| **R-1128** | Process & tooling | P4 | **The controller's decoy suite edits real tracked files (`handler_debug.go`, `update.go`, the locale bundles, templates) and plants `.go` files, with no lock** — a full run while another session edits the controller tree can overwrite that session's edits. felhom.eu's suite took an `flock` after the 2026-10-08 clobber. Found by the R-1116 helper 2026-10-17. | OPEN — filed 2026-10-17 | — | Run the suite in a scratch copy of the tree, or take the felhom.eu-style lock | CC | | **R-1123** | Process & tooling | P4 | **`reuse_refs_check.py` treats every git directory beside the repo as a sibling repo**, including stray clones in the workspace (`felhom.eu-media`, `felhom.eu-sizing-push`, `felhom.eu-wt-sizing`), so a citation can resolve against a stale clone and pass. Found by the R-1116 helper 2026-10-17 (it also makes the agent suite 20 s here vs 5 s in CI). | OPEN — filed 2026-10-17 | — | Search only the four known repo names (or the main clones), with a decoy | CC |