When a chat-message event fires, showTimmySpeech() creates a canvas
sprite near Timmy's avatar position (above the platform centre).
The bubble fades in over 0.35 s, holds for ~4 s, then fades out over
0.7 s (5 s total). Only the latest message is shown — any existing
bubble is immediately replaced. Uses the same canvas-sprite pattern as
commit banners and agent panels.
Fixes#205
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>