Sandbox-to-Live Policy Enforcement Parity Automation: Blocked in Rehearsal, Waved Through at the Premiere

A check that only runs in rehearsal only proves the rehearsal was safe
A rehearsal or sandbox environment is specifically valuable because nothing about the real world changes when something inside it is blocked — which makes it a natural, low-risk place to build and test a strict safety or compliance check for the first time. The trap is treating that rehearsal check as if it were protecting the real thing simply because it shares the same name and the same underlying rule. A check that runs correctly every single time inside a simulation says nothing about whether the equivalent live action — the one with actual consequences — ever asks the identical question, and a live path that was never wired to call the check will succeed silently and completely, producing no error, no warning, and no visible sign that anything was skipped.
How the underlying problem shows up before you fix it
A compliance or safety check exists and works correctly, but it is only ever invoked from a simulation, dry-run, or preview code path — never from the code path that performs the equivalent real, live action.
Two different action types in the same feature reuse or produce the exact same underlying content, but only one of them is wired to the shared safety check, leaving the other as an unguarded route to identical output.
A content-classification step defaults to the narrowest, least-strict rule set whenever the content's exact category isn't explicitly declared, rather than defaulting to the broadest, most cautious one.
A "blocked" outcome the check does successfully catch has no corresponding entry in any audit trail — so even the cases the system does stop leave no durable record for later review.
A team points to a passing rehearsal or test-mode run as evidence a safety mechanism works end to end, without separately confirming the exact same check also runs on the equivalent live path.
Why a rehearsal-only check can survive unnoticed indefinitely
Adding a strict policy check to a rehearsal environment is often the path of least resistance precisely because rehearsal is where mistakes are cheapest — nobody is harmed if a simulated step gets blocked, so a team can iterate on the rule freely. That reasonable starting point becomes a real gap the moment the live execution path is built separately, by a different piece of work, without an explicit step confirming it calls the identical check. From that point forward, the live path simply works — copy gets generated, campaigns get exported — and success produces no signal that anything is missing, because a check that was never called can't produce an error for not having been called. The gap only becomes visible by deliberately tracing whether the real, consequential action path invokes the same function the rehearsal path already relies on, which is a check nothing about a normally functioning product would prompt anyone to run.
How Centriu Axiom closed the gap between the rehearsal and the real thing
This gap was found in the same internal audit that rewrote Axiom's proof-of-action mechanism and connected its safety scanner to the real AI conversation path (both covered on this pillar's companion pages), described directly in the audit's own account: "the gate existed only in the sandbox — the policy blocked the rehearsal and cleared the premiere." Axiom's Sandbox already ran a genuine policy check, `quickPolicyCheck`, against any `submit` step's text before allowing that simulated step to proceed, evaluating the copy against Meta, Google Ads, or Google Business Profile-specific rules depending on the declared platform. That check worked correctly and had for some time. The problem was scope: it was the only place in the entire product this check was ever called.
The real execution path lives in a different function entirely — the one that actually processes a `GENERATE_CAMPAIGN_DRAFT` action, producing a downloadable campaign structure with real ad copy, naming conventions, audiences, and creative suggestions, which is the exact content that eventually reaches a platform like Meta once someone acts on it. Before the fix, generating that draft for real never once asked whether its own copy would pass the identical rule the Sandbox already enforced for a rehearsed version of the same action. The fix adds a new function, `extrairCopyParaPolicy`, that pulls the actual campaign name and every creative's description and suggested copy out of a campaign-draft payload, and calls it before the real action is allowed to complete. If a violation is found — the check returns a `blocked` status — the action is refused with a specific message naming the risk score and the number of findings, and the block itself is written to the audit trail with those same details, so even a caught violation leaves a durable record.
A detail the historical commit message doesn't fully spell out, found only by reading the diff itself closely: the fix deliberately covers a SECOND action type as well, `EXPORT_CAMPAIGN_DRAFT`. Exporting a campaign draft as a PDF downloads the identical copy an earlier `GENERATE_CAMPAIGN_DRAFT` action in the same session already produced — meaning that if only the generate step had been wired to the policy check, exporting would have remained a completely unguarded route to the exact same unscreened content, a bypass in all but name. The fix's own code comment states the reasoning directly: checking only the generation step and clearing the export step would simply invert which of the two steps got the scrutiny, not actually close the gap.
The platform classification driving which specific rule set applies is read from the campaign's own declared platform field, matching against Meta, Google Ads, or Google Business Profile — but when a campaign's platform isn't clearly one of those, the check deliberately falls back to a fourth, "generic" classification carrying the broadest applicable rule set, rather than skipping the check or defaulting to the narrowest one. The reasoning, again stated directly in the fix's own comment: when genuinely uncertain which specific rules should apply, the safer default is to evaluate against more rules, not fewer. Confirmed directly against the current source: `extrairCopyParaPolicy` and its call into `quickPolicyCheck` remain in `useSession.ts` today, unchanged since the fix, and the Sandbox's own original `submit`-step check remains in place as well — both paths now judged by the identical function.
What is actually built today
A real campaign-copy extraction step that pulls the campaign name and every creative's description and suggested copy out of the actual draft before real execution is allowed to proceed.
The exact same policy-check function the Sandbox's rehearsal environment already used for its own "submit" steps, now genuinely called on the real, live execution path as well.
Coverage for both `GENERATE_CAMPAIGN_DRAFT` and `EXPORT_CAMPAIGN_DRAFT` action types, closing a specific bypass where exporting would otherwise have reused the identical, unchecked copy from a generate step.
A deliberate "generic," broadest-rule-set default whenever a campaign's specific advertising platform isn't clearly declared, rather than defaulting to the narrowest applicable rule set or skipping the check.
A specific, actionable block message naming the risk score and finding count, shown to the person whose action was refused.
An audit trail entry written for every genuine block, recording the same risk score and finding count — so a caught violation leaves a durable, reviewable record.
The same rule, checked at the premiere too (illustrative scenario, not a real client)
An agent drafts Meta ad copy that trips a policy rule — say, an unsupported health claim. Rehearsing that same draft inside the Sandbox correctly blocks the simulated submit step. Before this fix, actually generating or exporting that identical draft for real skipped the check entirely, and the same unscreened copy would have reached whoever downloaded it. After the fix, generating or exporting that draft for real is blocked by the identical rule, with the block logged and explained, before the copy ever leaves the product.
What changes operationally
Ad copy that would be flagged during a rehearsal is now flagged with equal certainty the moment someone actually generates or exports it for real — the two paths are judged by the same function, so a rehearsal's "safe" verdict and the real action's outcome can no longer silently disagree. A blocked attempt also now leaves an auditable record naming the specific risk score and finding count, rather than existing only as a rehearsal-time result nobody could later point to.
When this is not the right fit
This fix closes the specific rehearsal-versus-live gap for campaign-draft copy across the generate and export action types — it does not add new ad-policy detection rules beyond what `quickPolicyCheck` already evaluated for the Sandbox, and it does not extend this particular parity check to action types outside the two confirmed to share this exact underlying content. A team wanting broader policy coverage of every possible AI-generated output, not specifically campaign-draft copy, would need that evaluated and built as a separate, additional scope.
A rule enforced once vs. a rule enforced everywhere the content can travel
A safety check wired only into a rehearsal path protects exactly that path and nothing else — the moment a real, consequential action reaches an equivalent outcome through a different route, the rehearsal's correctness becomes irrelevant. Centriu Axiom's fix closes that gap deliberately and completely: the same function, the same rules, and — critically — every action type confirmed to carry the same underlying content, so a fix scoped to only one of two routes couldn't leave the other standing open.
Related systems
Main system: Centriu Axiom.
What it does NOT do
- Does not let a campaign draft's ad copy reach real generation or export without being screened — the same policy-check function the Sandbox already used for rehearsal now runs on both real action types.
- Does not check only the generate action while leaving export unguarded — both `GENERATE_CAMPAIGN_DRAFT` and `EXPORT_CAMPAIGN_DRAFT` are covered, since export reuses the identical underlying copy.
- Does not default to the narrowest, least-strict rule set when a campaign's platform isn't clearly declared — an unclear platform falls back to the broadest, "generic" rule set instead.
- Does not block an action silently — every genuine block is both shown to the user with a specific risk score and finding count, and written to the audit trail with the same details.
- Does not add new ad-policy detection logic beyond what the Sandbox's own rehearsal check already evaluated — the fix is scoped to enforcing the existing rule on the real path, not expanding what is detected.
- Does not treat a passing rehearsal as proof the real action is also safe — the two are now enforced by the identical function specifically so that assumption no longer needs to be made on faith.
Security and governance
The policy check runs against real campaign copy before it can be generated or exported for real, using the same rule engine already relied on for rehearsal. Every genuine block is written to the audit trail with a risk score and finding count. Any personal or business data referenced in generated campaign copy remains subject to 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
Where did the Policy Copilot check actually run before this fix?
Only inside the Sandbox's rehearsal environment, on simulated "submit" steps — the real, live path that generates or exports an actual campaign draft never called it.
Why does the fix cover both generating and exporting a campaign draft?
Exporting a draft downloads the exact same copy an earlier generate action already produced — checking only the generate step would have left export as an unguarded route to identical, unscreened content.
What happens when a campaign's advertising platform isn't clearly declared?
The check deliberately falls back to the broadest, "generic" rule set rather than the narrowest one or skipping the check — when uncertain, it evaluates against more rules, not fewer.
Is a blocked action recorded anywhere, or does it just fail silently?
Every genuine block writes an audit trail entry naming the risk score and finding count, and shows the same information to the person whose action was refused.
Does this add new ad-policy rules beyond what already existed?
No — it enforces the exact same rule engine the Sandbox's rehearsal environment already used; the fix is about where the check runs, not what it detects.
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 enforces the same ad-policy rule in rehearsal and for real
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.