Payload-Derived Informed Consent Automation: The Approval Card Can't Hide a Field Anymore

Why an approval card is only as honest as the payload it describes
An approval step only means something if what the person reads on the card is actually what is about to happen — a card that summarizes an action in its own words, separately from the real request being built, can drift from that request the moment someone adds a new field to the operation and forgets to also update the card's hand-written description. The person still clicks "Approve," still believes they know what they authorized, and the gap between the two only surfaces later, if it surfaces at all.
How the underlying problem shows up before you fix it
An approval card shows the fields someone thought to describe by hand, and a newer field added to the underlying action quietly never makes it onto the card.
A generic summary view caps itself at a fixed number of fields with no visible sign that anything was cut — the person reviewing has no way to know they saw a partial picture.
Two related identifiers exist for the same recipient (a client ID, a user ID) and the card shows whichever one a human happened to reference when writing it, never both.
An approval request for an unfamiliar or newly added action type gets treated as low-risk by default, simply because nobody has classified it yet.
An approval flow "hangs" if the screen showing the card isn't open, leaving the underlying action stuck in limbo rather than clearly rejected.
Why a hand-written approval summary drifts from the real action it describes
A card written by a person, once, at the time an action type is built, is describing that action's CURRENT shape — the moment a field gets added to what the action actually sends, the hand-written card is describing a stale version of it unless someone remembers to update two places in lockstep. A generic fallback that just takes "the first N fields" is worse in a specific way: it looks complete (a normal-looking card, no error, no warning) while silently hiding whatever came after the cutoff, which is exactly the condition under which someone approves more than they realized.
How Centriu Axiom derives the approval card from the real payload, and gates on the result
The fix is documented directly in the code's own comment as correcting a named, confirmed defect: the approval card used to be assembled by hand per action, and a generic summary path cut off at 6 fields with `.slice(0, 6)` and no indication that anything was cut. In practice this meant a Maestro campaign update showed its name, budget and bid amount but not `bidStrategy` — which still went into the real request and changed the campaign's actual bidding strategy; a support-ticket email reply didn't show its `subject`; two report-generation actions didn't show their `title`; a client notification showed only a client ID or a user ID, never both, when either could be the real recipient; and any generic table write with 7 or more fields would show the first 6 and execute the rest without anyone seeing them.
The correction does not mean writing a better hand list — it means deriving the card's lines from the payload that is actually about to be sent. `linhasDeConsentimento()` walks every key of the real, already-built request: a nested object opens into one line per inner field specifically because, in the code's own words, that is where a hidden change can bury itself inside what looks like a single innocuous field. A value that is too long to show in full is shortened — but the shortening always announces exactly how much was cut, never silently. The hand-written header a developer writes for an action ("Sends a REAL email to the client") still appears at the top, because it explains what an operation MEANS — it just no longer substitutes for the complete list.
A companion function, `chavesNaoExibidas()`, exists specifically to be called by a test: given the real payload and the rendered card lines, it returns every key that failed to appear anywhere in what the person would see. That is the enforced invariant — not a comment reminding a future developer to keep the card current, but a check a test suite actually runs. And when an action arrives under a capability ID the registry doesn't recognize, the system does not default to treating it as low-risk because nothing is known about it yet — it is deliberately classified as the MOST dangerous class, high-impact-write, requiring approval, with an explicit note that an unknown capability can never become "low risk by omission."
Behind that card sits a real, blocking approval gate. The tool handler that wants to send an email, write to a table, or run a registered action calls a `request()` function and is genuinely suspended — not merely told an approval is pending — inside a Promise that only resolves when a person clicks Approve or Reject on the rendered card, confirmed wired into a real hook that subscribes to pending requests and resolves them from actual UI interaction. A 120-second timeout with no response resolves to REJECTED, not approved — fail-closed, not fail-open — and if no screen is even mounted to display a card (the panel closed, for instance), the request is rejected immediately rather than left hanging indefinitely. Any requests still pending when that hook itself unmounts are also explicitly rejected, so nothing is left in limbo.
What is actually built today
Approval-card lines derived directly from the real, fully-built outbound payload — not from a hand-written description maintained separately from the action itself.
Nested objects expanded field by field on the card rather than collapsed into a single line, specifically because that is where a meaningful change can hide.
A test-enforced invariant (`chavesNaoExibidas`) that returns any payload key missing from the rendered card — a check a test suite runs, not a comment relying on memory.
Announced, not silent, value shortening — a long value is cut for readability but the card always states how much was left out.
An unrecognized capability ID defaults to the highest risk class and always requires approval — never treated as low-risk simply because it is unclassified.
A genuinely blocking, fail-closed approval gate: a real Promise suspends the action, a timeout defaults to rejection, and no mounted screen means immediate rejection rather than a silent hang.
A bid strategy that used to travel unseen (illustrative scenario, not a real client)
Someone asks Sofia to update a Maestro campaign's daily budget and switch its bid strategy at the same time. Under the earlier hand-written card, only the budget and bid amount would have appeared — the strategy change would have gone through unseen. Under the payload-derived card, `bidStrategy` appears as its own line because it is a real key in the request about to be sent, and approving the card means approving exactly that change, not a partial description of it.
What changes operationally
Approving an action in Axiom now means approving what is actually about to happen, field by field, rather than a hand-written summary that can quietly fall behind the real request. A newly added field to any action is visible on the card automatically, because the card is generated from the same payload the action sends — nobody has to remember to update a second, separate description. And because the gate itself fails closed on both a timeout and a missing screen, an action can never execute simply because nobody happened to be looking.
When this is not the right fit
This page describes the approval mechanism confirmed wired into Axiom's voice assistant (Sofia) specifically — it was not re-verified this wave as also gating Axiom's separate text-based drafting copilot, the subject of Axiom's existing AI copilot governance page. A team expecting a fully custom, per-action narrative summary instead of a field-by-field payload listing will find the opposite by design: the header explains what an action means, but the full list of fields is never suppressed in favor of prose.
A hand-written summary vs. a card generated from the real request
A hand-written approval summary is a description of an action written once, and every field added to that action afterward needs someone to remember to update it too — a class of defect that only ever grows quieter over time, since a card that LOOKS complete gives no sign that it isn't. Centriu Axiom instead treats the real, already-built outbound payload as the single source of truth for what a person is shown: the card is a rendering of that payload, not a separate narrative about it, and a test specifically checks that no field from the real request can go missing from the card.
Related systems
Main system: Centriu Axiom. Complementary when relevant: Centriu Maestro.
What it does NOT do
- Does not build the approval card from a hand-written, separately-maintained description — every line is derived from the actual outbound payload for that specific call.
- Does not truncate the approval card to a fixed field count without saying so — the earlier `.slice(0, 6)` behavior is the named defect this mechanism replaced.
- Does not treat an unrecognized capability ID as low-risk by default — an unknown action is classified as the MOST dangerous class and always requires approval.
- Does not let an approval request hang indefinitely — a 120-second timeout defaults to rejection, and no mounted screen also means immediate rejection.
- Does not claim this exact mechanism gates Axiom's separate text-based drafting copilot — confirmed wired specifically into the voice assistant (Sofia) tool-runner this wave, not re-verified beyond that.
- Does not silently shorten a long value on the card — a cut value always states how many characters or items were left out.
Security and governance
Every approval decision (granted, refused, or timed out) is recorded alongside the tool call it gated in Axiom's shared, organization-scoped audit trail. High-impact actions gated this way (a real email, a real campaign change, a real client notification) remain subject to Brazil's LGPD (Law No. 13,709/2018) wherever personal data is involved. 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
What specific defect did this mechanism fix?
A hand-written approval card that omitted real fields (a campaign's bid strategy, an email subject, a report title, one of two recipient IDs) and a generic fallback that silently truncated at 6 fields on any write with more than that.
How does the new approval card avoid the same problem?
Every line is derived directly from the real, fully-built outbound payload rather than a separately maintained description, and a test specifically checks that no payload key is missing from what is shown.
What happens if nobody responds to an approval request?
A 120-second timeout defaults to REJECTED, not approved — the gate fails closed, not open.
What happens if the screen that would show the approval card isn't even open?
The request is rejected immediately rather than left hanging indefinitely.
What risk class does an action get if it isn't in the capability registry yet?
The highest one, high-impact-write, which always requires approval — an unclassified action is never assumed to be low-risk.
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 builds its approval cards from the real outbound request
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.