// Package storage observes and reconciles the host's storage targets (doc 03 §7).
//
// Slice 5 builds the full model + reconcile machinery; only the read-only, no-hub-desired-
// state parts run live:
//
//   - Observe every Proxmox storage target and report it into the host-report
//     (hub.StorageTarget). The reported view is what the agent SEES; the hub holds the
//     authoritative manifest (desired class/role/policy/creds) and is not served until
//     slice 10. So class is a rotational HINT here, never authoritative.
//   - A storage watchdog: a fast-poll loop that detects a KNOWN target going
//     attached↔disconnected in seconds and triggers an immediate, debounced out-of-band
//     host-report (rather than waiting for the slow ~15-minute cycle).
//
// Phase A (this file set) is read-only: every host read it needs — /proc/mounts,
// /dev/disk/by-uuid, /sys/.../rotational, device presence — is non-privileged. Anything
// needing root (SMART via smartctl, lvs for thin-pool metadata, blkid) is deferred to
// Phase B's privileged HostOps surface.
//
// Layout:
//   - hostread.go  — the HostReader seam + a non-privileged procfs/sysfs implementation.
//   - durableid.go — deterministic durable_id derivation per target type (the
//     DR-load-bearing field: the hub re-attaches the RIGHT drive by it).
//   - observe.go   — the Observer: builds []hub.StorageTarget from Proxmox + host reads.
//   - watchdog.go  — the fast-poll watchdog: transition detection + debounced trigger.
//
// The collector (internal/hub) calls the Observer through a narrow seam, so hub does not
// import storage (storage imports hub for the wire type) — the same interface-seam pattern
// the collector uses for proxmox and cloudflared.
package storage
