Conversation
96dbc67 to
ecc9a9c
Compare
|
Re-reviewed against current Blocking integration work:
This is separate from #796 (inert participant inventory) and #799 (authority snapshot reader). Neither by itself activates participant enrollment or grants ongoing naming admission. |
|
Integration update (main after #796/#799): I split the missing coherent local prefix scanner into #829. #811 still conflicts with main and remains draft. The rebase must preserve main’s escaped vote-key grammar, proposed-PID cross-scope checks, local-only EVENTUAL revocation, and authority/snapshot behavior. Before marking it ready, I will also require fail-closed observation errors and an atomic check that ACK and NACK cannot both be committed for one node/attempt. The initial automatic-merge trial does not compile and has not been pushed. Activation/retirement authority and 100-node evidence remain separate cluster-readiness work as already noted in this PR. |
3077813 to
a2d23fb
Compare
|
Adversarial follow-up (def75cd): Strong voting now inspects every live EVENTUAL dot for the name, not just the visible winner. EVENTUAL lookup suppresses a conflicting result while this node holds a pending or active Strong exclusion; the raw CRDT state remains intact for convergence. Regressions cover hidden local and remote dots, delayed gossip after reservation, and a real KV Strong NACK. Affected race suites, 20-run targeted stress, and go vet pass locally. Participant retirement is still deliberately fail-closed and remains a separate design/rollout decision; a gossip timeout is not fencing. |
What changes
Strong naming uses an ordered KV-watch owner with a bounded worker pool. Pending attempts have stable IDs, and waiters, retry timers, exclusions, and terminal results remain bound to their attempt. Slow votes cannot block unrelated watch delivery. Each voter checks LOCAL/EVENTUAL claims and installs its exclusion under the shared per-name admission gate. ACK/NACK, promotion, and expiry use conditional KV transactions; snapshot, record, and vote-read failures close admission.
This revision also closes the omitted-member gap. Before a node opens LOCAL/EVENTUAL admission, it commits a fresh activation marker into a KV-backed naming-participant roster, waits for that marker locally, opens the watch, and coherently seeds pending and active claims. Strong pending creation reads that roster and conditions its transaction on the exact roster version. If enrollment wins first, the new participant is required to vote; if pending creation wins first, the joining participant sees the pending claim during seed before it can admit a weaker name. Roster changes that supersede a node's activation close its admission. Activation has a 10-second startup bound, including a stalled Raft submission, and fails closed on timeout.
Operational boundaries
Validation
go vet, andgit diff --check.Astra reviewed the roster protocol and found no additional safety blocker under the stated NodeID assumption. Keep draft until CI and the fail-closed availability/rollout tradeoffs are accepted.