Challenge 1: Scroll Position Preservation

The RG40XX-V d-pad/joystick scrolls by message index (self.selected). When new messages append, the index of existing messages doesn’t change, but the visual scroll offset (self.scroll_offset) may need recalculation. If the user is scrolled up, inserting/appending messages should not shift their view unexpectedly.

Need: A clear definition of “user is at the bottom” — is it selected == len(messages) - 1? Or is it scroll_offset + msg_area_h >= total_msg_h - bubble_h? The former is simpler but less robust.

Challenge 2: The “New Messages” Indicator

On a 640×480 screen, space is limited. A pill/badge must be small but readable. It needs to: - Not overlap with message bubbles - Not be confused with a message bubble - Be dismissible via gamepad - Show a count (e.g., “3 new”) or just an arrow