OceanAltOceanAlt

RAP 一致性测试 v1.0

一份能跑的标准,和一份只能读的标准

RAP 框架发布之后,一直有个问题没解决:怎么判断一个实现「符合」它?

在只能读的标准里,「支付前必须做合规筛查」是一句谁都会点头的话,也是一句谁都能声称自己做到了的话。在能跑的标准里,它是一条会失败的断言,拿一个已知的混币器地址过去,如果你的实现返回 allow,那这条就是不过,没得解释。

我们自己的测试结果

15/15 条通过

跑于 2026/11/1 05:15:04 · https://oceanalt.com

这一栏由每日自测自动写入,按实际结果显示。

怎么对你自己的实现跑

向量只描述 HTTP 请求和对返回的断言,不引用任何 OceanAlt 内部概念。这是它能成为标准一部分的前提,否则它只是我们的自测脚本。critical 有失败就非零退出,可以直接当 CI 门禁。

# 下载 runner(公开仓库,无依赖,Node 18+)
curl -sO https://raw.githubusercontent.com/OceanAlt/mpp-compliance-adapter/main/rap-conformance.mjs

# 对你自己的实现跑
node rap-conformance.mjs https://your-gateway.example

# 也可以对我们跑,结果应该和这一页一致
node rap-conformance.mjs https://oceanalt.com

runner 会联网做一件事,就一件

开跑之前,它向我们取一次当前的向量版本号,好在你手上这份过期时提醒你一句。那次请求里带的是你的 IP 和 runner 版本号,没有别的;它不带你测的是哪个网关、不带任何一条测试结果、不带任何标识。我们落库时连 IP 本身都不存,只存一个每天换盐的哈希,所以同一个 IP 跨天也对不上。

不想要这次回拨:加 --no-version-check,或设 RAP_NO_VERSION_CHECK=1。测试结果一模一样。

最近 30 天,至少有 66 个不同来源取过版本号(不含我们自己)。 写「至少」是因为:关掉版本核对的人、以及取不到的人,都不在这个数里。它测不到「有多少人跑过」,只测得到「有多少人取过版本号」。

怎么算「符合」

只有一个定义:全部 5 条 critical 向量通过。important 没过要如实列出,但不否定符合性。如果把每一条都设成必过,只会让人不跑,或者跑了不说。

各支柱的测试向量

AML、可审计这类要求可以用 HTTP 请求直接断言;隐私、互操作里的很多要求靠单次请求验证不了,所以向量较少。向量多少不代表支柱的重要程度。

身份归因1 条
授权与限额1 条
防火墙1 条
AML 筛查3 条
可审计2 条
隐私3 条
互操作4 条

全部向量

RAP-AML-01critical我们通过

对已知混币器地址必须给出否定判决

筛查真的在跑,而不是对所有地址一律放行。这是整个 RAP 里最容易造假、也最容易验证的一条。

GET /api/decide

RAP-AML-02critical我们通过

筛查不可用时不得谎报为 clear

这是合规软件最危险的一种失败:数据源挂了,却返回「没查到风险」。静默的 PASS 比明确的错误糟得多。

GET /api/decide

RAP-AML-03important我们通过

非法输入不得被当成通过

把无法解析的地址当成「没有风险信号」,是同一个静默 PASS 问题的另一张脸。

GET /api/decide

RAP-AUDIT-01critical我们通过

判决必须附带可核验的证据,而不只是一个分数

分数是不可反驳的。证据可以被第三方点开、复核、推翻 —— 这正是「可审计」的含义。

GET /api/decide

RAP-AUDIT-02important我们通过

机器可读的原因码,而不是自由文本

自由文本让 Agent 只能靠字符串匹配来理解拒绝原因 —— 换个措辞就全崩。

GET /api/decide

RAP-MANDATE-01critical我们通过

超过限额的付款必须被真的拦下

这是 RAP 与「给模型写一段谨慎的提示词」之间的分界线。注意这条必须先设一个限额再测 —— 不设就只能看到那道闸 skip,而一道永远 skip 的闸能让任何实现「通过」。

(需要先建一个带限额的 Agent,跑完自动吊销)· POST /api/pay

