NewEvery agent tool call now routes through the governed MCP gateway — policy check, audit log, then dispatch.Read the changelogarrow_forward
XOOZLYAI Orchestrator
routeHow it workssmart_toyAgent fleetshieldGovernance & trustsellPricingmenu_bookDocsarticleBloghistoryChangelog
Log inStart free
grid_viewProductsrouteHow it workssmart_toyAgent fleetshieldGovernance & trustsellPricingmenu_bookDocsarticleBloghistoryChangelogHelp centreLog in
Start free
  1. XOOZLY
  2. chevron_rightDocumentation
Loading the knowledge base…
XOOZLYAI Orchestrator

Ready to orchestrate your AI fleet with total confidence?

Start a project, set a cost cap, and watch the loop run with every tool call policy-checked and logged before it leaves the platform.

Start freearrow_forwardSee what shipped
  • check_circleNo credit card required
  • check_circleYour keys, your model spend
  • check_circleEvery tool call audited

Platform

  • All productsarrow_forward
  • Orchestration looparrow_forward
  • Agent fleetarrow_forward
  • Governed control planearrow_forward
  • Pricingarrow_forward

Trust & legal

  • Trust centrearrow_forward
  • Security & compliancearrow_forward
  • AI use policyarrow_forward
  • Report a vulnerabilityarrow_forward
  • Data subject requestsarrow_forward

Resources

  • Documentation & guidesarrow_forward
  • Engineering & research blogarrow_forward
  • Changelogarrow_forward
  • Uptime & reliabilityarrow_forward

Browse by domain

  • Strategy & Researcharrow_forward
  • Developmentarrow_forward
  • QAarrow_forward
  • Governance & Orchestrationarrow_forward
  • All 10 domainsarrow_forward
XOOZLY
© 2026 XOOZLY · 61 agents · 10 domains · 8 SDLC stationsAI use policyarrow_forwardLog inarrow_forward99.9% uptime SLAarrow_forward
  1. XOOZLY
  2. chevron_rightDocumentation
  3. chevron_rightGuide
Loading this guide…
  1. XOOZLY
  2. chevron_rightDocumentation
  3. chevron_rightHow one project's data stays isolated from every other
arrow_backBack to the knowledge base
schedule2 min read·verifiedChecked against the code on 25 October 2026
Governance, compliance & securitytenant-isolationcodeapi-server/db/rls.pycodeapi-server/db/tenant.py

Security & compliance

How one project's data stays isolated from every other

Isolation here is two mechanisms, not one. Every query filters on the tenant's own id at the application layer, and Postgres row-level security sits underneath as a second refusal — deliberately not as a replacement for the first.

open_in_newOpen Trust centre in the consolearrow_forward
01

Two layers, on purpose

Isolation is two mechanisms stacked deliberately, and the second is not a licence to skip the first.

  1. filter_altApplication-layer filteringEvery query against tenant-owned data filters on the project or organization id explicitly. This is the layer the application is responsible for and the one code review checks.
  2. shieldRow-level securityPostgres row-level security refuses rows outside the request's tenant context independently of the query. It is defence in depth — a second refusal if the first is ever forgotten.
admin_panel_settingsWhy the database role mattersThe runtime database role is deliberately not a superuser and does not bypass RLS. Postgres bypasses row-level security unconditionally for superusers, whatever the table says — so the policy would be decorative if the application connected as one.
02

Which tables the pilot covers

RLS is piloted on the tables that carry a tenant id directly. Tables that are only tenant-scoped through a parent relationship are explicitly outside that pilot and rely on the application-layer filter — a disclosed scope, not an oversight.

03

What a cross-tenant read returns

Asking for another tenant's record does not return a permission error that confirms the record exists. It comes back as though the row is not there — which is the right answer, because a 403 on a resource you cannot see still tells you it exists.

visibility_offNot-found beats forbidden across a tenant boundaryThis is a deliberate convention, not an accident of implementation. Distinguishing “exists but denied” from “does not exist” leaks the existence of other tenants' data.
04

How isolation is tested

Cross-tenant leakage is treated as a release blocker, so it is tested rather than reasoned about: the same operation is exercised as two different tenants against a real database, and the second must come back empty — never a server error, and never a silent success.

  • Tested at both layers, because they fail independently: the application filter and the database policy.
  • Never against a mocked database — a mock cannot reproduce the behaviour the policy is there to provide.
  • Including a control that proves the row really does exist, so an empty result is isolation rather than a typo in the fixture.

boltPut it into practice

Run a fleet with these guardrails on from day one.

Hard cost caps, one audited gateway in front of every tool call, and versioned rule files — the defaults, not an enterprise add-on.

Start freearrow_forward

On this page

4 sections
  1. 1. Two layers, on purposechevron_right
  2. 2. Which tables the pilot coverschevron_right
  3. 3. What a cross-tenant read returnschevron_right
  4. 4. How isolation is testedchevron_right
feedbackSomething missing?

Related guides

  • articleData subject requests: intake, hold and what erasure removesData subject requests
  • articleManaging organization custom roles and permission gatesCustom roles
  • articleSetting up TOTP MFA, and where security keys standEnrol a second factor