Severity: CRITICAL · Source: docs/backend-contract-bug-audit.md (finding #2)
frontend/src/components/screens/Social.tsx:142-159,422 · backend/routes/social.py:335,356
room_messages.text is column-encrypted at rest; only the REST read paths decrypt it. The RoomChat realtime subscription stores { ...row } and renders payload.new.text directly, so messages from other users (which arrive only via realtime) display as unreadable ciphertext until a manual reload. The UPDATE handler has the same defect for edits.
Fix
Treat realtime as a "something changed" signal — re-fetch affected messages through the decrypting REST endpoint (or always source text from the API) rather than trusting payload.new.text.
Likely a root cause of #85 (Social page doesn't work).
Severity: CRITICAL · Source:
docs/backend-contract-bug-audit.md(finding #2)frontend/src/components/screens/Social.tsx:142-159,422·backend/routes/social.py:335,356room_messages.textis column-encrypted at rest; only the REST read paths decrypt it. The RoomChat realtime subscription stores{ ...row }and renderspayload.new.textdirectly, so messages from other users (which arrive only via realtime) display as unreadable ciphertext until a manual reload. The UPDATE handler has the same defect for edits.Fix
Treat realtime as a "something changed" signal — re-fetch affected messages through the decrypting REST endpoint (or always source text from the API) rather than trusting
payload.new.text.Likely a root cause of #85 (Social page doesn't work).