state:blocked-upstream on CIRISPersist#801.
src/equivocation.rs defines a contradiction as two claims at one signed instant that neither supersedes the other, reading the instant from the envelope's asserted_at via key_standing::signed_instant.
On persist v39.0.0 a claim reaches the federation only by being widened (a local row must be cohort_scope: self, and a self row is undiscoverable), and crossing::build_widening treats asserted_at as a placement member and drops it — so stamp_and_canonicalize stamps the widening time. The instant a peer can read is therefore when the row was placed, not when the claim was asserted, and the original is not recoverable off-node because the row carrying it never replicates.
Measured: two contradictory claims seeded at one instant T0 come back 259 ms apart, purely from being widened in sequence. classify_pair reads two different instants and returns Superseded — a legitimate later revision. The detector reports zero contradictions where there is one.
Four tests hold the assertions and are #[ignore]d against this, not weakened:
a_peers_two_claims_at_one_instant_are_detected_and_recorded
a_duplicated_statement_records_nothing
a_later_revision_records_nothing (passes; kept with its siblings)
re_detection_records_no_second_row
the_nodes_own_key_is_not_exempt
Un-ignore when #801 lands. We offered persist two shapes — preserve the prior's asserted_at through the widening, or keep the placement time and carry the claim's instant alongside it — and said we would adopt whichever they choose.
Not a local workaround: seeding at federation is refused by the local-tier rule; following references_attestation_id to the prior only works on the authoring node, which is not the node doing the detection; and dropping the same-instant rule changes what the detector means.
state:blocked-upstreamon CIRISPersist#801.src/equivocation.rsdefines a contradiction as two claims at one signed instant that neither supersedes the other, reading the instant from the envelope'sasserted_atviakey_standing::signed_instant.On persist v39.0.0 a claim reaches the federation only by being widened (a local row must be
cohort_scope: self, and aselfrow is undiscoverable), andcrossing::build_wideningtreatsasserted_atas a placement member and drops it — sostamp_and_canonicalizestamps the widening time. The instant a peer can read is therefore when the row was placed, not when the claim was asserted, and the original is not recoverable off-node because the row carrying it never replicates.Measured: two contradictory claims seeded at one instant
T0come back 259 ms apart, purely from being widened in sequence.classify_pairreads two different instants and returnsSuperseded— a legitimate later revision. The detector reports zero contradictions where there is one.Four tests hold the assertions and are
#[ignore]d against this, not weakened:Un-ignore when #801 lands. We offered persist two shapes — preserve the prior's
asserted_atthrough the widening, or keep the placement time and carry the claim's instant alongside it — and said we would adopt whichever they choose.Not a local workaround: seeding at
federationis refused by the local-tier rule; followingreferences_attestation_idto the prior only works on the authoring node, which is not the node doing the detection; and dropping the same-instant rule changes what the detector means.