Aria · permissions, in detail

How Aria keeps to your permissions.

For the IT or ERP lead: what Aria's pass signs, which account Aria uses, which tools it gets, what a refusal looks like, what lands in the log, how agents are limited, and what leaves your site.

In short

  • Aria reads your ERP with the permissions of the person asking. Nobody sees more through Aria than they could open in the Desk.
  • Each question carries a pass your own site signs: who, which conversation, good for at most 15 minutes. Without a valid pass, Aria's reads are refused.
  • Aria's own account has no document permissions. It can't read anything without a person's pass.
  • Under a pass, Aria gets read tools only. Changes go through action mode: Aria proposes, and the person confirms on their own login.
  • Every call lands in the Kremio Action Log with the person, Aria's account, the agent and the conversation or job.

The pass

For each question, server code on your site mints a short-lived pass, called an on-behalf-of claim, after checking that the person owns the conversation. Every call Aria's runtime makes to your ERP carries it, and your site checks it on each one. Neither minting nor checking can be called from outside your site.

What the pass signs
Field What it holds
k The kind of pass. A question to Aria is ask.
u The person asking.
t The conversation (Aria thread) the question belongs to.
a The agent. For Aria, aria; for a catalog agent, its id and version.
iat · exp When it was issued, and when it expires: at most 15 minutes later.
aud Your site's own address, so a pass from one site never verifies on another.
  • It's signed with HMAC-SHA256, under a key derived from your site's own encryption_key. Nothing new is stored, the key never leaves your site, and rotating the encryption key revokes every pass.
  • It reads as kobo1.<payload>.<signature>. Change one character and it no longer verifies.
  • Only enabled users who aren't Website Users can be named: System Users, and custom user types such as HRMS's Employee Self Service, who then see only what their user type allows. Portal users and Guest can't be named.
  • Infinary's hub never sees the pass, and never sees who is asking.
How a question reaches your ERP through Aria You ask a question. Your own site signs a pass for that question: who is asking, in which conversation, good for 15 minutes, signed with your site's own key. Aria reads through the pass with your permissions, using read-only tools, and every call is logged. The answer comes back with the records it read. Without a valid pass the call is refused and logged; Aria's own account can't read anything. You ask Dana, in the Desk “What did payroll costus last quarter?” Your site signs A signed pass who dana@acme.comthread #4821lasts 15 minuteskey your site's own
Aria reads as you Aria Read-only tools,Dana's permissions,every call logged.
The answer With its sources $412,880.00 across3 Payroll Entries,each one linked. No pass, no answer Missing, expired, altered or fromanother site: refused and logged.Aria's own account can't reada thing.

Aria's own account

Aria reaches your ERP through Kremio Connect's MCP endpoint, as a machine user, infinary-aria@infinary.invalid. That account is built to be useless on its own:

  • Its roles, Kremio Delegate and Infinary Aria, hold no document permissions and no Desk access, so it can't open the Desk even with a password.
  • It calls with an API key. A browser session is refused.
  • Every read needs a valid pass. A call without one is refused. It never falls back to the account's own view.
  • For the length of each request your site switches to the person the pass names, then puts Aria's account back. Nothing about the person is saved in a session or a cookie.
  • Its key is rotated together with the agent account's.

What Aria can call

Under a question's pass, Aria gets read tools only, such as get_document, list_documents, search_documents, global_search, generate_report and extract_file_content. Every check runs as the person: document permissions, field-level trimming and tool rules.

  • Never the tools that submit, cancel or delete, whatever Kremio Settings allow.
  • Never the System Manager tools, run_python_code and run_database_query, whoever is asking. Raw SQL would read past the person's permissions.

Changes: action mode

Aria proposes a change as a card: the sales order, the reply, the journal entry. Nothing is submitted until the person confirms it. The change then runs on their own login, with their own permissions, and the record notes “Submitted via Aria”. Because Aria's tools can't write, this holds even if a model tried to.

What a refusal looks like

Aria says what it can't see. It doesn't give a vague refusal or work around one.

The person can't open it

“I can't open that with your permissions.”

Underneath, it is Frappe's own permission error, such as "You are not permitted to read Payroll Entry." Aria says so plainly instead of guessing.

