Use-case evidence: twins and a referee
Seam ③ Check/judge. Build: a sampled twin comparison and a signed referee ruling. Conform to: draft-mih-agent-bilateral-attestation-02 and draft-mih-agent-evidence-layer-00 §4.1, §5.
Sending a request to two nodes and comparing the answers tells you how often a pairing disagrees; asking a third node to re-answer one disagreeing pair and sign a ruling tells you which twin it agrees with, and when nobody can rule, the pair is left unruled rather than counted against anyone.
1What it is
Use-case evidence is what you add on top of the plain record when your use case asks a question the record cannot answer by itself; for inference served on strangers' machines that question is whether a node served the model its record names.
Sending some requests to two nodes and comparing the answers gives you a rate, how often a pairing's answers differed, which tells you something is off without telling you who.
Adjudication adds a third node that re-answers one differing pair and signs a ruling naming the twin it did not agree with; where no node can do that, the pair reads “not adjudicated” and counts against no one.
2Design choices
x-mesh-twin-bracket value on two requests; the host copies it into twin_bracket_id and never sends a second request itself.docs/plugins/openai-exchange-lifecycle.md, “Client-marked pairs”; PR 2144; capsules docs/TWIN-REFEREE-SELECTION.md §1, §4)forwarded_request.rs; test added in PR 2300)crates/evidence-plugin/src/referee/request.rs, before_asking; crates/evidence-plugin/src/referee/verdict.rs)crates/evidence-plugin/src/referee/verdict.rs, referee_verdict; vectors/parity/referee/intended_differences.json, “only the referee signs”)docs/TWIN-REFEREE-SELECTION.md §4; crates/evidence-plugin/src/referee/request.rs, NO_ELIGIBLE_IS_RETRIED_AUTOMATICALLY = false)referee_bar_days); the pick is random within a tier, and the tier is sealed in the verdict.docs/TWIN-REFEREE-SELECTION.md §2, §3, §5; crates/evidence-plugin/src/verdict_counts.rs)adjudicate_differing_twins).docs/SHARING-POLICY.md; CHANGELOG.md 0.1.3)crates/evidence-plugin/src/producer/capsule.rs, tee_attestation; draft-mih-scitt-agent-action-capsule-05 §5.4)3What it shows / what it does not
Shows
- Sampling only: for pairs a client marked, whether the two sealed answers were byte-identical (their answer digests); over many pairs, how often a pairing differed (“Twin pairs: N · answers differed: M”). Sampled answers count as differing too.
- With a referee: a signed ruling on one pair: which twin the referee's re-answer agreed with at the earliest differing word, with the other named
contradicted:<node>. - What the ruling covers: both halves' record ids, the request digest, the weights digest and the referee's own answer digest, all under the referee's signature, which a holder can verify against the referee's key.
- For a pair with no ruling, why: off, not marked, answers agree, not comparable (with why), no eligible referee, referee cannot sign, referee did not answer.
Does not show
- Sampling only: which twin was wrong, or that either was. A difference counts against no one.
- Which model ran. The matching weights are each node's own claim, and twins serving the same wrong file corroborate each other.
- A node's future answers. A verdict is a ruling on one pair.
- Honesty across different hardware: exact replay can differ on different silicon for reasons unrelated to honesty, so such a mismatch is grounds to investigate, not a ruling.
- That the referee is independent of either twin; that is a claim about who runs it.
- Anything about a pair no client marked.
- Hardware evidence: at v0.1.4 no hardware quote is taken.
4Example
One pair from the referee's rule corpus, the same pair run under three regimes. Node B's answer differs from A's at the fourth word (index 3: "4," against "999"); the referee's re-answer is "1, 2, 3, 4, 5". The pair, trimmed:
"pair": {
"halves": [
{ "capsule_id": "3cde7ec4853bdf6d2e33904c1d4b2e972984b8725b3f72abeee503dbd2065480",
"model_hash": "b2767326b03d5e629546363ebe41714b78065e028709580996d60d2d119192da",
"node_id": "node-a", "temperature": 0, "text": "1, 2, 3, 4, 5",
"weights_digest": "ac28b90e169cc75956ee6283ac8dc787a945696122692a3b2f266d8453ff56cc" },
{ "capsule_id": "e96c12b9157ef4a7c82529e4ad1c1f6c823ac7b8a06b856a3cedada021945c4a",
"model_hash": "b2767326b03d5e629546363ebe41714b78065e028709580996d60d2d119192da",
"node_id": "node-b", "temperature": 0, "text": "1, 2, 3, 999 5",
"weights_digest": "ac28b90e169cc75956ee6283ac8dc787a945696122692a3b2f266d8453ff56cc" }
],
"request_digest": "c0b439598e4ff10d8f55dc241798b2a80aa8de77e564a169f8931336ac33ef1a",
"twin_bracket_id": "bracket-1"
}
The answers the rules require for it, one line per regime:
"operator_off_calls_nothing_and_says_so": [{"counts_against":null,"referee_calls":0,"row":{"reason":"off","state":"not_adjudicated"}}]
"differing_pair_triggers_one_call": [{"counts_against":"node-b","referee_calls":1,"row":{"referee":"node-c","state":"adjudicated","tier":1,"verdict":"contradicted:node-b"}}]
"no_eligible_referee": [{"counts_against":null,"referee_calls":0,"row":{"reason":"no_eligible_referee","state":"not_adjudicated"}}]
| Field | Type | Meaning |
|---|---|---|
| twin_bracket_id | string | The value the client sent in x-mesh-twin-bracket. Without one, nothing is compared and nobody is asked. |
| request_digest | hex | Digest of the request both twins answered; with the bracket id and the two node ids it is the pair's key, so a re-sealed half is the same pair. |
| capsule_id | hex | Each twin's own signed record of its half. |
| node_id | string | The node that served the half (placeholder ids in the corpus). |
| temperature | number | Above 0 means sampled: the pair reads “not comparable”, because sampled. |
| model_hash / weights_digest | hex | What each half's record says it served. Both must be named and equal, or the pair is not comparable. Self-report. |
| text | string | The answer. A node holds it only when the client supplies it and its digest is the record's response_digest. |
| state | string | adjudicated or not_adjudicated. |
| reason | string | Why a pair has no ruling: off, no_eligible_referee, and the other reasons listed above. |
| verdict | string | The referee's ruling: contradicted: plus the twin it did not agree with, or inconclusive, or not_comparable. |
| referee / tier | string / int | Who was asked, and from which tier: 1 has a corroborated verdict for the model on this node's chain, 2 has none yet. |
| referee_calls | int | Calls this attempt made: 0 or 1. |
| counts_against | string / null | The node the row's contradiction counts against; null for every unruled pair. |
The corpus states these answers from the rules; the plugin's tests run them. Two of the three cases leave the setting unset, which the test harness reads as on; a running node reads an unset adjudicate_differing_twins as off. The signed verdict record a referee seals, with its own fields, is crates/evidence-plugin/tests/fixtures/referee-verdict.json at the same tag (the fixture predates -05 and carries spec_version -04; the plugin seals -05).
Source: Mesh-LLM/capsules:vectors/parity/referee/corpus/request.json and Mesh-LLM/capsules:vectors/parity/referee/rule_answers/request.json @ b4e24453f572b2d9fe8f2cefbd0f35a5eb54b0ad (tag v0.1.4)
5Status
| Item | Status | Evidence |
|---|---|---|
Client-marked pairs in the host: x-mesh-twin-bracket copied into twin_bracket_id and stripped before forwarding | live | Mesh-LLM/mesh-llm PR 2144, merged 2026-10-03 (merge 6d36f3845c5f021eac432dfdc8c20efcbfaa340a); in release v0.78.1 (bc215ce5b880e21c6c3840b8574ab64f83278821: crates/mesh-llm-host-runtime/src/network/openai/forwarded_request.rs, ingress.rs). |
The host advertises capabilities.twin_bracket | built, not live | Mesh-LLM/mesh-llm PR 2300, merged 2026-10-11 (merge 572419fd1e3074f7e948996c292ca8e7972bda8c), on upstream main 60697c61755b7280c22d3ab9d9bcf5b663e8ae3b; after the latest release, v0.78.1 (2026-10-05). |
| Twin comparison, “not adjudicated” rows with reasons, and the Peers twin row | built, not live | Released in capsules v0.1.4 (b4e24453f572b2d9fe8f2cefbd0f35a5eb54b0ad: crates/evidence-plugin/src/referee/request.rs, CHANGELOG.md 0.1.4). Works with the twin_bracket_id stock mesh-llm v0.78.1 already carries (PR 2144); not yet reported on live hosts. |
| Referee: selection, re-answer, signed verdict, bar window; off by default | built, not live | capsules v0.1.4 crates/evidence-plugin/src/referee/, docs/TWIN-REFEREE-SELECTION.md. CHANGELOG.md 0.1.4: “A referee verdict on live hosts waits on 0.1.5; until then it is covered by tests only.” |
| Opt-in rule: stop routing to a peer after N referee-signed contradictions in D days | built, not live | capsules v0.1.4 docs/TWIN-REFEREE-SELECTION.md §6, crates/evidence-plugin/src/routing_rule.rs; off by default, and it counts only referee-signed verdicts, which are not yet live. |
| A host-side rate that duplicates a share of requests | not built | No such setting in mesh-llm at 60697c61755b7280c22d3ab9d9bcf5b663e8ae3b or in capsules v0.1.4; the host “sends no second request” (docs/plugins/openai-exchange-lifecycle.md). |
| Hardware evidence of what was loaded, cited by digest from the record | in this plugin: designed | capsules v0.1.4 crates/evidence-plugin/src/producer/capsule.rs: the tee_attestation slot is always written empty, “no TEE quote measured … recorded absent, never fabricated”. |
6Specs
- Internet-Draft draft-mih-scitt-agent-action-capsule-05 — the record each twin and the referee seals; §5.4, a producer must not record an assurance mode it did not achieve.
- Internet-Draft draft-mih-agent-evidence-layer-00 — §4.1, the
adjudicationepistemic type; §5, theadjudicateslink a verdict carries. - Internet-Draft draft-mih-agent-bilateral-attestation-02 — both sides of an exchange each keeping a signed record: the halves a comparison reads.
- RFC RFC 9052 — COSE: the
COSE_Sign1signature on each half and on the verdict. - RFC RFC 8785 — JSON Canonicalization Scheme: the bytes every digest covers.
- Code Mesh-LLM/capsules v0.1.4 — the comparison, the referee, the verdict record and the rule corpus.
- Code Mesh-LLM/mesh-llm#2144 — the header copied into
twin_bracket_idand stripped before forwarding (merged, in v0.78.1). - Code Mesh-LLM/mesh-llm#2300 — the
twin_bracketcapability (merged, not yet released).
7What you need before the next step
- A host seam that lets a client mark two requests as one pair and hands the mark to your plugin on both exchanges, without telling the serving nodes.
- Both halves of each pair held on the comparing node (the counterparties' signed records, pushed or fetched), and a way to get the texts there that you can check against the records' digests.
- An operator switch for the referee, off by default, because asking one sends the prompt to a third node.
- Yes/no eligibility rules, one call per pair, and a “not adjudicated” row with its reason for every case that has no ruling.
- A record slot for hardware evidence, written empty until you take a quote.