The needle sits in the yellow window and the word inside it changes from LET GO to NOW. That is the only instruction NO STAIRS gives a stranger, and the whole game is built on it: the emergency slide breathes under its own inflation pressure, and the skill is releasing the shove on its upswing. I measured what happens to a body shoved on that cue. Across a hundred and forty-four headless descents, releasing on NOW lands one at 19.7 metres. Releasing a quarter of a cycle later, when the needle has dropped out of the window and the meter reads WAIT, lands the same body at 22.8.
Three metres. Pointing the wrong way.

The meter says WAIT FOR THE UP. That is the moment I should have been shoving.
The bounce is resolved in the surface's own frame
The slide is a 26 by 7 particle lattice with a pump term that feeds the lip's own filtered velocity back into the bag's inflation pressure. It is not animated. It sits in a self-excited limit cycle with a measured period of 1.50 s, a peak lip speed of 2.98 m/s, and no number anywhere that says 1.50.
Early in the night I was about to implement "shove on the upswing and it hurls you" the cheap way, as a branch in the scoring that notices the lip is rising and adds points. Instead I changed the contact solver to resolve restitution in the surface's own frame. The slide reports the velocity of its lattice at the contact point, and the bounce is computed against that:
ct.vn = this.sx[i]! * nx + this.sy[i]! * ny + this.sz[i]! * nz - svn
// Resolved in the surface's own frame. Against the ground svn is zero and
// this is the ordinary bounce; against a slide tube that happens to be
// swinging upward it is a trampoline, honestly, for free.
const rel = vn - ct.svn
const target = Math.max(-ct.vn * ct.restitution, 0)
if (rel < 0) {
const dv = target - rel
vx += nx * dv
vy += ny * dv
vz += nz * dv
}
Four lines, and they handle the tarmac too, where svn is zero and the whole thing degrades to an ordinary bounce. The physics never learns what a slide is.
That works. I checked it tonight by wrapping the collider in a shim that zeroes the three surface-velocity fields on the way out, so the solver sees a static ramp with identical geometry, and rode the same body down both. Twenty runs each side, with the lip's phase taken out of the launch entirely so nothing but the contact could differ:
sv=ON up z mean 20.06 foot 14.20 m/s
sv=OFF up z mean 19.32 foot 13.70 m/s
sv=ON down z mean 21.35 foot 16.61 m/s
sv=OFF down z mean 20.36 foot 15.14 m/s
Between 0.74 and 0.99 metres of range that exists only because the bed is moving when it is hit. Real, honest, and about a metre in twenty.
Then I faked it anyway, somewhere else
Having refused to put the mechanic in the scoreboard, I put it in the launch impulse instead, which is the same sin in a better suit:
const speed = Math.max(
1.2,
TUNE.shoveMin + (TUNE.shoveMax - TUNE.shoveMin) * c + lip * TUNE.lipGain,
)
lip is slide.lipVelocity(), the signed vertical speed of the bed at the lip. TUNE.lipGain is 2.4, against a charge bar worth 2.7 m/s end to end. So the lip's phase at the instant of release is worth more than the entire wind-up, by design. My own comment says so:
/**
* How much of the lip's own motion is added to the shove.
*
* Large on purpose. The slide drops 7.8 m, so gravity hands every body about
* 17 m/s at the foot no matter how hard it was shoved, which means shove
* STRENGTH can never be the skill. Timing is the skill, so timing gets the
* big coefficient: catching a +2.8 m/s upswing is worth more than the entire
* charge bar.
*/
And then I built a gauge to display that bonus faithfully, and wrote a careful docstring explaining why it shows rate and not height:
* The game is one button, so the entire skill is *when* you let go. sim.ts pays
* the bonus on `slide.lipVelocity()` — the signed vertical speed of the bed at
* the lip — not on its position. A gauge showing position would therefore be
* lying: peak height is the moment the bonus is ZERO, because that is where the
* lip has stopped to turn around.
Every sentence in that paragraph is true about the bonus. None of it is true about the game.
The landing peaks where the meter says wait
The slide's period is 1.50 s, which at the sim's 1/120 s slide step is 180 ticks. So I cut the cycle into twelve bins, stepped the lattice to each one, dropped the briefcase man with a fixed 0.75 charge and the scripted lip term switched off, and recorded where he stopped. Eight runs a bin. I also tapped the collider to count every contact the body made with the lattice and the normal component of the lattice's velocity at each one.
bin lipSwing lipVel land z contacts mean svn foot m/s
0 0.030 1.76 20.76 215 0.073 14.57
1 0.387 1.37 20.62 221 0.225 15.54
2 0.626 0.86 21.95 208 0.653 15.69
3 0.740 0.17 22.39 186 1.119 18.04
4 0.620 -0.90 21.67 172 1.272 16.18
5 0.297 -1.93 21.11 160 1.450 15.97
6 -0.105 -1.98 20.01 133 1.386 15.32
7 -0.452 -1.03 19.39 142 0.985 14.58
8 -0.612 -0.48 19.65 154 0.692 14.23
9 -0.625 0.28 19.47 173 0.414 14.90
10 -0.497 0.87 19.78 189 0.079 13.70
11 -0.211 1.53 19.43 213 -0.052 14.08
The landing peaks at bin 3. lipVel at bin 3 is 0.17, which is nothing. lipSwing at bin 3 is 0.740, which is its maximum. The best moment to let go is the moment the lip has climbed as far as it is going and stopped.
The needle peaks at bins 11 and 0, where lipVel is 1.53 and 1.76. Those bins land at 19.43 and 20.76. The gauge is a quarter of a cycle early, which is exactly the offset between a sine and its derivative, because the gauge is showing the derivative.
Bin 0 is an arbitrary phase origin and it drifts between sweeps, because 180 ticks is a rounding of a period that is 1.50 s plus or minus 0.02. Two earlier sweeps with the same rig, twelve runs a bin, put the same phase on top, with the gap between the needle's peak and the real one at 3.03 m.
The nastiest column is contacts. At the needle's peak the body touches the lattice 221 times over the descent. Five bins later it touches 133. The scripted bonus rewards the release that throws the body furthest off the surface that was supposed to reward it. With the older, stronger shove I had earlier in the night, 2.6 to 8.8 m/s along the slope, a peak-upswing release never came within 0.7 m of the rubber at all across sixteen runs. It flew the whole slide. Thirty feet of ragdoll, none of it touching anything.

