Each step on this page adds one idea to the step before it. A person uses a page. The rule inside the page becomes a kernel, the kernel becomes a node, and each answer gets a hash that anyone holding the inputs can recompute. Agents reach that same kernel from a link, from inside the browser, or over the network. Nodes are ordered into workflows, and the evidence around an answer grows as a signature, a kernel identity, a zkVM receipt and outside timestamps are added. By the last step, a single prompt sends an agent through several workflows and across two blockchains, and anyone can check what it brings back with public tools.
Each step names one term, animates it, and ends with the prompt an agent can send once that step exists. From step 2 to step 8 the example is a single node, art-591, which recovers the address that signed an EIP-712 digest, the same check a merchant runs on an agent's x402 payment authorization.
A tool is a single HTML page with a form, its math written inline, and a result panel. Once loaded, it computes in the tab without calling a server or storing anything. The Agentic Checkout Protocol Selector, for example, asks for a merchant platform, buyer type, order value and agent-traffic appetite, then ranks checkout protocols.
Tools are built for people; an agent reaches one by handing you a link that fills the form (step 5). A workflow can include a tool as a human step: tool 495 is the first step of the agentic-commerce-checkout workflow, marked for a person to run. A tool that sets policy exports a Policy Mandate, the JSON file that carries one tool's result into the next.
You, at the keyboard: open the page, fill the fields, press Run.
A kernel is the page's rule in a module of its own: compute(policy_parameters) returns output_payload and reads only its inputs. That purity lets the same file run in a browser tab, on a Cloudflare Worker and inside a zkVM with identical results.
Every kernel lives at chaingraph/kernels/<tool_id>.kernel.mjs and exports compute, buildArtifact and meta (SPEC §12). The x402 signer-recovery kernel is the running example through step 8. Its source digest, sha256:4dfa2047d3aeebb35c0825fa07d54d487c7b254d0ad031e2d0c360a3736b5ab7, is how each surface names the exact bytes it ran (step 11).
import { compute } from './kernels/art-591-x402-signer-recovery-verifier.kernel.mjs'
compute({ digest, r, s, yParity, claimedFrom })
// { verdict: 'SIGNER_RECOVERED', recovered_signer: '0x7e5f…5bdf', recovered_signer_matches_claimed_from: true, ... }A node is a kernel registered in the Graph Index, chaingraph.json (SPEC §7): a tool_id, an agent-facing name, declared inputs, a page, and digests that pin its code. art-591 was one of 663 live nodes on 26 September 2026.
The Graph Index is a DCAT catalog. A tool serves people; a node serves people and agents at once, with one kernel behind its page, its MCP tool and, on pages like art-591, a WebMCP registration. Nodes also declare consumes and feeds edges, so an agent can plan which nodes fit together before it runs anything.
Find the AINumbers tool that recovers the signer of an EIP-712 digest, and list its inputs.
Every run emits an execution_hash: SHA-256 over the canonical JSON (RFC 8785) of exactly {policy_parameters, output_payload}. Anyone holding the inputs can recompute it. Change the last character of the signature's s value and the recovered signer changes, the match fails, and the hash changes completely.
This is the base of the staircase: anyone with the inputs and a SHA-256 implementation can recompute the hash (SPEC §4). Canonical JSON removes differences in key order and whitespace, and every value is covered, so dropping one output field fails verification. verify_execution_hash on the MCP server does the recomputation for any caller.
Call verify_x402_signer_recovery with these fields and give me the execution_hash. Then change the last character of s and show me what moves.
AIN Bridge is a small script inside nearly every tool page. It accepts inputs from a #in= URL fragment, which the browser keeps to itself, from a dropped Policy Mandate file, or from postMessage sent by a same-origin parent frame. Node pages carry a sibling deep link, #p=v1, that gzips the inputs; adding &run=1 computes on load.
Workflow runner pages use the message channel to drive each step in an iframe: prefill it, run it and collect its mandate. The bridge sets values through .value and .checked and calls the one run function the page declares, so a link reaches the declared fields and that function alone.
Give me a link that opens the art-591 page with these inputs filled in and runs it on load.
With WebMCP the page registers its own tool with the browser: registerTool({ name: 'verify_x402_signer_recovery', inputSchema, execute }). A browser-resident agent calls it and the page computes in the tab. In our run, the page's registered function made 0 network requests and produced sha256:1bc5c975…7a64.
Chrome is testing WebMCP in public through an origin trial in Chrome 149 to 156, and Chrome 157 is the tentative milestone for turning it on by default. On 26 September 2026 the trial token was on 472 pages of this site, art-591 and 359 workflow pages among them, so those Chrome versions expose the tools to a browser agent without a flag. The art-591 page registers in wrapper mode: the agent's arguments fill the page's own form and the page's own run function computes, so the hash matches the page's deep link exactly.
A local-first agent setup of the kind Vitalik Buterin describes in My self-sovereign / local / private / secure LLM setup (April 2026) keeps inference and files on the user's machine and sandboxes its tools, and it still cannot show a third party what the agent decided or computed. The Work Mandate states what the agent was allowed to do. The execution receipt proves what it did. Both verify offline, so the audit trail outlives the machine it ran on.
You are in my browser on the art-591 page. Use the tool this page registers to check this signature. Do not send anything off the page, and tell me how many network requests the call made.
The MCP server at mcp.ainumbers.co runs the same kernel on a Cloudflare Worker. Send it the parameters the page used and it returns the same hash, sha256:1bc5c975…7a64, together with the digest of the kernel it ran. Whether an agent arrives by link, through the browser or over the network, the kernel and the hash are the same.
The page fills every declared field, empty strings included, while a lean call leaves them out, so the two preimages and their hashes differ even though the verdict agrees; the hash commits to the exact bytes. The server lists one tool per node, a set of pilot widgets, and utility tools such as find_chain, run_chain, verify_execution_hash and build_session_receipt. For new inputs it attaches the kernel identity at once and marks the zk receipt as deferred (step 13).
Call verify_x402_signer_recovery on https://mcp.ainumbers.co/mcp with the exact parameters the page used, and compare its execution_hash with the page's, character by character.
A workflow is an ordered list of nodes in the Graph Index. The standard calls it a chain (SPEC §21), which is why the tool that runs one is run_chain; on this page, chain means a blockchain. The x402-spend-evidence workflow recomputes the EIP-712 digest (art-590), recovers the signer (art-591), then checks the domain, nonce and validity window (art-592). run_chain threads each step's execution hash into the next step's parent_hashes and returns one composite hash over the steps that ran.
Each step reads its own inputs from the caller or from the workflow's fixture, and the record shows what each step decided and in which order. Gates can route a run forward, end it, or escalate it to a person (SPEC §21.4 and §22.8). On 26 September 2026 the Graph Index held 370 workflows, 67 of them with gates. A composite hash can be cited as a parent hash by a step in another workflow, which is how an agent carries a receipt from one workflow into the next.
Run the x402-spend-evidence workflow on this authorization with run_chain, and give me each step's verdict and execution_hash plus the composite.
A workflow can run on the public server through run_chain, or it can be compiled into a Helm pack: a control-plane manifest (SPEC §26) listing its trigger, its nodes with their kernel digests, its gates and its actions. helmd, a daemon that listens on your own machine, runs the pack.
helmd listens on 127.0.0.1 and exposes eight MCP tools. An agent can describe, dry-run, run and verify a pack, and exporting evidence waits for a person to mint a consent ticket in the Helm UI. Helm is in beta, and its packs run on bundled sample data. On the public server, suite_howto serves workflow recipes that walk an agent through a workflow step by step.
On my local Helm daemon, find the agent commerce conformance workflow, list its nodes, gates and manifest digest, and dry-run it. Do not export evidence.
A signature adds who stands behind an artifact. OpenChainGraph uses W3C Data Integrity eddsa-jcs-2022 over the whole artifact, keyed by a did:key (SPEC §16). In Example 2 a principal's key signs a Work Mandate, and a copy edited after signing is refused with mandate_bad_signature.
Signing is optional and done by whoever holds a key, here the mandate's principal. Node results from the public server carry a hash and a kernel identity, and its credential tool generates a fresh key for each call. Several parties can sign one artifact as a proof set, an endorsement can sign over an earlier signature (SPEC §16.5), and a hybrid post-quantum profile adds ML-DSA (§PQC-1).
Before you act on this mandate, verify its eddsa-jcs-2022 signature and tell me which did:key signed it and whether that is the principal it names.
Every artifact the server returns names the kernel it ran: build_identity.kernel_digest is SHA-256 over the kernel's source (SPEC §17). A verifier checks that three values agree: the artifact's digest, the node's published compute_images entry, and a digest recomputed from the source. For art-591 all three read sha256:4dfa2047…5ab7.
A mismatch among the three values fails the binding. On its own this is an advisory claim (SPEC §17.2): a server could name one kernel and run another, which the zkVM receipt in steps 12 and 13 rules out. Each digest is published with a valid_from date, so a kernel change shows up as a new digest.
Which exact kernel produced this result? Compare the kernel_digest in the artifact with art-591's sha256-source entry in https://ainumbers.co/chaingraph/chaingraph.json.
To prove execution, the same kernel source runs inside RISC Zero's zkVM: a QuickJS JavaScript engine compiled into a RISC-V (RV32IM) guest that takes the kernel as data. The guest commits a journal holding the kernel digest and the output, and the receipt is bound to the guest program's ImageID, sha256:a1a0bc89…7bc6, one universal guest shared by nearly every node.
Proving is heavy, so it runs offline on a GPU (SPEC §18.2), and every surface verifies. Because the guest interprets the kernel source as data, one ImageID serves almost every node, and the journal's kernel_digest ties the receipt to the exact source from step 11. The journal's output must equal the artifact's output_payload, so the proof speaks about this particular answer.
Show me art-591's zkVM receipt from the Graph Index: the system, the ImageID it pins, and the kernel digest in its journal. Does the journal's output match the node's published fixture output?
RISC Zero wraps its STARK into a Groth16 SNARK over the BN254 curve: a 256-byte seal. OpenChainGraph ships its own verifier, verifySeal, which rebuilds the claim from the ImageID and journal and runs the pairing check in about a tenth of a second in a browser or a Worker. On 26 September 2026 every live node carried one, 663 of 663.
A stored receipt proves that the node's kernel ran on its published fixture, and it is renewed by an offline re-prove when the inputs or the kernel change; until then a new run reads compute_proof_ready: deferred, as ours did. A freshness check flags receipts whose journal names an earlier kernel digest. The verifier handles RISC Zero receipts, and the SPEC names SP1 as another system that emits the same seal format.
Verify art-591's Groth16 seal against its ImageID and journal with the published verifier, without re-running the kernel. Then tell me whether my own run today is covered by that receipt.
build_session_receipt folds any number of execution hashes into one Merkle root. anchor.ainumbers.co then asks independent timestamp authorities to sign that root as RFC 3161 tokens; OpenTimestamps and a witness-cosigned Sigsum log are supported too (SPEC §20). The tokens verify offline against pinned roots, with no AINumbers server involved.
An anchor fixes when a value existed; steps 4 to 13 establish what the value means. The ledger at ledger.ainumbers.co replays hashes, signatures, kernel identity and gate decisions in the browser from a URL fragment, and the anchor page verifies timestamp tokens the same way, so both checks run on the reader's own machine.
Bundle every execution hash from this session into one receipt with build_session_receipt, then timestamp the root with anchor_hash on https://anchor.ainumbers.co/mcp using the sigstore, digicert and freetsa authorities, and verify the tokens.
Each example below gives a copy-paste prompt for any agent that can reach the public MCP server or a browser tab, the live answers it produced, and an animation of what happened. They cross two kinds of boundary: workflows that hand receipts to one another, and blockchains, each of which a signature is bound to.
EIP-3009 lets an agent pay with a signed transfer authorization, and x402 uses it for HTTP payments. EIP-712 folds the chain id and the token contract into the digest the agent signs, so a signature made for USDC on Base cannot be replayed on Ethereum. The x402-spend-evidence workflow checks both halves, and the results below are from live runs.
| Run | Domain check (art-592) | Composite execution hash | Verify |
|---|---|---|---|
| Signed for Base, checked on Base | PASS | ad46564c00bd402b0e6e5c930187d19236149d75d84cd4b40529bb2bdf84211b | ledger |
| Same signature replayed on Ethereum | REFUSE chain + contract mismatch | a7a6588be0ebbb9d74430c09c1e40021f9f5ac98e3608c8e373daaec912b0269 | ledger |
| Signed for Ethereum, checked on Ethereum | PASS | 424209654e4c3106de219067251a739f023c7c65ef259b32cac649b1d933575e | ledger |
The signer is the public test key 1 (address 0x7e5f4552091a69125d5dfcb7b8c2659029395bdf), and the recovered signer equals the authorization's from. The workflow produces evidence about the authorization; moving the funds and enforcing nonce uniqueness happen in the USDC contract at settlement. Each ledger link carries the whole run in its URL fragment and re-checks it in your browser.
You are checking an agent's USDC payment authorization before a merchant accepts it. Use the MCP server at https://mcp.ainumbers.co/mcp (streamable HTTP, no key). All data is synthetic: the signer is the public test key 1.
1. Call run_chain with chain "x402-spend-evidence", compute "server", and these inputs:
{"art-590-x402-eip712-digest-recomputer":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","from":"0x7e5f4552091a69125d5dfcb7b8c2659029395bdf","to":"0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f2","value":1000000,"validAfter":0,"validBefore":2000000000,"nonce":"0x000000000000000000000000000000000000000000000000000000000000002a"},
"art-591-x402-signer-recovery-verifier":{"digest":"0x6948b98d3f3adffc2d4e9d6a62634dddfd9ed74221f1970c54fe301712cbf1b7","r":"0x2a7b25162f218d75ae1731cc95931e21b505aa5e095f23a6ae07c4394fd3b457","s":"0x36c25d04da5f28533648b7ea241aa84ce5b138f90fb23dcb53a6969c2b2173bf","yParity":1,"claimedFrom":"0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"},
"art-592-x402-domain-nonce-window-checker":{"expected_chain_id":8453,"expected_verifying_contract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","validAfter":0,"validBefore":2000000000,"now_unix":1790000000,"nonce":"0x000000000000000000000000000000000000000000000000000000000000002a","nonce_already_used":false}}
Report each step's verdict and execution_hash, the composite_execution_hash and the ledger_url.
2. Someone replays the same signed authorization on Ethereum mainnet. Run the workflow again, changing only art-592's expected_chain_id to 1 and expected_verifying_contract to 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48. Report the verdict and explain why it changed.
3. Recompute the digest with chainId 1 and the mainnet USDC contract, and explain why the Base signature cannot be reused for it.
4. Call build_session_receipt over the two composite hashes, in order, and give me the root.A principal signs a Work Mandate that scopes what an agent may run (SPEC §22). run_chain verifies the signature, then folds the mandate hash into every step, so the receipt proves which policy governed the run. When a gate trips, the run halts and opens a record that a person must close.
| Run | Status | Composite or record hash | Verify |
|---|---|---|---|
| agent-commerce-conformance, no mandate | 4 of 4 ran | e51f3c239b0e4395f5baa5d1f1088eca22852be4521b198089ea3a4356428bb6 | |
| same workflow under the mandate | 4 of 4 ran every step hash changed | c5486c0547530fc9542360f73a53f3149d0df9e25abff01071d653088f975eb6 | ledger |
| escalation-sla-supervised-autonomy-receipt under the mandate | escalated at art-67, art-236 skipped | 7519b7d687df882f191cb5580ca7f9df93fc1b60bb2d2e56978290d7ad8b3e46 record b5f9ce9472b0de3df9f2bfe2e071910af7ad12163e4b77c73ba3ceadd4abd3ba | ledger |
| mandate edited after signing | mandate_bad_signature | stopped before step 1 |
The mandate is synthetic: a key generated for this run signed it, scoped to the two workflows above and valid from 25 September to 25 October 2026. Closing the open record takes a signed decision through the anchor server's create_signature_envelope and verify_escalation_closure tools. These runs exercise signature verification and the hash binding.
You act for a treasury team under a signed OpenChainGraph Work Mandate. Prove the mandate governed every step, and show what happens when a case leaves the automated path. Use https://mcp.ainumbers.co/mcp. The mandate below is synthetic (a throwaway key signed it) and is valid until 25 October 2026.
MANDATE = {"chaingraph_version":"0.4.0","mandate_type":"work_mandate","tool_id":"work-mandate","generated_at":"2026-09-25T12:00:00Z","policy_parameters":{},"output_payload":{"mandate_type":"work_mandate","scope":{"tool_ids":[],"chains":["agent-commerce-conformance","escalation-sla-supervised-autonomy-receipt"]},"conditions":[],"escalation_triggers":[],"validity":{"not_before":"2026-09-25T00:00:00Z","not_after":"2026-10-25T00:00:00Z"},"principal":{"id":"did:key:z6MkhU7ioaZXvWTnV5eQPCfEuwyX6JMM3roPpgBf3XcDu2T4"}},"execution_hash":"2266ce3efbb34154345acda9018a1955b7a187b310849721b9f02fafcf3e5f73","audit_signature":{"proof":{"type":"DataIntegrityProof","cryptosuite":"eddsa-jcs-2022","verificationMethod":"did:key:z6MkhU7ioaZXvWTnV5eQPCfEuwyX6JMM3roPpgBf3XcDu2T4","proofPurpose":"assertionMethod","created":"2026-09-25T12:00:00Z","proofValue":"z3qwKgvT7MmVLd9XDD4fSnUorXhhq9sruyTvoEwTe4qgzTv6LV7b4Q3JYPduYQ6VeF6rdEL4FixBCHV7tBJZuLVxd"}}}
1. Call run_chain with chain "agent-commerce-conformance", compute "server", and mandate MANDATE. Report each step's execution_hash and the composite. Run it again without the mandate and explain why every hash differs.
2. Call run_chain with chain "escalation-sla-supervised-autonomy-receipt", compute "server", and the same mandate. Report the status, which gate fired, which step was skipped, and the escalation record's record_hash, and confirm the record carries the mandate hash.
3. Change one character inside MANDATE's scope and call run_chain again. Quote the error.Four EMIR Refit checks, UTI completeness, UPI validity, lifecycle action and reporting readiness, run inside their own pages from fragment links. The trade fields stay in the browser; only four hashes leave, to be bound into a receipt and timestamped. Each page's hash equals the kernel's hash for the same inputs.
| Node (in-page, from a fragment link) | Result | Execution hash (page = kernel) |
|---|---|---|
| art-154 check_emir_uti_completeness | uti_complete | ef76f68fe520581b62ead2423822022b70d71d0dbd69445e9bde8226260892b5 |
| art-155 validate_emir_upi | upi_valid | 3ef8679a7817268f7df888891874caf57a037f39547eb69604590ff8d7c77ea1 |
| art-157 validate_emir_lifecycle_event | action_legal | f5a9670511d044f8ae1f180c39d75c66fa84f6944157791befb523b7044e5205 |
| art-158 run_emir_reporting_fit | ready, grade A | e89f8f61eb15ddbbd19553c0abb28869c8ed53e46d100228ec171c21f05c5cc8 |
A third party re-verifies one of these results from its disclosed inputs. For data that stays private, SPEC §25 defines a profile in which a zkVM receipt over committed inputs becomes the verification path; these four nodes use the standard hash. Each page ships its own synthetic sample, and those are the inputs used here.
You are a trade-reporting agent working inside my browser. The trade fields must not leave this tab. All values are the pages' own synthetic samples. 1. Open each link below. Each carries its inputs in the URL fragment, which the browser never sends to a server, and computes on load: https://ainumbers.co/chaingraph/art-154-emir-uti-completeness-checker.html#p=v1.H4sIAAAAAAAACk3NsQrCMBQF0H95c4ab5yNts3XoIDQoakG6hEBDzRIkpqCI_y5uzmc4b9pqIkvTZQ_o4dq74zgwWCDcQZOiNeZYQk159fdQ6ossuX44w_DM-iCnmafGdYYU1RKW6LecnmR1o2UnbQuo3-Aft1Di8ocCI8DnC0SuYMyAAAAA&run=1 https://ainumbers.co/chaingraph/art-155-emir-upi-validator.html#p=v1.H4sIAAAAAAAACqtWKi3IVLJScvHy9TUIizD3iDRxVNJRSiwuTi2JT85JLC5WslLyDFLSUcrMKy4pKs1NzSuJL6ksSAULByvVAgC_AoEMQQAAAA&run=1 https://ainumbers.co/chaingraph/art-157-emir-lifecycle-event-validator.html#p=v1.H4sIAAAAAAAACqtWSkwuyczPiy-pLEhVslLySy1X0lEqKMrML4ovLkksAYnl5eelKtUCAJia9okqAAAA&run=1 https://ainumbers.co/chaingraph/art-158-emir-reporting-readiness-diagnostic.html#p=v1.H4sIAAAAAAAACkXKOwoCQQwA0LtMbbFM6WVCyGbXQEwkH0HEu4uKWr93H5I-l2VOoC6_csDqxuNY0XwYfRFI7yCxHchtk72D1x-XQJ4wXpqKcOb6UjC5kahgiRuUKwcaMeT_qGxMN1IGpPcitwrX_ITHE--iBo6dAAAA&run=1 2. From each page, read the execution hash it produced, and confirm in DevTools that no request left the tab after the page loaded. 3. Send only the four hashes (bare hex, without the sha256: prefix), never the inputs, to build_session_receipt on https://mcp.ainumbers.co/mcp, in the order above, and return the root. 4. Timestamp that root with anchor_hash on https://anchor.ainumbers.co/mcp using the sigstore, digicert and freetsa authorities, and return the three timestamps.
The ten runs in the three examples (three x402 composites, the mandate, two mandated runs, four EMIR hashes) are bound into one session receipt, root sha256:7bc2980b…c26b, and three independent timestamp authorities signed that root within one second of each other.
| Authority | genTime (UTC, 26 Sep 2026) | Serial | Policy OID | Chain valid until |
|---|---|---|---|---|
| Sigstore TSA (OpenSSF) | 02:48:56 | 00cb1d269d4efb1f2374f5f2672c9bdf02ff7d803a | 1.3.6.1.4.1.57264.2 | 2035-04-06 |
| DigiCert Timestamp Authority | 02:48:56 | 00b6271da38ff8ad6f4d04f5573f348191 | 2.16.840.1.114412.7.1 | 2031-11-09 |
| FreeTSA | 02:48:57 | 08773b2a | 1.2.3.4.1 | 2040-02-02 |
The download holds the session receipt (its ten leaves, in order, with their tool ids) and the three RFC 3161 responses, base64-encoded, with their signer certificate chains. To check a token yourself, decode a response to a .tsr file and run openssl ts -verify -in digicert.tsr -digest 7bc2980bc7d8a719166804e9bd9e553f767d9dd2fd3f96c1ac9b14cbd669c26b -CAfile <that authority's root>, or call verify_anchor_binding on the anchor server. To check the root itself, call build_session_receipt with the ten hashes in order and compare.
Trusted Compute Units frame chained verifiable computation as one abstraction over heterogeneous backends, TEEs and zkVMs, with an on-chain program registry. OpenChainGraph shares the goal and uses the zkVM half. It makes three different choices: software and cryptography only, a published catalog as the registry, and a base layer that anyone can verify by recomputing.
| Dimension | Trusted Compute Units | OpenChainGraph |
|---|---|---|
| Unit | A containerized service: an application component exposing compute and proof retrieval, and a verifiable-computation component that checks external inputs, runs the logic, and commits to internal inputs. | A node: one pure kernel plus a declared contract, reachable as a page and an MCP tool, and on some pages as a WebMCP tool, all running the same source. |
| Backends | Heterogeneous by design: TEEs (evaluated with AWS Nitro Enclaves) and zkVMs (evaluated with RISC Zero). | Software and cryptography only. RISC Zero receipts today, through one universal QuickJS guest; the spec is system-agnostic. |
| Registry | A smart-contract program registry on an EVM chain holding unit ids, verification keys or ImageIDs, and attestation reports. | The Graph Index, a published and downloadable catalog, carrying kernel source digests and ImageIDs per node. |
| Chaining | Proof-carrying: each downstream unit verifies its upstream proofs inside its own computation, so a consumer checks only the last output. | Hash-linked: each step cites its predecessor's hash in parent_hashes, and a verifier checks each receipt on its own. Composing the receipts into one proof is an open direction. |
| Confidential inputs | Kept inside the TEE or zkVM, with commitments to internal inputs. | Optional: SPEC §25 private-input profile (commitments, the receipt becomes the only verification path); Example 3's pattern keeps data in the browser. |
| Base layer | Every unit attests or proves. | Recompute-to-verify works from the inputs alone; signatures, kernel identity and zk receipts add strength on top. |
| Where verification runs | On-chain for sink computations, so downstream applications can react automatically. | In a browser, a Worker or a CLI; external timestamp authorities are optional. |
The two designs meet at composition. A TCU verifies upstream proofs inside the downstream computation, and RISC Zero can verify one receipt inside another guest, so a single Groth16 seal could cover a whole multi-workflow agent run while OpenChainGraph keeps its recompute base layer. That is an open direction for OpenChainGraph. The mapping above is our reading of the paper (arXiv:2504.15717).
Every hash, seal and timestamp above can be re-derived with public tools, most of them inside a browser tab. These four checks run from a single hash up to the timestamps on the page's receipt.
verify_execution_hash on https://mcp.ainumbers.co/mcp with an artifact's policy_parameters and output_payload, or run the kernel from the repository and hash the result with chaingraph/kernels/_hash.mjs.compute_proof from chaingraph.json and run verifySeal from chaingraph/kernels/_computeproof.mjs against its ImageID and journal.openssl ts -verify for each token, or call verify_anchor_binding on https://anchor.ainumbers.co/mcp.All content on this page is static and processed locally in your browser. No data is transmitted. Do not enter real personal data into any OpenChainGraph tool. Use synthetic or anonymised inputs only.