Extract _build_world_state() logic from dashboard/routes/world.py into
a standalone serialize_presence() function in infrastructure/presence.py.
This allows the WebSocket gateway and other consumers to reuse the
ADR-023 presence-to-world-state transformation without importing the
dashboard route module.
- New: src/infrastructure/presence.py with serialize_presence()
- Updated: world.py delegates to serialize_presence()
- New: tests/unit/test_presence.py with round-trip and edge-case tests
Fixes#668
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>