Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions .agents/skills/g6-orientation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ interface.
|---|---|
| **reiserlab/maDisplayTools** | **MATLAB** tools (G4+). Pattern math reference — **web output must match MATLAB exactly** (CI validates, tol 1e-4). Its protocol **runner is G4.1-only and frozen** (decision 2026-10-26); protocol authority = `webDisplayTools/docs/development/v3-spec.md` + conformance fixtures. (Its `docs/development/G4G6_ROADMAP.md` is largely historical now — use the umbrella docs for current G6.) |
| **reiserlab/LED-Display_pyDisplayTools** (pyDisplayTools) | **Python** tools for the displays (G4 pattern + experiment-folder tools). **Accepted destination** for the Python arena library and the **headless runner** (`arena-run`), a peer of the web runner (decision 2026-10-26). |
| **reiserlab/rig-nodes** | **Accepted destination, not yet created:** shared ROS 2 infrastructure for every lab rig (`rig_interfaces`, device nodes for FicTrac / Kinefly / BIAS / ScanImage / SiPM, MCAP recording and supervision primitives). Today that code lives in `webDisplayTools/rig/` on the 2026-10-20 release candidate. Record: `webDisplayTools/docs/development/rig-software-repos-and-runners.md`. |
| **reiserlab/rig-nodes** | **Current location (since 2026-10-26)** of the shared ROS 2 infrastructure for every lab rig: `rig_interfaces` (FicTracFrame, ArenaFrame, ConnectorReply), the device adapters + simulators (FicTrac, Kinefly, BIAS, ScanImage; SiPM and the ScanImage frames node follow when their PRs land), the MCAP recorder/indexer/CDR decoder/Foxglove rewriter, the supervision primitives and the Zenoh configs, as the `rig_nodes` + `rig_interfaces` packages (one package-set version, conda channel at a release tag). `CONTRACT.md` there is the graph contract (topics, QoS, envelope, invariants). webDisplayTools' `rig/` installs the set and keeps only the arena gateway, composition and visualization. Record: `webDisplayTools/docs/development/rig-software-repos-and-runners.md`. |

### G6 firmware (what the web connects to over USB)
| repo | role |
Expand Down Expand Up @@ -120,13 +120,15 @@ interface.
(`CE_DISPLAY_ACTIVE`); STOP also blanks the panels (they latch the last frame).
- **"Web is the runner"** (CSHL) — the browser **executes** the protocol, host-timed:
`js/arena-runner-g6.js`.
- **FicTrac closed loop** — `fictrac_sim.py` (or real FicTrac) → **`fictrac-bridge/bridge.py`**
- **FicTrac closed loop** — the FicTrac simulator (`rig_nodes.sims.fictrac_sim`, rig-nodes; or real FicTrac) → **`fictrac-bridge/bridge.py`**
(WebSocket `ws://localhost:8765` ← UDP `:60000`) → browser. `pixi run bridge` + `pixi run
sim` (start the bridge first). The web runner executes only the `fictrac` and `log` plugins;
`backlight`/`camera`/`temperature` are declared for MATLAB and **skipped on the web**.
- **ROS 2 graph (LAB-303, candidate 2026-10-20)** — `rig/` replaces the bridge with a graph
- **ROS 2 graph (LAB-303, released 2026-10-20/26)** — `rig/` replaces the bridge with a graph
(rmw_zenoh, MCAP record, BIAS + ScanImage connectors) behind the SAME WebSocket; the Studio is
unchanged. Where the pieces will live from here: `rig-software-repos-and-runners.md` (above).
unchanged. Since 2026-10-26 the device nodes, simulators and recording primitives come from the
installed `rig_nodes` package (reiserlab/rig-nodes); `rig/` keeps the gateway (`bridge_node.py`),
the composition (`rig.py`) and the arena visualization. Record: `rig-software-repos-and-runners.md`.

## Pointers (go here for depth)

Expand Down
140 changes: 0 additions & 140 deletions .github/workflows/rig-interfaces.yml

This file was deleted.

17 changes: 12 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,18 @@ When editing web tools, audit all buttons and controls in the modified code sect
- Dependencies via CDN or vendored under `js/vendor/` (e.g. `yaml`); no runtime npm
- Web outputs must match MATLAB outputs exactly

