Skip to Content
Platform · Security & AI governance

It can act, because it can be refused.

Odient does real work in your Odoo, but only what the person asking is cleared to do, only after you approve a write, and never off the books. The governance layer is not a setting. It is the reason it is allowed to act at all.

prompt_firewall.py · 5 layers · every request, every refusal · one record each.
every decision ON THE
RECORD™
allowed · blocked · approved
The firewall

Five checks stand between a prompt and your data.

Every request, whether from Diana, the Odient panel or any MCP client, walks the same five gates before it touches a single Odoo record. Each gate can stop it cold. Watch two requests take the walk.

prompt_firewall.py5 layers
request in →
1Identity &
access
2Injection
screening
3Tool-scope
policy
4Per-action
approval
5Audit &
logging
outcome
Diana · agentsale.order.confirm · S01213
✓
✓
✓
✓
✓
reaches Odooallowed · logged
Diego Santanapurchase.order · read · out of scope
✓
✓
✕
·
·
stoppedlayer 3 · logged

Two requests, the same five gates. Diana’s confirmed order clears all five and reaches your data. Diego’s out-of-scope read is stopped at layer 3 - it never reaches Odoo, and the stop is written to the record, in the same trail as the work that went through. The firewall is not a wrapper around the model. It is the path the model has to take.

The write-gate

Every write is decided before it happens.

Reading is scoped to the person. Writing is held to a gate you set: human-in-the-loop by design, each of these a control Odient checks before a single record changes. Built and tested this way, not bolted on.

  • ✓Allow / deny / confirmPer model, per action. Each write is matched to a rule before anything runs. Some go, some stop, some wait.
  • ✓Value capsA reminder over a set amount, a change past a threshold: held for a person, not sent on the assistant’s say-so.
  • ✓Rate limitsHow many writes an assistant can make in a window is bounded, so nothing runs away in a loop.
  • ✓Dry-runThe write is computed and shown first, so the exact change is on screen before it ever lands.
  • ✓Human-confirmAnything above policy waits for a person to approve. Drafts stay drafts until you say go.
  • ✓PII redactionSensitive fields are stripped at egress, before anything leaves your Odoo on its way to a model.
  • ✓One audit record per writeAllowed, blocked or approved: every decision writes exactly one row, tied to the person who made the request. Not a sample. Every write.
The audit record, shown

This is the trail, not a diagram of one.

A real AI audit trail: every question, action and refusal Odient handled: user, channel, model, action, decision. The declined rows sit in the same list as the work that ran. Nothing hidden, nothing silent.

The Odient Access Audit trail - every request logged with user, channel, model, action and decision. Real rows show Declined access_error attempts (Omar Hassan on hr.employee and account.move, Diego Santana on purchase.order) next to Allowed executions

You can let it act, because every move is auditable.

Who asked, what ran, whether policy allowed it, exactly when. Ask and Act are one trail. A granted execution and a declined attempt sit side by side, tied to the person who made the request. That is the reason a lean team can hand real work to AI.

Access audit · livetenant: elmwood
09:14:22Maria Gómezaccount.reminder.draft · account.moveallowed
09:14:31Diego Santanapurchase.order · readdeclined
09:15:03Diana · agentsale.order.confirm · S01213allowed
09:15:47Omar Hassanhr.employee · readdeclined
every action Odient takes - allowed, blocked, or approved - writes one record. not a sample. every write.
How it is architected

The AI can only reach what the person can.

Access is decided per user, not per feature. Diana never sees more of your Odoo than the person asking already can. API keys are scoped, and when a call needs to hit Odoo, a short-lived session exchange mints a native-scope key bounded by that person’s own permissions, then lets it expire. No long-lived, all-powerful token sitting on a server. Plain plumbing, and the part we were most careful to get right.

session_exchange.py
# Scoped key in → short-lived native key out
session = exchange(
    tenant="elmwood",
    user="marco.ricci",
    scope="odient_mcp",   # narrow, per-user
)

# mints a native-scope key just for this call,
# bounded by Marco's own Odoo permissions,
# then expires. Nothing long-lived is stored.
token = session.native_key(ttl=300)

Built and tested: the write-gate and session exchange are how Odient is architected, not a checkbox you turn on later.

It will also
tell you no.

An assistant that can do real work is only safe if it can be refused. Ask Odient to touch a record you are not cleared to see, and it stops. The refusal is logged too, as visible as the work that went through.

Declined · today
DSDiego Santanapurchase.order · readdenied
OHOmar Hassanaccount.move · readdenied
DADiana · agentres.users · writeblocked by policy
MGMaria Gómezreminder ≤ $50kallowed
FAQ

Frequently asked questions.

Can the AI write to our production ERP?

Only through the gate you set, and only as the person who asked. Each write is matched to a rule (allow, deny or confirm) with value caps, rate limits and a dry-run that shows the exact change before it lands. Anything above policy waits for a person.

Where do our prompts and data go?

Your Odoo data is read to serve the request in front of it, never to train models. Sensitive fields are stripped at egress before anything reaches a model, and every request is logged, served or refused. For teams that need everything inside their own walls, an on-prem option is in development.

What does the audit trail actually record?

One record per decision: who asked, through which channel, what ran, and whether policy allowed it: allowed, blocked and approved rows side by side, nothing sampled, nothing hidden. It is the reason a lean team can hand real work to AI and still pass its own audit.

Are you SOC 2 compliant?

Not yet. SOC 2 is in progress. We will publish the report the day it is issued, not a target date before it exists.

Is our data encrypted?

Encryption is in progress, not complete. We are not going to claim it is done until it is verified end to end, at rest and in transit.

Where is our data hosted?

US and Europe today, or the AWS region closest to you if neither fits. Your Odient contact can confirm the exact region for your account.

See exactly what it did, and what it was not allowed to.

Refused · auditable
Diego Santanastopped · layer 3
purchase.order · read · out of scope
the stop is logged too - the same trail that proves what ran proves what didn’t.