---
name: Server-authoritative architecture Phase 1
description: WSEnvelope protocol, server-owned movement system, combat push via WS, RoadGraph, hero lifecycle on connect/disconnect
type: project
---

Phase 1 of server-authoritative architecture implemented 2026-03-27.

**Why:** Frontend becomes a pure renderer; all game logic (movement, combat, encounters) is owned by the backend to prevent cheating and enable consistent simulation.

**How to apply:**
- All WS messages use `model.WSEnvelope` (type + json.RawMessage payload). Both server->client and client->server.
- `game.MessageSender` interface decouples engine from handler (avoids import cycle game<->handler).
- Engine now has 3 tickers: combat (100ms), movement (500ms/2Hz), position sync (10s).
- `game.HeroMovement` tracks per-hero walking state; created on WS connect, destroyed on disconnect.
- `game.RoadGraph` loaded from DB at startup; towns connected in linear chain with waypoints.
- Client commands (activate_buff, use_potion, revive) routed from hub.Incoming -> engine.IncomingCh.
- Hub has OnConnect/OnDisconnect callbacks wired in main.go.
- Migration 000013: hero movement columns + roads + road_waypoints tables.
- Offline simulator does NOT touch position/movement fields (per spec risk section 6).
