Skip to content

docs: scope C15's freshness claim to the answering node, and file C33 - #373

Merged
vieiralucas merged 1 commit into
mainfrom
docs/c15-follower-freshness
Jul 29, 2026
Merged

docs: scope C15's freshness claim to the answering node, and file C33#373
vieiralucas merged 1 commit into
mainfrom
docs/c15-follower-freshness

Conversation

@vieiralucas

@vieiralucas vieiralucas commented Jul 29, 2026

Copy link
Copy Markdown
Member

Doc-only follow-up to C15 (#368), from its final review pass.

  • ARCHITECTURE §Named Versions: "current policy governs a version read" was silent on whose current. The doc-ACL tuples ride the room's log, so a follower that has not yet replicated a revoke redacts by the grants it still holds. Scoped the claim to the node answering.
  • C33 filed: VersionFetch has no read-routing gate at all — Subscribe runs read_redirect_response (a follower serves only when caught up to the client's floor) and the version mutations redirect to the leader outright, but a fetch answers from local state unconditionally. Not a regression, and the live fan-out on the same follower is equally stale; the version seam is where the staleness is unbounded by the client, since a fetch names no sequence and so cannot be refused for being behind one. Distinct from C29, where the gate fails open for want of a creator rather than working on stale inputs.

Summary by cubic

Clarifies that version reads use the policy current on the node answering, not the version’s captured ACLs, so a lagging follower may redact using stale grants. Files C33 to track that VersionFetch lacks a read-routing gate and should route like Subscribe to avoid stale reads.

Written for commit cd4c327. Summary will update on new commits.

Review in cubic

ARCHITECTURE said current policy governs a version read, which is true of the
tiers but silent on which node's "current" it means. The doc-ACL tuples ride the
room's log, so a follower that has not replicated a revoke redacts by the grants
it still holds — and `VersionFetch`, unlike `Subscribe`, has no read routing gate
at all, so nothing steers the request to a node that is caught up.

C33 files that: the fetch names no sequence, so unlike a subscribe it cannot be
refused for being behind one. Distinct from C29, where the gate fails open for
want of a creator rather than working on stale inputs.
@vieiralucas
vieiralucas merged commit 66eb12a into main Jul 29, 2026
18 checks passed
@vieiralucas
vieiralucas deleted the docs/c15-follower-freshness branch July 29, 2026 04:27
vieiralucas added a commit that referenced this pull request Jul 29, 2026
…vidence actually converges to

Cold review pass 8.

`dial_establishes_identity` decides what enters `verifiers`, and `verifiers` is
what the ring is derived from, so it has to be the same answer everywhere. It
read `advertises_tls`, a roster lookup, which answers `false` for a member not
yet learned — so the frame that *introduces* a sender was judged differently
from every later one, and the claims it carried were kept by nodes that already
knew it and dropped by nodes meeting it. One delivery, two states. A node id is
an advertise address, so the transport is a property of the id and needs no
state to read.

The module docs claimed the evidence "converges however gossip interleaves".
It does not. Liveness is relayed and anti-entropies; a verification claim is
first-hand and is never passed on, deliberately, because with no signature on
the wire "A and B verified X" is free for any node to write and relaying it
would hand a compromised member a mint rather than a split. The consequence is
that a compromised adopted member is a swing vote for any candidate exactly one
other trust unit has reached: it sets the flag toward some peers and clears it
toward others, and the groups place rooms differently — measured at 721/1000
rooms, 149 of them with two nodes each believing itself primary, surviving 30
further anti-entropy sweeps. The docs now state what holds, and the residual is
pinned as a passing test and filed as C39.

Board: C15 (#368/#373) filed its own C27-C33 first, so this branch's units are
renumbered C34-C38 and the stale duplicate C26 line is dropped.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant