# Authored Source push volumes

Mesa contains a continuous `trigger_push`, flags 1, speed 3500, direction +Y, bounds (-384,-4352,-12288) to (384,-3328,-11808). Its compiled brush hull is imported with the map. This is authored map behavior, not a surf assist or a velocity boost added to compensate for geometry.

Valve's [trigger implementation](https://github.com/ValveSoftware/source-sdk-2013/blob/b8cfb12c0e083a2ef5b2f9f9b50f3902fa034474/src/game/server/triggers.cpp) sets base velocity during continuous touching. Overlapping continuous pushes add. Positive vertical pushes release ground and raise the origin one unit. Flags 1 allows players; flags 128 is a different, one-shot mode. The present helper supports continuous player pushes; it does not emulate one-shot entity deletion or arbitrary entity I/O.

The server's [CheckMovingGround](https://github.com/ValveSoftware/source-sdk-2013/blob/b8cfb12c0e083a2ef5b2f9f9b50f3902fa034474/src/game/server/player_command.cpp) converts unrefreshed base velocity into player momentum before movement, using `previousBase * (1 + tickInterval/2)`, then clears it. In [shared player movement](https://github.com/ValveSoftware/source-sdk-2013/blob/b8cfb12c0e083a2ef5b2f9f9b50f3902fa034474/src/game/shared/gamemovement.cpp), StartGravity consumes vertical base velocity as a force. AirMove adds horizontal base velocity after air acceleration, sweeps collisions with the combined velocity, and subtracts it before categorization/final gravity. The non-player `PhysicsAddGravityMove` path is not a replacement for these player rules.

`prepareMapPush` returns optional base velocity and retains the previous horizontal component in optional player state. Save/restore and replay initial states consequently retain exit momentum correctly. Maps without pushes leave that field absent and use exactly the previous movement path. The movement core receives an optional third argument; it neither changes the authoritative tick interval nor runs extra acceleration ticks.

Independent evidence comes from the [public native KSF Mesa replay](https://ksf.surf/replays/surf_mesa_fixed/replay_css_1777_0_576582_1775395546.rec), decoded in `fixtures/mesa-ksf-telemetry.json`. At tick 3058 the player travels about 104.334 Y units, consistent with `(storedVelocityY + 3500)*0.015`; stored player velocity remains about 3455.614, so directly adding 3500 to the stored velocity is wrong. Push displacement continues through 3067. On exit 3068, inherited momentum is limited before acceleration. Subsequent stored Y velocity clamps to 3500. That cap is an observed Mesa/reference-map setting; Boreas's 5000 profile remains unchanged.

`tests/map-push.test.ts` passes seven tests, including independent one-step replay comparisons for every state 3055→3070 against actual Mesa geometry. Predeclared tolerances remain .002 Source units and .002 u/s: maximum position error .001137880, maximum velocity error .000222171, first out-of-tolerance tick none. Analytical fixtures additionally verify acceleration order, wall sweeps, vertical force/ground release, one-time exit momentum and absent-map state identity. These comparisons establish the tested push transition; native contact flags, the complete entity touch queue, arbitrary filters, moving conveyors and skipped-over thin push volumes remain outside this implementation's verified scope.

After adding the optional movement argument, all 27 focused Boreas/playability/revision/laboratory checks pass, including both full-course command witnesses and identical 30/60/144/240 FPS states. No source implementation was copied into runtime code.
