Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.2 KiB
REPORT — slice 8C Phase A (agent half): disk endpoints + data-bearing classifier gate (v0.12.0) (2026-06-10)
Overwrite-latest report. Cumulative history: CHANGELOG.md. Implements the host-agent half of
TASK — Slice 8C. The controller de-privileging + disk-subsystem retirement is thefelhom-controllerhalf (v0.37.0). No hub change.
Outcome
The agent now owns disk execution. It serves the §6 disk-management endpoints the controller's UI
drives, with the 8C security invariant: the agent decides data-bearing-ness by inspecting the
actual device (agent-internal evidence), NEVER from the caller's claim. A compromised controller
asserting "this drive is blank" cannot wipe a data-bearing drive — proven live (a data-bearing
device → refused pending_signature, mkfs never called, the device untouched).
What landed
internal/storage—SudoHostOps.Format(device, fstype)(device-pinnedmkfs.ext4 -F/mkfs.xfs -f,ValidateBlockDevice+ValidateFSType, narrowFELHOM_FORMATsudoers).SudoHostOps.InspectDevice(device)→DeviceProbe(blkid -psignatures +lsblk -Jpartitions/mount).DeviceProbe.DataBearing()is conservative: any filesystem / partition table / partition / mount — OR a probe that did not read cleanly — is data-bearing (fail-safe).internal/localapi— the §6 disk endpoints, self-scoped (token→guest; cross-guest 403):GET /disks(drives + data-bearing flag),POST /disks/assign(benignEnsureMount),POST /disks/eject(benignUnmount+ dependent guests),POST /disks/format./disks/formatis the centerpiece: the agent inspects the device; blank → benign →mkfs; data-bearing →ClassStorageWipe→ the slice-4 gate →pending_signature(refused). The signed completion is slice 10.storageGateAdapterbridges to the gate (no new gate/crypto).
Tests
go test ./... green; -race green (build server). localapi security matrix: blank → mkfs called,
gate not consulted; data-bearing → 403, mkfs NEVER called, gate consulted; ambiguous/unprobed →
fail-safe destructive; gate-allows still refuses in 8C; assign/eject; cross-guest 403; bad
device/fstype 400; unconfigured 503. storage: validators (whitelist + injection rejection),
InspectDevice (blank/fs/parttable/mounted/failed-probe-fail-safe), Format invokes the right mkfs.
Live validation (demo-felhom)
A provisioned de-privileged controller (v0.37.0) drove the agent: GET /disks flagged the mounted
felhom-usb (/dev/sdb1) data_bearing: true and the LVM/PBS/dir storages false. POST /disks/format on the mounted-vfat /dev/sda2 → 403 "device is data-bearing — format requires operator authorization (pending_signature)"; agent log refusing format of a data-bearing device … gate=pending_signature; /dev/sda2 untouched. Deployed to the standing demo service as v0.12.0.
Deferred (stated, not built)
The operator-signed completion of a data-bearing wipe/format → slice 10. No spare blank
/dev/sd* on the demo to live-exercise an actual mkfs (won't format real disks — covered by unit
tests). No secrets committed.