OceanAltOceanAlt

CONTROL BASELINE v1.0

How do you know this agent hasn't been talked into it?

It is the question everyone who hands money to an AI eventually asks. Our answer may not be the one you expect:

We do not try to judge whether its thinking is clean.

Because that cannot be done, and cannot be shown. Whether a model was nudged off course by a sentence hidden in a web page is not something you can open its head and check; any product claiming otherwise is selling you a statement you cannot verify.

So we stand somewhere else: we put the boundary outside its reasoning. An agent can be persuaded to do anything, but it cannot persuade a spending ceiling it has no reach over, or rewrite a payee list it has no authority to touch. If it wants to send $50,000 and the ceiling is $500, the answer is $500 — however good its reasons sound.

This approach is not ours

In 2016 attackers used stolen credentials to move $81 million out of Bangladesh Bank. SWIFT's response was not to guess which terminal had been compromised — it published a control baseline, required every member to attest against it, and made each member's attestation visible to counterparties before they transacted. Those three moves are the three layers below.

The RAP (Responsible Agentic Payments) framework →

A control list written down plainly

17 controls, 10 of them mandatory. Each one is answerable yes or no, with no room to explain — because a list that leaves room to explain ends up being one that everybody claims to meet.

Attest control by control, and get a verifiable receipt

Report what you actually do. You can file with gaps — declare them, and say how you plan to close them. Make attestation a test only a perfect score can pass, and you get no filings, or dishonest ones.

The counterparty can look you up before paying

This layer is what makes the other two matter. However good the list and however careful the attestation, if the payer cannot see it before paying, it is a document that talks only to itself.

What we can prove, and what is only a claim

This distinction is the most important thing in the baseline. Some controls run at our gateway on every single payment, and we can produce the record. Others are about what the counterparty does on their own side, where all we hold is their statement. Presenting the two as one would be passing someone's claim off as our verification — so every control below is colour-coded, and the lookup API returns the two sets separately.

Gateway-enforcedOn-chain verifiableSelf-attested

Identity & attribution

Every payment traces back to a specific accountable party, not merely “some agent”.

ACB-1.1Gateway-enforcedMandatory

Every paying agent is attributed to a registered party

Without attribution, after an incident you cannot even say whom to go to — let alone claw back or revoke.

What counts as met: Register the agent at the gateway with an accountable entity; every payment carries its agentId.

ACB-1.2Gateway-enforcedMandatory

Agent identity is proven, not merely claimed

Accepting an agentId without a credential lets anyone impersonate another agent — which nullifies attribution entirely.

What counts as met: An agentSecret is issued at registration and presented in the x-agent-secret header on every call. Rotatable.

ACB-1.3Self-attestedAdvisory

The accountable party has passed third-party identity verification (KYC/KYB)

A self-typed entity name can be any string. For attribution to hold up legally, the party itself must have been verified.

What counts as met: Complete verification through the gateway's KYC integration, or supply your existing KYB evidence.

Mandate boundary

How much it may spend, to whom, and for what — written down where the agent cannot reach.

ACB-2.1Gateway-enforcedMandatory

A per-payment ceiling is set

The most direct way to monetise a prompt injection is a single transfer of everything. A per-payment ceiling caps the worst case at a number you can absorb.

What counts as met: Set mandate.maxUsdc for the agent; anything above it is blocked, with no exceptions.

ACB-2.2Gateway-enforcedMandatory

A daily cumulative ceiling is set

With only a per-payment cap, an attacker splits the theft into a hundred small ones. The cumulative cap governs the total.

What counts as met: Set mandate.dailyUsdc; once the day's total exceeds it, payments are blocked.

ACB-2.3Gateway-enforcedAdvisory

A payee allowlist is in place

Ceilings govern how much, not to whom. An allowlist means a compromised agent cannot reach the attacker's address even within its limits.

What counts as met: Set mandate.payees; any payee outside the list is blocked. Suited to flows where payees are known in advance.

ACB-2.4Gateway-enforcedAdvisory

Payment purpose is matched against the mandate

Amount and payee both fine, purpose entirely unrelated — that is the most characteristic trace a prompt injection leaves.

What counts as met: Set mandate.purpose and pass a purpose with each payment; the gateway compares intent.

Enforcement point

The boundary is not an instruction in a prompt; it is a checkpoint the agent cannot talk its way past.

ACB-3.1Gateway-enforcedMandatory

The boundary is enforced outside the agent's reasoning

