Skip to content

feat(readers): open .jsonl.gz + behavior_v2 run logs everywhere via shared js/runlog-format.js (PR 3 of 3) — Studio v0.73 - #188

Open
mbreiser wants to merge 1 commit into
claude/runlog-behavior-v2-studiofrom
claude/runlog-behavior-v2-readers
Open

feat(readers): open .jsonl.gz + behavior_v2 run logs everywhere via shared js/runlog-format.js (PR 3 of 3) — Studio v0.73#188
mbreiser wants to merge 1 commit into
claude/runlog-behavior-v2-studiofrom
claude/runlog-behavior-v2-readers

Conversation

@mbreiser

@mbreiser mbreiser commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Reader side (PR 3 of 3) of docs/development/runlog-behavior-v2-plan.md. Stacks on the Studio PR #186 (base = its branch; retarget to main as the stack merges). Once this is in, everything that opens a run-log file reads both .jsonl and .jsonl.gz, and both behavior_v1 and behavior_v2. Merge order: this PR must land before or together with #186 — a v0.72 Studio commits .jsonl.gz files that only these readers open.

The shared module — js/runlog-format.js

One classic dual-export module knows how a run-log FILE is encoded; every reader goes through it. The dashboard uses an exact vendored copy (dashboard/data-browser/vendor/runlog-format.js, same convention as kinematics.js) and tests/test-runlog-format.js fails if the copies diverge.

  • gzip: isGzip (magic 1f 8b, never by name alone), inflateIfGzip, readRunlogText(string | bytes | ArrayBuffer | Blob/File) → text, readRunlogPrefixText (a truncated .gz prefix still inflates to the run_metadata line near the top, which is what the catalog's 64 KB metadata reads need). isRunlogName accepts .jsonl|.ndjson|.json with optional .gz; stripGz for filename parsers.
  • behavior_v2: isArenaArray, expandV2Line(arr, schema) → the exact v1 arena_command object in the original key order, including the corpus-verified timeout rule (status, echo, ok all null); compactV1Line; detectFormat; createNormalizer() — the per-file state machine each reader feeds every parsed line through, so v2's ["a", …] echoes reach every existing consumer (p3LedEpochs, stall forensics, replay frame decoding) as v1 objects. A v2 file may still carry a verbatim v1 echo (non-fitting bulk command) and a converted legacy file may carry "cols": null — both handled.
  • convertV1ToV2Text / convertV2ToV1Text: the JS mirror of the bridge's --convert, used by the tests and the parity script to exercise the readers on v2 versions of every existing v1 log.

Readers changed

  • Dashboard (dashboard/data-browser/): analysis-core.js parseJsonl normalizes every line and reports run.logFormat / run.rawBytes; parseFilename strips .gz. github-repo.js fetchRaw now reads bytes and inflates (prefix mode inflates a truncated gz). app.js: the repo, URL, local-server and dropped-file loaders all go through readRunlogText; catalog filters accept .jsonl.gz; new size column (committed/compressed size, with the inflated size and line format in the hover); file input accepts .gz; ?v= cache busters bumped.
  • Replay (js/runlog-replay.js parseRunLog): normalizes records; arena_studio.html (v0.73) loads js/runlog-format.js before it. Under a stale cache it degrades to "v2 echoes skipped" with a console warning while frames and runner events still replay. js/arena-studio-alt.js: the replay picker lists .jsonl.gz from the repo and inflates the picked file.
  • Unchanged on purpose: arena_replay_viewer.html (fed over its protocol module, never reads files), js/studio-runlog-adapter.js (no file reads), js/kinematics.js.

Tests

  • tests/test-runlog-format.js (new, in pixi run test): 86 checks — gzip detection and inflation for every input type incl. Blob, truncated-prefix inflation of a >64 KB gz, expandV2Line exact objects (ok / reject / timeout / other command byte) and malformed-input throws, compactV1Line Python-identical arrays + round trips + must-not-compact cases, the normalizer state machine (orphan arrays before a schema, full-level detection), detectFormat, whole-text conversion both ways incl. the legacy no-schema insertion, gz → text → normalizer end to end, and the vendored-copy identity.
  • tests/test-runlog-replay.js 65 → 76 checks: a behavior_v2 log yields identical samples, arena frames, events and bounds to the equivalent v1 log; rejected and timed-out compact echoes are not frames.
  • dashboard/data-browser/tests/test-analysis.js: re-reads the P3 fixture as v2 + gzip and asserts identical frames, identical expanded arena_command objects (51,091 of them), identical preference indices, LED epochs and every page's CSV rows, plus run_metadata from a 64 KB gz prefix and run id from a .jsonl.gz name.
  • Full pixi run test passes; touched JS is Prettier-clean.
  • Browser-verified on the dashboard served from this branch: ?data=<converted .jsonl.gz> loads (all scripts with fresh stamps, the gz fetched once), catalog row shows 1.6 MB gz with hover "compressed (gzip) size 1.6 MB · 4.9 MB of JSONL text · format behavior_v2", 52,369 frames / 29 steps (identical to the v1 fixture), no console errors. Not browser-tested: the Alt Studio replay picker path (one-line change to the file read; the parser is covered in Node) and the private-repo prefix read against real GitHub (covered by the mocked client test + the Node gz-prefix test).

164 / 164 identical (frames, events, step summaries, metadata, run id; plus every P3 preference index and every P3 page's CSV rows for the 30 P3 runs). Formats: 14 legacy, 149 behavior_v1, 1 full.

All files
file fmt ok frames P3 csv rows v1 MB v2.gz MB
runlogs/bench00/fictrac-test-shorter__michael__2026-07-06T14-24-28__b7qrjimm.jsonl legacy 0 0.7 0.1
runlogs/bench00/fictrac-test-shorter__michael__2026-07-06T15-10-03__cudoq0sk.jsonl legacy 0 0.7 0.1
runlogs/bench00/fictrac-test-shorter__michael__2026-07-07T05-14-50__70rj8ll1.jsonl legacy 0 0.7 0.1
runlogs/bench01/fictrac-direction-test__michael__2026-07-04T22-46-23__y4ji2xz4.jsonl legacy 0 2.2 0.2
runlogs/bench01/fictrac-direction-test__michael__2026-07-04T23-32-38__zxu2a6pg.jsonl legacy 0 0.4 0.0
runlogs/bench01/fictrac-direction-test__michael__2026-07-06T00-49-04__hwyim9v0.jsonl legacy 0 1.2 0.1
runlogs/bench01/fictrac-direction-test__michael__2026-07-06T01-26-54__jewjaohf.jsonl legacy 0 0.8 0.1
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T02-14-44__l6ixehiy.jsonl legacy 0 0.2 0.0
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T02-17-11__l9o0jine.jsonl legacy 0 0.3 0.0
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T03-04-54__mz1jpqrs.jsonl legacy 0 0.3 0.0
runlogs/bench01/fictrac-test-shorter__michael__2026-07-06T04-36-36__q8zaj8l7.jsonl legacy 0 0.3 0.0
runlogs/bench01/g6-2x10-smoke__michael__2026-07-04T17-46-23__nkts77qj.jsonl legacy 0 0.2 0.0
runlogs/bench01/g6-2x10-smoke__michael__2026-07-04T17-55-32__wls517zb.jsonl legacy 0 0.2 0.0
runlogs/bench02-il/gratingsol-barcl__isabel__2026-07-29T19-17-21__gsyicnsy.jsonl behavior_v1 28110 3.0 0.6
runlogs/bench02-il/gratingsol-barcl__isabel__2026-07-29T19-25-59__h42f1lnh.jsonl behavior_v1 28086 2.9 0.6
runlogs/bench02-il/gratingsol-barcl__isabel__2026-07-29T19-28-08__h6tsw3bq.jsonl behavior_v1 28086 3.0 0.6
runlogs/bench02/fictrac-direction-test__hannah-marie__2026-07-06T21-41-56__qop150xr.jsonl full 44091 23.1 8.3
runlogs/bench02/fictrac-direction-test__hannah-marie__2026-07-07T17-34-00__xagkpdwu.jsonl legacy 0 5.2 0.4
runlogs/bench02/fictrac-direction-test__hannah-marie__2026-07-07T17-58-28__5x5f16bf.jsonl behavior_v1 39945 4.2 0.9
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T20-11-17__qjs21a3i.jsonl behavior_v1 74735 4.3 1.5
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T20-32-52__3ic476gs.jsonl behavior_v1 74565 4.3 1.5
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T20-47-27__12h810pf.jsonl behavior_v1 74645 4.3 1.5
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T21-04-43__4na490v2.jsonl behavior_v1 74613 4.2 1.6
runlogs/bench02/p0-opto-intensity__hannah-marie__2026-07-07T21-47-11__65vhx27m.jsonl behavior_v1 74736 4.3 1.6
runlogs/bench02/p1-motion-v2__hannah-marie__2026-07-07T22-38-35__82uzfwrt.jsonl behavior_v1 58486 3.5 1.1
runlogs/bench02/p1-motion-v2__hannah-marie__2026-07-07T22-55-06__8o2so8el.jsonl behavior_v1 58572 3.5 1.2
runlogs/bench02/p1-motion-v2__hannah-marie__2026-07-08T15-28-03__49m610er.jsonl behavior_v1 62856 3.7 1.3
runlogs/bench02/p1-motion__hannah-marie__2026-07-07T22-08-03__71jujrws.jsonl behavior_v1 47425 2.8 0.9
runlogs/bench02/p1-motion__hannah-marie__2026-07-07T22-22-11__7jptihkl.jsonl behavior_v1 47459 2.8 0.9
runlogs/bench02/p2-object-burst-short__hannah-marie__2026-07-08T22-47-03__ny76rj9y.jsonl behavior_v1 32593 6.6 0.9
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T18-46-08__f4zbccp7.jsonl behavior_v1 74242 14.4 1.9
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T19-24-42__ij07134k.jsonl behavior_v1 74558 14.3 1.9
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T21-15-58__kho5np10.jsonl behavior_v1 74187 14.7 1.9
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T21-45-53__lk56hjd4.jsonl behavior_v1 74236 14.9 2.1
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T22-10-53__mganholq.jsonl behavior_v1 74223 14.9 2.0
runlogs/bench02/p2-object-burst__hannah-marie__2026-07-08T22-32-10__f27016vw.jsonl behavior_v1 32581 6.8 0.9
runlogs/bench02/p2-object-burst__michael__2026-07-08T20-25-27__ioox6k0b.jsonl behavior_v1 74236 14.7 2.0
runlogs/bench02/p2-object-tonic-short__hannah-marie__2026-07-08T22-38-47__nns3jgiu.jsonl behavior_v1 31394 6.6 0.9
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T16-19-45__9uzf6q8w.jsonl behavior_v1 84144 13.6 2.2
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T19-50-29__hg8km7mj.jsonl behavior_v1 71372 14.2 1.8
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T21-26-30__kvpxk2iv.jsonl behavior_v1 71387 14.2 1.8
runlogs/bench02/p2-object-tonic__hannah-marie__2026-07-08T21-56-42__lyk07niu.jsonl behavior_v1 71390 14.4 2.0
runlogs/bench02/p2-object-tonic__michael__2026-07-08T20-39-17__701t1a3d.jsonl behavior_v1 71378 14.6 2.0
runlogs/bench02/shortol-w-led__hannah-marie__2026-07-07T18-15-56__yubbedzl.jsonl behavior_v1 29065 1.6 0.6
runlogs/rig03-sr/p3-heisenberg-ts-full-led3__shubhamtr__2026-09-04T20-32-59__7owc12qq.jsonl behavior_v1 109620 16778 26.5 3.0
runlogs/rig03-sr/p3-heisenberg-ts-full-led3__shubhamtr__2026-09-04T21-09-47__j0q01cow.jsonl behavior_v1 109640 16865 26.7 3.1
runlogs/rig03-sr/p3-heisenberg-ts-full-led3__shubhamtr__2026-09-04T23-01-55__jj850l1w.jsonl behavior_v1 109640 16575 26.0 3.0
runlogs/rig03-sr/p3-heisenberg-ts-full-led8-40strain__shubhamtr__2026-09-05T19-27-19__rydc2tql.jsonl behavior_v1 218708 17454 53.9 6.2
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-04T23-26-06__kebkqlx9.jsonl behavior_v1 109651 17070 26.8 3.1
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-04T23-56-32__lhgm7i7l.jsonl behavior_v1 109626 16657 26.5 3.0
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T20-25-42__te6ebvwb.jsonl behavior_v1 109610 16780 26.2 3.1
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T20-48-39__7otr1dfu.jsonl behavior_v1 109618 17490 26.9 3.2
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T21-10-26__uzpn3fmb.jsonl behavior_v1 109611 17327 27.2 3.2
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T21-36-14__ww5m1e3x.jsonl behavior_v1 109613 17044 26.9 3.1
runlogs/rig03-sr/p3-heisenberg-ts-full-led8__shubhamtr__2026-09-05T22-05-36__wyghjfgc.jsonl behavior_v1 110492 16573 27.3 3.2
runlogs/rig03-sr/p3-heisenberg-ts-short-led5__shubhamtr__2026-09-04T19-41-21__cq6hcj29.jsonl behavior_v1 48944 15718 11.9 1.4
runlogs/rig1/p0-opto-intensity-short__jude-nnaka__2026-07-10T17-20-49__78yihmqz.jsonl behavior_v1 14307 0.9 0.3
runlogs/rig1/p0-opto-intensity-short__steven-bradley__2026-07-10T18-49-25__ew3x1e8c.jsonl behavior_v1 14313 0.9 0.3
runlogs/rig1/p0-opto-intensity-short__steven-bradley__2026-07-10T20-54-03__v6c51dze.jsonl behavior_v1 14319 0.9 0.3
runlogs/rig1/p1-motion-v2-full__steven-bradley__2026-07-10T19-45-14__c7glphii.jsonl behavior_v1 46757 3.1 1.0
runlogs/rig1/p1-motion-v2-full__steven-bradley__2026-07-10T20-31-59__dvkuh1rg.jsonl behavior_v1 46792 3.1 1.0
runlogs/rig1/p1-motion-v2-full__steven-bradley__2026-07-10T21-07-42__f5hr38n2.jsonl behavior_v1 46807 3.0 0.9
runlogs/rig1/p1-motion-v2-short__steven-bradley__2026-07-10T19-00-46__at5oqc6m.jsonl behavior_v1 15791 1.0 0.4
runlogs/rig1/p1-motion-v2-short__steven-bradley__2026-07-10T19-09-53__b4vzmbyc.jsonl behavior_v1 15789 1.0 0.3
runlogs/rig1/p3-heisenberg-ts-full__steven-bradley__2026-07-11T02-12-50__plqc5vs6.jsonl behavior_v1 104573 16359 25.6 2.8
runlogs/rig1/p3-heisenberg-ts-full__steven-bradley__2026-07-11T03-00-32__redzrtzq.jsonl behavior_v1 104597 17103 25.2 3.1
runlogs/rig2/p0-opto-intensity-full__xiao-li__2026-07-10T20-35-55__dxx0lqx0.jsonl behavior_v1 74000 4.4 1.5
runlogs/rig2/p0-opto-intensity-short__xiao-li__2026-07-10T18-04-33__8t7nhrt9.jsonl behavior_v1 17862 1.0 0.4
runlogs/rig2/p0-opto-intensity-short__xiao-li__2026-07-10T20-09-36__da0rpnyy.jsonl behavior_v1 17857 1.0 0.4
runlogs/rig2/p1-motion-v2-short__xiao-li__2026-07-11T02-42-29__rayjsix8.jsonl behavior_v1 19609 1.2 0.4
runlogs/rig2/p3-dill-random-checkers-full__xiao-li__2026-07-11T02-30-38__qby09m0a.jsonl behavior_v1 131107 16051 31.6 3.5
runlogs/rig2/p3-heisenberg-slashes-full__olenka-jain__2026-07-11T03-35-00__spzae5dn.jsonl behavior_v1 112734 16414 23.6 3.1
runlogs/rig2/p3-heisenberg-slashes-full__xiao-li__2026-07-11T03-17-52__0otk11o5.jsonl behavior_v1 131131 16784 31.5 3.6
runlogs/rig2/p3-heisenberg-slashes-short__xiao-li__2026-07-11T02-11-59__q0u1l6y6.jsonl behavior_v1 58542 15503 14.1 1.6
runlogs/rig3/p0-opto-intensity-short__fatimah-hussein__2026-07-10T20-54-47__ew4leyyw.jsonl behavior_v1 18042 1.0 0.4
runlogs/rig3/p0-opto-intensity-short__olenka-jain__2026-07-10T19-14-09__b9fr2tk8.jsonl behavior_v1 20068 1.1 0.4
runlogs/rig3/p0-opto-intensity-short__olenka-jain__2026-07-10T19-25-13__oybm19le.jsonl behavior_v1 14274 0.8 0.3
runlogs/rig3/p1-motion-v2-full__fatimah-hussein__2026-07-10T21-12-07__fb9s692j.jsonl behavior_v1 58609 3.7 1.5
runlogs/rig3/p3-heisenberg-ts-full__fatimah-hussein__2026-07-11T01-43-15__n08n1914.jsonl behavior_v1 132077 16457 32.2 3.8
runlogs/rig4/p0-opto-intensity-full__byoungsoo-kim__2026-07-10T19-37-54__vavu199y.jsonl behavior_v1 73225 4.2 1.5
runlogs/rig4/p0-opto-intensity-full__elle-mccall__2026-07-10T20-18-20__dbbblr60.jsonl behavior_v1 73239 4.2 1.5
runlogs/rig4/p0-opto-intensity-full__elle-mccall__2026-07-10T20-29-50__dq3chaxr.jsonl behavior_v1 73239 4.3 1.5
runlogs/rig4/p0-opto-intensity-short__byoungsoo-kim__2026-07-10T19-27-19__brna2ccs.jsonl behavior_v1 17675 1.0 0.4
runlogs/rig4/p0-opto-intensity-short__elle-mccall__2026-07-10T19-56-29__t5wa1b4g.jsonl behavior_v1 17674 1.0 0.4
runlogs/rig4/p0-opto-intensity-short__elle-mccall__2026-07-10T20-07-10__d6we1odi.jsonl behavior_v1 17671 1.0 0.4
runlogs/rig4/p1-motion-v2-full__byoungsoo-kim__2026-07-10T19-49-08__cclmiuqc.jsonl behavior_v1 57292 3.5 1.2
runlogs/rig4/p1-motion-v2-full__elle-mccall__2026-07-10T20-39-20__e55oh4yq.jsonl behavior_v1 57285 3.5 1.2
runlogs/rig4/p1-motion-v2-full__elle-mccall__2026-07-10T20-50-11__ej3yx6cf.jsonl behavior_v1 57321 3.5 1.2
runlogs/rig4/p1-motion-v2-short__byoungsoo-kim__2026-07-10T19-40-52__c8rde7cf.jsonl behavior_v1 19402 1.1 0.4
runlogs/rig4/p3-heisenberg-ts-short__elle-mccall__2026-07-11T02-13-47__q35nv4cr.jsonl behavior_v1 57931 15711 13.9 1.5
runlogs/rig5/p0-opto-intensity-short__kristina-ponimaskine__2026-07-10T19-16-30__bdql4krn.jsonl behavior_v1 17869 1.0 0.4
runlogs/rig5/p0-opto-intensity-short__kristina-ponimaskine__2026-07-10T19-46-18__cg2awv52.jsonl behavior_v1 17867 1.0 0.4
runlogs/rig5/p0-opto-intensity-short__michael__2026-07-10T16-07-31__4mpozwkv.jsonl behavior_v1 17863 1.0 0.4
runlogs/rig5/p1-motion-v2-full__kristina-ponimaskine__2026-07-10T19-59-03__cpcm9o9v.jsonl behavior_v1 57899 3.5 1.2
runlogs/rig5/p1-motion-v2-short__kristina-ponimaskine__2026-07-10T19-49-28__cjtkx8pd.jsonl behavior_v1 19618 1.2 0.4
runlogs/rig5/p2-object-burst-full-neg-gain__frank__2026-07-11T01-04-51__jrl416l6.jsonl behavior_v1 74039 15.4 2.0
runlogs/rig5/p2-object-burst-full__kristina-ponimaskine__2026-07-10T20-15-24__d7ii0wgv.jsonl behavior_v1 74033 15.1 2.0
runlogs/rig5/p2-object-burst-short__kristina-ponimaskine__2026-07-10T20-04-51__d1bn4991.jsonl behavior_v1 32508 6.8 0.9
runlogs/rig5/p2-object-tonic-short__lilly-kamman-cummings__2026-07-10T17-36-31__7qs3hn6q.jsonl behavior_v1 31341 6.8 0.8
runlogs/rig5/p3-heisenberg-relational-full__kristina-ponimaskine__2026-07-11T02-11-37__nhup10e2.jsonl behavior_v1 131126 16034 32.1 3.5
runlogs/rig6/led-activation-quadrant-test__michael__2026-07-10T03-39-14__dxnifld8.jsonl behavior_v1 8676 2.1 0.3
runlogs/rig6/led-activation-quadrant-test__michael__2026-07-10T04-34-32__fwrqv385.jsonl behavior_v1 8676 2.1 0.3
runlogs/rig6/p0-opto-intensity-full__lilly-kamman-cummings__2026-07-10T18-34-40__9lzgfq0a.jsonl behavior_v1 74001 4.4 1.6
runlogs/rig6/p0-opto-intensity-full__lilly-kamman-cummings__2026-07-10T19-27-09__bhh2084q.jsonl behavior_v1 74003 4.3 1.5
runlogs/rig6/p0-opto-intensity-full__lilly-kamman-cummings__2026-07-10T20-35-34__xgeh145h.jsonl behavior_v1 74007 4.5 1.6
runlogs/rig6/p0-opto-intensity-short__lilly-kamman-cummings__2026-07-10T18-20-13__dcsn14bv.jsonl behavior_v1 17862 1.0 0.4
runlogs/rig6/p0-opto-intensity-short__lilly-kamman-cummings__2026-07-10T19-16-35__bdup47cb.jsonl behavior_v1 17855 1.0 0.4
runlogs/rig6/p0-opto-intensity-short__lilly-kamman-cummings__2026-07-10T20-25-00__ttyh139x.jsonl behavior_v1 17858 1.0 0.4
runlogs/rig6/p1-motion-v2-full__lilly-kamman-cummings__2026-07-10T19-38-26__yrap1dqd.jsonl behavior_v1 58359 3.6 1.2
runlogs/rig6/p1-motion-v2-full__lilly-kamman-cummings__2026-07-10T20-46-54__ewh61427.jsonl behavior_v1 57832 3.7 1.3
runlogs/rig6/p1-motion-v2-short__lilly-kamman-cummings__2026-07-10T18-38-15__08zs1bpn.jsonl behavior_v1 19607 1.2 0.4
runlogs/rig6/p1-motion-v2-short__lilly-kamman-cummings__2026-07-10T19-30-06__bux9lu2w.jsonl behavior_v1 19596 1.2 0.4
runlogs/rig6/p1-motion-v2-short__lilly-kamman-cummings__2026-07-10T20-38-30__eavuqafk.jsonl behavior_v1 19593 1.2 0.4
runlogs/rig6/p2-object-burst-full__lilly-kamman-cummings__2026-07-10T19-54-02__g1yo16ft.jsonl behavior_v1 74034 15.1 2.0
runlogs/rig6/p2-object-burst-full__lilly-kamman-cummings__2026-07-10T21-02-52__ewk96b3a.jsonl behavior_v1 74035 15.3 2.0
runlogs/rig6/p2-object-burst-short__lilly-kamman-cummings__2026-07-10T19-43-19__c9mcoek1.jsonl behavior_v1 32507 6.8 0.9
runlogs/rig6/p2-object-burst-short__lilly-kamman-cummings__2026-07-10T20-51-39__ephveo2m.jsonl behavior_v1 32506 6.9 0.9
runlogs/rig6/p2-object-tonic-full__lilly-kamman-cummings__2026-07-10T20-10-02__d138hxcb.jsonl behavior_v1 71427 15.1 1.8
runlogs/rig6/p2-object-tonic-short-neg-gain__frank__2026-07-11T01-01-46__nndfbtib.jsonl behavior_v1 31340 6.8 0.9
runlogs/rig6/p2-object-tonic-short__lilly-kamman-cummings__2026-07-10T19-59-11__cu8eh1gd.jsonl behavior_v1 31341 6.8 0.8
runlogs/rig6/p3-heisenberg-high-low-short__hannah-marie__2026-07-11T02-39-56__r0s814l2.jsonl behavior_v1 58535 15855 14.1 1.7
runlogs/rig7/p0-opto-intensity-short__changyuan-wang__2026-07-10T18-55-26__amjzt9p4.jsonl behavior_v1 16483 0.9 0.3
runlogs/rig7/p0-opto-intensity-short__frank__2026-07-10T22-53-50__j57x1wia.jsonl behavior_v1 16072 0.9 0.4
runlogs/rig7/p0-opto-intensity-short__lina-iseni__2026-07-10T19-55-44__cs6tbwtu.jsonl behavior_v1 16043 1.0 0.3
runlogs/rig7/p0-opto-intensity-short__lina-iseni__2026-07-10T20-13-25__dex8fy6r.jsonl behavior_v1 16034 1.0 0.4
runlogs/rig7/p0-opto-intensity-short__sanmin-jahan__2026-07-10T19-27-39__bs2awvdw.jsonl behavior_v1 16036 0.9 0.4
runlogs/rig7/p0-opto-intensity-short__sanmin-jahan__2026-07-11T02-10-13__q5rkfloi.jsonl behavior_v1 16110 1.0 0.4
runlogs/rig7/p0-opto-intensity-short__sanmin-jahan__2026-07-14T01-08-17__9nst191d.jsonl behavior_v1 16179 0.9 0.3
runlogs/rig7/p1-motion-v2-full__changyuan-wang__2026-07-10T19-05-32__sfy012yz.jsonl behavior_v1 52205 3.3 1.1
runlogs/rig7/p1-motion-v2-full__frank__2026-07-10T23-02-59__j9sn6z5b.jsonl behavior_v1 52270 3.2 1.2
runlogs/rig7/p1-motion-v2-full__lina-iseni__2026-07-10T20-22-01__itl315kh.jsonl behavior_v1 52180 3.3 1.2
runlogs/rig7/p1-motion-v2-full__sanmin-jahan__2026-07-10T19-36-13__bvw48ilk.jsonl behavior_v1 52241 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T13-33-42__op3e0ll5.jsonl behavior_v1 52338 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T13-48-53__8llk19le.jsonl behavior_v1 52395 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T13-57-16__pjehbly9.jsonl behavior_v1 52347 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-05-39__pu5qn8b6.jsonl behavior_v1 52439 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-17-37__q9kcnrur.jsonl behavior_v1 52376 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-29-49__qp8ofktl.jsonl behavior_v1 52453 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-41-42__4isu19h3.jsonl behavior_v1 52403 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T14-50-22__rfo1an51.jsonl behavior_v1 52428 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-01-54__ruid9c39.jsonl behavior_v1 52334 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-12-12__s7rmdf13.jsonl behavior_v1 52349 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-32-24__sxpo6dwv.jsonl behavior_v1 52436 3.3 1.0
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-42-07__a6fa1crf.jsonl behavior_v1 52577 3.3 1.0
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T15-52-48__tny9y7zm.jsonl behavior_v1 52417 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T16-49-14__oj0s17iq.jsonl behavior_v1 52459 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-00-07__w2idwbk4.jsonl behavior_v1 52495 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-25-04__yl4k19sx.jsonl behavior_v1 52580 3.3 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-36-07__xct3fe1s.jsonl behavior_v1 52466 3.4 1.0
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-45-44__p69m1b17.jsonl behavior_v1 52515 3.4 1.0
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T17-55-47__y23ypbko.jsonl behavior_v1 52486 3.4 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T18-06-08__fevw14kf.jsonl behavior_v1 52504 3.4 1.1
runlogs/rig7/p1-motion-v2-full__xiao-li__2026-07-14T18-15-32__rhms1dfy.jsonl behavior_v1 52577 3.4 1.0
runlogs/rig7/p1-motion-v2-short__sanmin-jahan__2026-07-14T01-14-04__ygqu9sbu.jsonl behavior_v1 17881 1.1 0.4
runlogs/rig7/p2-object-burst-full__lina-iseni__2026-07-10T20-32-42__dtr0u05b.jsonl behavior_v1 66297 13.6 2.0
runlogs/rig7/p2-object-burst-short__sanmin-jahan__2026-07-14T01-20-01__ym5stsel.jsonl behavior_v1 29136 5.6 0.8
runlogs/rig7/p3-conditioning-closedloop-short-dillpat-ng__michael__2026-07-10T23-53-41__2zk01bzj.jsonl behavior_v1 52356 15382 12.8 1.6
runlogs/rig7/p3-conditioning-closedloop-short-lowg__michael__2026-07-10T23-28-27__k6iypb00.jsonl behavior_v1 52369 15988 12.6 1.6
runlogs/rig7/p3-conditioning-closedloop-short-negative__michael__2026-07-10T23-37-38__kibvj85p.jsonl behavior_v1 52362 15351 12.5 1.6
runlogs/rig7/p3-conditioning-closedloop-short__frank__2026-07-10T23-12-46__mcvn1dan.jsonl behavior_v1 52356 16291 12.7 1.7
runlogs/rig7/p3-conditioning-closedloop-v2-short__michael__2026-07-11T00-25-23__m7qkhw6o.jsonl behavior_v1 52369 15332 12.8 1.6
runlogs/rig7/p3-dill-random-checkers-full__sanmin-jahan__2026-07-11T02-29-29__qag7pbrn.jsonl behavior_v1 117315 16786 28.0 3.5
runlogs/rig7/p3-dill-random-checkers-short__sanmin-jahan__2026-07-11T02-44-13__r6ab0due.jsonl behavior_v1 52390 15309 12.2 1.5
runlogs/rig7/p3-dill-random-checkers-short__sanmin-jahan__2026-07-14T01-30-53__vj6k15p2.jsonl behavior_v1 52374 15258 12.2 1.5

🤖 Generated with Claude Code

…red js/runlog-format.js (PR 3 of runlog-behavior-v2-plan) — Studio v0.73

Reader side of docs/development/runlog-behavior-v2-plan.md (Part 3). Stacks on
the Studio PR (v0.72). With this, everything that opens a run-log FILE inflates
gzip on the magic bytes and expands behavior_v2's compact arena echoes back to
the v1 `arena_command` object at parse time, so every existing consumer
(p3LedEpochs, stall forensics, replay frame decoding) is unchanged.

- js/runlog-format.js (new; classic dual-export, vendored byte-identical at
  dashboard/data-browser/vendor/): isGzip, isRunlogName, stripGz, inflateIfGzip,
  readRunlogText (string|bytes|ArrayBuffer|Blob → text), readRunlogPrefixText
  (truncation-tolerant gunzip for the catalog's 64 KB metadata reads),
  isArenaArray, expandV2Line (exact v1 key order; timeout ⇒ status/echo/ok all
  null), compactV1Line, detectFormat, createNormalizer() (per-file state
  machine), convertV1ToV2Text / convertV2ToV1Text (JS mirror of the bridge
  converter, for tests + parity).
- Dashboard: analysis-core.js parseJsonl normalizes every line, run.logFormat +
  run.rawBytes, parseFilename strips .gz; github-repo.js fetchRaw reads bytes and
  inflates (prefix mode inflates a truncated gz); app.js loaders (repo / URL /
  local server / dropped file) go through readRunlogText, catalog filters accept
  .jsonl.gz, new size column (compressed size; inflated size + format in the
  hover), ?v= cache busters bumped, file input accepts .gz.
- Replay: js/runlog-replay.js parseRunLog normalizes records (loads
  js/runlog-format.js first in arena_studio.html; degrades to "v2 echoes
  skipped" + console warning under a stale cache); js/arena-studio-alt.js replay
  picker lists .jsonl.gz and inflates the picked file. arena_replay_viewer.html
  (protocol-fed) and js/studio-runlog-adapter.js (no file reads) unchanged.
- Tests: tests/test-runlog-format.js (new, 86 checks, in pixi run test — also
  enforces the vendored copy); tests/test-runlog-replay.js v2 case identical to
  the equivalent v1 (76 checks); dashboard test-analysis.js re-reads the P3
  fixture as v2 + gz asserting identical frames, arena_command objects,
  preference indices, LED epochs and page CSV rows, plus metadata from a gz
  prefix; dashboard/data-browser/tests/corpus-v2-parity.js runs the same over a
  whole clone (164/164 on cshl-2026-course origin/main).
- Browser-verified: the dashboard opens a converted .jsonl.gz via ?data= (52,369
  frames / 29 steps, size column "1.6 MB gz", no console errors).
- Docs: dashboard README, release notes v0.73, plan doc status + PR 3 notes,
  CLAUDE.md reader rule.

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