• v0.3.29 b82b1a621b

    v0.3.29 Stable

    calum released this 2026-07-16 23:17:48 +01:00 | 142 commits to main since this release

    0.3.29 test build (ADR-N039): FE fix batch. LookupCombobox opt-in click-shows-all (media/signal only). Raw-id leak sweep — Network switch dropdown + LAG table Device col + IpSchedule device dropdown/table now render composed labels via composeDeviceLabel(dev, {brands, models}). Create/Edit port-line parity restored (Mode/V-native/V-allow/PoE/Speed in Create). Column-aligned bulk header row on the network ports table with per-column controls defaulting to '(no change)' + Apply-to-selected — replaces the pre-N039 popup + toolbar. Network port labels bare 'Port N'; misc unchanged 'type - NNN'. FE-only. Rust 56/56, TS+Vite clean.

    Downloads
  • v0.3.28 f08c7a7bd0

    v0.3.28 Stable

    calum released this 2026-07-16 21:14:41 +01:00 | 143 commits to main since this release

    0.3.28 test build (ADR-N038): seeded system device_types (dt-switch, dt-access-point, dt-router-firewall) with backend-enforced immutability; retire devices.category (migration 010); PoE control gated to copper media (100M/1GbE, 10GbE) with a 3-state select; speed is DERIVED from media type at every port-add path (SFP=1G, SFP+=10G, SFP28=25G, QSFP=40G, QSFP28=100G, 10GbE=10G; 100M/1GbE toggles between 100M and 1G, default 1G). Dead validation rules (poe_budget_per_switch, ap_on_non_poe_port) re-live by keying off the seeded system ids. Backend deployed first, wire-verified. Rust 56/56, pytest 39/39, TS+Vite clean.

    Downloads
  • v0.3.27 da4666cf18

    v0.3.27 Stable

    calum released this 2026-07-16 19:31:57 +01:00 | 144 commits to main since this release

    0.3.27 test build (ADR-N037): display fixes + labelling batch. Unit-collision message names the device (no UUIDs). Offline sync errors read 'No internet connection — working offline...' No transport text, no expander. Port auto-numbering per (device, type) at creation: two devices of same brand+model each start at 001. DMX signal_types renamed to 'DMX 3P/5P (M/F)' (same ids, no ghosts). short_name column additive on media_types + signal_types with six approved overrides (DP, TBLK, IEC, DC, BT, OM4). Backend deployed first, wire-verified. Rust 56/56, pytest 34/34, TS+Vite clean.

    Downloads
  • v0.3.26 58f075582a

    v0.3.26 Stable

    calum released this 2026-07-16 18:17:06 +01:00 | 145 commits to main since this release

    0.3.26 test build (ADR-N036): provisional-visibility invariant. Hard-blocker fix on 0.3.25 — type-to-create a brand under a selected device type no longer makes the brand disappear from the picker. withProtected() unions each filtered picker's items with the currently-selected value + any id type-to-created during the form session. Applied to brand + model + device_type in create + edit. FE-only. No backend / schema / migration changes. Rust 53/53 unchanged; TS + Vite clean.

    Downloads
  • v0.3.25 bb9fe8fed2

    v0.3.25 Stable

    calum released this 2026-07-16 17:09:27 +01:00 | 146 commits to main since this release

    0.3.25 test build (ADR-N035): a MODEL belongs to a BRAND and has a DEVICE TYPE. Backend + client schema deployed together — models gain brand_id + device_type_id; uniqueness moves to (brand_id, key). Devices form cascades: type unfiltered; brand filters by type; model filters by brand+type; model pick auto-fills brand+type; model +Add requires brand+type first. Save-time re-upsert on brand change creates model under new brand (old row stays). Rust 53/53, pytest 29/29, TS+Vite clean.

    Downloads
  • v0.3.24 d811f6bc0a

    v0.3.24 Stable

    calum released this 2026-07-16 14:55:08 +01:00 | 147 commits to main since this release

    0.3.24 test build (ADR-N034): library.sqlite becomes a real mirror of the backend catalogue. sync's do_upsert prunes any local vocab row absent from the fetched catalogue and not marked unsynced=1. Fixes the operator finding on 0.3.23 (backend hard-deleted brands/models/device_types but fresh-project pickers still listed them). Prune only reachable on ProviderOutcome::Ok(cat); Unavailable never prunes. Order: pull -> upsert+prune -> reconcile -> ghosts. Rust 49/49, TS+Vite clean.

    Downloads
  • v0.3.23 db276dfe50

    v0.3.23 Stable

    calum released this 2026-07-16 00:16:13 +01:00 | 149 commits to main since this release

    0.3.23 test build (ADR-N033): case-sensitive '+ Add' gate, resurrect clears local deleted_at, sync pull-path conform + per-row failure isolation + toast dedup + sync-on-nav/create/delete. Backend cleanup (data-only): hard-deleted 15+10+3 orphan brand/model/device_type rows. Rust 44/44, pytest 22/22.

    Downloads
  • v0.3.22 97ead57636

    v0.3.22 Stable

    calum released this 2026-07-15 20:06:51 +01:00 | 150 commits to main since this release

    0.3.22 test build (ADR-N032): simplification — create-rule + reconcile, unified ghost path, silent-IPC-error toasts. Deferred-push apparatus deleted (flushOnNavigate + bridge.rs + delete IPCs). Backend + client shipped together. Backend deploys first, wire-verified. Rust 40/40, pytest 22/22.

    Downloads
  • v0.3.21 3dadb41df5

    v0.3.21 Stable

    calum released this 2026-07-15 16:54:01 +01:00 | 152 commits to main since this release

    0.3.21 test build (ADR-N011 hands-on-validation exception): library vocab soft-delete + labelled ghosts (ADR-N031). Backend + client shipped together (backend deployed first, wire-verified: DELETE 204, row still in /catalogue with deleted_at, second DELETE idempotent). Ghost text now shows actual label, not raw UUID. LIBRARY_SCHEMA_VERSION 4->5 via migration 005. Verified by execution (phase3_21_soft_delete.rs). Rust 37/37, pytest 17/17.

    Downloads
  • v0.3.20 1b989af066

    v0.3.20 Stable

    calum released this 2026-07-15 15:17:50 +01:00 | 153 commits to main since this release

    0.3.20 test build (ADR-N011 hands-on-validation exception): recompute ghosts on device/port mutations. Fixes persistent brand ghost after edit on 0.3.19. Additive; library_rev nullability + ADR-N029 id authority + sync path all unchanged. Verified by execution via new phase3_20 integration test.

    Downloads