{
  "id": 8813900,
  "title": "Who Decides the Tenant? A Small Rust Guard for AI Tool Calls",
  "url": "https://urgent.news/2026/09/21/who-decides-the-tenant-a-small-rust-guard-for-ai-tool-calls",
  "topic": "ai",
  "section": "AI",
  "published": "2026-09-21T01:28:40.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/subaruhello/who-decides-the-tenant-a-small-rust-guard-for-ai-tool-calls-4pc4"
  },
  "original_language": "en",
  "account": "I examined a common failure mode in AI-enabled SaaS products. A support agent was assisting a user from tenant-a. The user requested a contract, and the model generated a valid tool call: get_contract(contract-b). The issue arose because contract-b belonged to tenant-b. While the call seemed legitimate, the problem lay in the fact that the resource was not owned by the tenant making the request. To address this, I created the TenantInvariant Rust crate, an experimental library aimed at making tenant isolation an executable invariant in AI agent tool calls. This library ensures that tenant isolation is checked before an AI agent's tool call executes, preventing unauthorized access to resources from other tenants.",
  "summary": "I have been thinking about a fairly ordinary failure mode in AI-enabled SaaS products. A support agent is helping a user from tenant-a . The user asks about a contract, and the model produces a perfectly valid tool call: get_contract(\"contract-b\") There is nothing obviously wrong with the call. The tool exists and the argument has the right shape. The problem is that contract-b belongs to…",
  "key_points": [
    "TenantInvariant Rust crate prevents unauthorized AI tool calls",
    "Library checks tenant isolation before executing tool calls",
    "Ensures resources accessed belong to requesting tenant"
  ],
  "editors_take": "This development helps prevent AI tool calls from accessing unauthorized resources across different tenants, enhancing security and tenant isolation in AI-enabled SaaS products.",
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}