Thanks both, very helpful! 
I’m building myself a mini-Javascript client, so this is useful.
It seems like it’s a case of always update the client’s lin_read to the maximum values received from any transaction/request.
Any new requests use the client’s lin_read to start, and any on-going transactions can use the latest lin_read they received in a response related to that transaction (even if it’s not as high as the client’s lin_read).