Tenancy is enforced below the API
The firm sits on every row and is applied in the layer that builds the query, not in the handlers. That gives scoping exactly one place it can be forgotten, and a build that forgets it fails rather than shipping.
- A read, list, search or download across firms answers as though the record does not exist
- That answer is deliberate: a refusal confirms the row is there, and for a mandate name or an address the confirmation is the disclosure
- The firm comes from a signed token — no endpoint accepts a firm identifier as an argument
- A test fails the build if any data-access function can be called without a scope, and the handful of deliberate exceptions are listed individually with the reason each has no session to scope by