Engineering read-out
These are the numbers the HUD keeps out of the way: the achieved tick rate against the 50 Hz target, the hub's height and position, the contact count, and the raw commanded and achieved twist components. hub z is the height of the body's centre above the floor; con is the number of contacts MuJoCo is solving this step.
No demonstration running
Measured.
Where it is weak.
Where every number came from
Every number on a card is a substitution from a file named above: a training-side eval (uv run stumblebug eval, twelve seeds), a campaign record, an open-loop ceiling record, or what node tests/demos.mjs measured driving this same demo through this same tick under node. The catalogue (assets/demos.json) is generated by uv run stumblebug demos and records each number beside its source; the bars listed decide the card's status. The bounds a caption rests on are in the demo's own expect list and are checked by tests/demos.mjs; a demo that fails one is barred from the unattended showcase loop.
This net's identity
The artifact-lifecycle contract: a checkpoint carries its own identity and no consumer guesses it from a path (docs/artifact-lifecycle.md). The capability record below it is derived by uv run stumblebug ship from the run's identity card, and it is what decides which controls the page draws.
Log
Session record
off — nothing is recorded, nothing leaves this browser
Off by default, and nothing is sent anywhere either way. Turned on, every command, goal, pose, shove, demonstration and net or ground change you make is kept in this tab's memory, stamped with the net's identity (id, campaign, checkpoint) and the sim clock. The only way out is the download button: no upload, no cookie, no storage, and closing the tab discards it. It is the seam for a consented data path (docs/research-agenda.md §8) that does not exist yet; a ● rec pill sits in the bar while it is on.
Help
Showcase. Touch nothing for 25 seconds and the page plays every demonstration in turn, looping, captioned. The first click, key or drag stops it. The button in the bar starts and stops it by hand.
Demonstrations. Declarative records in web/src/demos.js: a net, a ground and a timeline of intents. tests/capability.mjs checks each one against the manifest and against the net's capability record, so a demo cannot command something its net was not trained to answer, and tests/demos.mjs drives all of them on the real plant.
Capability gating. Each manifest entry carries a capabilities block derived from the run's identity card: whether the twist command was ever non-zero in training and over what range, which poses the goal block indexes, which anomaly profile was in the curriculum, and which ground. The Drive and Commanded-pose controls exist only when that record says the net can answer them.
Speeds. Both units are the eval's: metres per second, and body lengths per second over the stand stance's 0.4893 m foot-to-foot diameter (evaluate.py STANCE_DIAMETER_M).
Who drives. Policy runs the trained ONNX. Gait is the scripted tripod (kits/gait.py) with a hub-height and attitude regulator — at the servo's honest 1.9 N·m ceiling it no longer walks. Puppet lets you drag a foot: grab the ring drawn on a foot and that leg's IK tracks the ghost.
Ground. Six worlds from mjlab_stumblebug/scenario.py: the flat plane, plus rough, rocks, steps, gaps and mixed. A ground the loaded net did not train on stays selectable — the contrast is the point — and the HUD says so.
Shove. Push on the robot. Put a pointer on the body and drag: the arrow is where it will go, how far you drag is how hard, and letting go fires it. The direction is taken onto the ground through the camera's own azimuth, so it means what it looks like whatever way you have orbited the view, and the magnitude can only scale anomaly.py's own range down, never past it. The dial at the bottom right is the same gesture for a keyboard: arrow keys aim, Enter fires. With no aim at all the direction is sampled the way the training term samples it. push is the velocity task's ±0.3 m/s planar kick, shove the measured 6-DoF one (±25 rad/s roll/pitch, which tips this body about one time in three), tumble and invert drop it from clear of its own reach. Every magnitude is mjlab_stumblebug/anomaly.py's.
Keys. ↑↓←→ drive · QE turn · Space stop · M mode · T policy slot · P pause · R reset · C camera follow · ZXBV disturb · 1–9FSI poses · [ deck · ? this drawer. Drag the view to orbit, wheel to zoom.