For a minimum initial server federation system, I'm thinking we could just have a hardcoded list of servers to federate with in the server config file. We also don't need a fancy DAG for message ordering, we can just continue using the server timestamp for now. Even with these simplifications, this is going to be a hard problem. Particularly, we need to determine when to send new messages to peers, how to handle retries on errors, and how to resolve conflicts when two servers send a message with the same contents.
For the absolute minimal initial prototype, I plan to send messages immediately when they are received from the client, making no effort to retry sending on errors, and always accepting the newest received message when there is a conflict.