From 52ed52c131fa55b0e041a5613524ab7d8610387b Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Thu, 15 Oct 2026 21:09:54 +0200 Subject: [PATCH] =?UTF-8?q?CHANGELOG:=20v0.157.0=20=E2=80=94=20physical-di?= =?UTF-8?q?sk=20identity=20+=20POST=20/disks/same-disk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f064108..bc6bb12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ +## v0.157.0 — every storage place knows its physical disk(s); POST /disks/same-disk (2026-10-15) + +Design: felhom.eu `architecture/16-storage-physical-identity.md` §3, §4, §10 (operator rulings D1–D6, 2026-10-15). Spike: +felhom.eu `audits/storage-identity-2026-10-15/`. + +- **Identity of a storage place** (`internal/storage/identity.go`): the physical disk(s) under it, from `/sys`, `/run/udev/data` + and `/proc/mounts` only — partition → disk, device-mapper / LVM thin → slaves, loop → backing file → its disk. Keys: + `eui:` (NVMe), `serial:::`, `wwn:` only without a serial and only with a vendor (OUI ≠ 000000). + `proven`, or `unknown` with one reason: `vm` (systemd-detect-virt), `network`, `usb_bridge` (a placeholder serial — the rule + is the design's, UNPROVEN on a real enclosure, R-1077), `weak_wwn`, `no_serial`. No block I/O. +- **Reported:** `GET /disks` rows and the hub report's `storage_targets` gain `kind`, `physical_disks`, `identity`, + `identity_reason` (additive; the golden and the hub's copy change together). A dir storage is judged only on its OWN mount — an + absent drive is "not computed", never the root disk. +- **`POST /disks/same-disk`** `{a, b}` (guest paths) → `{different, proven, reason, a, b}`. Maps `/mnt/felhom-drives/` to + the host mount at exactly that path, and `/mnt/sys_drive`, `/var/lib/felhom`, `/var/lib/docker` to the guest's data volume's + storage. Anything else, or an absent drive → `unmapped`. A shared disk key is "same, proven" even when the disk is unknown. + Scoped like every `/disks` call. +- Tests: fixture `/sys` + udev trees for every spike case (one disk LVM thin, two disks, two partitions, a loop on a file, NVMe eui, + vendor-less WWN, a VM, a USB placeholder serial, a network share) and the same-disk call (equal, different, VM, NAS, absent + drive, scope); red-proofed (the LVM "diamond" bug was seen failing first; the VM, WWN, own-mount and sys_drive rules broken on purpose). +- `configs/` unchanged — no config-bundle job needed. **Not vouched** (the operator's act). + ## Unreleased (2026-10-15, afternoon) — the shared rule file; no code change - `.claude/rules/unprompted-work.md` §3 item 6: **a controller release needs no golden** — the floor carries it after the