This is the core of the whole baseline. “Never exceed $100” written in a system prompt is a sentence that can be argued with; the same rule at the gateway is not. Any limit the agent can rewrite, bypass, or explain its way around is not a control.

What counts as met: Payments go through the gateway (or an on-chain policy contract); limits, allowlists and purpose are adjudicated there — the agent cannot modify its own mandate.

ACB-3.2Gateway-enforcedMandatory

The payee is screened for compliance before settlement

Once funds are on-chain they do not come back. Screening has to happen before settlement, not during reconciliation afterwards.

What counts as met: Run AML screening before each payment (sanctions / mixer / risk lists + on-chain heuristics); a hit blocks the payment.

ACB-3.3Gateway-enforcedMandatory

Replay and double-spend are prevented

A request that passed every check will pass again on replay, each time “legitimately”. The control point has to remember it already approved that payment.

What counts as met: Each payment carries a single-use nonce that the gateway records and rejects on reuse.

ACB-3.4On-chain verifiableAdvisory

The same rules are also written into an on-chain policy contract

When an agent settles directly on-chain it does not pass the gateway. For the boundary to hold on that rail too, the rules must be enforced on-chain — where anyone can verify them.

What counts as met: Bind an on-chain policy contract in the console and sync limits/allowlist to it. The session private key never leaves your side.

Observability & audit trail

After an incident you can reconstruct what happened — and the agent did not author that record.

ACB-4.1Gateway-enforcedMandatory

Both approvals and blocks leave a non-repudiable record

Logging only blocks leaves you unable to explain why a given payment was let through. And the record must not be authored by the agent — a compromised agent will compromise its own log too.

What counts as met: The gateway records every verdict (per-gate results + evidence). The record is produced by the gateway; the agent cannot write to it.

ACB-4.2Gateway-enforcedAdvisory

Verdicts can be verified by a third party

“We screened it” is a claim. A verifiable attestation lets the counterparty, an auditor or a regulator confirm it themselves rather than take your word.

What counts as met: An attestation is issued on allow/review and bound to the settlement memo; anyone can re-check it at /api/attestation/verify.

ACB-4.3Self-attestedAdvisory

Someone actually watches for anomalies

Every control shares one precondition: somebody notices when it fires. An alert nobody reads is not an alert.

What counts as met: Wire alerts to a channel (email / IM / webhook) and name who is responsible for responding.

Revocation & incident response

When something looks wrong there is a stop button that takes effect now, not at the next deploy.

ACB-5.1Gateway-enforcedMandatory

A mandate can be revoked with immediate effect

When an agent goes wrong you need it stopped now, not at the next deploy. Revocation has to take effect before the next payment.

What counts as met: One click in the console; the gateway checks revocation on every payment and blocks immediately once revoked.

ACB-5.2Self-attestedMandatory

Credentials are rotatable, and rotation actually happens

Credential leaks are a when, not an if. Being able to rotate is what makes a leak an incident rather than an ending.

What counts as met: Use the gateway's credential rotation endpoint, and agree a rotation cadence plus a leak playbook.

ACB-5.3Gateway-enforcedAdvisory

Large payments are held for human approval

Not everything should be fully autonomous. Above a chosen amount, have a human look — that look costs far less than one wrong payment.

What counts as met: Set mandate.holdUsdc; payments at or above the threshold are held pending human approval before settlement.

How to use it

I run an agent and want to attest

Use the form — five minutes →no code, no account

Pull the control list, answer honestly for what you actually do, and submit. Mark what you have not done as false and say how you plan to close it in gapPlan.

curl https://oceanalt.com/api/baseline

curl -X POST https://oceanalt.com/api/baseline/attest \
  -H "content-type: application/json" \
  -d '{"entity":"Acme Robotics Ltd",
       "answers":{"ACB-1.1":true,"ACB-2.1":true,"ACB-3.1":true},
       "gapPlan":"Daily cap ships next sprint"}'

I am about to pay and want to check the other side

Finding nothing is not bad news — most parties have not attested. No record means no information, not a negative signal; do not decline on that basis alone.

curl "https://oceanalt.com/api/baseline/lookup?entity=Acme%20Robotics%20Ltd"

# or ask for it inside the payment decision
curl "https://oceanalt.com/api/decide?to=0x…&counterparty=acme-robotics-ltd"

What this is not

Meeting this baseline is not compliance, not a licence, and not safety. What it lowers is the ceiling on how much damage a persuaded agent can do — it does not promise nothing goes wrong. Items marked as self-attested have not been verified by OceanAlt.

Machine-readable: /api/baseline · /openapi.json