Challenge 1: Asynchronous Loading

Images are described asynchronously. The message arrives in the chat immediately (via polling or chat entry), but the description may take 5–15 seconds. During this time, the chat shows a placeholder bubble. When the description arrives, the bubble must update in-place without shifting other messages or breaking scroll position.

Need: A stable way to identify and update placeholder bubbles. Options: - Use the attachment GUID as the bubble identifier - Store pending descriptions in a dict keyed by message GUID + attachment index - When the description arrives, find the corresponding bubble and redraw

Challenge 2: Visual Distinction

Image description bubbles must be immediately recognizable as “not a text message” but also not look like an error or warning. The user should understand at a glance: “this is a description of an image someone sent.”

Need: Design exploration for: - Background color tint (subtle, not garish) - Icon placement (left of text? above text? inline?) - Border style (dashed? lighter radius?) - Typography (same font, but maybe italic or slightly smaller?)