encode_startup_message() now accepts optional CharacterVisualDescriptor as third param, serialized via to_dict(). sim_bridge passes the descriptor from GameState on new game start. apply_snapshot() restores descriptor from server snapshot on save/load cycle. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>