You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
root_covers_this_receipt: {type: "boolean",description: "true iff index < anchored_tree_size: the anchored ROOT commits to this leaf via the inclusion proof"},
88
+
covers_this_receipt: {type: "boolean",description: "deprecated alias of root_covers_this_receipt"},
{uri: "gblin://howto/seal",name: "How to seal AI actions without limits (x402)",mimeType: "application/json",
106
112
description: "Paid seal endpoint ($0.01 USDC on Base via x402), fields, free reading routes and the offline verifier."},
107
113
{uri: "gblin://limits",name: "Rate limits and costs of this server",mimeType: "application/json",
108
-
description: "60 requests/min/IP on /mcp; seal_action demo 5/day/IP; all tools free; what is paid lives on x402 HTTP endpoints."},
114
+
description: "Machine-readable numbers: 60 requests/min/IP on /mcp, seal_action demo 5/day/IP, all tools free; paid prices of the x402 HTTP endpoints."},
115
+
{uri: "gblin://keys",name: "Signing keys and rotation policy",mimeType: "application/json",
116
+
description: "Current verifier keys (receipts log, witness), the EAS attester wallet, and the pre-registered key-rotation procedure (how old receipts stay verifiable)."},
109
117
];
110
118
111
119
constTOOLS=[
@@ -225,7 +233,7 @@ const TOOLS = [
225
233
tool: {type: "string",description: "Tool/model used (optional, <=128)"},
annotations: {title: "Seal an AI action (demo receipt)",readOnlyHint: false,idempotentHint: false,openWorldHint: false},
231
239
outputSchema: RECEIPT_SCHEMA,
@@ -239,7 +247,7 @@ const TOOLS = [
239
247
},
240
248
{
241
249
name: "verify_receipt",
242
-
description: "Verify a gblin-receipt/v1 JSON with pure math (no log lookup, no trust in this server): leaf hash, Ed25519 signature, RFC 6962 inclusion proof, C2SP checkpoint signature, verifier-key hash. Same checks as the zero-dependency verify-receipt.mjs you can run offline.",
250
+
description: "Verify a gblin-receipt/v1 JSON with pure math (no log lookup, no trust in this server): leaf hash, Ed25519 signature, RFC 6962 inclusion proof, C2SP checkpoint signature, verifier-key hash. Same checks as the zero-dependency verify-receipt.mjs you can run offline. For the extra on-chain-anchor consistency check use GET /v1/verify/:index.",
243
251
inputSchema: {
244
252
type: "object",
245
253
properties: {receipt: {type: "object",description: "The receipt JSON as returned by seal_action / get_receipt / GET /v1/receipt/:i (bare or wrapped in {receipt})"}},
@@ -530,6 +538,9 @@ async function coherenceAttestClosedDay(env) {
530
538
// Mark sealed only after a tx hash exists, so a failure retries next run.
about: "GET-able conformance fixture of the hosted MCP surface: identical data to tools/list and resources/list, plus error shapes and representative outputs. Lets an auditor without POST capability check the live surface.",
984
+
meta,tools: TOOLS,resources: RESOURCES,
985
+
jsonrpc_errors: [
986
+
{code: -32700,when: "body is not JSON"},{code: -32600,when: "not a JSON-RPC 2.0 request"},
987
+
{code: -32601,when: "unknown method"},{code: -32602,when: "unknown tool, bad arguments, or seal_action mode != demo"},
eas_attester_wallet: {address: "0x14d4d81233EAa95F071f514510661a2a873D83a1",role: "pays the daily EAS attestations on Base (Coherence days + receipts-log root)",note: "dedicated hot wallet, not the protocol owner"},
1023
+
rotation_policy: {
1024
+
trigger: "suspected compromise or scheduled rotation; never silent",
1025
+
procedure: [
1026
+
"1. New keypair generated; new verifier_key published here, in /log/checkpoint and in llms.txt with the rotation date.",
1027
+
"2. The last checkpoint signed by the OLD key is sealed on Base via EAS (same schema) so the hand-over point is on-chain.",
1028
+
"3. The old verifier_key stays listed under retired_keys with its valid_until and last_tree_size; receipts issued before that size verify with the old key.",
1029
+
"4. The new key signs a checkpoint over the SAME tree (no new log, no re-indexing): inclusion proofs of old receipts remain valid against new checkpoints.",
1030
+
],
1031
+
retired_keys: [],
1032
+
last_rotation: null,
1033
+
},
1034
+
};
1035
+
}
931
1036
default: returnnull;
932
1037
}
933
1038
}
@@ -966,12 +1071,12 @@ async function handleMessage(msg, env) {
note: "Cryptographic checks are recomputed server-side from the receipt alone (same math as verify_receipt / verify-receipt.mjs); anchor_root_matches recomputes the root at anchored_tree_size from the log and compares it with the root written on Base. Trust model: re-run verify-receipt.mjs offline if you do not trust this server.",
0 commit comments