Three root causes fixed:
- Room Flow observer overwrote deduplicated list during loadMoreHistory()
→ Added isLoadingHistory flag to suppress Flow updates while loading
- beforeId used local IDs (user_/asst_ prefix) that server couldn't resolve,
causing server to return ALL messages → Find oldest server-UUID message as cursor
- Scroll-to-top LaunchedEffect could double-fire → Added 800ms throttle
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>