Skip to content

Release 2026-09-29: Arena Studio v0.93 - #235

Merged
mbreiser merged 9 commits into
mainfrom
release/2026-09-29
Sep 29, 2026
Merged

mbreiser merged 9 commits into
mainfrom
release/2026-09-29

Conversation

@mbreiser

@mbreiser mbreiser commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Release candidate 2026-09-29 rc3 · candidate commit 801a9f27b0 · built on main 188bf63098

Live on Next: https://reiserlab.github.io/webDisplayTools/next/

Tool Version
Arena Studio v0.92 → v0.93
PR Title Head CI Release notes
#233 Studio v0.93: panel inventory — which panels are present and their firmware, in every run log bd2d27fa20 green Arena Studio
#234 fix(studio): Digital IO 1 can't be the trigger input — only Digital IO 2 reaches EINT (#168) dafd269dfa green Arena Studio

Promotion checklist

  • CI green on this PR and on every constituent PR (pixi run release checks)
  • Validated on a rig between sessions — comment Validated 801a9f2 … (pixi run tiers -- validate --rig … --by …). Any change to a constituent PR = rebuild (rc+1) = validate again.
  • Release window: Slack heads-up posted; nobody is mid-experiment (release lists recent rig runs — advisory)
  • After merge: rigs hard-refresh between sessions; if fictrac-bridge/ changed, rig PCs git pull + restart the bridge

Promote with pixi run release (merges with a merge commit — never squash — and tags release-2026-09-29). Manifest: releases/2026-09-29.json.

🤖 Generated with Claude Code release tooling (scripts/tiers/candidate.py)

mbreiser and others added 6 commits September 28, 2026 19:31
…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>
…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>
…O 2 reaches EINT (#168)

Only the "Digital IO 2 (5V)" BNC is wired to the panels' EINT net (U3 + J30
shunt); Digital IO 1 has no route, so `in_trigger` there gave a silently
dead trigger.

- parseRigIo: `in_trigger` on dio port 1 degrades to off with a warning
  naming Digital IO 2 (shown in the Console log at connect).
- Studio Rig I/O menu: the Digital IO 1 `in_trigger` option stays disabled
  on every firmware, with the reason as its tooltip; capability gating no
  longer enables it.
- Rig-io apply path: never sends SET_DIO_ROLE in_trigger to channel 1.
- Tests: N12io-c2 (parser + static Studio checks).

The controller-side refusal is reiserlab/LED-Display_G6_Firmware_Arena#45.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng it

It can never be valid (no EINT route on that BNC), so a permanently
disabled option was clutter. The reason moves into the Digital IO 1
label/select tooltips; the parser warning and the apply guard stay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Candidate for Production. PRs: #233, #234.

Release-Manifest: releases/2026-09-29.json
@mbreiser

Copy link
Copy Markdown
Contributor Author

✅ Validated 801a9f2 — candidate 2026-09-29 rc3 — on G6 2×10 bench arena (controller 04:E9:E5:12:91:E2, fw c15d840a restack/panel-boot) by Michael Reiser + Claude

Closed-loop run of pr225-bench-frame-index.yaml from https://reiserlab.github.io/webDisplayTools/next/ (rc3 = #233 + #234; #219 held back after the adversarial review, see its PR), stationary simulated fly, bridge 3.4.

  • Outcome COMPLETED: 805 arena commands, all ok; 0 error glyphs; 0 runner errors; STOP acked.
  • Closed loop opened on its frame_index: epoch A 400/400 frames at idx 25, epoch B 400/400 at idx 75. Identical to the v0.91/v0.92 runs.
  • Studio v0.93: panel inventory — which panels are present and their firmware, in every run log #233 panel inventory: run_metadata.panels = status ok, 20/20 present, none missing or mismatched, one firmware group 0x9BE0D3C7 ×20 (= g6-panel-v0.3.1-isp-eintlow-9014b5b). The provenance box reads "20/20 present · fw 0x9BE0D3C7 ×20 (64 KB prefix, no SD image)".
  • fix(studio): Digital IO 1 can't be the trigger input — only Digital IO 2 reaches EINT (#168) #234: Controller ▾ → Rig I/O: Digital IO 1 no longer offers in_trigger (the reason is in its tooltip); Digital IO 2 in_trigger is still enabled on this io_ext firmware.
  • run_metadata: channel: next, build: 801a9f27b0…, candidate: candidate 2026-09-29-rc3, tool_version: Arena Studio v0.93; controller fw c15d840a 2x10 … restack/panel-boot. No console errors; window name arena-studio@next.
  • The course-repo auto-commit was off in the test tab.

@mbreiser
mbreiser marked this pull request as ready for review September 29, 2026 20:57
@mbreiser
mbreiser merged commit 995ab34 into main Sep 29, 2026
8 checks passed
@mbreiser
mbreiser deleted the release/2026-09-29 branch September 29, 2026 20:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant