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 天,至少有 65 個不同來源取過版本號(不含我們自己)。 寫「至少」是因為:關掉版本核對的人、以及取不到的人,都不在這個數里。它測不到「有多少人跑過」,只測得到「有多少人取過版本號」。

怎麼算「符合」

只有一個定義:全部 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 控制基線