Skip to content

Equivocation detection reads placement time, not claim time — blocked on CIRISPersist#801 #534

Description

@emooreatx

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions