Skip to content
Centriu
Centriu Axiom

Cross-Module Context Handoff Sanitization Automation: A Screen Can Say Where You Are, Never Who You Are

When another Centriu screen hands context to Axiom — which record is open, what period is selected, what filters are active — that handoff follows a fixed protocol (`centriu.context/1`) that treats the context as a ticket describing WHERE someone is, never as a grant of WHAT they can do. Fields that decide authority — organization, user, permissions, roles, tenant — are refused on principle even if a screen tries to send them, values that look like a credential (a JWT, a Supabase key, an OpenAI-style key, a GitHub or Slack token, a Google API key, a private-key block, a Bearer header) are caught by pattern even under an innocent field name, and any key that would carry full document content is blocked outright rather than trimmed. Every single field that gets removed is recorded with one of six named reasons — there is no silent discard — and the resulting prompt block tells the model in plain language that the context grants nothing, that any real access still has to go through the owning tool, and that a refusal should be reported honestly rather than answered from memory.
Authority never travels in context
Every removal logged, none silent
Person working on a laptop with notifications on screen
A screen can say where you are, never who you are.

Why a helpful "here is what you're looking at" handoff is also a way to smuggle authority

Handing an assistant a bit of context about the screen someone is already on is a small, obviously useful thing — it means not having to re-explain which invoice or which deal is in focus. But that same channel, if left unguarded, is also the easiest place for a bug or a compromised client to slip in something that decides authority — an organization ID, a role, a permission flag — hoping the assistant on the other end treats a screen's own claim as good enough. An internal AI that reaches across a whole company's modules needs a rule that never lets that shortcut work, not a policy someone has to remember to enforce screen by screen.

How the underlying problem shows up before you fix it

A screen hands over context that includes an organization ID or a role, and nothing downstream distinguishes that from an actual, server-verified identity.

A filter value that happens to look like an API key or an auth token passes straight through because the code only ever checked the field NAME, not the shape of the VALUE.

A "just a quick summary" field ends up carrying an entire document, complaint, or transcript, because nothing capped how much a single context field could hold.

Something gets silently dropped from an inbound context object, and nobody downstream can ever answer whether that was intentional filtering or a real defect.

A nested object sneaks past a validator that only checked top-level fields, because the validator never asked the obvious next question: what is IN the box.

Why "just validate the top-level fields" is not enough for something built to cross module boundaries

A context object that travels between a screen and an internal AI assistant is exactly where two different failure modes meet: it is used often enough that a hand-checked allowlist per field is tedious to keep current, and it is trusted enough that a person building the sending screen might reasonably assume "the receiving side will figure out what it needs." A rule that only checks field names allows content to hide under an unexpected key; a rule that has no size limit allows a full record to travel through a channel meant for a label and an ID; and a rule that silently drops what it doesn't like leaves nobody able to tell, later, whether a missing field was policy or a bug.

How Centriu Axiom sanitizes a context handoff before it ever reaches the model

Every context object that reaches Axiom carries a protocol version (`centriu.context/1`) and is read through one function, `sanitizarContexto()`, shared byte-for-byte between the module's own app and every Edge Function that accepts context — a generation script keeps the two copies from silently drifting apart, with a `--check` mode specifically built to catch that drift. Three fields refused on principle even if a screen tries to send them: organization, user, and permissions (along with their common aliases — tenant, role, scopes, entitlements) — because authority in Axiom always comes from the caller's own verified identity, never from a claim inside the context payload itself.

What IS allowed is narrow and shaped: which system is handing off (a lowercase slug), which surface it came from (the Axiom screen itself, ChatGPT, or a system-to-system call), an optional area and route within that system, an entity being looked at (a type and an opaque ID Axiom never interprets — it just passes it back to the tool that owns it), a selected date range in ISO format, a currency CODE only (never a monetary value), a short list of filters, and a list of capability hints a screen can offer as a navigation cue — re-verified against the real registry and the caller's own identity before anything is trusted. Every one of those fields has a hard character or item cap, because a context object is meant to be a ticket, not an attachment.

On top of the field allowlist, values themselves are checked for the SHAPE of a credential regardless of which field they arrived in — seven distinct patterns cover JSON Web Tokens, both old- and new-format Supabase keys, OpenAI-style secret keys, GitHub personal-access tokens, Slack tokens, Google API keys, PEM-formatted private keys, and Bearer/Basic authorization headers. A key whose NAME suggests it carries full content — body, payload, an attached document, a transcript, a complaint, a medical or financial extract — is refused outright, not merely trimmed, because summarizing a document is a different operation from receiving one wholesale. Nested objects inside filters or metadata are stripped for the same reason stated directly in the code's own comment: the context is shallow on purpose, because nesting is where a document hides.

None of this fails the whole request over one bad field. A single strange filter gets pruned, with the removal recorded under one of six named reasons — authority claim, looks like a secret, carries full content, text too long, wrong format, or over a numeric limit — and that record travels all the way to Axiom's own audit trail alongside the call it accompanied. The model itself is then told, in a fixed block of plain language, exactly what the surviving context does and does not mean: it says WHERE someone is, it grants NOTHING, and if a downstream tool refuses an action, the honest response is to report the refusal — not to try another path, and not to state a remembered number as if it were current.

What is actually built today

One shared sanitization function (`sanitizarContexto`), generated identically into every Edge Function from a single source file, with a `--check` script that catches the two copies drifting apart.

