A mimicry duel. The rival marionette dances a choreography you have never seen — half a dozen string pulls over five seconds — and then you have to reproduce the inputs from what you saw the puppet do. Watch, recall, and then both figures dance at once so you can see where you went wrong.
The game only works if the map from input to motion is legible, and legibility is two properties that pull against each other:
| property | why it is needed |
|---|---|
| repeatable | the same strings must give the same dance, or "that move means Q" is not something a player can learn |
| separable | different strings must give a visibly different dance, or you are guessing and the score is noise |
A free ragdoll fails both. It is chaotic, so the same input twice does not look the same, and once it is thrashing every input looks like every other one. A marionette passes both, and that is the whole reason it is a marionette: strings make the motion bounded and restoring. Pull and the limb rises along a path it always takes; let go and gravity brings it back the same way.
That is not asserted. The selftest measures it:
| measurement | result |
|---|---|
| same choreography danced twice | pose distance 0.000 — bit-identical |
| closest pair of different choreographies | 0.229 of a figure apart |
| …at maximum erraticness | 0.154 — still plainly different |
Neither property on its own is enough. The real question is whether motion distance tracks input distance — if you press 90% of the right strings, does it look 90% right? If not, partial credit means nothing and a player can never tell how close they were.
Corrupting a choreography by degrees and measuring both:
| corruption | input match | how different it looks |
|---|---|---|
| none | 1.000 | 0.000 |
| 0.15 | 0.970 | 0.012 |
| 0.30 | 0.692 | 0.096 |
| 0.50 | 0.507 | 0.162 |
| 1.00 | 0.290 | 0.237 |
Correlation across all of them: r = −0.950. Looking right really does track being right.
Temporal intersection-over-union per string, averaged over the four. IoU is the right shape because it charges for both errors in the same currency: pulling a string you should not have grows the union, and holding one for the wrong length shrinks the intersection.
| what you play | scores |
|---|---|
| an exact copy | 1.000 |
| a uniform 0.18 s lag | 0.953 — reaction time is not the skill being tested |
| right rhythm, wrong strings | 0.154 |
| right strings and moments, a third of the length | 0.299 — duration is part of the answer |
| holding all four down the whole time | 0.246 |
| nothing at all | 0.000 |
It is scored at the best single global shift within a quarter-second — one shift for all four strings, not one each, because letting each slide independently would forgive an ordering error, which is exactly the error worth catching.
| erratic | moves | each held | two-plus strings at once |
|---|---|---|---|
| 0% | 5.0 | 0.80 s | 5% |
| 50% | 8.6 | 0.55 s | 17% |
| 100% | 12.0 | 0.31 s | 27% |
More to remember, shorter pulls that read as flicks rather than poses, and far more overlap. The third is the one that bites: two strings pulled together make the body lean and lift in a way neither does alone, so a compound shape has to be decomposed rather than just seen. It is also where separability was most at risk, which is why the test checks the hard end separately — cranking the slider has to make the dance harder to remember, not harder to see.
The strings brighten and go taut when their key is down. That makes the watch phase easier than pure mimicry would be, and it is a real cost, taken knowingly: a player who cannot see the strings is not reading a puppet, they are decoding a cipher. Everything else on screen is drawn straight from the physics — no limb is nudged for looks.
All of it. Unlike /armline/, whose arm is a real AR4 transcribed from its URDF, nothing here is a measurement of anything — the limb masses, the string tensions, the coupling between the strings and the body are chosen to make a legible puppet, not to model one. The claim is not that this is how a marionette behaves; it is that this one is repeatable and separable enough to play, and that claim is tested.
Same four keys as /qwop/, /graze/, /qgol/, /griddle/, /armline/ and /pong/. Rendering is three.js r169 (MIT), vendored — no CDN, nothing fetched at runtime.