#302 HANDOFF (start after #299 lands): ranked source candidates in .spt/preserved/302/CANDIDATES-doyle-20260913.md — read it whole. Headline: local rc rides the NetHost stream table (rc.rs:2425-2493), so BOTH rc directions run on NetHost's 2-worker tokio runtime (nethost.rs:1286), the same runtime the peer pump's ≤24 concurrent dead-peer dials (10 s bound each, nethost.rs:73/:82/:1610-1655) occupy every 15/30 s round (config.rs:39-41). Starved workers ⇒ read-pump tasks unpolled (output stops) + send_stream bounded_block_on stuck (input stops); both release at the 10 s bound; fire-and-forget input frames burst-drain. The canary/gauges for exactly this starvation already exist (nethost.rs:1386-1398 canary, :1541 active_dial_tasks, :1549 net_canary_age_ms). YOUR FIRST STEP IS A FIELD DISCRIMINATOR, NOT A FIX: find how net_canary_age_ms + active_dial_tasks surface (daemon status/diag verb; if they do not, the smallest exposure is the instrumentation, gated like #299's), and hand ME a one-line probe the operator runs on an affected box DURING a freeze. Stale canary (seconds) + nonzero dials confirms #1; fresh canary + a broker-conn parked in bounded_block_on = #2; neither → #4 (OutputLog mutex hold around become_controller). No remedy proposal until the discriminator has read. Candidate remedies are obvious once attributed (dials off the rc-serving runtime, or rc streams off the dial runtime) — do not pre-build one.