Task
When a corroboration round catches the writer contradicting a decisive quorum, dig-node now ends the session at once and dials a fresh peer (dig_ecosystem#2868). Nothing tells the dial which address it just rejected: connect_random_peer takes no exclusion argument, so the replacement may be the same contradicting peer.
Context
crates/dig-wallet/src/sage/sync_supervisor.rs — ChiaQuorumCorroborator::probe and the reconnect path; chia_query::peer::connect::connect_random_peer(network, tls, timeout).
- The supervisor already documents the related bias: the helper tries
127.0.0.1 first and returns latency-first, so a host with a co-resident full node gets the same address every time.
Why it is not urgent
The existing backoff ladder bounds it. A refused session is far shorter than HEALTHY_SESSION, so backoff is not reset and doubles toward BACKOFF_MAX (60s) — a permanently contradicting local peer converges on one dial per minute rather than a dial loop. That is the property repeated_contradiction_climbs_the_existing_backoff pins.
Scope
An exclusion set (or at minimum a one-address avoid hint) threaded into the dial, so the peer that was just replaced is not the first candidate returned. Assess whether this belongs in chia-query (shared) or as a retry-with-reject loop in dig-node; the shared crate is release-first if so.
Evidence
A test showing a contradicting writer at address A is followed by a dial that is not A, while a network offering only A still degrades to the backoff ladder rather than a hang.
Orchestrator ticket: https://github.com/DIG-Network/dig_ecosystem/issues/2790
Moved from DIG-Network/dig_ecosystem#2873 so this repo's own PR can close it with Closes (CLAUDE.md §1.3).
GitHub refuses a private-to-public issue transfer, so the body was copied and comment history
stayed on the original.
Task
When a corroboration round catches the writer contradicting a decisive quorum, dig-node now ends the session at once and dials a fresh peer (dig_ecosystem#2868). Nothing tells the dial which address it just rejected:
connect_random_peertakes no exclusion argument, so the replacement may be the same contradicting peer.Context
crates/dig-wallet/src/sage/sync_supervisor.rs—ChiaQuorumCorroborator::probeand the reconnect path;chia_query::peer::connect::connect_random_peer(network, tls, timeout).127.0.0.1first and returns latency-first, so a host with a co-resident full node gets the same address every time.Why it is not urgent
The existing backoff ladder bounds it. A refused session is far shorter than
HEALTHY_SESSION, so backoff is not reset and doubles towardBACKOFF_MAX(60s) — a permanently contradicting local peer converges on one dial per minute rather than a dial loop. That is the propertyrepeated_contradiction_climbs_the_existing_backoffpins.Scope
An exclusion set (or at minimum a one-address avoid hint) threaded into the dial, so the peer that was just replaced is not the first candidate returned. Assess whether this belongs in
chia-query(shared) or as a retry-with-reject loop in dig-node; the shared crate is release-first if so.Evidence
A test showing a contradicting writer at address A is followed by a dial that is not A, while a network offering only A still degrades to the backoff ladder rather than a hang.
Orchestrator ticket: https://github.com/DIG-Network/dig_ecosystem/issues/2790
Moved from DIG-Network/dig_ecosystem#2873 so this repo's own PR can close it with
Closes(CLAUDE.md §1.3).GitHub refuses a private-to-public issue transfer, so the body was copied and comment history
stayed on the original.