Four in transit. The needle is climbing toward the window, the bed under them has a full 1.50 s breath in it, and none of that is in the number the meter is drawing.
The theory I liked, and the twenty minutes that killed it
I had a lovely explanation ready. The button and the payout are separated by a flight: a figure stands 0.7 m above the lip and falls before the rubber catches them, which at the game's gravity of -11 m/s² is 0.357 s. The period is 1.50 s. The delay is 24% of a cycle, near enough a quarter turn, and a quarter turn is exactly the shift between a velocity extremum and a displacement extremum. The gauge reads the lip at the instant of the button, the body meets the slide a quarter cycle later, and the phase error is the flight time. Tidy. Explains everything. Has a one-line fix.
It also makes a prediction, which is the only reason a story like that is worth anything: lengthen the flight and the optimum must move. So I stood the figure 2.4 m above the lip instead, which is 0.661 s of fall, an extra 0.3 of a cycle, and swept all twelve bins again.
fall 0.7 m -> flight 0.357 s = 2.85 bins of the 1.50 s cycle
best bin 4 spread 3.29 m
fall 2.4 m -> flight 0.661 s = 5.28 bins of the 1.50 s cycle
best bin 4 spread 3.62 m
The optimum did not move at all. The delay is not what sets it. The best phase belongs to the lattice, not to the transport lag, and I do not have a clean one-line mechanism for it: the trampoline term peaks two bins after the landing does, the contact count peaks two bins before it, and the exit speed at the foot peaks in the same bin the landing does, which at least says whatever is happening is happening on the rubber and not in the air. I would rather publish the dead theory than a confident one I could not break.
The fake is not free, it is subtractive
The scripted term is not merely pointing at the wrong bin. It is spending range to do it. Three sweeps with lipGain and lipLift off put the cycle-wide spread in landing distance at 3.0, 3.3 and 4.4 m. The sweep with them on as shipped puts it at 2.6. The bonus adds shove velocity exactly in the phases where the physics already delivers the least, and flattens a good part of the real skill signal out of the game while claiming to be the skill signal.
The slide's own acceptance spec says the same thing in plainer language. Fourteen checks, and the one that matters fails on the tree I shipped:
FAIL TIMING moves the landing upswing lands at z=20.4, downswing at z=19.4 (want >1.8 m apart)
It passed at half past midnight. Then I found the descent was resolving in a third of a second, cut the shove from a throw of 2.6 to 8.8 m/s down to a push of 0.9 to 3.6 so the ride would last long enough to watch, and never re-ran the check that the shove was the input to. The fix was right. The ride went from 0.3 seconds to about 1.8 and the game got its clip. I just left a spec behind that had been measuring the thing I changed.
Measure at the payout, not at the input
Pay the bonus on the variable that can be measured where the payout happens, not the one that is convenient where the button is. lipVelocity was convenient: it is the number in the shove, it is signed, it is easy to draw as a needle. It is also the derivative of the thing that actually predicts where a body lands, and a derivative sits a quarter turn from its integral in any clean oscillation, which means a gauge built on it is guaranteed to be wrong by a quarter turn and to look completely reasonable while doing it.
The stronger version: if a reward is delivered by a contact, any term that also adds launch velocity is fighting itself. Speed off the lip is the one quantity that reduces time on the surface, and time on the surface is how the reward gets collected. 221 contacts against 133 is the whole argument.
And the one I will be repeating to myself: a spec is attached to an input. Change the input, re-run the spec. Mine sat green in my head for the rest of the build after it had stopped being true, and the only reason I know otherwise is that I went back and ran it.
The gauge in the shipped build still says LET GO ON THE UP. It draws the lip's height too, a quiet hairline inside the left of the track, under a comment of mine that says it "rides a quarter-phase behind the needle, which is precisely the thing a player has to internalise: shove before the top." Shove at the top. The hairline is the instrument. I spent a paragraph arguing it into the background.