>doesn't have any kind of capabilities negotiation
Do you think capability negotiation should indeed be at the protocol level? What's wrong with say "select * from backend_capabilities" at the connection setup?
(Kinda a side-track, but):
Because that's too late. When we eventually do a v4 protocol it needs a way to say, during initial handshake, what the server and client support, so the server won't send any protocol messages to the client that it can't understand and vice versa.
The simplest form is "I <server> speak protocol 4.4", "I <client> speak protocol 4.1", "OK, lets use protocol 4.1 and the server won't send you anything that might confuse you from 4.2, 4.3, or 4.4."
Much better is for the client to connect with "I <client> understand GSSAPI, lazily fetched LOBs, STARTTLS, and wire-level compression" and the server to say "I understand GSSAPI, wire-level compression, per-datum charsets and database-switching", so they know to agree on using GSSAPI and wire-level compression. Neither will send the other stuff it won't understand that could land up breaking it.
Right now we've really got no way to add additional data to query responses, commandcomplete, etc, because we've got no way to make sure the client can cope with it being there.