Skip to content

feat(bridge): behavior_v2 run-log format, --convert CLI, log_control ack (PR 1 of 3) - #183

Open
mbreiser wants to merge 1 commit into
mainfrom
claude/runlog-behavior-v2-bridge-d7554d
Open

feat(bridge): behavior_v2 run-log format, --convert CLI, log_control ack (PR 1 of 3)#183
mbreiser wants to merge 1 commit into
mainfrom
claude/runlog-behavior-v2-bridge-d7554d

Conversation

@mbreiser

@mbreiser mbreiser commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Bridge side (PR 1 of 3) of docs/development/runlog-behavior-v2-plan.md. The Studio and the dashboard are not touched; old Studios never send behavior_v2 and ignore the new ack message types, so this is safe to deploy first. Benches need git pull + restart pixi run bridge to pick it up (the ack now makes a stale bridge visible instead of silent).

What changed (fictrac-bridge/bridge.py, BRIDGE_VERSION 3.0)

  • behavior_v2 log level (new default). The browser's arena_command echo — one per closed-loop 0x70 frame command, 76 % of a v1 file — is written as ["a", t_off, dt, hex, status, rx_off] (+ a 7th error string when non-null), with ms offsets from the schema line's t0. Frame arrays [ms,fc,idx,ft,x,y,hd] are unchanged; runner / session / run_metadata / config lines stay verbatim objects. Schema line: {"type":"frame_schema","level":"behavior_v2","cols":[…],"arena_cols":["t_off","dt","hex","status","rx_off"],"t0":<epoch ms>}.
  • Lossless by construction. compact_arena_command verifies every invariant the expansion relies on (fixed 12-key set, dir, int t/rx_ms, spaced lowercase hex head with len = byte count, echo = command byte and ok = status === 0, or all three null on timeout). A line that does not fit is written verbatim by the live bridge (never dropped) and raises under --convert.
  • bridge.py --convert IN OUT [--to v1|v2] — offline v1 ⇄ v2 re-encoding, direction auto-detected, .jsonl.gz on either side (reproducible gzip). Files without a v1 schema line (pre-Run-log: curated FicTrac column subset (middle ground) + optional size reduction #140 logs, full level) get a v2 schema with "cols": null inserted after the session line; the reverse drops it. The websockets import is now optional so --convert and the tests run without the server.
  • Level negotiation. log_controllog_control_ack {enabled, level, requested, file} where level is the one actually in force (an unknown requested level is ignored, not applied). hellohello_ack {bridge, levels:["behavior_v2","behavior_v1","full"], level, logging}. New --log-level flag; --log-frames stays as an alias for full.
  • Plan correction (recorded in the plan doc's new "PR 1 implementation notes"): on a timeout the real v1 lines have status: null, echo: null, ok: null — not ok: false. The PR 3 reader's expandV2Line must reproduce that.
  • run_metadata.log_format is left to the Studio PR (the Studio composes that line and will know the acked level); injecting it in the bridge would break the exact round trip.

Tests

  • tests/test-bridge-behavior.py (in pixi run test): 27 → 126 checks. Encode/decode on real line samples (ok, status-1 reject, timeout with null status/echo/ok + error, synthetic error-with-status, a 0xa0 command), 12 must-not-compact cases (unknown key, echo/ok mismatch, truncated head, float t, …) in both strict and lenient modes, whole-file v1→v2→v1 round trips (in-memory, .jsonl, .jsonl.gz), the legacy no-schema path, LogWriter output per level, and the dispatcher's hello_ack / log_control_ack (incl. an unknown level and a missing websocket).
  • Full pixi run test passes.
  • Not tested: a live rig. The WebSocket/serial path is unchanged except for the two reply messages, which are covered by the dispatcher test with a fake socket. Bench check when hardware is back: run a short P3 on behavior_v2, confirm "a" lines in the file and that --convert round-trips it.

Corpus gate — scripts/runlog-v2-corpus.py

Run over a git archive of cshl-2026-course origin/main (164 logs; the local checkout is 9 commits / 15 logs behind and was left untouched). Every file: strict v1→v2→v1, canonical-JSON identity line by line, plus a known-line-shape check (any key outside the 2026-09-06 inventory fails the run). 164 / 164 pass.

Round trip v1 → v2 → v1 (strict converter, canonical-JSON identity per line): 164 / 164 files pass. Formats: 149 behavior_v1, 14 legacy, 1 full. Wall time 36 s (4 workers).

lines arena echoes frames other v1 on disk v1.gz v2 v2.gz v2/v1 v2.gz/v1
total 12,554,796 4,065,636 8,198,234 290,926 1281.6 MB 223.3 MB 655.6 MB 211.3 MB 0.51 0.165

gzip level 6 (≈ the browser's CompressionStream). v1 on disk counts the July logs' non-compact whitespace; compact v1 would be 1278.3 MB.

Per rig

rig files pass v1 on disk v2 v2.gz v2/v1 v2.gz/v1
bench00 3 3 2.2 MB 1.3 MB 0.2 MB 0.58 0.071
bench01 10 10 6.0 MB 4.2 MB 0.5 MB 0.71 0.083
bench02 28 28 250.9 MB 141.8 MB 47.7 MB 0.57 0.190
bench02-il 3 3 8.9 MB 5.3 MB 1.8 MB 0.60 0.205
rig03-sr 12 12 332.7 MB 127.2 MB 38.5 MB 0.38 0.116
rig1 10 10 64.8 MB 33.5 MB 10.6 MB 0.52 0.163
rig2 8 8 108.4 MB 45.8 MB 14.3 MB 0.42 0.132
rig3 5 5 38.8 MB 18.9 MB 6.4 MB 0.49 0.164
rig4 11 11 41.2 MB 32.4 MB 11.1 MB 0.79 0.269
rig5 10 10 83.9 MB 38.0 MB 11.9 MB 0.45 0.142
rig6 21 21 118.3 MB 63.6 MB 21.2 MB 0.54 0.179
rig7 43 43 225.6 MB 143.5 MB 47.2 MB 0.64 0.209

Largest 12 files

file lines arena v1 on disk v1.gz v2 v2.gz v2/v1
runlogs/rig03-sr/p3-heisenberg-ts-full-led8-40strain__shubhamtr__2026-09-05T19-27-19__rydc2tql.jsonl 436,772 217,204 53.9 6.7 20.4 6.2 0.38
runlogs/rig3/p3-heisenberg-ts-full__fatimah-hussein__2026-07-11T01-43-15__n08n1914.jsonl 262,715 130,150 32.2 4.2 12.3 3.8 0.38
runlogs/rig5/p3-heisenberg-relational-full__kristina-ponimaskine__2026-07-11T02-11-37__nhup10e2.jsonl 261,417 129,880 32.1 3.8 12.3 3.5 0.38
runlogs/rig2/p3-dill-random-checkers-full__xiao-li__2026-07-11T02-30-38__qby09m0a.jsonl 261,235 129,732 31.6 3.8 11.8 3.5 0.37
runlogs/rig2/p3-heisenberg-slashes-full__xiao-li__2026-07-11T03-17-52__0otk11o5.jsonl 261,559 129,742 31.5 3.9 11.7 3.6 0.37
runlogs/rig7/p3-dill-random-checkers-full__sanmin-jahan__2026-07-11T02-29-29__qag7pbrn.jsonl 228,147 110,036 28.0 3.8 11.1 3.5 0.40
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T22-05-36__wyghjfgc.jsonl 220,744 109,530 27.3 3.5 10.5 3.2 0.39
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T21-10-26__uzpn3fmb.jsonl 219,218 108,692 27.2 3.5 10.5 3.2 0.39
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T21-36-14__ww5m1e3x.jsonl 218,677 108,403 26.9 3.4 10.4 3.1 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T20-48-39__7otr1dfu.jsonl 218,958 108,506 26.9 3.5 10.3 3.2 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-04T23-26-06__kebkqlx9.jsonl 217,995 107,617 26.8 3.5 10.3 3.1 0.39
runlogs/rig03-sr/p3-heisenberg-ts-full-led3__shubhamtr__2026-09-04T21-09-47__j0q01cow.jsonl 217,696 107,339 26.7 3.4 10.2 3.1 0.38
All files (MB)
file fmt ok lines arena frames v1 v1.gz v2 v2.gz v2/v1
runlogs/bench00/fictrac-test-shorter__michael__2026-07-06T14-24-28__b7qrjimm.jsonl legacy 6,715 1,501 0 0.7 0.1 0.4 0.1 0.58
runlogs/bench00/fictrac-test-shorter__michael__2026-07-06T15-10-03__cudoq0sk.jsonl legacy 6,715 1,501 0 0.7 0.1 0.4 0.1 0.58
runlogs/bench00/fictrac-test-shorter__michael__2026-07-07T05-14-50__70rj8ll1.jsonl legacy 6,712 1,500 0 0.7 0.1 0.4 0.1 0.58
runlogs/bench01/fictrac-direction-test__michael__2026-07-04T22-46-23__y4ji2xz4.jsonl legacy 21,331 4,502 0 2.2 0.2 1.3 0.2 0.59
runlogs/bench01/fictrac-direction-test__michael__2026-07-04T23-32-38__zxu2a6pg.jsonl legacy 4,038 750 0 0.4 0.0 0.3 0.0 0.62
runlogs/bench01/fictrac-direction-test__michael__2026-07-06T00-49-04__hwyim9v0.jsonl legacy 15,701 0 0 1.2 0.1 1.1 0.1 0.91
runlogs/bench01/fictrac-direction-test__michael__2026-07-06T01-26-54__jewjaohf.jsonl legacy 8,517 1,202 0 0.8 0.1 0.5 0.1 0.67
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T02-14-44__l6ixehiy.jsonl legacy 2,369 0 0 0.2 0.0 0.2 0.0 0.91
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T02-17-11__l9o0jine.jsonl legacy 2,718 339 0 0.3 0.0 0.2 0.0 0.70
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T03-04-54__mz1jpqrs.jsonl legacy 2,705 336 0 0.3 0.0 0.2 0.0 0.70
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T04-36-36__q8zaj8l7.jsonl legacy 2,708 337 0 0.3 0.0 0.2 0.0 0.70
runlogs/bench01/g6-2x10-smoke__michael__2026-07-04T17-46-23__nkts77qj.jsonl legacy 2,577 0 0 0.2 0.0 0.2 0.0 0.91
runlogs/bench01/g6-2x10-smoke__michael__2026-07-04T17-55-32__wls517zb.jsonl legacy 2,579 0 0 0.2 0.0 0.2 0.0 0.91
runlogs/bench02-il/gratingsol-barcl__isabel__2026-07-29T19-17-21__gsyicnsy.jsonl behavior_v1 36,171 7,805 28,110 3.0 0.6 1.8 0.6 0.60
runlogs/bench02-il/gratingsol-barcl__isabel__2026-07-29T19-25-59__h42f1lnh.jsonl behavior_v1 35,978 7,636 28,086 2.9 0.6 1.8 0.6 0.60
runlogs/bench02-il/gratingsol-barcl__isabel__2026-07-29T19-28-08__h6tsw3bq.jsonl behavior_v1 36,090 7,748 28,086 3.0 0.6 1.8 0.6 0.60
runlogs/bench02/fictrac-direction-test__hannah-marie__2026-07-06T21-41-56__qop150xr.jsonl full 45,676 1,482 0 23.1 8.5 21.3 8.4 0.93
runlogs/bench02/fictrac-direction-test__hannah-marie__2026-07-07T17-34-00__xagkpdwu.jsonl legacy 50,921 10,874 0 5.2 0.4 3.0 0.4 0.58
runlogs/bench02/fictrac-direction-test__hannah-marie__2026-07-07T17-58-28__5x5f16bf.jsonl behavior_v1 50,899 10,850 39,945 4.2 0.9 2.5 0.9 0.60
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T20-11-17__qjs21a3i.jsonl behavior_v1 76,385 0 74,735 4.3 1.5 4.3 1.5 1.00
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T20-32-52__3ic476gs.jsonl behavior_v1 76,215 0 74,565 4.3 1.5 4.3 1.5 1.00
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T20-47-27__12h810pf.jsonl behavior_v1 76,295 0 74,645 4.3 1.5 4.3 1.5 1.00
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T21-04-43__4na490v2.jsonl behavior_v1 76,263 0 74,613 4.2 1.6 4.2 1.6 1.00
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T21-47-11__65vhx27m.jsonl behavior_v1 76,386 0 74,736 4.3 1.6 4.3 1.6 1.00
runlogs/bench02/p1-motion-v2__hannah-marie__2026-07-07T22-38-35__82uzfwrt.jsonl behavior_v1 60,245 0 58,486 3.5 1.1 3.5 1.1 1.00
runlogs/bench02/p1-motion-v2__hannah-marie__2026-07-07T22-55-06__8o2so8el.jsonl behavior_v1 60,331 0 58,572 3.5 1.2 3.5 1.2 1.00
runlogs/bench02/p1-motion-v2__hannah-marie__2026-07-08T15-28-03__49m610er.jsonl behavior_v1 64,615 0 62,856 3.7 1.3 3.7 1.3 1.00
runlogs/bench02/p1-motion__hannah-marie__2026-07-07T22-08-03__71jujrws.jsonl behavior_v1 49,136 0 47,425 2.8 0.9 2.8 0.9 1.00
runlogs/bench02/p1-motion__hannah-marie__2026-07-07T22-22-11__7jptihkl.jsonl behavior_v1 49,170 0 47,459 2.8 0.9 2.8 0.9 1.00
runlogs/bench02/p2-object-burst-short__hannah-marie__2026-07-08T22-47-03__ny76rj9y.jsonl behavior_v1 57,866 25,032 32,593 6.6 1.0 2.8 0.9 0.42
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T18-46-08__f4zbccp7.jsonl behavior_v1 129,723 54,928 74,242 14.4 2.1 6.0 1.9 0.42
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T19-24-42__ij07134k.jsonl behavior_v1 129,066 53,955 74,558 14.3 2.1 6.0 1.9 0.42
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T21-15-58__kho5np10.jsonl behavior_v1 130,565 55,825 74,187 14.7 2.1 6.2 1.9 0.42
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T21-45-53__lk56hjd4.jsonl behavior_v1 130,617 55,828 74,236 14.9 2.3 6.3 2.1 0.42
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T22-10-53__mganholq.jsonl behavior_v1 130,664 55,888 74,223 14.9 2.2 6.3 2.0 0.42
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T22-32-10__f27016vw.jsonl behavior_v1 58,831 26,009 32,581 6.8 1.0 2.8 0.9 0.41
runlogs/bench02/p2-object-burst__michael__2026-07-08T20-25-27__ioox6k0b.jsonl behavior_v1 130,490 55,701 74,236 14.7 2.2 6.1 2.0 0.42
runlogs/bench02/p2-object-tonic-short__hannah-marie__2026-07-08T22-38-47__nns3jgiu.jsonl behavior_v1 57,054 25,492 31,394 6.6 0.9 2.7 0.9 0.41
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T16-19-45__9uzf6q8w.jsonl behavior_v1 132,239 47,581 84,144 13.6 2.4 6.4 2.2 0.47
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T19-50-29__hg8km7mj.jsonl behavior_v1 126,950 55,202 71,372 14.2 1.9 5.8 1.8 0.41
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T21-26-30__kvpxk2iv.jsonl behavior_v1 125,347 53,584 71,387 14.2 2.0 6.0 1.8 0.42
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T21-56-42__lyk07niu.jsonl behavior_v1 125,920 54,154 71,390 14.4 2.2 6.1 2.0 0.42
runlogs/bench02/p2-object-tonic__michael__2026-07-08T20-39-17__701t1a3d.jsonl behavior_v1 127,714 55,960 71,378 14.6 2.2 6.0 2.0 0.41
runlogs/bench02/shortol-w-led__hannah-marie__2026-07-07T18-15-56__yubbedzl.jsonl behavior_v1 29,166 0 29,065 1.6 0.6 1.6 0.6 1.00
runlogs/rig03-sr/p3-heisenberg-ts-full-led3__shubhamtr__2026-09-04T20-32-59__7owc12qq.jsonl behavior_v1 217,777 107,575 109,620 26.5 3.4 10.0 3.0 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led3__shubhamtr__2026-09-04T21-09-47__j0q01cow.jsonl behavior_v1 217,696 107,339 109,640 26.7 3.4 10.2 3.1 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led3__shubhamtr__2026-09-04T23-01-55__jj850l1w.jsonl behavior_v1 215,087 104,897 109,640 26.0 3.2 9.9 3.0 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led8-40strain__shubhamtr__2026-09-05T19-27-19__rydc2tql.jsonl behavior_v1 436,772 217,204 218,708 53.9 6.7 20.4 6.2 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-04T23-26-06__kebkqlx9.jsonl behavior_v1 217,995 107,617 109,651 26.8 3.5 10.3 3.1 0.39
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-04T23-56-32__lhgm7i7l.jsonl behavior_v1 216,687 106,563 109,626 26.5 3.3 10.2 3.0 0.39
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T20-25-42__te6ebvwb.jsonl behavior_v1 216,135 105,924 109,610 26.2 3.4 9.9 3.1 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T20-48-39__7otr1dfu.jsonl behavior_v1 218,958 108,506 109,618 26.9 3.5 10.3 3.2 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T21-10-26__uzpn3fmb.jsonl behavior_v1 219,218 108,692 109,611 27.2 3.5 10.5 3.2 0.39
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T21-36-14__ww5m1e3x.jsonl behavior_v1 218,677 108,403 109,613 26.9 3.4 10.4 3.1 0.38
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T22-05-36__wyghjfgc.jsonl behavior_v1 220,744 109,530 110,492 27.3 3.5 10.5 3.2 0.39
runlogs/rig03-sr/p3-heisenberg-ts-short-led5__shubhamtr__2026-09-04T19-41-21__cq6hcj29.jsonl behavior_v1 97,717 48,472 48,944 11.9 1.5 4.5 1.4 0.38
runlogs/rig1/p0-opto-intensity-short__jude-nnaka__2026-07-10T17-20-49__78yihmqz.jsonl behavior_v1 14,697 0 14,307 0.9 0.3 0.9 0.3 1.00
runlogs/rig1/p0-opto-intensity-short__steven-bradley__2026-07-10T18-49-25__ew3x1e8c.jsonl behavior_v1 14,703 0 14,313 0.9 0.3 0.9 0.3 1.00
runlogs/rig1/p0-opto-intensity-short__steven-bradley__2026-07-10T20-54-03__v6c51dze.jsonl behavior_v1 14,709 0 14,319 0.9 0.3 0.9 0.3 1.00
runlogs/rig1/p1-motion-v2-full__steven-bradley__2026-07-10T19-45-14__c7glphii.jsonl behavior_v1 48,516 0 46,757 3.1 1.0 3.1 1.0 1.00
runlogs/rig1/p1-motion-v2-full__steven-bradley__2026-07-10T20-31-59__dvkuh1rg.jsonl behavior_v1 48,551 0 46,792 3.1 1.0 3.1 1.0 1.00
runlogs/rig1/p1-motion-v2-full__steven-bradley__2026-07-10T21-07-42__f5hr38n2.jsonl behavior_v1 48,566 0 46,807 3.0 0.9 3.0 0.9 1.00
runlogs/rig1/p1-motion-v2-short__steven-bradley__2026-07-10T19-00-46__at5oqc6m.jsonl behavior_v1 16,390 0 15,791 1.0 0.4 1.0 0.4 1.00
runlogs/rig1/p1-motion-v2-short__steven-bradley__2026-07-10T19-09-53__b4vzmbyc.jsonl behavior_v1 16,388 0 15,789 1.0 0.3 1.0 0.3 1.00
runlogs/rig1/p3-heisenberg-ts-full__steven-bradley__2026-07-11T02-12-50__plqc5vs6.jsonl behavior_v1 208,449 103,439 104,573 25.6 3.1 9.8 2.8 0.38
runlogs/rig1/p3-heisenberg-ts-full__steven-bradley__2026-07-11T03-00-32__redzrtzq.jsonl behavior_v1 206,748 101,385 104,597 25.2 3.4 9.7 3.1 0.39
runlogs/rig2/p0-opto-intensity-full__xiao-li__2026-07-10T20-35-55__dxx0lqx0.jsonl behavior_v1 75,650 0 74,000 4.4 1.5 4.4 1.5 1.00
runlogs/rig2/p0-opto-intensity-short__xiao-li__2026-07-10T18-04-33__8t7nhrt9.jsonl behavior_v1 18,252 0 17,862 1.0 0.4 1.0 0.4 1.00
runlogs/rig2/p0-opto-intensity-short__xiao-li__2026-07-10T20-09-36__da0rpnyy.jsonl behavior_v1 18,247 0 17,857 1.0 0.4 1.0 0.4 1.00
runlogs/rig2/p1-motion-v2-short__xiao-li__2026-07-11T02-42-29__rayjsix8.jsonl behavior_v1 20,208 0 19,609 1.2 0.4 1.2 0.4 1.00
runlogs/rig2/p3-dill-random-checkers-full__xiao-li__2026-07-11T02-30-38__qby09m0a.jsonl behavior_v1 261,235 129,732 131,107 31.6 3.8 11.8 3.5 0.37
runlogs/rig2/p3-heisenberg-slashes-full__olenka-jain__2026-07-11T03-35-00__spzae5dn.jsonl behavior_v1 205,222 91,871 112,734 23.6 3.3 9.5 3.1 0.40
runlogs/rig2/p3-heisenberg-slashes-full__xiao-li__2026-07-11T03-17-52__0otk11o5.jsonl behavior_v1 261,559 129,742 131,131 31.5 3.9 11.7 3.6 0.37
runlogs/rig2/p3-heisenberg-slashes-short__xiao-li__2026-07-11T02-11-59__q0u1l6y6.jsonl behavior_v1 116,514 57,760 58,542 14.1 1.7 5.2 1.6 0.37
runlogs/rig3/p0-opto-intensity-short__fatimah-hussein__2026-07-10T20-54-47__ew4leyyw.jsonl behavior_v1 18,432 0 18,042 1.0 0.4 1.0 0.4 1.00
runlogs/rig3/p0-opto-intensity-short__olenka-jain__2026-07-10T19-14-09__b9fr2tk8.jsonl behavior_v1 20,458 0 20,068 1.1 0.4 1.1 0.4 1.00
runlogs/rig3/p0-opto-intensity-short__olenka-jain__2026-07-10T19-25-13__oybm19le.jsonl behavior_v1 14,664 0 14,274 0.8 0.3 0.8 0.3 1.00
runlogs/rig3/p1-motion-v2-full__fatimah-hussein__2026-07-10T21-12-07__fb9s692j.jsonl behavior_v1 60,368 0 58,609 3.7 1.5 3.7 1.5 1.00
runlogs/rig3/p3-heisenberg-ts-full__fatimah-hussein__2026-07-11T01-43-15__n08n1914.jsonl behavior_v1 262,715 130,150 132,077 32.2 4.2 12.3 3.8 0.38
runlogs/rig4/p0-opto-intensity-full__byoungsoo-kim__2026-07-10T19-37-54__vavu199y.jsonl behavior_v1 74,875 0 73,225 4.2 1.5 4.2 1.5 1.00
runlogs/rig4/p0-opto-intensity-full__elle-mccall__2026-07-10T20-18-20__dbbblr60.jsonl behavior_v1 74,889 0 73,239 4.2 1.5 4.2 1.5 1.00
runlogs/rig4/p0-opto-intensity-full__elle-mccall__2026-07-10T20-29-50__dq3chaxr.jsonl behavior_v1 74,889 0 73,239 4.3 1.5 4.3 1.5 1.00
runlogs/rig4/p0-opto-intensity-short__byoungsoo-kim__2026-07-10T19-27-19__brna2ccs.jsonl behavior_v1 18,065 0 17,675 1.0 0.4 1.0 0.4 1.00
runlogs/rig4/p0-opto-intensity-short__elle-mccall__2026-07-10T19-56-29__t5wa1b4g.jsonl behavior_v1 18,064 0 17,674 1.0 0.4 1.0 0.4 1.00
runlogs/rig4/p0-opto-intensity-short__elle-mccall__2026-07-10T20-07-10__d6we1odi.jsonl behavior_v1 18,061 0 17,671 1.0 0.4 1.0 0.4 1.00
runlogs/rig4/p1-motion-v2-full__byoungsoo-kim__2026-07-10T19-49-08__cclmiuqc.jsonl behavior_v1 59,051 0 57,292 3.5 1.2 3.5 1.2 1.00
runlogs/rig4/p1-motion-v2-full__elle-mccall__2026-07-10T20-39-20__e55oh4yq.jsonl behavior_v1 59,044 0 57,285 3.5 1.2 3.5 1.2 1.00
runlogs/rig4/p1-motion-v2-full__elle-mccall__2026-07-10T20-50-11__ej3yx6cf.jsonl behavior_v1 59,080 0 57,321 3.5 1.2 3.5 1.2 1.00
runlogs/rig4/p1-motion-v2-short__byoungsoo-kim__2026-07-10T19-40-52__c8rde7cf.jsonl behavior_v1 20,001 0 19,402 1.1 0.4 1.1 0.4 1.00
runlogs/rig4/p3-heisenberg-ts-short__elle-mccall__2026-07-11T02-13-47__q35nv4cr.jsonl behavior_v1 115,511 56,977 57,931 13.9 1.7 5.2 1.5 0.37
runlogs/rig5/p0-opto-intensity-short__kristina-ponimaskine__2026-07-10T19-16-30__bdql4krn.jsonl behavior_v1 18,259 0 17,869 1.0 0.4 1.0 0.4 1.00
runlogs/rig5/p0-opto-intensity-short__kristina-ponimaskine__2026-07-10T19-46-18__cg2awv52.jsonl behavior_v1 18,257 0 17,867 1.0 0.4 1.0 0.4 1.00
runlogs/rig5/p0-opto-intensity-short__michael__2026-07-10T16-07-31__4mpozwkv.jsonl behavior_v1 18,253 0 17,863 1.0 0.4 1.0 0.4 1.00
runlogs/rig5/p1-motion-v2-full__kristina-ponimaskine__2026-07-10T19-59-03__cpcm9o9v.jsonl behavior_v1 59,658 0 57,899 3.5 1.2 3.5 1.2 1.00
runlogs/rig5/p1-motion-v2-short__kristina-ponimaskine__2026-07-10T19-49-28__cjtkx8pd.jsonl behavior_v1 20,217 0 19,618 1.2 0.4 1.2 0.4 1.00
runlogs/rig5/p2-object-burst-full-neg-gain__frank__2026-07-11T01-04-51__jrl416l6.jsonl behavior_v1 132,619 58,027 74,039 15.4 2.2 6.5 2.0 0.42
runlogs/rig5/p2-object-burst-full__kristina-ponimaskine__2026-07-10T20-15-24__d7ii0wgv.jsonl behavior_v1 132,620 58,034 74,033 15.1 2.2 6.2 2.0 0.41
runlogs/rig5/p2-object-burst-short__kristina-ponimaskine__2026-07-10T20-04-51__d1bn4991.jsonl behavior_v1 59,353 26,604 32,508 6.8 1.0 2.7 0.9 0.40
runlogs/rig5/p2-object-tonic-short__lilly-kamman-cummings__2026-07-10T17-36-31__7qs3hn6q.jsonl behavior_v1 58,114 26,605 31,341 6.8 0.9 2.7 0.8 0.39
runlogs/rig5/p3-heisenberg-relational-full__kristina-ponimaskine__2026-07-11T02-11-37__nhup10e2.jsonl behavior_v1 261,417 129,880 131,126 32.1 3.8 12.3 3.5 0.38
runlogs/rig6/led-activation-quadrant-test__michael__2026-07-10T03-39-14__dxnifld8.jsonl behavior_v1 17,428 8,677 8,676 2.1 0.3 0.7 0.3 0.36
runlogs/rig6/led-activation-quadrant-test__michael__2026-07-10T04-34-32__fwrqv385.jsonl behavior_v1 17,468 8,676 8,676 2.1 0.3 0.8 0.3 0.36
runlogs/rig6/p0-opto-intensity-full__lilly-kamman-cummings__2026-07-10T18-34-40__9lzgfq0a.jsonl behavior_v1 75,651 0 74,001 4.4 1.6 4.4 1.6 1.00
runlogs/rig6/p0-opto-intensity-full__lilly-kamman-cummings__2026-07-10T19-27-09__bhh2084q.jsonl behavior_v1 75,653 0 74,003 4.3 1.5 4.3 1.5 1.00
runlogs/rig6/p0-opto-intensity-full__lilly-kamman-cummings__2026-07-10T20-35-34__xgeh145h.jsonl behavior_v1 75,657 0 74,007 4.5 1.6 4.5 1.6 1.00
runlogs/rig6/p0-opto-intensity-short__lilly-kamman-cummings__2026-07-10T18-20-13__dcsn14bv.jsonl behavior_v1 18,252 0 17,862 1.0 0.4 1.0 0.4 1.00
runlogs/rig6/p0-opto-intensity-short__lilly-kamman-cummings__2026-07-10T19-16-35__bdup47cb.jsonl behavior_v1 18,245 0 17,855 1.0 0.4 1.0 0.4 1.00
runlogs/rig6/p0-opto-intensity-short__lilly-kamman-cummings__2026-07-10T20-25-00__ttyh139x.jsonl behavior_v1 18,248 0 17,858 1.0 0.4 1.0 0.4 1.00
runlogs/rig6/p1-motion-v2-full__lilly-kamman-cummings__2026-07-10T19-38-26__yrap1dqd.jsonl behavior_v1 60,118 0 58,359 3.6 1.2 3.6 1.2 1.00
runlogs/rig6/p1-motion-v2-full__lilly-kamman-cummings__2026-07-10T20-46-54__ewh61427.jsonl behavior_v1 59,591 0 57,832 3.7 1.3 3.7 1.3 1.00
runlogs/rig6/p1-motion-v2-short__lilly-kamman-cummings__2026-07-10T18-38-15__08zs1bpn.jsonl behavior_v1 20,206 0 19,607 1.2 0.4 1.2 0.4 1.00
runlogs/rig6/p1-motion-v2-short__lilly-kamman-cummings__2026-07-10T19-30-06__bux9lu2w.jsonl behavior_v1 20,195 0 19,596 1.2 0.4 1.2 0.4 1.00
runlogs/rig6/p1-motion-v2-short__lilly-kamman-cummings__2026-07-10T20-38-30__eavuqafk.jsonl behavior_v1 20,192 0 19,593 1.2 0.4 1.2 0.4 1.00
runlogs/rig6/p2-object-burst-full__lilly-kamman-cummings__2026-07-10T19-54-02__g1yo16ft.jsonl behavior_v1 132,611 58,024 74,034 15.1 2.1 6.3 2.0 0.41
runlogs/rig6/p2-object-burst-full__lilly-kamman-cummings__2026-07-10T21-02-52__ewk96b3a.jsonl behavior_v1 132,619 58,031 74,035 15.3 2.1 6.4 2.0 0.42
runlogs/rig6/p2-object-burst-short__lilly-kamman-cummings__2026-07-10T19-43-19__c9mcoek1.jsonl behavior_v1 59,353 26,605 32,507 6.8 0.9 2.8 0.9 0.40
runlogs/rig6/p2-object-burst-short__lilly-kamman-cummings__2026-07-10T20-51-39__ephveo2m.jsonl behavior_v1 59,351 26,604 32,506 6.9 0.9 2.8 0.9 0.41
runlogs/rig6/p2-object-tonic-full__lilly-kamman-cummings__2026-07-10T20-10-02__d138hxcb.jsonl behavior_v1 129,966 58,163 71,427 15.1 2.0 6.1 1.8 0.41
runlogs/rig6/p2-object-tonic-short-neg-gain__frank__2026-07-11T01-01-46__nndfbtib.jsonl behavior_v1 58,111 26,603 31,340 6.8 1.0 2.7 0.9 0.40
runlogs/rig6/p2-object-tonic-short__lilly-kamman-cummings__2026-07-10T19-59-11__cu8eh1gd.jsonl behavior_v1 58,117 26,608 31,341 6.8 0.9 2.7 0.8 0.40
runlogs/rig6/p3-heisenberg-high-low-short__hannah-marie__2026-07-11T02-39-56__r0s814l2.jsonl behavior_v1 117,010 58,032 58,535 14.1 1.9 5.2 1.7 0.37
runlogs/rig7/p0-opto-intensity-short__changyuan-wang__2026-07-10T18-55-26__amjzt9p4.jsonl behavior_v1 16,873 0 16,483 0.9 0.3 0.9 0.3 1.00
runlogs/rig7/p0-opto-intensity-short__frank__2026-07-10T22-53-50__j57x1wia.jsonl behavior_v1 16,462 0 16,072 0.9 0.4 0.9 0.4 1.00
runlogs/rig7/p0-opto-intensity-short__lina-iseni__2026-07-10T19-55-44__cs6tbwtu.jsonl behavior_v1 16,433 0 16,043 1.0 0.3 1.0 0.3 1.00
runlogs/rig7/p0-opto-intensity-short__lina-iseni__2026-07-10T20-13-25__dex8fy6r.jsonl behavior_v1 16,424 0 16,034 1.0 0.4 1.0 0.4 1.00
runlogs/rig7/p0-opto-intensity-short__sanmin-jahan__2026-07-10T19-27-39__bs2awvdw.jsonl behavior_v1 16,426 0 16,036 0.9 0.4 0.9 0.4 1.00
runlogs/rig7/p0-opto-intensity-short__sanmin-jahan__2026-07-11T02-10-13__q5rkfloi.jsonl behavior_v1 16,500 0 16,110 1.0 0.4 1.0 0.4 1.00
runlogs/rig7/p0-opto-intensity-short__sanmin-jahan__2026-07-14T01-08-17__9nst191d.jsonl behavior_v1 16,569 0 16,179 0.9 0.3 0.9 0.3 1.00
runlogs/rig7/p1-motion-v2-full__changyuan-wang__2026-07-10T19-05-32__sfy012yz.jsonl behavior_v1 53,964 0 52,205 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__frank__2026-07-10T23-02-59__j9sn6z5b.jsonl behavior_v1 54,029 0 52,270 3.2 1.2 3.2 1.2 1.00
runlogs/rig7/p1-motion-v2-full__lina-iseni__2026-07-10T20-22-01__itl315kh.jsonl behavior_v1 53,939 0 52,180 3.3 1.2 3.3 1.2 1.00
runlogs/rig7/p1-motion-v2-full__sanmin-jahan__2026-07-10T19-36-13__bvw48ilk.jsonl behavior_v1 54,000 0 52,241 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T13-33-42__op3e0ll5.jsonl behavior_v1 54,097 0 52,338 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T13-48-53__8llk19le.jsonl behavior_v1 54,154 0 52,395 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T13-57-16__pjehbly9.jsonl behavior_v1 54,107 1 52,347 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-05-39__pu5qn8b6.jsonl behavior_v1 54,198 0 52,439 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-17-37__q9kcnrur.jsonl behavior_v1 54,135 0 52,376 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-29-49__qp8ofktl.jsonl behavior_v1 54,212 0 52,453 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-41-42__4isu19h3.jsonl behavior_v1 54,162 0 52,403 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-50-22__rfo1an51.jsonl behavior_v1 54,187 0 52,428 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-01-54__ruid9c39.jsonl behavior_v1 54,093 0 52,334 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-12-12__s7rmdf13.jsonl behavior_v1 54,108 0 52,349 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-32-24__sxpo6dwv.jsonl behavior_v1 54,195 0 52,436 3.3 1.0 3.3 1.0 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-42-07__a6fa1crf.jsonl behavior_v1 54,336 0 52,577 3.3 1.0 3.3 1.0 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-52-48__tny9y7zm.jsonl behavior_v1 54,176 0 52,417 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T16-49-14__oj0s17iq.jsonl behavior_v1 54,218 0 52,459 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-00-07__w2idwbk4.jsonl behavior_v1 54,254 0 52,495 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-25-04__yl4k19sx.jsonl behavior_v1 54,339 0 52,580 3.3 1.1 3.3 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-36-07__xct3fe1s.jsonl behavior_v1 54,225 0 52,466 3.4 1.0 3.4 1.0 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-45-44__p69m1b17.jsonl behavior_v1 54,274 0 52,515 3.4 1.0 3.4 1.0 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-55-47__y23ypbko.jsonl behavior_v1 54,245 0 52,486 3.4 1.1 3.4 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T18-06-08__fevw14kf.jsonl behavior_v1 54,263 0 52,504 3.4 1.1 3.4 1.1 1.00
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T18-15-32__rhms1dfy.jsonl behavior_v1 54,336 0 52,577 3.4 1.0 3.4 1.0 1.00
runlogs/rig7/p1-motion-v2-short__sanmin-jahan__2026-07-14T01-14-04__ygqu9sbu.jsonl behavior_v1 18,480 0 17,881 1.1 0.4 1.1 0.4 1.00
runlogs/rig7/p2-object-burst-full__lina-iseni__2026-07-10T20-32-42__dtr0u05b.jsonl behavior_v1 118,515 51,665 66,297 13.6 2.2 5.7 2.0 0.42
runlogs/rig7/p2-object-burst-short__sanmin-jahan__2026-07-14T01-20-01__ym5stsel.jsonl behavior_v1 50,478 21,101 29,136 5.6 0.9 2.3 0.8 0.42
runlogs/rig7/p3-conditioning-closedloop-short-dillpat-ng__michael__2026-07-10T23-53-41__2zk01bzj.jsonl behavior_v1 104,203 51,453 52,356 12.8 1.8 4.9 1.6 0.38
runlogs/rig7/p3-conditioning-closedloop-short-lowg__michael__2026-07-10T23-28-27__k6iypb00.jsonl behavior_v1 103,472 50,678 52,369 12.6 1.8 4.8 1.6 0.38
runlogs/rig7/p3-conditioning-closedloop-short-negative__michael__2026-07-10T23-37-38__kibvj85p.jsonl behavior_v1 102,895 50,169 52,362 12.5 1.7 4.8 1.6 0.39
runlogs/rig7/p3-conditioning-closedloop-short__frank__2026-07-10T23-12-46__mcvn1dan.jsonl behavior_v1 104,586 51,491 52,356 12.7 1.9 4.8 1.7 0.38
runlogs/rig7/p3-conditioning-closedloop-v2-short__michael__2026-07-11T00-25-23__m7qkhw6o.jsonl behavior_v1 103,766 51,091 52,369 12.8 1.7 4.9 1.6 0.39
runlogs/rig7/p3-dill-random-checkers-full__sanmin-jahan__2026-07-11T02-29-29__qag7pbrn.jsonl behavior_v1 228,147 110,036 117,315 28.0 3.8 11.1 3.5 0.40
runlogs/rig7/p3-dill-random-checkers-short__sanmin-jahan__2026-07-11T02-44-13__r6ab0due.jsonl behavior_v1 100,643 47,907 52,390 12.2 1.7 4.9 1.5 0.40
runlogs/rig7/p3-dill-random-checkers-short__sanmin-jahan__2026-07-14T01-30-53__vj6k15p2.jsonl behavior_v1 102,262 49,591 52,374 12.2 1.7 4.6 1.5 0.38

🤖 Generated with Claude Code

…ack + hello levels (PR 1 of runlog-behavior-v2-plan)

Bridge side of docs/development/runlog-behavior-v2-plan.md (Part 1). Nothing in
the Studio or dashboard changes; old Studios never send behavior_v2 and ignore
the new ack messages.

- behavior_v2 (new default): the browser's arena_command echo (76 % of a v1
  file) is written as ["a", t_off, dt, hex, status, rx_off(, error)] with ms
  offsets from the schema line's t0. Frame arrays are unchanged; runner /
  session / run_metadata / config lines stay verbatim objects. Lossless by
  construction: compact_arena_command verifies every invariant the expansion
  relies on (12-key set, dir, int t/rx_ms, spaced lowercase hex head, len,
  echo = command byte and ok = status===0 — or all three null on timeout) and
  writes a non-fitting echo verbatim instead.
- bridge.py --convert IN OUT [--to v1|v2]: offline v1 ⇄ v2 re-encoding,
  direction auto-detected, .jsonl.gz on either side, strict (unknown arena key
  raises). Files without a v1 schema (pre-#140, full level) get a v2 schema
  with cols:null inserted; the reverse drops it. websockets import is now
  optional so --convert runs without the server deps.
- log_control → log_control_ack {enabled, level, requested, file} with the level
  ACTUALLY in force (an unknown requested level is ignored, not applied);
  hello → hello_ack {bridge, levels, level, logging}. --log-level flag
  (--log-frames = alias for full). BRIDGE_VERSION 3.0.
- tests/test-bridge-behavior.py: +99 checks — encode/decode invariants on real
  line samples (ok / status-1 / timeout / non-null error / other cmd), strict vs
  lenient fallbacks, file round trips (.jsonl + .gz), legacy path, LogWriter
  output per level, dispatcher acks.
- scripts/runlog-v2-corpus.py: the corpus gate — round trip + known-shape check
  + size table over every log in a course-repo clone. 164/164 pass on
  cshl-2026-course origin/main (1281.6 MB v1 → 655.6 MB v2 → 211.3 MB v2.gz).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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