Tenant isolation
Isolation is implemented in the data layer, not in the view layer.
- Every business table carries a tenant id, first in every index and unique key.
- Access goes through a wrapper that injects the tenant id into every read and write.
- An automated lint fails if a business module touches the database directly.
- Every lookup by id passes through that wrapper, so reaching another business resource returns 404.