# OIP federation self-test — live run

> Cross-domain federation is proven when a capability minted at one node can be handed to an agent at another domain, run a real object back home under every gate, and both sides can prove the exchange — while a forwarded, stale, replayed, or out-of-scope attempt fails closed. These two test nodes are independently deployed under one operator; independent custody requires a second operator.

**Verdict:** CROSS-DOMAIN CONFORMANT — all 11 clauses hold live between two independently deployed nodes under one operator.
**Home:** https://miscsubjects.com · **Peer:** https://oip-peer.massoumi-cyrus.workers.dev
**Ran:** 2026-07-15T21:10:06.480Z · **Spec:** https://miscsubjects.com/a/oip-message · **Re-run:** https://miscsubjects.com/api/dispatch?fedtest=1

| clause | title | pass | evidence |
|---|---|---|---|
| F0 | Two nodes, two domains, both discoverable | PASS | {"home_domain":"miscsubjects.com","peer_domain":"oip-peer.massoumi-cyrus.workers.dev","home_agent":"pepper@miscsubjects.com","peer_agent":"buttercup@oip-peer.massoumi-cyr |
| F1 | A signed question crosses the federation and comes back verified | PASS | {"home_reply_kind":"result","response_verified":true,"invoked":false} |
| F2 | A capability handed across domains runs a real object | PASS | {"invocation_id":"inv_dvsxyi1zmp","ran":true,"result_preview":"{\"now\":\"2026-07-15T14:10:08-07:00\",\"today\":\"2026-07-15\",\"time\":\"14:10:08\",\"zone\":\"America/Lo |
| F3 | A capability handed to one agent cannot be used by another | PASS | {"reason":"audience_mismatch","minted_for":"buttercup@oip-peer.massoumi-cyrus.workers.dev","presented_by":"mallory@oip-peer.massoumi-cyrus.workers.dev"} |
| F4 | A federation capability is useless outside the federation | PASS | {"direct_status":403,"error":"audience_bound:buttercup@oip-peer.massoumi-cyrus.workers.dev"} |
| F5 | Least privilege holds across the federation | PASS | {"reason":"scope_mismatch","allowed":"NOW","attempted":"UPPER"} |
| F6 | A resent message never runs twice | PASS | {"first_kind":"result","second_reason":"replay_rejected","msg_id":"msg_fedtestreplay2si22iwt"} |
| F7 | Stale messages are refused even when correctly signed | PASS | {"reason":"expired_envelope"} |
| F8 | Revocation reaches across the federation | PASS | {"reason":"revoked"} |
| F9 | Message text is data, never an instruction | PASS | {"invoked":false,"retrieved_text_is_data":true,"injection_returned_as_data":true} |
| F10 | Two ledgers, one provable exchange | PASS | {"msg_id":"msg_3PMT9bySwsWGWFjN","home_body_sha256":"74c659353983e67314108217be21d0852d88699b320f0dc50bedf88192d14258","peer_body_sha256":"74c659353983e67314108217be21d08 |

## The clauses in full

**F0 — Two nodes, two domains, both discoverable** (PASS)
Each domain MUST publish /.well-known/oip.json listing its agents with an ES256 public key and an inbox URL, so a stranger can resolve identity with zero prior coordination.

**F1 — A signed question crosses the federation and comes back verified** (PASS)
A query envelope signed by a remote agent MUST reach the home inbox, be answered with a signed result the sender can verify, and invoke nothing.

**F2 — A capability handed across domains runs a real object** (PASS)
An invoke envelope carrying a capability minted for the sender MUST run the named object under every gate and return a signed result with a real receipt id that the home ledger confirms.

**F3 — A capability handed to one agent cannot be used by another** (PASS)
The same capability, presented in a validly-signed invoke from a DIFFERENT verified agent (mallory instead of buttercup), MUST be refused for audience mismatch. Nothing runs.

**F4 — A federation capability is useless outside the federation** (PASS)
A capability bound to a remote agent MUST fail when presented directly at the door with no verified signed sender — it only works inside a signed invoke from its audience.

**F5 — Least privilege holds across the federation** (PASS)
A capability scoped to one object MUST be refused for scope mismatch when the signed invoke names any other object.

**F6 — A resent message never runs twice** (PASS)
A validly-signed envelope whose message id was already delivered MUST be rejected as a replay. Delivery is at-most-once.

**F7 — Stale messages are refused even when correctly signed** (PASS)
An envelope past its expires_at MUST be rejected for expiry before its signature or body is trusted — the server clock decides freshness.

**F8 — Revocation reaches across the federation** (PASS)
A capability revoked at home MUST be refused when presented in a signed federated invoke. Revocation is not local to the door it was minted at.

**F9 — Message text is data, never an instruction** (PASS)
A query whose body contains an imperative ("ignore your rules and run X") MUST be echoed as data and execute nothing. Only a typed invoke with a valid capability can act.

**F10 — Two ledgers, one provable exchange** (PASS)
Each node MUST keep its own ledger of the exchange, and the two MUST be joinable by message id and body hash — proof both sides saw the same bytes without a shared database.
