1730a2c32a
Offloading the fsync to a worker thread (previous commit) lets two inbound messages have two persists in flight. Without ordering, a slow first flush lands after the second and the disk file loses the newer token/id/seen-id (in-memory state stayed correct, so the loss only surfaced after restart). The loop-side dict could also be mutated while the worker iterated it. - weixin ContextTokenStore / discord non-conversational tracker: snapshot the payload on the loop, hand it to the worker, serialize with a per-store asyncio.Lock. - feishu dedup: same asyncio.Lock around the offloaded persist (its snapshot was already taken under _dedup_lock; the write was not). - Regression tests: two concurrent persists with a slow first write must leave the union on disk. All three fail on the previous commit.