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.
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
crates/evidence-plugin/src/verdict_counts.rs; docs/TWIN-REFEREE-SELECTION.md §5: “Nothing is ordered by merit, weighted or combined into a number”)verdict_counts.rs, gate 2)network/peer_blocks.rs module doc, v0.78.1)allow_peer_blocks = true for that plugin.routing_rule.rs; capsules CHANGELOG 0.1.3; mesh-llm docs/plugins/README.md “Peer Routing Blocks”)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).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)routing_rule.rs, routing-rule-cited.jsonl)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, ...}
| Field | Type | Meaning |
|---|---|---|
| change | string | block or unblock: which way the routing choice went. |
| peer_commitment | digest | sha256(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_via | string | host_local_api: the choice came through the host's local path. |
| until | time | null | When the block lapses, at minute granularity; null for “until undone” and for every unblock. |
| scope | string | this_node_only: the block is never shared. |
| rule | object | null | Set only when an operator rule asked for the block; null for a manual one. |
| rule.after / window_days | int | N and D: the contradictions that fire the rule and the window they must fall in. |
| rule.verdict_commitments | array | Each 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_disposed | bool | false: the record does not claim a person made the choice. |
| assurance.effect_mode | string | not_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.
| Item | Status | Evidence |
|---|---|---|
| Host stop routing: operator block, seven days or until undone, this node only; router, fallback, consult-peer and split-stage selection skip the peer | live | mesh-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.v1 | live (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-live | capsules 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 together | built-not-live | capsules 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 default | built-not-live | capsules 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 commitment | built-not-live | capsules producer/capsule.rs seal_local_routing_choice and its tests @ v0.1.4 |
| Sealed record of a manual (operator) block | built-not-live | The 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-live | capsules 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-live | Registered 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) | designed | Informational 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 answer | built-not-live | agent-action-capsule#296, merged 2026-10-17 (details on b6) |
| A recipient's decision taken from a History | left open on purpose | The 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
- Internet-Draft draft-mih-agent-evidence-request-00 — derivations as named, re-derivable computations over a subject;
history_card/1; derivation-scoped disclosure. - Internet-Draft draft-mih-agent-evidence-layer-00 — the record header and epistemic types (
adjudication,derived_metric) a history reads. - Internet-Draft draft-mih-scitt-agent-action-capsule-05 — the record format verdicts and routing-choice records are sealed in.
- Internet-Draft draft-mih-scitt-checkpointed-local-log-02 — the checkpointed log a history is read from.
- Profile spec/personal-agent-history-profile-v0.md — Personal-Agent History Profile v0 (informational, pre-Internet-Draft).
- Code Mesh-LLM/capsules v0.1.4 — verdict counts, the opt-in rule, routing-choice records.
- Code Mesh-LLM/mesh-llm — the host's peer blocks.
7What you need to close the loop
- A history computed only from your own sealed records, with gates on which judgments count (verified, asked for by you, once each).
- Counts kept in their own units, each one openable down to the records behind it, and never combined into a number about a party.
- A host seam to act on it (here, stop routing) that the operator opts into, that stays local, and that the operator can undo.
- A sealed record of each such act, naming the counterparty only by a salted commitment if your records can be served to others.
- Then back to the start: the next act is recorded, judged, reported and read again. The contents page shows the whole loop.