Launcher protocol v1
Unity and HTML5 use the same wire envelope.
Envelope
Required: msg, seq, session_id, ts_monotonic_ms and body. Sequence and time are integers. Monotonic time cannot be compared to Date.now or another process's clock. session_id matches the launch. Extra fields create no new guarantees.
Game → Launcher
client.hello; game.ready; heartbeat; score.update; game.log; session.complete; led.trigger; led.override.set; led.override.clear. First send client.hello with session_token, game_id, game_version and sdk_version.
Launcher → game
server.hello; session.start; session.pause; session.resume; session.stop; heartbeat; device.state; target.hit. Accepted hello contains accepted=true and capabilities. target.hit uses x_mm/y_mm; the JS library, not the wire transport, adds nx/ny.
Not defined
No game.pause, self-authorized resume, license mutation, result ACK or interrupted-session recovery. Never extend the wire contract unilaterally.