diff --git a/.github/release-notes/v0.5.0.md b/.github/release-notes/v0.5.0.md index 12ec41221..6e2f04635 100644 --- a/.github/release-notes/v0.5.0.md +++ b/.github/release-notes/v0.5.0.md @@ -2,7 +2,7 @@ **Released:** 2026-09-08 -This release lands two large hardware efforts: full **Lian Li TL LCD and L-Wireless** support (wired panels, RF controller, wireless LCD receivers) and a productized **OpenRGB fallback** that Hypercolor can install, partition, launch, and supervise on your behalf. Alongside them, a new `rig-setup` agent skill turns a physical PC build into a working spatial layout, and the Studio canvas gets a hard look at frame-budget behavior on dense scenes. +This release lands two large hardware efforts: full **Lian Li TL LCD and L-Wireless** support (wired panels, RF controller, wireless LCD receivers) and a productized **OpenRGB fallback** with installation guidance, detector partitioning, and managed server startup. Alongside them, a new `rig-setup` agent skill turns a physical PC build into a working spatial layout, and the Studio canvas gets a hard look at frame-budget behavior on dense scenes. ## 🌟 Highlights @@ -16,7 +16,7 @@ New crate `hypercolor-openrgb-host` detects the installed OpenRGB binary (native Hypercolor now tracks what it *cannot* drive. `GET /devices/unclaimed` lists USB hardware no enabled native driver claims, `GET /devices/coverage` joins native, bridge, and unclaimed views per physical device, and `GET /system/openrgb` reports installation, endpoint probes, permission checks, and coverage in one payload. The UI surfaces this through `unclaimed_hardware.rs` and `bridge_status.rs`, including prefilled device-support issue links. ### 🤖 The `rig-setup` agent skill -A user-facing skill that onboards a physical build end to end: inventory, coverage, interview, generate, dial in. `skills/rig-setup/scripts/gen_layout.py` turns a case spec (mm geometry, mount positions) plus a rig spec into attachment profiles, a spatial layout, and a named scene, working offline against a saved template catalog when the daemon has no coverage route. `coverage.py` decides native vs bridge vs unsupported (falling back to `lsusb`, `system_profiler`, or `pnputil`), and `request_support.py` files a deduplicated GitHub issue for unclaimed hardware. Skills now ship in the release tarball under `share/hypercolor/skills`. +A user-facing skill that onboards a physical build end to end: inventory, coverage, interview, generate, dial in. `skills/rig-setup/scripts/gen_layout.py` turns a case spec (mm geometry, mount positions) plus a rig spec into attachment profiles, a spatial layout, and a named scene, supporting offline generation from a saved template catalog. `coverage.py` decides native vs bridge vs unsupported (falling back to `lsusb`, `system_profiler`, or `pnputil`), and `request_support.py` checks for existing requests and prints a prefilled issue URL; passing `--file` submits the request through an authenticated `gh` session. Skills now ship in the release tarball under `share/hypercolor/skills`. ### ⚡ Studio canvas under a frame budget `layout_canvas.rs` drops overlapping per-output backdrop filters, memoizes render metadata via `Memo::new`, samples pointer geometry once per animation frame (flushing final movement on release), and keeps `` outputs keyed across edits. Measured on an 80-output scene during development, median frame intervals fell from **66.7 ms to 16.7 ms** and median hover work from **5 ms to 0.7 ms**. `e2e/tests/studio-performance.spec.mjs` pins the resulting *behavior*: drag and undo state, output stacking during hover, absence of per-output backdrop filters, inspector freshness, and no redundant scene fetch. @@ -39,8 +39,8 @@ A user-facing skill that onboards a physical build end to end: inventory, covera - **CLI**: `hypercolor openrgb status | hints | partition | start | stop | resize `. The managed server binds loopback only, runs headless, and logs to `/logs/openrgb.log`. - **Detector partition** (`data/openrgb/detectors.toml`): per-family prefix matching for `razer`, `lianli`, `corsair`, `dygma`, `nollie`, and `asus`/ENE. Families with an active native driver are disabled in OpenRGB's config; user toggles outside the managed keys are preserved, and re-enabling requires an explicit list. - **Permission checks** (Linux): `udev_rules`, `i2c_dev_module`, `i2c_nodes_writable`, `hidraw_nodes_writable`, each carrying a concrete remedy command. -- **Driver hardening**: writers paced to `target_fps` from a detector-class table, one shared SDK link per endpoint with a reconnecting task, `RESIZEZONE` gated behind a clean close, brightness verified on output activation, frame-shape mismatches guarded, and serial plus location published in discovery metadata. -- **Live reconciliation**: flipping `drivers..enabled` registers or unregisters the output backend without a restart, and `openrgb diagnose` joins the safe diagnostic checks. +- **Driver hardening**: writers paced to `target_fps` from a detector-class table, one shared SDK link per endpoint with a reconnecting task, zone resizing requires explicit opt-in and a resizable zone, brightness verified on output activation, frame-shape mismatches guarded, and serial plus location published in discovery metadata. +- **Live reconciliation**: flipping `drivers..enabled` registers or unregisters the output backend without a restart, and `hypercolor diagnose --check openrgb` checks bridge connectivity and reports output-disabled routes. - **Zone sizes**: `PATCH /config/keys/drivers.openrgb.zone_sizes` merges an object patch against current settings, keyed by driver-minted controller fingerprint then zone name, and applies on connect. ## 🔭 Events and API @@ -82,14 +82,14 @@ A large grouped Rust bump (77 crates) plus the workspace follow-through on every - **System-packaged user service identity changed.** `packaging/systemd/user/hypercolor.service.system` now sets `HYPERCOLOR_SERVICE_IDENTITY=user_service:systemd:hypercolor.service` (was `system_service:...`). Distro packagers must ship the updated unit, or protected control operations will attest with the wrong identity. - **New udev rules are required for Lian Li TL LCD and wireless receivers.** `udev/99-hypercolor.rules` adds product-scoped rules for `04fc:7393`, `1cbe:0006`, and `1cbe:0005`. Without reinstalling and reloading the rules, those panels will not be reachable. - **Release archive layout changed.** Tarballs now include `share/hypercolor/skills`, and the manifest reports `user_skill_files` alongside `skill_files`. Packaging scripts that enumerate archive roots need updating; `scripts/verify-release-artifact.sh` enforces the new contract. -- **`hypercolor-control` moved** from `.agents/skills/` to `skills/hypercolor-control/`. Anything referencing the old path should follow the move. -- **`DisplaySummary` gained a `rotation` field** and face requests now carry the display rotation field. The field is serde-defaulted, so old clients keep decoding, but clients that round-trip face requests must preserve it or they will silently reset a screen's mounting. +- **User-facing skills now live under `skills/`.** The old `.agents/skills/hypercolor-control` path remains available through a compatibility symlink. +- **Display mounting rotation is now a device setting.** `DisplaySummary.rotation` reports the mounting orientation. Update it through `PUT /api/v1/devices/{id}` using `display_rotation`; face-assignment requests do not carry this setting. ## Upgrade Notes -1. Reinstall and reload udev rules on Linux: `sudo cp udev/99-hypercolor.rules /etc/udev/rules.d/ && sudo udevadm control --reload-rules && sudo udevadm trigger`. +1. Reload the updated Linux udev rules. From an extracted release archive, run `sudo cp lib/udev/rules.d/99-hypercolor.rules /etc/udev/rules.d/ && sudo udevadm control --reload-rules && sudo udevadm trigger`. In a source checkout, the rules file is `udev/99-hypercolor.rules`. 2. Distro packagers: pick up the updated `hypercolor.service.system` and the `share/hypercolor/skills` archive root. 3. Regenerate any OpenAPI-derived clients. The Python client in `python/src/hypercolor/_generated/` is already regenerated for coverage, unclaimed devices, OpenRGB status, display rotation, and `forget_device`. -4. If you previously killed OpenRGB before launching Hypercolor, stop doing that. Run `hypercolor openrgb status` to see what is detected, `hypercolor openrgb hints` for install commands, then `hypercolor openrgb start` to adopt or launch a managed loopback server. Native drivers still take precedence per device. -5. Run `hypercolor devices coverage` after upgrading to see which hardware is native, bridged, or unclaimed, and `hypercolor devices unclaimed` to generate support requests for the rest. +4. For hardware without a native driver, run `hypercolor openrgb status` and `hypercolor openrgb hints`. After installing OpenRGB, enable the bridge with `hypercolor config set drivers.openrgb.enabled true`, select managed ownership with `hypercolor config set drivers.openrgb.ownership.mode open_rgb_owned`, then run `hypercolor openrgb partition` and `hypercolor openrgb start`. Native drivers retain ownership of supported devices. +5. Run `hypercolor devices coverage` to inspect native and bridged ownership, and `hypercolor devices unclaimed` to list unmatched USB hardware. Use the rig-setup skill's `request_support.py` helper to prepare support requests. 6. Lian Li LCD owners: set the panel's mounting rotation in device detail or Studio so faces, media, and effects turn with the screen.