What you want to do sort of breaks the encapsulation principle behind i-PI.
The way we deal with WF extrapolation (which works on a very similar basis) in quantum espresso is entirely on the driver side. You keep the trajectory memory on the client side, and only check you're receiving the same replica ID as the previous step. If you do, you extrapolate, if you don't you reset the history. This is the only way to make the scheme robust. On his side, i-PI will guarantee that if you have as many running drivers as you have replicas, it will try to always pass the same replica to the same driver.
If you choose to do this, all you need is the replica ID, and we can help you figure out how to fetch that. Basically the relevant bits in the driver are
CALL writebuffer(socket,"NEEDINIT ",MSGLEN) ! Signals that we need initialization data
that is you ask to get init data, to which i-PI will reply
ELSEIF (trim(header) == "INIT") THEN ! The driver is kindly providing a string for initialization
CALL readbuffer(socket, rid)
CALL readbuffer(socket, cbuf)
CALL readbuffer(socket, initbuffer, cbuf)
i-PI passes the replica ID, and could send an initialization string, that you can happily ignore. Most codes don't do this at every step, but you can do that if you need the replica ID.
Answer to (2) is actually no. We're considering to do that, but never had a compelling use case this far. Drivers are allocated dynamically as they connect, and are assigned replicas to be computed in a load-balancing scheme. This means you can have any number of drivers, from one to the number of replicas, and i-PI will use them as well as it can.
Michele