docs(v0.27.0): REPORT — P3 self-heal reconcile done; live-validated on 9201

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-12 17:57:05 +02:00
parent 9580c8c75d
commit 9ff0410755
+19 -5
View File
@@ -58,8 +58,22 @@ live-propagation alternative is deferred to its own spike. (Build remaining —
`findmnt /mnt/<name>` 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 `<state-dir>/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).