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>