Address both P1 review comments:
- The exchange now runs on the stage's tensor-model-parallel group
(vLLM parallel state) instead of pt.world. World also holds DP
replicas and PP stages working on different requests, so the old
group could mix verdicts across requests and — worse — deadlock if
one replica skipped the exchange (dummy request) while another
entered it. Within the TP group every skip guard is symmetric.
- Ranks now exchange (primary_received, sorted applied-KV roles)
instead of a bare flag, using the same field enumeration as
apply/broadcast, so partially-received CFG companion KV
(cfg_text/cfg_img) diverging between ranks is caught too. Verdict is
identical-state-everywhere: any divergence clears KV on every rank;
symmetric absence is kept because it is consistent (Bagel's empty
unconditional branch).
Local e2e rerun of test_bagel[tp_vae_patch_parallel_2] passed and the
new path fired on a real divergence (one rank primary+metadata, the
other only cfg_kv_request_ids) — both ranks fell back together.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: tzhouam <tzhouam@connect.ust.hk>