Reads check the queue every time. I don't write anything into the cache ahead of time.
The cache just stores the server's response for each query. When you read, it takes that cached response and applies your pending writes on top: inserts get added, updates get patched, deletes get removed.
When a write syncs, it stays applied until that list gets refetched from the server, and then it drops out. So there's no writing optimistic rows into local tables, and no reconcile step afterward.
The trade-off is there's no local SQL. Pending rows only match simple filters (eq, neq, in, is), and they don't respect sort order or limits.