Permissions are a data model problem, not a UI problem
Hiding a button is not a permission. If the underlying route still returns the data, anyone with the browser console can read it. Real permissions are enforced where the data lives, which in practice means row-level policies in Postgres or an authorisation check on every server action. Retrofitting this onto an application that assumed everyone sees everything is close to a rewrite, which is why we model roles before screens.