OceanAltOceanAlt

RAP CONFORMANCE v1.0

A standard you can run, versus one you can only read

One question went unanswered after the RAP framework was published: how do you tell whether an implementation actually meets it?

In a standard you read, “screen the counterparty before paying” is a sentence everyone nods at — and one everyone can claim to satisfy. In a standard you run, it is an assertion that can fail: send a known mixer address, and if your implementation answers allow, that vector fails. There is nothing to explain.

Our own results

15/15 vectors passed

Run at 17/09/2026, 05:15:03 · https://oceanalt.com

Written automatically by the daily self-test; shows the actual result.

Running it against your own implementation

The vectors describe only HTTP requests and assertions on responses; they reference nothing internal to OceanAlt — which is what makes them part of a standard rather than our own test script. The runner exits non-zero on any critical failure, so it works as a CI gate.

# download the runner (public repo, no dependencies, Node 18+)
curl -sO https://raw.githubusercontent.com/OceanAlt/mpp-compliance-adapter/main/rap-conformance.mjs

# run it against your own implementation
node rap-conformance.mjs https://your-gateway.example

# or run it against us — the result should match this page
node rap-conformance.mjs https://oceanalt.com

What counts as conformant

There is exactly one definition: all 5 critical vectors pass. Failing important vectors must be disclosed but do not negate conformance — make everything mandatory and people simply do not run it, or run it and stay quiet.

Vectors by pillar

AML and auditability can be asserted directly with HTTP requests; much of privacy and interoperability cannot be verified by a single request, so those pillars have fewer vectors. The count does not reflect a pillar's importance.

Attribution1
Mandate & limits1
Firewall1
AML screening3
Auditability2
Privacy3
Interoperability4

All vectors

RAP-AML-01criticalwe pass

A known mixer address must produce a negative decision

Screening actually runs, rather than waving everything through. It is the easiest claim in RAP to fake and the easiest to check.

GET /api/decide

RAP-AML-02criticalwe pass

When screening is unavailable, the result must not be reported as clear

This is the most dangerous failure mode in compliance software: the data source is down and the answer comes back as “no risk found”. A silent PASS is far worse than a loud error.

GET /api/decide

RAP-AML-03importantwe pass

Malformed input must not be treated as a pass

Treating an unparseable address as “no risk signal” is the same silent-PASS problem wearing a different face.

GET /api/decide

RAP-AUDIT-01criticalwe pass

A verdict must carry verifiable evidence, not just a score

A score cannot be argued with. Evidence can be opened, re-checked and overturned by a third party — which is what auditability means.

GET /api/decide

RAP-AUDIT-02importantwe pass

Machine-readable reason codes, not free text

Free text forces an agent to string-match its way to understanding a refusal — one rewording and it all breaks.

GET /api/decide

RAP-MANDATE-01criticalwe pass

A payment above the mandate ceiling must actually be blocked

This is the line between RAP and “write the model a careful prompt”. Note it must set a ceiling first: without one the gate merely skips, and a gate that always skips lets any implementation “pass”.

(sets up an agent with a ceiling first, revoked afterwards) · POST /api/pay

RAP-KYA-01importantwe pass

The service can describe which controls it runs

A compliance service that will not say which checks it runs cannot be audited, nor assessed by a counterparty.

GET /api/pay

RAP-INTEROP-01importantwe pass

Output language is negotiable, and language-independent keys are provided

In cross-border agent payments the human sentence is for humans; the agent should branch on keys. Prose in a single language ties decision logic to that language.

GET /api/risk

RAP-INTEROP-02importantwe pass

A machine-discoverable interface description is published

If “callable by agents” exists only in human documentation, the agent first has to learn to read human documentation.

GET /openapi.json

RAP-CONTROLS-01criticalwe pass

A refusal must come with an actionable next step

A refusal that only says “no” leaves an autonomous agent either retrying blindly or stuck. Neither is what we want.

GET /api/decide

RAP-PRIVACY-01importantwe pass

Basic screening must not require signup or identity documents

Compliance should not be premised on “hand yourself over first”. Checking a public address's risk does not require knowing who is asking.

GET /api/risk

RAP-PRIVACY-02importantwe pass

Anonymous screening must not set a persistent identifier on the caller

An endpoint whose only job is to answer whether an address is risky has no reason to remember who asked. Setting a cookie means collecting something the compliance task does not need.

GET /api/risk

RAP-PRIVACY-03importantwe pass

The service must publicly state how long it retains data

“We avoid over-collecting” is unverifiable without a retention period. Anyone deciding whether to send you their queries needs to know how long those queries live, and needs to read that period straight from the machine-readable self-description rather than inferring it from a legal page.

GET /api/pay

RAP-INTEROP-03importantwe pass

Callable cross-origin

Many agents run in a browser, an extension or a sandbox. Refusing cross-origin calls excludes that entire class — which is precisely the class that most needs to check before paying.

GET /api/risk

RAP-INTEROP-04importantwe pass

Self-described controls must carry stable machine keys, not only display names

Display names get translated and reworded. Logic branching on a display name breaks the next time the copy changes — the same principle as signal_keys, one layer over.

GET /api/pay

Public scoreboard

Anyone can enter their gateway. Scores are not self-reported: we run the same vectors ourselves and publish what comes out, failures included. Our own implementation sits in the same table, treated the same way.

ImplementationPassedcriticalVerdictFailed vectors
OceanAltushttps://oceanalt.com15/155/5conformant

Want to enter?

Run it yourself first — the script is public, dependency-free and needs no signup. Results are published in full, including failed vectors.

curl -sO https://raw.githubusercontent.com/OceanAlt/mpp-compliance-adapter/main/rap-conformance.mjs
node rap-conformance.mjs https://your-gateway.example

# happy with it? then submit
curl -X POST https://oceanalt.com/api/rap/conformance/submit   -H "content-type: application/json"   -d '{"name":"Acme Gateway","baseUrl":"https://gateway.acme.example"}'

Machine-readable: /api/rap/conformance · The RAP framework · Agent Control Baseline