No valid pass

“I can't read the ERP for this turn.”

A pass that is missing, expired, for another site or tampered with is refused with HTTP 403, and the site writes an Error Log row titled "Kremio MCP: on-behalf-of refused".

An agent's own limit

“Cash Forecaster isn't allowed to read Payroll Entry (agent limit).”

When an agent is involved, the refusal says which side refused: the person, or the agent. That tells whoever maintains the agent exactly what is missing.

The Action Log

Every call through Kremio Connect, from Aria, an agent, the Kremio app or an AI app you connected, writes a row to the Kremio Action Log on your site. Rows are kept for 90 days by default.

Kremio Action Log fields for delegated calls
Field What it holds
User The person the call ran as.
Via The account that carried the pass: Aria's, or the agent runner's.
Agent aria, or a catalog agent as id@version.
Thread or Job Aria's conversation, or the agent's job id.
Also The call, the document it touched, and the outcome, refusals and their error included.

Filter by Thread or Job to see every call one conversation or one agent run made, failed ones included. Calls made without a pass, such as an AI app you connected over OAuth, leave Via, Agent and Thread or Job empty.

Agents: both must allow

Aria has no limit of its own: it reads what the person can. Infinary's catalog agents are different. Each one also has its own user, agent-<id>@infinary.invalid, holding one role whose permissions are exactly what the agent's manifest lists. It never signs in. It's a permission profile your site checks against.

  • Under a pass that names an agent, a call must be allowed for the person and the agent's user: documents, fields, search results and reports. Neither can widen the other.
  • Only the agent user's own role counts, never the automatic ones every user holds.
  • When a new version of an agent asks for more access, it doesn't run until a System Manager approves the addition. A System Manager's own narrowing survives upgrades.
  • Disabling an agent's user is its kill switch: every call naming it is refused at once.
  • “Agents run as a person” is a setting in Infinary Controls Settings, off by default. When it's on, a run started from the ERP acts as the person who started it, and a scheduled run acts as the person a System Manager names for that agent. With nobody named, the run is refused. Its drafts belong to that person and stay private to them: a Note is never public, a ToDo goes only to them, and a Communication stays unsent.
Collections Clerk collections@1.1.0
Reads
Sales Invoice · Customer · Payment Ledger Entry · Issue
Reports
Accounts Receivable
Drafts
Communication · Note
Cash Forecaster cash-forecast@1.1.0
Reads
Purchase Invoice · Sales Invoice · Purchase Order · Payment Ledger Entry · Salary Slip · Payroll Entry
Reports
Accounts Payable · Accounts Receivable · Purchase Order Analysis
Drafts
Note

So the Cash Forecaster, started by someone without payroll access, forecasts without payroll and lists it as unknown. And the Collections Clerk can't read a Salary Slip, even when the person it runs as can.

Limits from each agent's manifest in Infinary's catalog

What leaves your site

Aria runs inside your site and calls Google's Vertex AI from your own Google Cloud project. What Aria reads to answer you goes to the model to write the answer.

  • Infinary's hub never sees who is asking, or their pass.
  • A System Manager chooses which models your site allows. Gemini is the default. If your site allows Anthropic's Claude models on Vertex AI, those calls go to Vertex AI's global endpoint, so they aren't held to one region.
  • An AI app you connect yourself, such as Claude through Kremio's Connect an AI app, sends what it reads to that app's own provider. That's separate from Aria, and it's logged the same way.
  • Kremio doesn't keep Aria chats on the phone.

Versions and settings

Answering as the person needs infinary_controls 0.14.0 or newer and Kremio Connect 0.5.0 or newer on the site. Agents' own limits need infinary_controls 0.16.0 and Kremio Connect 0.7.0.

Your site records in Infinary Controls Settings when Aria's runtime has taken Aria's own key. Until it has, Aria reads with the agent account's permissions, and only Desk users can use it.

A System Manager turns Aria on or off in Infinary Controls Settings. Off, the launcher leaves the Desk and Aria leaves Kremio. The Action Log keeps its history.

Questions from your security review?

An architect will walk your team through it, on our own ERP.