94b10eccf5
Async retain already keeps the memory WRITE off the reply path (writes drain on the single writer thread while the user gets their response immediately). This closes the remaining retain/prefetch race: the next turn's warm prefetch runs on its own thread and could recall BEFORE the just-enqueued retain write lands, silently dropping the latest turn from recall. - The background prefetch now waits (bounded) for pending retains to drain before recalling, so warmed context includes the just-completed turn. - The wait runs only on the background prefetch thread, never the reply path, so it adds zero latency to the user's response and loses no writes. - Bounded by prefetch_retain_drain_timeout (default 10s) and polls unfinished_tasks so a wedged write can't hang the prefetch. - New config keys: prefetch_waits_for_retain (default true), prefetch_retain_drain_timeout (default 10.0).