Repository navigation
Release 2026-10-27: Arena Studio v0.99 - #279
Conversation
--runlog was parsed but never read: it only relabelled the reconstructed step edges as "commanded". Now, with a run log: - /arena/stimulus markers sit at each trialParams' logged send time (labelled commanded); qc step windows use the controller's first displayed frame after it. - Clock: the run log's PC clock. Each TIFF is anchored by one point, its first DO1 pulse = the controller's first displayed frame for that color (controller t_us -> PC ms by a fit of the executed trialParams against their send times). The ScanImage header epoch is no longer used for placement: on 2026-10-16 it ran 531-671 ms ahead of the first frame, different per grab. The per-file correction, display latency and an end check (last DO1 vs allOff + latency) go to /run/provenance. - /arena/display comes from the controller's displayed-frame records (observed) instead of .pat at nominal fps, when the log carries them. - /run/events carries every ScanImage connector command and reply, plus display_start events. Without --runlog the output is unchanged, except that it no longer claims "commanded". tools/check_tiff2mcap.py checks a --runlog MCAP against its log. Bergamo 2026-10-16 run 2: markers at send times (max |delta| 0.000 ms), 13/13 commands + replies, 1909 frames + 4 allOff, end checks +1.3 to +2.8 ms, qc d255 jump -4.6 / +20.3 / +3.5 ms from display_start (violet/green/yellow; blue below the drift, skipped). tests/test_tiff2mcap_runlog.py covers the run-log side on a synthetic log (19 checks). Rebased over the ros2-poc/ → rig/ rename (2026-10-26). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…eep gateway, composition, viz (LAB-338)
Extraction step of docs/development/rig-software-repos-and-runners.md §3.3 / §7 / §9. The shared
infrastructure under rig/ moved with history to reiserlab/rig-nodes (package set 0.2.1:
rig_interfaces + rig_nodes) and is installed here from that repository's channel.
Removed (moved): rig/interfaces, rig/channel, rig/config (the Zenoh configs ship inside rig_nodes),
rig/nodes/{_common, fictrac_udp_adapter, kinefly_udp_adapter, kinefly_sim, bias_node, bias_sim,
bias_cmd, scanimage_node, scanimage_cmd, recorder, mcap_index, graph_dump, build_interfaces}.py,
rig/tests/si_json_mock.py, rig/sizing, the benches, three rig/docs notes, fictrac-bridge/fictrac_sim.py
(its tests → rig-nodes; the closed-loop-report half stays as tests/test-closed-loop-report.py),
.github/workflows/rig-interfaces.yml (→ rig-nodes package-set.yml).
Rewired: rig.py composes with rig_nodes.supervise and starts nodes as `python -m rig_nodes.<module>`;
bridge_node imports rig_nodes._common / recorder / mcap_index and records the package-set versions
(hello_ack + /arena/session `packages`); mcap_convert imports the CDR decoder from rig_nodes.cdr;
_rows re-exports the FicTrac grammar from rig_nodes.fictrac; foxglove_json is the arena `enrich`
wrapper; the harness drives the installed nodes; root `pixi run sim` delegates to rig/.
rig/pixi.toml: channel raw.githubusercontent.com/reiserlab/rig-nodes/v0.2.1/channel, rig_nodes ==0.2.1,
ros2-distro-mutex 0.19 + Python 3.12 pinned, macOS 14 floor; environments default / typed (+
rig_interfaces, same solve group) / viz / dev (sibling ../../rig-nodes path deps). pixi.lock is
re-generated against the tagged channel in the next commit.
Verified on osx-arm64 against the installed packages (local index of the CI-equivalent build):
harness 59/59 (String) and 62/62 (typed), test-viz, root suite.
Docs: record §9 completion note, CLAUDE.md boundaries, orientation skill, rig/README banner,
WINDOWS-TEST 1b/7b, fictrac-bridge/README.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…x 0.19 + Python 3.12, all three platforms) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…, PR #274) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ng path (fixes `pixi install` on rig PCs) `cd rig && pixi install` failed on any machine without a `../../rig-nodes` checkout (ww18, 2026-10-27): pixi validates every environment's source PATHS before installing ANY environment, so the `dev` feature's path dependencies broke the default install. `pixi install --locked` reported "lock-file not up-to-date", `pixi install -e default` "source path … could not be found". The `dev` feature now uses git source dependencies on reiserlab/rig-nodes `main` (`subdirectory = src/rig_nodes` / `src/rig_interfaces`), pinned to one commit in pixi.lock (75b9986 = the v0.2.1 release commit without the channel payload). Git sources are fetched only when `dev` itself is installed. Verified on the Mac with the sibling hidden and the network blocked (dead proxy, pixi git cache removed, environments removed first): `pixi install --locked` and `pixi install --locked -e typed` succeed and leave pixi.lock byte-identical. Lock diff is confined to the dev block (the two source lines per platform) and to the source packages' build records (uv 0.13.5 → 0.13.6). Dev Zenoh config URIs: with a git source the package is a real (non-editable) install, so the `$CONDA_PREFIX/…/site-packages/rig_nodes/config/*.json5` URIs resolve in `dev` too (they did not with the editable path build — LAB-338 note). Also found: a source build of the same version as the release lands in pixi's package cache under the release's filename and shadows a later channel install on that machine (my default env held the editable 25-file stub while conda-meta showed the channel URL and sha). After purging that entry: default 59/59, typed 62/62 harness checks against the genuine channel packages. The manifest comment, CLAUDE.md, rig/README.md, WINDOWS-TEST.md and the record (§7 item 6, §9) say how to point `dev` at a local checkout without committing it and name the cache gotcha. LAB-338, LAB-303. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Since Studio v0.91 / bridge 3.4 every startClosedLoop config carries start_frame, and the bridge sets offset = (start_frame mod frames) x deg_per_frame for that message. The logged browser config still says offset: 0 and the bridge's "[cfg] applied" line goes to stderr only, so the report predicted every start_frame epoch from frame 0 and flagged 100 % idx mismatch (ww18 2026-10-27, bench_closed_loop_2x10.yaml). The report now replays the config echoes in order the way bridge.py's handler does (apply_config): offset from the message, overridden by start_frame using the same message's pitch and frame count, cleared by the next message's offset (one-shot). Logs without start_frame are unchanged. The table shows "frames @start" and the legend names it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…rig-nodes (extraction, LAB-338)
|
✅ Validated ww18 ( Mac (osx-arm64), candidate SHA Known, not blocking: a plain |
Release candidate
2026-10-27rc1 · candidate commit458c6758fe· built on maina8ef775a96Live on Next: https://reiserlab.github.io/webDisplayTools/next/
ca9f5c431f0c33668729174966e6c2Promotion checklist
pixi run releasechecks)Validated 458c675 …(pixi run tiers -- validate --rig … --by …). Any change to a constituent PR = rebuild (rc+1) = validate again.releaselists recent rig runs — advisory)fictrac-bridge/changed, rig PCsgit pull+ restart the bridgePromote with
pixi run release(merges with a merge commit — never squash — and tagsrelease-2026-10-27). Manifest:releases/2026-10-27.json.🤖 Generated with Claude Code release tooling (
scripts/tiers/candidate.py)