b42362e041
Two bugs caused accessories to render independently of their NPC: 1. spawnEntities ran concurrently with state updates, allowing duplicate sprites to be created for the same entity. The orphaned sprite would animate in place but never move. Fixed by deferring onStateUpdate registration until initial spawn completes. 2. CharacterCompositor tracked load intent (Set) rather than load completion (Promise), so concurrent preloads could composite before shared textures finished loading — producing sprites with missing skin layers. Fixed by using a Map<string, Promise> so concurrent callers await the same per-file load promise. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>