The Whole Simulation Moved to 125Hz
Three layers, deterministic ticks, server authority with client prediction, MessagePack over WebTransport — and reconciliation error that went to zero.
The Architecture
Simulation -> Network -> GameDeterministic fixed-timestep 125Hz, Copy-on-Write WorldState, branded types in BrandedTypes.ts. A multi-rate tick system: FPS at 125Hz, RTS at 30Hz, configurable, benchmarked at 64 players and 22,000+ ticks/sec.
The Netcode
Server-authoritative with client prediction, input buffering and acknowledgement, MessagePack binary serialization, delta compression, snapshot interpolation, WebTransport (QUIC over UDP), a drift-compensated tick loop, frame-synchronised reconciliation and an input queue. Lag compensation with a history buffer.
CLI: npm run net:server, server:tick, server:bench, fuzz testing and deterministic replay.
The Number On The Release
Reconciliation error: 0.0 units (was 24-40 units)And the reason it was 24-40 units: spawn point Y-offset was wrong, and the collision world was not being injected into the client predictor.
Breaking Changes
- New binary network protocol.
- Fixed 125Hz simulation.
- WebTransport replaces WebSocket.
AdvancedCharacterControllerremoved.
Physics
Q3 ground plane clipping before stepSlideMove; wall-climb prevention removed from slideMove; clip-plane thresholds 0 instead of 0.1; walljump ground clearance traced from feet level. Dev bar on developer 1 showing FPS, PING, SPEED and POS. AGENTS.md renamed from CLAUDE.md.
Known Issues
- LightGrid dimension mismatch warnings on some FBSP maps.
- Debug logging is verbose (will be reduced for release).