**Repository boundaries (decision 2026-10-26):** `docs/development/rig-software-repos-and-runners.md`
is the record. The browser tools and their rig-side gateway (`rig/nodes/bridge_node.py`) stay
here; the Python arena library + headless runner go to `LED-Display_pyDisplayTools`; shared ROS 2
infrastructure (interfaces, device nodes, recording, supervision) goes to `rig-nodes`, which does not
exist yet. Until the extraction session, every file is where the record's inventory says it is today.
**Repository boundaries (decision 2026-10-26; extraction done the same day):**
`docs/development/rig-software-repos-and-runners.md` is the record. The browser tools, their rig-side
gateway (`rig/nodes/bridge_node.py`), the arena composition (`rig/nodes/rig.py`, `rig/pixi.toml`) and the
arena visualization stay here; the Python arena library + headless runner go to
`LED-Display_pyDisplayTools` (LAB-337); shared ROS 2 infrastructure lives in **`reiserlab/rig-nodes`**
(`rig_interfaces`, the device adapters + simulators, `rig_nodes.recorder` / `mcap_index` / `cdr` /
`foxglove_json`, `rig_nodes.supervise`, the Zenoh configs; contract: its `CONTRACT.md`) and is INSTALLED
into `rig/` as the pinned `rig_nodes` + `rig_interfaces` packages from that repo's channel. A node fix
is tested here with `pixi install -e dev` (rig-nodes `main` built from source — git source dependencies,
NEVER path dependencies on a sibling checkout: pixi validates every environment's source paths before
installing any environment, which broke `pixi install` on rig PCs on 2026-10-27); a release of the set
re-pins `rig/pixi.toml`. Never re-add a device node or recorder copy under `rig/`.

### Dev environment (pixi — the only tool you install)

Expand Down
2 changes: 1 addition & 1 deletion arena_studio.html
Original file line number Diff line number Diff line change
Expand Up @@ -3426,7 +3426,7 @@ <h2 id="modalTitle">Import error</h2>
</div>

<footer id="footer">
<span class="foot-left">Arena Studio v0.98 | 2026-10-26 18:11 ET · <a href="https://github.com/reiserlab/webDisplayTools" target="_blank" rel="noopener" title="webDisplayTools on GitHub: source, issues, and release notes (docs/development/arena-studio-release-notes.md)">GitHub</a></span>
<span class="foot-left">Arena Studio v0.99 | 2026-10-27 15:21 ET · <a href="https://github.com/reiserlab/webDisplayTools" target="_blank" rel="noopener" title="webDisplayTools on GitHub: source, issues, and release notes (docs/development/arena-studio-release-notes.md)">GitHub</a></span>
<!-- Course-repo quick-links: open protocols / logs / patterns in a new tab.
Hrefs built from the configured repo + bench id (updateGhQuickLinks). -->
<span id="ghQuickLinks" title="Open the course repo on GitHub (new tab)">
Expand Down
8 changes: 8 additions & 0 deletions docs/development/arena-studio-release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ The Studio's footer used to carry the full changelog inline; it now shows one li
history lives here. Newest first. (Per-session engineering detail stays in
`arena-studio-handover.md` and the design docs — this file is the user-facing what-changed list.)

## v0.99 (2026-10-27) · rig/ installs the rig-nodes v0.2.1 package set; closed-loop-report applies start_frame; tiff2mcap --runlog

<!-- #274 -->
none (no user-visible change; rig PCs: `cd rig && pixi install` re-locks onto the rig-nodes channel — the Studio's `hello_ack` now carries `packages`).

<!-- #273 -->
none (offline analysis tool)

## v0.98 (2026-10-26) · Ros2-poc: the FicTrac record in the bag — one /arena/frame message per frame with 10 columns (LAB-303) · Assert sticky controller settings before every run: controller: block, rig defaults, run header (LAB-230) · Rename ros2-poc/ → rig/ and arena_interfaces → rig_interfaces (LAB-303 cleanup, no behavior change)

<!-- #264 -->
Expand Down
10 changes: 9 additions & 1 deletion docs/development/closed-loop-bias.md
Original file line number Diff line number Diff line change
Expand Up @@ -370,8 +370,16 @@ idx = round((coupling * rel + offset + b) / deg_per_frame) % n_frames
# bridge <= 3.2 logs: rel = ((hd_deg - hd0_deg + 180) % 360) - 180; idx = round((rel + offset + b) / gain) % n_frames
```

`offset` is NOT simply the `config` echo's `offset` field on bridge 3.4: when the epoch's
config carries `start_frame` (the trialParams `frame_index` the epoch opens on), the bridge
sets `offset = (start_frame % n_frames) * deg_per_frame` for that message while the logged
browser config still says `offset: 0`; the next config's `offset` replaces it
(`docs/development/closed-loop-start-frame.md`). The bridge's `[cfg] applied` line goes to
its stderr, not the run log, so readers replay the config echoes in order.

`scripts/closed-loop-report.py` does exactly this (it picks the formula from whether the
`config` echo carries `coupling`) and reports the mismatch fraction per epoch.
`config` echo carries `coupling`, and replays `start_frame` the way the bridge applies it)
and reports the mismatch fraction per epoch.

Because the waveform is analytic and deterministic, this recovers the exact value the
bridge used — no per-frame bias column is needed.
Expand Down
Loading
Loading