RLS works on rows, not columns. "You may update this row" means every column in it. Two ways to fix it, pick one:
1. Column privileges (smallest change):
revoke update on public.profiles from authenticated;
grant update (display_name, avatar_url) on public.profiles to authenticated;Now an update that touches credits or is_admin fails with permission denied for table profiles, even though the RLS policy passes. Keep your policy, and add with check ((select auth.uid()) = id) so nobody can move a row to another id.
2. Move the sensitive columns out (cleaner long term): profiles for what users edit, and a separate accounts or user_roles table with credits and admin flags that has a select policy only. Credits change only through a security definer function or your payment webhook with the service role.
For credits I'd do option 2: you'll want a ledger of purchases and usage anyway, not just a number anyone can overwrite.