Y / N indicates whether this message is part of the spec for this direction (C2S/S2C) and mode (HTTP/Sock).
Message type C2S
HTTP
C2S
Sock
S2C
HTTP
S2C
Sock
Purpose
HelloFrame(helloData) Y Y N N Used to authenticate each transport that connects to the Minerva server. C2S only because HelloFrame is used by the client to identify itself to the server, and set critical transport parameters.
StreamCreatedFrame() N N Y Y Sent to indicate that a Stream has been successfully created. This is the first frame sent over *every* sucessfully-authenticated transport with `requestNewStream`, so it may be sent over more than one in transport. This allows the client to know that it can now send smaller HelloFrames without `requestNewStream` and `credentialsData`.
CommentFrame(comment) N N Y Y CommentFrame is used for HTTP anti-script-inclusion preamble, padding, and heartbeats.  Padding is only needed to work around browser problems with content sniffing (in IE, Safari, Chrome, maybe Opera?), and maybe annoying proxies.
SeqNumFrame(nextSeqNum) Y Y Y Y "The next string I write to the transport will have this seqNum"
StringFrame(string) Y Y Y Y Both peers send strings (previously "boxes") - every other frame supports this basic function. `string` is restricted to the base "restricted string" codepoints.
ResetFrame(
reasonString, applicationLevel?)
Y Y Y Y Either peer can reset if they've given up on this stream. `reasonString` is restricted to the base "restricted string" codepoints.
SackFrame(sack) Y Y Y Y Both parties need to sack often to free memory in their peer's send queue
StreamStatusFrame(
lastSackSeenByServer)
N N Y Y Used to tell the client the `lastSackSeenByServer` before server closes the transport. Client uses this information to decide whether it needs to send a SackFrame. S2C only. Client also sends similar information to server, but it does so with `lastSackSeenByClient` in the HelloFrame.
YouCloseItFrame() N N Y Y In S2C context: This is useful when server wants client to do active close on the TCP socket for this transport (usually, to avoid having TIME_WAIT sockets). If server sends YouCloseItFrame over an HTTP transport, client must try to close the HTTP connection. (usually with xhrObject.abort() or removing an iframe)
TransportKillFrame(
"stream_attach_failure")
N N Y Y This error is a possible response to HelloFrame. It means transport authentication failed, or streamId does not exist.
TransportKillFrame(
"acked_unsent_strings")
N N Y Y This error is a response to client sending a SackFrame that SACKed strings that server never sent. Only the server sends acked_unsent_boxes. If the client thinks server sent a bad SACK, it should send ResetFrame.
TransportKillFrame(
"frame_corruption")
N N Y Y This error is a response to client sending corrupt frame octets or an overlong frame. Only server sends frame_corruption. If client received corrupt frames, it should make a new transport.
TransportKillFrame(
"invalid_frame_type_or_arguments")
N N Y Y This error is a response to client sending any unknown frame, or frame with invalid arguments. Only server sends invalid_frame_type_or_arguments. Only server sends invalid_frame_type_or_arguments. If client gets an unknown frame type or bad arguments, it should make a new transport.
TransportKillFrame(
"rwin_overflow")
N N Y Y This error is a response to client that has caused the server's receive window to overflow by sending strings that cannot be delivered. Later, client can connect a new transport and send deliverable strings. Only server sends overflowing_rwin. If client's receive window is overflowing, it should make a new transport and write a SackFrame.
HelloFrame arguments are documented in frames.py and frames.js

Presence of succeedsTransport option means "give me boxes, server". If succeedsTransport != null, temporarily assume that all boxes written to #<succeedsTransport> were SACKed.

Idea: perhaps ackMode: 0 - require Minerva-level SACKs, 1 - use my TCP acks, 2 - assume everything written is received
Idea: maybe distinct 'shutdown' and 'reset'?
Idea: advise_connect_bulk_transport: S2C-only message: Server indicates that client should try to establish an S2C transport more suitable for bulk transport. TODO: define this more
Why does server send TransportKillFrames, but client does not? Because the server doesn't really care about the client's problems with decoding frames. Server is still interested in this "problems" data, so it could be sent in a batch later.