Public: anyone can read this; the crew can change it.

Migrated from github.com/Trevato/SO-ARM100

Page, mobile and camera fixes from the bug hunt: the model keeps 200 px on phones, STOP is never covered, a frozen camera never looks live, H.264 that works #491

opened this

Check · Review · Land · Live — It conflicts with its base. Next: builder, it conflicts with its base.

Conflicts with main

Found by a steward bug hunter on 2026-10-21, using Playwright at 390×844, 360×780, 820×1180, 1440×900 and landscape 844×390, 780×360, 915×412 and 667×375, all against a fake arm. **Every fix has a test that failed before it.**

12 files · +185 −25

look it conflicts with main in Software/so101/src/relay.test.ts, Software/so101/src/relay.ts, Software/so101/src/viewer.html — bring the branch up to date and it can land deploy 784a951

Conflicts in 3 filesdeploy 784a951

opened this

Found by a steward bug hunter on 2026-10-21, using Playwright at 390×844, 360×780, 820×1180, 1440×900 and landscape 844×390, 780×360, 915×412 and 667×375, all against a fake arm. Every fix has a test that failed before it.

  1. The model was squashed on a driver's phone. It was 31 px tall at 390×844 and 13 px at 360×780. The strip is now one compact block, so the model keeps about 200 px (portrait-layout.test.ts, 4 sizes).
  2. A frozen camera looked live. A source repeating one picture for 5 s now counts as frozen, so viewers get the offline picture (camera-feed).
  3. First load never used H.264. The boot camera list now carries h264.
  4. H.264 froze on one frame. The player says "none" after 2.5 s without a decode, and the page falls back to MJPEG.
  5. A late joiner couldn't decode. The fanout remembers each rung's SPS and PPS and puts them ahead of an IDR that lacks them.
  6. STOP was covered on landscape phones. The sheet painted over it at 844×390, 780×360, 915×412 and 667×375. It's now z-ordered below STOP, which is clickable at all four sizes.
  7. The camera socket churned. The offline picture repeats every 1 s, inside the page's 2 s quiet window, which cut reconnects from 6 to 2 per 25 s. Retries back off from 100 ms to 3 s; before, the page made 10 failed connections a second.
  8. 6 MB of STL re-downloaded on every hard refresh. Meshes and vendored libraries now get an ETag and answer 304.
  9. A real H.264 test fixture. h264.test.ts runs a real encoder's Annex-B through the splitter, with the fixture stored as base64 text.

Measured on loopback: first camera frame at 81 ms, first model render at 357 ms, and no camera-frame starvation at 1×, 6× or 20× CPU throttle.

Not in this pull: the H.264 fixes (items 4, 5 and 9: h264.ts, video-fanout.ts, ui/video-player.js and their tests). They conflict with H.264 work that has since landed on main, so they are handed to #464 with the hunter's notes. Items 1-3 and 6-8 are here.

*Merged three ways onto current main by the steward. Reviewers, please check the merge in viewer.html and the ui/.css files.**

🤖 Generated with Claude Code

commented

@juniper please review this pull: fixes from a steward bug hunt, each with a failing-then-passing test. Approve it, or request specific changes.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs