Agent Action Capsule · build your own evidence layer
b11 / 11

History back into the loop

Seam ⑤ View, back into ①. Build: History as a read over sealed records that shapes the next act. Conform to: draft-mih-agent-evidence-request-00 (history_card/1).

The loop closes when what was recorded and judged shapes the next act. In Mesh-LLM a node's own count of referee verdicts about a peer can stop it routing to that peer; in a personal agent the person hands one recipient a History of selected deals. Both are reads over sealed records, and neither is a score.

The general rule. History is a derived read over records already sealed, never a new fact. It reports counts in their own units, says what it does not establish, and is never folded into one number about a party. Who can recompute it differs: a personal History is recomputed by anyone holding the replies; a Mesh-LLM node's verdict counts are its own, because they also read two unsealed local files (which pairs this node asked a referee about, and which verdicts a rule block already used).
History feeding the next decision, in a mesh node and in a personal agent Top row, a Mesh-LLM node. Step 1: this node's chain of sealed records, exchange halves and verified referee verdicts. Step 2: a fold with two gates, verified and asked for by this node, once per referee and pair. Step 3: the Peers drill's verdict counts for one peer, four counts: corroborated 12, contradicted 2, inconclusive 0, not comparable 3, illustrative numbers, never sent. Step 4: an opt-in rule, N contradictions within D days, at most N minus 1 per referee, off by default. Step 5: the host's block, refused unless the operator allowed it, seven days or until undone, this node only, and a sealed record naming the peer by a salted commitment. Step 6: an arrow back to the chain: the router skips the peer and the next exchanges are sealed and folded again. Bottom row, step 7: a personal agent: the holder's stream, a definition for one recipient, a History of counts per deal state with outcomes not established, and the recipient's own next decision, drawn dashed because no profile defines it. Step 8: a band across the bottom: history is a derived read over sealed records, counts in their own units, never one number about a party. Mesh-LLM node (capsules plugin + host) Personal agent (History profile) This node's chain exchange half exchange half verdict (checked) verdict (checked) signed, chained Fold gate 1: verified gate 2: this node asked that referee, that pair once per (referee, pair) Verdicts about peer P corroborated12 contradicted2 inconclusive0 not comparable3 counts only, never sent numbers illustrative Opt-in rule N contradictions within D days ≤ N − 1 from any one referee off by default asks; never routes Host block operator opt-in 7 days, or undone this node only never gossiped Block record peer: salted hash verdicts: same next act: router and referee choice skip P; new records are folded again Holder's stream step_completed step_failed Definition personal_history_ basic/1 for 1 recipient History outcomes: not established 3 deals: 1 failed step, 2 completed only, 0 none The recipient's next decision its own; the profile defines no conclusion and no figure that orders or grades deals, holders or counterparties History is a derived read over sealed records computed from sealed records · counts in their own units · never one number about a party

1What it is

History is the last step of the loop: a read over records that were already sealed and judged, used to shape what happens next.

In Mesh-LLM a node counts the referee-signed verdicts about each peer from its own chain, and an operator can opt in to a rule that asks the host to stop routing to a peer after enough contradictions; for a personal agent, the person gives one recipient a History of selected deals, counted by state.

In both cases the read is computed from records already sealed, it reports counts with what they do not establish, and no step turns them into a score.

2Design choices

Chosen: four separate counts per peer (corroborated, contradicted, inconclusive, not comparable), each a list of verdict ids that can be opened.
Rejected: a computed figure about a peer, or the counts blended into one number. (capsules v0.1.4 crates/evidence-plugin/src/verdict_counts.rs; docs/TWIN-REFEREE-SELECTION.md §5: “Nothing is ordered by merit, weighted or combined into a number”)
Chosen: a received verdict counts only if this node itself asked that referee about that exact pair of halves, and once per referee and pair.
Rejected: counting any validly signed verdict. A signature says who signed, not that anyone asked: a peer with an announced key could mint verdicts about another peer at will. (verdict_counts.rs, gate 2)
Chosen: the counts and every block stay on this node; a block is never gossiped or shared.
Rejected: a shared list, which “would let any peer get an honest one excluded with made-up reports”. (mesh-llm network/peer_blocks.rs module doc, v0.78.1)
Chosen: the rule is off unless the operator sets N, one referee contributes at most N − 1 contradictions, and the plugin only asks; the host refuses unless its operator set allow_peer_blocks = true for that plugin.
Rejected: a plugin that routes, or that blocks through the operator's own API. (routing_rule.rs; capsules CHANGELOG 0.1.3; mesh-llm docs/plugins/README.md “Peer Routing Blocks”)
Chosen: the record of a block names the peer only by sha256(salt || peer id), and cites the verdicts that met the rule the same way; the salt stays on this node (for a rule block the plugin draws it and keeps it in its local routing-rule-cited.jsonl).
Rejected: naming the peer in clear. A range answer returns whole records to any asker, so a clear name would tell everyone who was blocked. (producer/capsule.rs seal_local_routing_choice)
Chosen: verdicts that met the rule never count toward it again, so undoing a block holds until new contradictions arrive.
Rejected: re-firing on the same verdicts the moment an operator lifts a block. (routing_rule.rs, routing-rule-cited.jsonl)
Chosen: for a personal agent, a History is a recipient-specific disclosure counted in selected deals, with “outcomes not established” shown before any count.
Rejected: any figure that adds deals to records, combines across deals, holders or counterparties, or orders or grades them. (spec/personal-agent-history-profile-v0.md §5, §6.3, §9 “No ordering”)

