Tenant isolation belongs in the database, not in the application.
Every table carries a required tenant id and every policy checks it against the claim on the JWT. The audit log is append-only, no update or delete permission is granted to anyone. The point is the failure mode: with isolation in application code, one missing `where` clause in one handler leaks another business's data. With row-level security, that same bug returns an empty set. Multi-tenancy is the one place where being paranoid at the lowest layer is cheaper than being careful at every higher one.