A fixed refusal list — organization, user, permissions, tenant, role, scopes, entitlements — removed on principle even if a sending screen includes them, never treated as a substitute for verified identity.

Seven credential-shape detectors (JWT, two Supabase key formats, OpenAI-style keys, GitHub tokens, Slack tokens, Google API keys, PEM private keys, Bearer/Basic headers) checked against the VALUE, independent of which field name it arrived under.

Outright refusal — not truncation — of any field whose name suggests it carries full document, transcript, or complaint content.

Hard numeric caps on every field (system slug, area, route, entity type/ID/label, filter count, metadata count, capability-hint count) so a context object cannot grow into an attachment.

Six named removal reasons, every single discard logged rather than dropped silently, feeding the same audit trail every tool call already writes to.

A filter that looked like a token (illustrative scenario, not a real client)

A screen hands Axiom context that includes a filter whose value happens to match the shape of a Bearer authorization header — pasted in by mistake during testing, not a real attack. Rather than passing it through because the field name looked innocuous, the sanitizer recognizes the VALUE's shape, strips it, and records the removal under "looks like a secret" — visible later in the audit trail — while the rest of the context (which system, which entity, which period) reaches the model exactly as sent.

What changes operationally

A screen can hand Axiom useful, specific context without that channel ever becoming a second, informal way to claim authority or leak a credential. Nothing that gets stripped disappears without a trace — every removal is attributable to a specific, named reason, which matters the day someone asks why a particular filter didn't make it through. And because the sanitizer is generated from one source into every consumer, a fix made once cannot silently fail to reach an Edge Function that was written against an older copy of the rule.

When this is not the right fit

A team that wants to pass an entire document, a full complaint, or a whole conversation transcript through this specific handoff channel will find it refused by design — that is a different operation (fetching a document a person is authorized to see, through the tool that owns it), not a context field. A team expecting the context object itself to grant access to a system will find the opposite: the context describes a screen, and every real read or write still goes through the owning tool's own identity, role and plan checks, independent of anything the context claimed.

A trusted screen payload vs. a context that grants nothing by design

Trusting whatever fields a sending screen includes — because it is "internal, so it should be safe" — quietly turns a convenience channel into a second authority path the moment any one screen gets it wrong. Centriu Axiom instead treats every context handoff as untrusted input worth the same discipline as an external one: a fixed allowlist, credential-shape detection independent of field names, hard size caps, and a named reason for every single removal, so the channel can be genuinely useful without ever being able to grant what only a verified identity should grant.

Related systems

Main system: Centriu Axiom.

What it does NOT do

  • Does not accept organization, user, permission, role, or tenant claims from a context payload, under any field name — authority is always resolved from the caller's own verified identity.
  • Does not allow a full document, transcript, or complaint body to travel through this channel — keys that suggest full content are refused outright, not merely shortened.
  • Does not drop a rejected field silently — every removal is recorded under one of six named reasons and reaches the same audit trail as the tool call it accompanied.
  • Does not treat a screen's declared "available capabilities" hint as a grant — it is a navigation cue only, re-verified against the real registry and the caller's identity before anything executes.
  • Does not interpret the ID inside an entity reference — Axiom passes it through unchanged to the tool that actually owns that record.
  • Does not accept an absolute URL as a route hint — only a relative, same-app path, specifically to avoid becoming a vector for an external redirect.

Security and governance

The sanitization rule is generated from one source file into every Edge Function that accepts context, with a `--check` script guarding against the SPA and the Edge Functions silently disagreeing on the contract. Every removal is logged to the same shared, organization-scoped `audit_logs` table the rest of Axiom's tool calls write to. Any personal data referenced in a downstream tool call still follows Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.

Pricing and contracting

Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).

Frequently asked questions

Can a screen grant itself extra access just by including it in the context it sends?

No — organization, user, permission, role and tenant fields are refused on principle from context payloads; access is always decided by the caller's own verified identity, never by a claim inside the handoff.

What happens if a context value looks like an API key or a password?

It is caught by matching the shape of the VALUE against known credential patterns (JWT, Supabase, OpenAI-style, GitHub, Slack, Google, private keys, Bearer/Basic headers) regardless of which field name it arrived under, and removed.

Can a whole document or transcript be passed through this context channel?

No — any field whose name suggests full content (body, payload, an attachment, a transcript, a complaint) is refused outright, not shortened; retrieving an actual document is a separate, authorized operation.

Is a removed field just silently dropped?

No — every removal is recorded with one of six named reasons and logged to the same audit trail every Axiom tool call writes to.

Do the Axiom app and its Edge Functions ever disagree on this rule?

The rule is generated from a single source file into every consumer, with a script that specifically checks for drift between the copies.

What does Centriu Axiom cost?

It is sold by subscription with a published starting price — exact current values are on the central pricing page.

See how Centriu Axiom sanitizes context handed off between screens

Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.

Sources

  1. Centriu Axiom — public product page — Centriu, 2026-07-20 · link(primária)
  2. Centriu Axiom — public factsheet (API, JSON) — Centriu, 2026-07-21 · link
  3. Law No. 13,709/2018 — Brazil’s General Data Protection Law (LGPD) — Presidência da República (Brazil), 2018-08-14 · link

Last material update on .

By · AI-assisted production, with human review