From c9a8376e2e2c6260ea9af774751cc241c2abe5c2 Mon Sep 17 00:00:00 2001 From: Kevin Adams Date: Mon, 31 Aug 2026 08:46:48 -0400 Subject: [PATCH] docs: record write-path live-test results in ADR-012 alloc_image/path/volume_size_info/free_image confirmed working end-to-end against .92 after fixing the delete param-shape bugs. pool.dataset.create/delete both confirmed along the way. Only zfs.snapshot.* remains entirely untested against the WS transport. Co-Authored-By: Claude Sonnet 5 --- .../adrs/ADR-012-websocket-transport-v4.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.claude/cos/adrs/ADR-012-websocket-transport-v4.md b/.claude/cos/adrs/ADR-012-websocket-transport-v4.md index a51bc19..bdb1025 100644 --- a/.claude/cos/adrs/ADR-012-websocket-transport-v4.md +++ b/.claude/cos/adrs/ADR-012-websocket-transport-v4.md @@ -324,6 +324,31 @@ fell back to REST regardless of actual version. Fixed by parsing the `/system/version` string's major-version magnitude instead (SCALE's calendar versioning is unambiguously >= 24; CORE has only ever used 11.x-13.x). +**2026-08-31 — write path live-tested for the first time.** Ran a full +`alloc_image` → `path` → `volume_size_info` → `free_image` cycle against `.92` +with a disposable fake VMID, calling the plugin module directly (not deployed +to any Proxmox node — see the risk note in Implementation branch above). Found +and fixed two real bugs, same "string vs integer" class of issue that's a +running theme throughout the REST implementation: + +- `iscsi.target.delete` and `iscsi.targetextent.delete` were passed a raw + regex-captured id (a Perl string) — Pydantic rejects it without `int()`. +- `iscsi.extent.delete(id, remove=False, force=False)` is **positional**, not + `(id, {force=>bool})` — REST's `{force=>true}` body was landing in position + 2, which the API validates as a boolean field named `remove`, not `force`. + Fixed to unpack positionally, with `remove` always `false` (REST's DELETE + never asked for that — `free_image` deletes the underlying zvol separately). + +After the fix: a full cycle leaves zero orphaned targets, extents, +targetextents, or datasets on TrueNAS — confirmed by querying `.92` directly +before and after, which means `pool.dataset.create` and `pool.dataset.delete` +are now confirmed working too (the latter's `[id, {recursive,force}]` shape, +sourced from documented API research rather than guesswork, checked out on +the first try). This narrows the "write path not yet tested" warning +considerably but doesn't close it — still entirely untested: `zfs.snapshot.*` +(create/delete/rollback/query, none of it touched by this pass). The file's +own header warning has been narrowed to reflect this. + ## References - ADR-009 (established v4.0.0 = WebSocket, this ADR is the "how")