RAP-KYA-01important我们通过

服务能自述它跑了哪些控制

一个不肯说自己做了什么检查的合规服务,没法被审计,也没法被对手方评估。

GET /api/pay

RAP-INTEROP-01important我们通过

输出语言可协商,且提供语言无关的判定键

跨境的 Agent 支付里,人读的那句话是给人看的;Agent 该按键判断。只给一种语言的散文,等于把判定逻辑绑死在一种语言上。

GET /api/risk

RAP-INTEROP-02important我们通过

提供机器可发现的接口描述

「可被 Agent 调用」如果只体现在人读的文档里,那 Agent 得先学会读人话文档。

GET /openapi.json

RAP-CONTROLS-01critical我们通过

拒绝时必须给出可执行的下一步

只说「不行」的拒绝,会让自主 Agent 要么无脑重试、要么直接卡死。两种都不是我们想要的。

GET /api/decide

RAP-PRIVACY-01important我们通过

基础筛查不得强制要求注册或身份材料

合规不该以「先把你自己交出来」为前提。查一个公开地址的风险,不需要知道是谁在查。

GET /api/risk

RAP-PRIVACY-02important我们通过

匿名筛查不得给调用方种持久标识

一个只需回答「这地址风不风险」的接口,没有理由记住是谁问的。种 cookie 意味着在做与合规无关的采集。

GET /api/risk

RAP-PRIVACY-03important我们通过

服务必须公开声明数据保留期限

「避免过度采集」如果不说保留多久,就是一句无法核验的话。接入方要评估把查询交给你的风险,首先得知道这些查询会被留多久,而且这个期限要能从机器可读的自述里直接读到,不用去翻法律页猜。

GET /api/pay

RAP-INTEROP-03important我们通过

跨域可调用

很多 Agent 跑在浏览器、扩展或沙箱里。不支持跨域,等于把它们整类排除在外 —— 而它们恰恰是最需要付款前查一下的那批。

GET /api/risk

RAP-INTEROP-04important我们通过

自述里的控制项要带稳定机器键,不能只有显示名

显示名会翻译、会改措辞。机器拿显示名做逻辑,换一次文案就全崩 —— 这和 signal_keys 是同一条道理,只是换了个位置。

GET /api/pay

公开成绩榜

任何人都可以把自己的网关报上来。分数不是自己填的。我们拿同一套向量去跑,跑出什么公布什么,包括没过的那几条。我们自己也在这张表里,同样待遇。

实现通过critical结论未通过项
OceanAlt我们自己https://oceanalt.com15/155/5符合—
OceanAlt 自测-可删https://example.org1/150/5critical 有失败
  • RAP-AML-01 A known mixer address must produce a negative decision
  • RAP-AML-02 When screening is unavailable, the result must not be reported as clear
  • RAP-AML-03 Malformed input must not be treated as a pass
  • RAP-AUDIT-01 A verdict must carry verifiable evidence, not just a score
  • RAP-AUDIT-02 Machine-readable reason codes, not free text
  • +9

主路:自己跑

下载 runner,对你自己的实现跑一遍。向量内嵌在文件里,结果留在你那儿,我们收不到,也不想收。这一条不需要联系我们,不需要注册。

如果你【想要】一个第三方来跑、并且愿意公开结果,才用下面这个接口。提交之后,我们把完整结果私下给你;要不要上榜,你自己再点一次头。

我们从不公开任何人未经其同意的测试结果。我们自己那条永远在榜上,包括没通过的。那是我们对自己的选择,我们不拿它要求别人。

实现方发布一致性测试结果后,会列在这里。

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

# 想要第三方来跑?提交后会拿到一个只属于你的结果地址
curl -X POST https://oceanalt.com/api/rap/conformance/submit   -H "content-type: application/json"   -d '{"name":"Acme Gateway","baseUrl":"https://gateway.acme.example"}'

# 结果默认私有。要上榜,在你自己的结果地址上再点一次头
curl -X POST https://oceanalt.com/api/rap/conformance/result/YOUR_TOKEN   -H "content-type: application/json" -d '{"publish":true}'

机器可读:/api/rap/conformance · RAP 框架 · Agent 控制基线