Fan a request out to peer runtimes; tolerate partial failure. The
load-bearing pattern is JobMux: a single reader on client.events()
fans envelopes out to per-job tokio::sync::mpsc channels.
Parallel for await env in client.events() loops starve each other —
only one wins per await. Without a mux you serialize everything.
let mux = JobMux::new();
mux.start(Arc::clone(&client));
for peer in PEERS {
let job = delegate(&client, peer, request, trace_id).await;
mux.register(job.job_id.clone()).await;
}
let completed = futures::future::join_all(jobs.iter().map(|j| collect(&mux, j))).await;trace_id propagates so peers join one distributed trace.
agent.delegate— §14.job.accepted/job.completed/job.failed/job.cancelled— §10.trace_idpropagation across peers — §17.idempotency_keyfor re-delegation safety — §6.4.
main.rs— fan-out +JobMux+collect.synth.rs— final synthesis stub.
- Add a fastest-wins variant: cancel laggards once
min_resultsarrive. - Rebalance: track per-peer P50 latency from past runs to pick the best target order.