Let go of the handrail and you are a closed system. There is nothing to push against, no reaction wheel in the backpack, and — if you let go cleanly — exactly zero angular momentum. Angular momentum is conserved, so it stays zero no matter what you do with your arms.
The obvious conclusion is that you are stuck facing whichever way you were facing. The obvious conclusion is wrong, and the reason it is wrong is the whole mechanic.
Zero momentum is not zero rotation
Conservation pins a rate, not an angle. Writing the system’s angular momentum
about its own centre of mass, in one plane, with the trunk at angle th and
the arms at shoulder angle ph and extension r:
L = I(ph, r)·th' + Aph(ph, r)·ph' + Ar(ph, r)·r'
Set L = 0 and the trunk’s rate is whatever the arms’ rates make it:
th' = −( Aph·ph' + Ar·r' ) / I
Integrate that and th is a path integral over arm shapes. Not a function
of where your arms are — a function of the route they took to get there. Move
the arms out and back along the same route and the integral cancels term for
term. Move them out along one route and back along another, and it does not.
The mechanic is that second sentence, and the suit is built to make it the only thing you can think about.
What the suit actually is
src/no-torque.mjs is two rigid bodies on a revolute joint: trunk, head and
legs lumped as one (70.2 kg, 11.5 kg·m² about its own centre of mass), and both
arms lumped as the other (7.8 kg, hinged at a shoulder 0.49 m up the trunk from
its centre of mass). The limb is a real two-segment arm — 0.33 m of upper arm,
0.42 m to the centre of the glove — so folding the elbow does two separate
things at once: it pulls the limb’s centre of mass from 0.313 m to 0.163 m off
the shoulder, and it drops the limb’s own inertia from 0.366 to 0.123 kg·m².
Segment masses and centroids are the standard tables evaluated for a 78 kg,
1.75 m body, not invented.
The shoulder stops at −60° and +190°, which matters more than it sounds. A shoulder that could spin all the way round would be a crank: one full revolution with the elbows locked is worth 24.8° of heading, no cleverness required. Anatomy forbids it. You get 250° of travel and then you have to come back, and coming back is where the entire problem lives.
The four numbers
Out and back, elbows locked: 0.000°. Not approximately. The path in shape space is retraced, the integral cancels, and the suit returns to the heading it started on. The demo will let you spend 1440° of shoulder on this and the heading readout will not move — and then tell you so.
Out extended, back folded: 10.59° per cycle. Same 500° of shoulder travel,
same two joints, same amount of effort. The difference is that the route out
and the route back are different routes, so the loop encloses area in the
(ph, r) plane, and the heading gained is that area. A 2.1% gear ratio: 8.5
cycles for 90°, 3.08 s a cycle at honest joint rates, so 26 seconds.
Fold all the way or not at all. Half a fold is not half the gain — it is 3.07° instead of 10.59°, because the area you enclose falls off much faster than the time you save. 71% of the payout to save 16% of the clock. The intuition that a partial version of a good move is a partial good move is exactly the thing this geometry punishes.
A thrown tool: 2.98 kg·m²/s. 1.2 kg at 4 m/s on a 0.62 m moment arm, and
suddenly you are not a zero-momentum system any more. You turn at about 14°/s,
four times faster than any gesture — and you keep turning, because L is now a
number you own. The suit carries two tools, which is the joke: the second one,
thrown the other way, is the only brake you have. Watch the rate while you
spin, too. L is fixed but I is not, and your own shape swings it between
12.09 and 16.39 kg·m², so the same momentum reads anywhere from 10.4 to
14.1°/s depending on where your arms happen to be.
Playing it
You are drifting at an airlock with a handrail on it, closing at about 0.18 m/s, and you have to be pointing the right way when you arrive — within 12°, and turning slower than 3°/s, or your hand does not stay on the rail. The clock is the drift, which is diegetic and cannot be paused.
Drag the glove. The pointer is your hand: the arm tracks toward it at a
real shoulder rate, so the gesture you draw on screen is literally the loop in
shape space, and the inset at bottom-left draws that loop back at you with its
enclosed area shaded. Circling the glove concentrically around your own
shoulder, which is the first thing everyone tries, holds r constant and
therefore encloses nothing — the arm just rattles between its stops. Keyboard
works too: arrows for shoulder and elbow, Q/E to throw a tool.
Five approaches, including a pressurised suit at half joint rate (the gear ratio is unchanged; only the clock gets worse) and one that asks for 155° in 20 s, which no gesture can do.
Things worth knowing if you reuse this
- The module has no renderer.
Floater.step(dt, cmd)takes commanded joint targets or rates and returns the trunk’s rate; everything else is a readout. holonomy(loop)walks a closed path in shape space and reports the net rotation, which is how all the numbers above were produced rather than asserted.strategies()returns the three headline cases.- The figure visibly recoils when the arms swing. That is not an animation
flourish — the system’s centre of mass is pinned at the origin, so the body
has to translate to keep it there, and
pose()in the demo solves for that rather than drawing the trunk at a fixed point. - The one-plane, both-arms-as-one-limb reduction is the real simplification here. A diver’s actual twist-from-nothing is three-dimensional and uses the coupling between somersault and twist, which a planar model cannot show. What the planar model does show honestly is the part that generalises: rotation is the holonomy of a loop in shape space, and the size of the loop is not what pays — the area is.


