Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.2 KiB
REPORT — Impl-2b: enrollment wizards → /disks/candidates + end-to-end raw enrollment (controller v0.95.0)
Date: 2026-07-01 · Repo: felhom-controller · Class: Risky/supervised (first live raw
enrollment runs the Impl-1 guarded mkfs inside a real enroll). Companion agent work: v0.55.0→v0.58.0.
Final piece of the drive-enrollment series: both enrollment wizards now source candidates from the agent's raw-device scan, so a brand-new (non-PVE-storage) drive is discoverable + enrollable end-to-end.
1. Baseline → target
felhom-controller 6ce61e8 (v0.94.0) → v0.95.0. Agent v0.55.0 → v0.58.0 (separate repo — the
raw-drive path needed agent fixes the spec's "N/A agent" premise didn't anticipate; see agent REPORT).
2. Files changed + commits
internal/agentapi/client.go—ListCandidates+CandidatesResult/DiskCandidate(mirror the agent's/disks/candidates).internal/web/agent_disk_handlers.go—GET /api/disks/candidatespassthrough proxy.templates/storage_init.html/storage_attach.html— fetch/api/disks/candidates; renderinitialize/attach; dropped the client-side "already-managed" filter.internal/web/storage_handlers.go—resolveEnrollUUID: a raw candidate isn't in/disks, so resolve its fs-UUID from/disks/candidates(the enroll blocker the "reuse unchanged" premise missed). BothrunStorageInit+runStorageAttachuse it.- Tests:
agentapiTestListCandidates(+_Error),webTestRunStorageAttach_RawCandidate(+red-proof). CHANGELOG.md,README.md. Commitsfeab92c(wiring) +bea05ea(resolveEnrollUUID) onmain.
3. Green gate
go build ./..., go vet ./..., go test ./... — clean. Image felhom-controller:0.95.0 built on 180,
deployed to guest 9201 (golden/bootstrap), Up (healthy).
4. End-to-end live validation (real UI, claude-in-chrome, felhom.demo-felhom.eu)
| Step | Result |
|---|---|
| Discovery (init wizard) | ✅ /dev/sdd (SD/MMC/MS PRO, 59 GB, ext4) offered as the sole candidate; sda/sdb/sdc NOT shown. |
| Format via Impl-1 guard | ✅ enroll ran the guarded mkfs on /dev/sdd (formatted device … fstype=ext4) — the first real customer-flow guarded format. |
| Discovery (attach wizard) | ✅ the ext4 /dev/sdd offered under attach. |
| Enroll end-to-end | ✅ wizard attach → resolveEnrollUUID → mount (/mnt/teszt_enroll) → bind (/mnt/felhom-drives/teszt_enroll) → intent enrolled → guest-bind recorded → registered. UI shows "Aktív" (USB), alongside felhom-usb + felhom-flash, all Active — no false detach. |
| Health-tracked | ✅ the watchdog (RegistryKnownTargets) detected + self-healed a drop of the drive during testing. |
Note on the init slow-format path: a slow device (the 60 GB SD card, ~25 s mkfs) exceeds the
controller→agent request timeout; runStorageInit calls FormatDisk synchronously and does NOT poll the
agent's detached-format status (/disks/format/status), so on a slow device it aborts after the format
detaches and the mount/bind back-half doesn't run. Pre-existing (F20-BUG3-adjacent; not the Impl-2b
wiring). The end-to-end above was completed via the attach path (no mkfs) — which fully exercises the
candidate→enroll→active pipeline. Follow-up: make runStorageInit poll the detached-format status.
5. NOT done / follow-ups
- Init slow-format polling (above) —
runStorageInitshould poll/disks/format/statusso a slow-device format completes the enroll in one flow. - Impl-3 — the shared-box operator gate for self-serve format (raw-passthrough blind spot). The demo is a dedicated box, so self-serve format is appropriate there.
- The throwaway
/dev/sdd(SD card) is left enrolled + Aktív as living proof; the operator can eject it via the UI (Leválasztás) and unplug when done.
6. Observations
- The spec's premise ("just wire the wizards; the enroll flow already works") was optimistic: the entire
enroll + tracking machinery assumed a PVE-storage drive (
Observe()), so making raw drives first-class requiredresolveEnrollUUIDhere + a chain of agent fixes (see agent REPORT). All shipped + validated.