3What it shows / what it does not

Shows

  • How many referee-signed verdicts this node asked for and received about a peer, in each of four outcomes, each verdict openable by id.
  • That a block was made, when, for how long, and, for a rule block, which rule (N, D) and which verdicts met it, by commitment.
  • For a personal History: which deals the holder selected for this recipient, and how many have a recorded failed step, completed steps only, or no step.
  • For a personal History, counts any holder of the replies recomputes; for a mesh node, counts it recomputes from its own chain and its own local list of referee requests.

Does not show

  • Anything about a peer's future answers: a verdict is a ruling on one pair of answers (TWIN-REFEREE-SELECTION §5).
  • What any other node counts or blocks: counts and blocks are local and never shared.
  • That a person made a block: the record says human_disposed: false, since a local API call does not show who made it.
  • For a personal History: any outcome, or that the selection is all of the holder's deals.
  • That another node holding the same chain would count the same: gate 2 reads this node's own unsealed list of the referee requests it sent.
  • A ranking, a grade, or a single number about a party.

4Example

The record a rule block seals, from the plugin's own test a_rule_block_cites_its_verdicts_only_by_commitment: peer "a70d3967bea3b22f" repeated four times, salt 32 bytes of 0x07, rule N = 2 within 30 days, two verdict ids ("1"×64 and "2"×64). Below is the record's local_routing_choice block. The three digests were computed here from those inputs with Python's hashlib, using the record's own formula, sha256(salt || id as hex text); the same formula reproduces the plugin's test vector peer_commitment_matches_the_host_vector (265aff05…7e74). Its comment says the host pins the same vector; no such host code exists in mesh-llm v0.78.1 or upstream main 60697c61.

// model_attestation.compute_attestation.local_routing_choice
{
  "change": "block",
  "peer_commitment": {
    "alg": "SHA-256",
    "digest": "90c22a1ed65c7f0fd6a95bd7f9eb5fbe112ca711591c50c3632cb75964844c3d"
  },
  "requested_via": "host_local_api",
  "until": null,
  "scope": "this_node_only",
  "rule": {
    "rule": "stop_routing_after_contradictions",
    "after": 2,
    "window_days": 30,
    "verdict_commitments": [
      {"alg": "SHA-256", "digest": "a7820fdcea8191a97ccb2d75e014e33ebbf1800320ed9b69f2509068e7c294cf"},
      {"alg": "SHA-256", "digest": "d6b5883ec63c66c6938f8d9c56c0bc1720b2b0d80ede31200cc095a705f2da8d"}
    ]
  }
}

// and, in the same record
"action_type": "decide",
"assurance":   {"attestation_mode": "self_attested", "effect_mode": "not_applicable", ...},
"disposition": {"decision": "accept", "approver": "policy", "human_disposed": false, ...}
FieldTypeMeaning
changestringblock or unblock: which way the routing choice went.
peer_commitmentdigestsha256(salt || peer id). Only a holder of the salt, kept on this node, can say which peer it names; the peer id appears nowhere in the sealed bytes.
requested_viastringhost_local_api: the choice came through the host's local path.
untiltime | nullWhen the block lapses, at minute granularity; null for “until undone” and for every unblock.
scopestringthis_node_only: the block is never shared.
ruleobject | nullSet only when an operator rule asked for the block; null for a manual one.
rule.after / window_daysintN and D: the contradictions that fire the rule and the window they must fall in.
rule.verdict_commitmentsarrayEach verdict that met the rule, as sha256(salt || verdict id). The verdicts name the peer, so citing them in clear would name it too.
disposition.human_disposedboolfalse: the record does not claim a person made the choice.
assurance.effect_modestringnot_applicable: the record is the decision; the host's router enforces it.

The personal-agent History this page also refers to is worked through, with the published vectors, on b6, personal agents.

