Follow-on to #568's second mechanism (v20.3.0 dial detach). CIRISServer re-measured on v20.3.0: 181/210 s → 61/90 s, one run per substrate, direction consistent with the detach. The remainder is still quantised to the scheduler cadence: 61 s ≈ 2 ticks, 90 s = 3 ticks of DEFAULT_CADENCE (30 s).
The mechanism that plausibly remains
The detach (DialCtx + tokio::spawn) means a round that abandons its wait no longer destroys the link — the dial completes and publishes into reusable_dialed_link. But nothing wakes the coordinator when it does. The next round toward that peer waits for the next cadence tick, and if the dial completed just after a tick, that's up to a full 30 s of a ready link sitting idle. Two ticks is the expected cost when the first round times out at +10 s and the dial completes somewhere in the following 20 s.
Proposed fix
On detached-dial completion, fire SchedulerCommand::RoundNow for the coordinators bound to that peer — the same kick sync_and_await already uses (CoordControl.kick, per-coordinator Notify; a kick during a round is held; interval.reset() after a kicked round). The plumbing exists; what's missing is the trigger from the transport's dial-completion back to the scheduler for that peer_key_id.
Expected outcome: the first round still times out at +10 s (the dial can't finish inside it), but the completed dial immediately kicks a round, so convergence lands at ~10 s + dial time rather than at the next tick boundary. That would take 61/90 s toward the 30–40 s range on this ladder.
Not to be done blind
Before wiring the kick, read ladder.owner_binding_converged's new gauge row (retry_queued / retry_dropped_total beside elapsed_ms) from a v20.3.0 mesh run. If retry_dropped_total is climbing during the window, the residual is retry-queue drops (leviculum#63's observation from the live canonical), not tick alignment, and a RoundNow kick would just retry into a shedding queue. The gauge row distinguishes them; #568 has now been inferred three times and measured zero.
Related: #568, leviculum#63, SchedulerCommand::RoundNow (v19.0.0 sync_and_await).
Follow-on to #568's second mechanism (v20.3.0 dial detach). CIRISServer re-measured on v20.3.0: 181/210 s → 61/90 s, one run per substrate, direction consistent with the detach. The remainder is still quantised to the scheduler cadence: 61 s ≈ 2 ticks, 90 s = 3 ticks of
DEFAULT_CADENCE(30 s).The mechanism that plausibly remains
The detach (
DialCtx+tokio::spawn) means a round that abandons its wait no longer destroys the link — the dial completes and publishes intoreusable_dialed_link. But nothing wakes the coordinator when it does. The next round toward that peer waits for the next cadence tick, and if the dial completed just after a tick, that's up to a full 30 s of a ready link sitting idle. Two ticks is the expected cost when the first round times out at +10 s and the dial completes somewhere in the following 20 s.Proposed fix
On detached-dial completion, fire
SchedulerCommand::RoundNowfor the coordinators bound to that peer — the same kicksync_and_awaitalready uses (CoordControl.kick, per-coordinatorNotify; a kick during a round is held;interval.reset()after a kicked round). The plumbing exists; what's missing is the trigger from the transport's dial-completion back to the scheduler for thatpeer_key_id.Expected outcome: the first round still times out at +10 s (the dial can't finish inside it), but the completed dial immediately kicks a round, so convergence lands at ~10 s + dial time rather than at the next tick boundary. That would take 61/90 s toward the 30–40 s range on this ladder.
Not to be done blind
Before wiring the kick, read
ladder.owner_binding_converged's new gauge row (retry_queued/retry_dropped_totalbesideelapsed_ms) from a v20.3.0 mesh run. Ifretry_dropped_totalis climbing during the window, the residual is retry-queue drops (leviculum#63's observation from the live canonical), not tick alignment, and aRoundNowkick would just retry into a shedding queue. The gauge row distinguishes them; #568 has now been inferred three times and measured zero.Related: #568, leviculum#63,
SchedulerCommand::RoundNow(v19.0.0sync_and_await).