why is the jump not replicated by default? Or is it?

You don’t necessarily need to call StopJumping() in the game, and in my code I don’t call it. ResetJumpState() is already called when the movement mode is changed, which occurs when the character lands and the player isn’t pressing the jump button.

Looking into it a bit further, Kaidoom mentioned bWantsToJump, which doesn’t exist, but I think they meant bPressedJump which seems to be replicated. See UpdateFromCompressedFlags() and ClientUpdatePositionAfterServerUpdate().

On a side note, the movement class is 13395 lines of code, which is disgusting, and makes it hard to follow the logic. Epic should really refactor that junk.