Source: Mesh-LLM/capsules:crates/evidence-plugin/src/producer/capsule.rs (seal_local_routing_choice, peer_commitment, tests a_rule_block_cites_its_verdicts_only_by_commitment, peer_commitment_matches_the_host_vector) @ tag v0.1.4 = b4e24453f572b2d9fe8f2cefbd0f35a5eb54b0ad

5Status

Tags: live in a released host or plugin that runs on stock hosts · built-not-live merged or released at a SHA, not yet exercised on a live host · designed written down, no code · planned not designed, or left open on purpose.

ItemStatusEvidence
Host stop routing: operator block, seven days or until undone, this node only; router, fallback, consult-peer and split-stage selection skip the peerlivemesh-llm v0.78.1 (bc215ce5b880e21c6c3840b8574ab64f83278821, 2026-10-05) crates/mesh-llm-host-runtime/src/network/peer_blocks.rs; upstream main 60697c61755b7280c22d3ab9d9bcf5b663e8ae3b mesh/docs/plugins/README.md “Peer Routing Blocks”
Plugin-requested block (PeerBlockRequest), refused unless the operator set allow_peer_blocks; host capability peer_blocks.v1; choices published on routing.choice.v1live (host side)mesh-llm v0.78.1: peer_blocks.rs, plugin_request_choice (the refusal); crates/mesh-llm-config/src/model.rs (allow_peer_blocks, peer_blocks_allowed: on only when set to true); plugin side capsules peer_blocks_seen.rs @ b4e24453
Verdict counts per peer (the fold, two gates, four counts)built-not-livecapsules crates/evidence-plugin/src/verdict_counts.rs @ v0.1.4 (b4e24453f572b2d9fe8f2cefbd0f35a5eb54b0ad). CHANGELOG 0.1.4: “A referee verdict on live hosts waits on 0.1.5; until then it is covered by tests only”, so on a live host the counts have nothing to count yet
Peers drill “Their history” tab: verdicts by who stands behind them, three columns never added togetherbuilt-not-livecapsules web-ui/src/features/capsules/components/PeerHistoryTab.tsx, lib/their-history-view.ts @ v0.1.4; verdict rows wait on the same live referee verdict
Opt-in rule stop_routing_after_contradictions (N, D = 30, at most N − 1 per referee, 1 when N = 1), off by defaultbuilt-not-livecapsules crates/evidence-plugin/src/routing_rule.rs; docs/TWIN-REFEREE-SELECTION.md §6 @ v0.1.4; it reads only referee-signed verdicts, which wait on 0.1.5
Sealed record of a rule block, peer and verdicts by commitmentbuilt-not-livecapsules producer/capsule.rs seal_local_routing_choice and its tests @ v0.1.4
Sealed record of a manual (operator) blockbuilt-not-liveThe plugin offers mesh_local_routing_choice for a host's block store to call (routing_choice_bridge.rs @ v0.1.4); no host calls it: no match for mesh_local_routing_choice in mesh-llm v0.78.1 or upstream main 60697c61. Until one does, the plugin keeps the latest choice per peer in a local, unsealed file (peer-blocks-seen.json)
History back into referee choice: a blocked node, or one with a referee-signed contradiction for that model within referee_bar_days (30), is not asked to referee; a node with a corroboration for that model is asked before others (tier 1)built-not-livecapsules docs/TWIN-REFEREE-SELECTION.md §2, §3, crates/evidence-plugin/src/referee/bar.rs @ v0.1.4; referee off by default (§6)
history_card/1: the checkpoint history of a stream (checkpoints, receipts, consistency proofs; no record content)built-not-liveRegistered by draft-mih-agent-evidence-request-00 (spec/draft-mih-agent-evidence-request-00.md “The History Card” @ agent-action-capsule 2ef8aeb49e2334e24c404bd62d3fdb161770873c)
The profile text: Personal-Agent History, Basic level (personal_history_basic/1)designedInformational host profile, pre-Internet-Draft: agent-action-capsule#259, merged 2026-10-15; spec/personal-agent-history-profile-v0.md @ 2ef8aeb4
Its 12 conformance vectors and a book's answerbuilt-not-liveagent-action-capsule#296, merged 2026-10-17 (details on b6)
A recipient's decision taken from a Historyleft open on purposeThe profile “does not define … what a recipient should conclude” (profile, dependency boundary @ 2ef8aeb4)

Not to be confused: the verdict counts on this page are the capsules plugin's “Verdicts about them”, a node's own count of verdicts about a peer; the plugin's Peers drill also has a “Their history” tab and its own history-card records, which are different things. history_card/1 is the evidence-request derivation over a stream's checkpoints. personal_history_basic/1 is the personal-agent History. Three different reads; none of them is a score.

6Specs

7What you need to close the loop