Your recently viewed sidebar can keep naming records you lost access to
Most apps keep a "recently viewed" list as user_id + record_id rows, updated on every open. The sidebar endpoint often loads those IDs and returns titles without running the same read check the detail page uses.
Sam opens twelve deals over a morning. After lunch a role change drops three of them. The sidebar still shows all twelve, because it only joins Sam's recent rows and never asks whether Sam can still read each deal.
When you build the recent list, filter with the current viewer's read check after the join. Drop IDs that fail. If you cache recent titles, key the cache by viewer permissions, or recheck on read. Don't treat "they opened it once" as lasting access.
Quick test: open five records as a limited user, revoke two, reload the app. If the revoked ones still appear in Recently viewed (or open from that list), the recent query skipped the check.
