# SPIKE — Decommission / migration feasibility (2026-06-14) **Report-only. No feature code, no version bump.** GATE: B1/B2 do not start until the product owner reviews these findings and picks the forks at the end. **Product decision (locked, restated):** storage decommission is **self-serve — NO operator signature**. It is the customer's own drive; we warn (and offer migration) but do not gate on operator authorization. Decommission is **non-destructive** — un-enroll + drop the guest bind; **data stays on the drive**. It must **NOT** format/wipe — that remains the separate customer-confirmed wipe flow. Evidence is `file:line` + (live) where empirically checked on demo guest **9201** (host `felhom-pve`, 192.168.0.162). The legacy bare-metal `controller/docker-compose.yml` was NOT trusted — the real deploy is the golden/bootstrap `docker run` in `felhom-agent/configs/build-golden.sh`. --- ## Q1 — Data-move layer (controller vs agent) **The controller's actual /mnt mount** — `felhom-agent/configs/build-golden.sh:179-186`: ``` docker run -d --name felhom-controller --restart unless-stopped ... \ -v /mnt:/mnt:rslave \ -v /var/run/docker.sock:/var/run/docker.sock \ "$IMAGE" ``` De-privileged (`build-golden.sh:176-178`: NO `--privileged`, no `/dev`, no `/etc/fstab`). The host pre-shares /mnt so agent binds propagate in (`build-golden.sh:173-175`: `mkdir -p /mnt; mount --rbind /mnt /mnt; mount --make-rshared /mnt`). **`rslave` is read-WRITE for file content.** `rslave` governs *mount-event propagation direction* (host→ container only — the container can't mutate the guest mount tree), NOT file permissions. The bind has **no `:ro`**, so reading/writing file *content* under /mnt is allowed. **Live proof (inside the `felhom-controller` container on 9201):** ``` $ docker exec felhom-controller sh -c '... write/read/delete a marker under each enrolled path ...' == mount opts for /mnt == /dev/mapper/pve-vm--9201--disk--0 /mnt ext4 rw,relatime,stripe=16 0 0 -- writing /mnt/felhom-usb/.felhom-spike-marker -- WRITE_OK / spike-1781452108 / DELETE_OK -- writing /mnt/sys_drive/felhom-data/.felhom-spike-marker -- WRITE_OK / spike-1781452108 / DELETE_OK ``` Both enrolled storage paths (`/mnt/felhom-usb`, `/mnt/sys_drive/felhom-data`) are writable+deletable from inside the controller container. **Conclusion — chosen layer = CONTROLLER.** The controller already holds RW access to every enrolled drive under /mnt, so it can perform an app's data move **itself**, in-process, no agent round-trip for the bytes. The agent is needed only for the privileged side-effects that bracket the move: **unmount** (eject/decommission) and **intent** recording. **The move primitive is `rsync`, not `cp -a`** (see locked decision #3): B1 needs copy→verify→remove that is idempotent/resumable — `rsync -a --checksum` (copy + verify) → confirm → only then remove the source; a crash mid-copy just re-runs. rsync is already the controller's cross-drive primitive (Tier-2 off-drive backup). --- ## Q2 — "Migrate" button state `controller/internal/web/templates/settings.html:337`: ```html 📦 Összes adat átköltöztetése ``` **Vestigial.** It is a ``, not a `