diff --git a/REPORT.md b/REPORT.md index 790d886..e11bdac 100644 --- a/REPORT.md +++ b/REPORT.md @@ -58,8 +58,22 @@ live-propagation alternative is deferred to its own spike. (Build remaining — `findmnt /mnt/` shows two (identical) rows — functional (IsMountPoint true, apps write fine); inherent to rbind (a non-recursive bind would hide the submounts from the container). Tidy later. -## Not done (next build increments) -- **P3** self-heal watchdog reconcile (4-state new/enrolled/ejected/decommissioned, durable-id-keyed) + - safety rails (flapping backoff, durable-id-only, in-progress-op respect, PVE coordination, - re-propagate); flags "restart to reconnect" for recovered drives. -- **P4** dual-role eligibility + backup-aware wipe warning. Cross-drive backup ENGINE stays out of scope. +## P3 self-heal reconcile — DONE (agent v0.27.0) +- **`IntentStore`** (`internal/storage/intent.go`): durable, durable-id-keyed 4-state model + (new/enrolled/ejected/decommissioned), atomic writes, `OnAbsent` replug rule. Intent recorded ONLY + via the official enroll (`/disks/guest-attach`, incl. the idempotent path) + eject (`/disks/eject`, + before unmount) paths. +- **Watchdog**: re-mount candidate now intent-gated (only `enrolled` self-heals) + a present→absent + hook clears `ejected`; exponential-backoff flapping guard (alert@4, hard stop@8, failure = "still + not present a full backoff window after dispatch" so a slow async re-mount isn't miscounted). +- **Wired in main.go**: one `IntentStore` at `/drive-intents.json`, shared by the watchdog + + the local API; open failure degrades to ungated legacy remount. +- **Tests**: intent states/persistence/replug-rule/gate + the watchdog scenarios (colleague-unmount→ + reconciled, ejected/new/decommissioned→left alone, ejected→absent→replug→auto-mount, flapping→caps). +- **Live-validated on 9201**: out-of-band `umount` → watchdog "self-heal — re-mounting enrolled drive + (no eject intent)" → host **HEALED** within a tick; official eject → intent `ejected` → **NOT + reconciled** (stays unmounted). (No golden change — P3 is host-side.) + +## Not done +- **P4** dual-role eligibility + backup-aware wipe warning (controller). Cross-drive backup ENGINE stays + out of scope (needs a 2nd physical drive).