Repository navigation
Studio v0.93: panel inventory — which panels are present and their firmware, in every run log - #233
Merged
4 commits merged intoSep 29, 2026
Merged
4 commits merged into
4 commits merged into
Conversation
…rmware, in every run log (v0.93) Wire (js/arena-wire-g6.js): decodeControllerInfo() reads the 0xC2 feature bitmap appended after the MAC (FEATURE_BITS: panel_inventory, qwiic_i2c, ai_stream) and labels capability bit 6 ai_cal; encodePanelInventoryScan(action) 0xD0, encodeGetPanelInventory(first) 0xD1, decodePanelInventory() for the 18-byte page header (scan_id at [17]) + 5-byte entries; PANEL_STATUS_NAMES / PANEL_INVENTORY_FLAGS. Golden tests for all of it, including the 0xD0 echo, the past-the-end page and a pre-scan_id 17-byte header (rejected). Reader (js/studio-panel-inventory.js, dual-export): readAll() pages the fleet and re-reads from first=0 when scan_id changes between pages; summarize() → present / missing / firmware groups / mismatched (≠ SD image, else outside a strict fingerprint majority, plus no-ISP panels); describe(); toRunMeta(). Studio: Studio.features from every 0xC2 decode; Studio.refreshPanelInventory() after refreshFirmwareVersion() on Connect, on the gesture-free reconnect hook and from Controller ▾ info, gated on the panel_inventory feature; one follow-up read while the boot sweep is still running. Provenance box shows "panels: 20/20 present · fw 0x9BE0D3C7 ×20 …"; run_metadata.panels (studio-meta buildMeta) carries the compact record. Console → Panel firmware gets Inventory / Rescan (0xD0 action 1 after quiesceDisplay, follow-up read 3 s later). Help-mode text. Bench (G6_2x10, fw #59 bf2a8e3): link-up read 20/20 · 0x9BE0D3C7 ×20 · scan 9; Rescan → scan 10 with FP_VALID inside the follow-up window; no console errors. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… cache (Codex review)
- Studio.panels is cleared before every read, on a failed read and on
disconnect (with Studio.features); Studio.panelsStatus records why.
- runOnce() re-reads the inventory right before startRunLog(), so
run_metadata.panels is a run-start snapshot, not connect-time state.
- toRunMeta(inv, status) always returns {schema: 1, status: ok|pending|failed|
unsupported|disconnected, …}; per-panel array renamed panel_status;
presence_valid / fp_in_progress added.
- readAll() also re-reads when a page's `first` is not the requested offset
or panel_count changes between pages.
- Rescan is guardDestructive (it stops the display); all follow-up reads go
through Studio.scheduleInventoryFollowUp (connected + not running).
- Tests for each; verified live on the G6_2x10 (fw #59 c15d840 build).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…y-host # Conflicts: # pixi.toml
…ile back to main's Feature PRs no longer bump versions (docs/development/release-process.md rule 4); the release commit does it and folds the notes in from the PR body. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This was referenced Sep 29, 2026
Merged
mbreiser
added a commit
that referenced
this pull request
Sep 29, 2026
…and their firmware, in every run log # Conflicts: # pixi.toml
mbreiser
added a commit
that referenced
this pull request
Sep 29, 2026
…and their firmware, in every run log
4 of 5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The Studio records which panels are present and what firmware each one runs in every run log, from controller firmware with the panel-inventory feature (reiserlab/LED-Display_G6_Firmware_Arena#59; spec reiserlab/Modular-LED-Display#71).
js/arena-wire-g6.js):decodeControllerInfo()reads the 0xC2 feature bitmap appended after the MAC (FEATURE_BITS:panel_inventory,qwiic_i2c,ai_stream) and labels capability bit 6ai_cal;encodePanelInventoryScan(action)0xD0,encodeGetPanelInventory(first)0xD1,decodePanelInventory()for the 18-byte page header (scan_idat [17]) + 5-byte entries;PANEL_STATUS_NAMES/PANEL_INVENTORY_FLAGS. Golden tests for all of it.js/studio-panel-inventory.js, dual-export, DOM-free):readAll()pages the fleet and re-reads whenscan_id,firstorpanel_countdisagree between pages;summarize()→ present / missing / firmware groups / mismatched (≠ SD image, else outside a strict fingerprint majority, plus no-ISP panels);describe();toRunMeta().Studio.featuresfrom every 0xC2 decode; the inventory is read on Connect, on the gesture-free reconnect, from Controller ▾ info, and again at run start right beforestartRunLog(), sorun_metadata.panelsis a run-start snapshot. The record is always an object —{schema: 1, status: ok | pending | failed | unsupported | disconnected, count, present, missing, panel_status[], firmware[{crc32, panels}], mismatched, ref_crc32, fp_len, presence_valid, fp_valid, fp_in_progress, scan_id, age_ms}— so an absent inventory is never mistaken for "no panels".Studio.panelsis cleared before every read, on failure and on disconnect. Provenance box:panels: 20/20 present · fw 0x9BE0D3C7 ×20 (64 KB prefix, no SD image). Console → Panel firmware → Inventory / Rescan (0xD0 action 1,guardDestructive, gated follow-up read). Help-mode text. Older firmware: nothing is sent; the box says "firmware without panel inventory".Coordination: #219 (
claude/controller-settings-block) rewrites much ofarena_studio.htmland wants per-panel firmware for its run header — it can readStudio.panelsafter rebasing over this (~40 lines in the Studio: therefreshPanelInventoryblock, three connect-path hooks,runOnce,startRunLog, the fleet row). Suggested to share a Next candidate with #219: both touch the 0xC2/connect path and validate on the same bench firmware.Tier
next candidate
Release notes
Studio
panelsrecord (next tofirmware) describes the panels at that run's start: a missing panel or one on different firmware is on record for that run.statusok / pending / failed / unsupported — so an absent inventory is never mistaken for "no panels". On older controller firmware the box says "firmware without panel inventory" and nothing is sent.Review
Codex GPT-5.5 standard + adversarial cross-review (report in the branch worktree's
.codex-review/). Its blocking finding — a staleStudio.panelswritten into the next run's metadata after a failed re-read — and its design points (run-start capture, durablestatus, page coherence) are in the second commit.Test plan
pixi run test(full suite) green;test-arena-wire-g6.js314 checks, newtest-studio-panel-inventory.js49 checks,test-studio-meta.js460x9BE0D3C7×20 ·status: ok; run-start record;unsupported/failedpaths null the cache and record their status; guarded Rescan → newscan_idwith the gated follow-up; disconnect clears everything; no console errorsrun_metadata.panelsto the course repo (on /next/)🤖 Generated with Claude Code