# felhom.eu — task reports > **Overwrite** this file with a summary of the most recent task only (uniform with the other repos; not cumulative). The cumulative hub history lives in [hub/CHANGELOG.md](hub/CHANGELOG.md); the scripts history lives in [scripts/CHANGELOG.md](scripts/CHANGELOG.md). ## Hub v0.45.0 — floor-UI separation + per-box MinAgent conditional floor (+ DSM spike, Q1c FAIL) — 2026-07-11 felhom.eu's parts of the NAS/coupling backlog-clear task (composite A–F; agent v0.82.0 + controller v0.115.0 shipped in their repos). Commits: hub `bbecf05` + manifest `37222d3` + rules `bbecf05`; DSM findings `37e60b4`; Q1c + follow-up `9b95f88`. ### Hub v0.45.0 (Parts C + D — LIVE, GitOps synced Healthy) - **Part C — floor-UI separation + effective-floor source:** the global controller-version floor is its own card with a type-to-confirm dialog that first shows the live blast radius (`GET /configuration/global-floor/impact` → `countBoxesBelowFloor`, honoring per-customer overrides); an effective-floor + source line (`store.ResolveGlobalFloor`) shows the resolved value and WHICH source won (DB `hub_settings` vs env `DEFAULT_MIN_CONTROLLER_VERSION`, both raw values). The Day-0 manifest save provably does not touch the floor (the 9-min-skew incident's root cause, now visible + isolated). - **Part D — per-box MinAgent conditional floor:** the artifact manifest gains `MinAgent`; at report-ACK time `store.ResolveManagedFloor(customerID)` HOLDS the controller floor for a box whose `hosts.agent_version` is below (or unknown vs) MinAgent, flags it on the Hosts dashboard (`floor held: agent < MinAgent `), and serves it once the agent qualifies. Mechanises "agent BEFORE controller floor" per box — the manual fleet check is retired (rule 3 updated). - **THE one comparator:** `web.compareVersions`'s body → leaf `internal/semver` (web delegates, store reuses; no import cycle, no second comparator). - Red-proofs (all: mutate → predicted failure → revert → green): DB-wins precedence; manifest-save- doesn't-touch-floor; impact count with override exclusion; managed-floor hold/serve/uncoupled/ unknown-agent + a fleet discriminator + the report-ACK wire test (held box omits the floor). - **Deployed:** built 0.45.0 on 180, manifest bumped, ArgoCD hard-refresh + sync → Synced/Healthy, rollout OK, live image `felhom-hub:0.45.0`. Live state: demo agent 0.82.0, Peti 0.81.0, MinAgent unset (uncoupled → no holds, as expected), floor 0.113.0 (DB). ### Part A — DSM spike (findings `documentation/audits/SPIKE-nas-dsm-2026-07-11.md`) Real DSM 7.2 (virtual-dsm on DooPlex, macvlan .199, driven via claude-in-chrome, torn down + ports dead) validated the consumer recipes E2E through the live add pipeline: NFS "Map all users to admin" = Route A PASS (hardlink incl.); squash-off = `not_writable` refusal; plain-user SMB PASS **with working hardlinks** (Q5 caveat CLOSED for Synology); wrong-password/share classify identically. The copy edits landed in controller v0.115.0; QNAP stays a stated caveat (no emulator — nothing fabricated). ### Part E — Q1c restart survival: **FAIL** (supervised, operator GO) `pct reboot 9201` proved a configured NAS automount trigger does NOT survive a guest reboot: the autofs trigger does not re-propagate into the guest's fresh namespace (shared→slave only carries post-bind mounts), so an in-guest access sees an **empty directory** and does not trigger the host mount — the dangerous case for a restarting media app. Apps otherwise recovered healthy. FAIL protocol honored (nothing repaired live); root cause + fix (agent `ReassertNetworkMounts` on guest reboot) spec'd at `documentation/backlog/FOLLOWUP-nas-automount-guest-reboot-reassert.md`. ### NOT done / open - The follow-up NAS-reboot-reassert fix (agent) — new task, evidence attached. - Held-floor state never fired live (no box below MinAgent, and MinAgent is unset) — test-proven only. - QNAP appliance pass (no emulator).