session.caller was reading name/voice from CALLER_BASES randomized defaults instead of the slim bg dict — causing Silas to appear as "Earl" with wrong voice. Now prefers bg data when populated. Also: avatar endpoint infers gender from voice pool, /api/callers returns bg name, regulars get canonical voice force-locked, batch gen splits into two parallel calls with pre-warm so subsequent resets are instant. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>