Arc lengthPaths walk at a steady speed
A* on the bay grid gives tile centres. Corners are rounded by Chaikin cutting, then the path is indexed by distance so speed never depends on how many points a segment has. A trapezoid profile ramps speed in and out over 0.35 s.
T = L / v + t_ramp
s(u) = v̂u²/2a u < a
= v̂(u − a/2) a ≤ u ≤ 1−a
Reach budgetLift with the legs
For each pick or place the compiler searches hip hinge and knee crouch together, scoring how far the shoulder ends from a comfortable reach. Crouching costs more than hinging, but a deep hinge costs more than both, so low shelves get a squat and benches get a bow.
cost = 10·(|S(θ,c) − T| − 0.8·arm)²
+ 0.35·θ + 0.9·c + 2·max(0, θ − 0.7)²
Gaze hierarchyEyes lead, spine follows
The head chases its look target through a fast, lightly damped spring with r above 1. The torso yaw follows the path tangent through a slower one. The lag between them reads as intent: the figure looks at the press before it turns to walk there.
head: f 3.5 Hz, ζ 0.4, r 1.5
body: f 2.2 Hz, ζ 0.6, r 0.5
hands: f 3.6 Hz, ζ 0.75, r 0
Counter-rotationArms swing against legs
The pelvis yaws toward the leading leg and the shoulders turn the other way. Each hand swings opposite the same-side foot, scaled by that foot's forward offset from the pelvis. There is no arm-swing curve anywhere; it comes out of where the feet are.
pelvis_yaw = 0.18 · (f_R − f_L) / stride
hand_fwd = −0.3 · f_side
Discrete eventsThe timeline is a simulation
Cellcode is compiled by running it. Each figure has a program counter. A step either runs, taking time, or blocks on a station lock, an empty shelf, a full bench or a signal. Every state change wakes the blocked figures in first-come order. Blocked time becomes the dashed clips on the timeline.
pick blocks until item ∧ ¬locked
place blocks until count + incoming < capacity
wait consumes one signal token
Deterministic replayScrub anywhere
Machine cycle jitter comes from a seeded generator, so the same source always compiles to the same timeline. The rig steps at a fixed 120 Hz and snapshots its state every second. Scrubbing restores the nearest snapshot and simulates forward, so a pose at 42.3 s is the same whether you played or jumped there.
x ← x + 0x6D2B79F5 (mulberry32)
h = 1/120 s, snapshot every 1.0 s