- is_read and read_at columns are now obsolete since notification_reads tracks per-user read receipts - Removed UPDATE statements in markAsRead/markAllAsRead that touched the old columns - API response still includes computed is_read field via SQL CASE in getForUser() JOIN with notification_reads, maintaining Android compatibility - Migration 009 drops both columns