Original text:
client, or the client receives a server version that it did not offer, the corresponding peer MUST close the connection. <del> The SETUP parameters are described in the setup-parameters section. </del>  <del> 6.1.1. </del>  Every parameter MUST appear at most once within the SETUP message. The peers SHOULD verify that and close the connection if a parameter

Reviewer comments:
Based on QUIC: URL
Based on call today, sounds like when running over QUIC we should also use an ALPN of "moq-13" for draft 13
When running over web transport, we need to talk to the web transport people to talk about what to do but the ALPN would be H3 (or whatever) so the answer is not ALPN
The conclusion was that we should move version negotiation out of the SETUP message and into an ALPN for native QUIC and an unspecified mechanism for WebTransport. However, I can't think of any replacement for WebTransport that would work today. Query parameters would work for passing the client supported versions but there's no mechanism for replying with the server selected version. The javascript API provides no information about connection establishment (ex. any returned headers), only that it completed. If we moved version negotiation out of SETUP, then it would not be possible to interop until new WebTransport functionality was deployed, assuming W3C agrees in the first place. Could we go ahead with this PR until there's an available alternative? I like the direction of utilizing more of the QUIC/WebTransport handshake, but I don't think we should block interop awaiting this marginally better design.
Can we add in the ALPN text as part of this PR and for now say something like "When QUIC is used, the negotiated alpn MUST match the value in the SETUP message."?
It's time to specify some version numbers so we can attempt interop. We should do something like QUIC, where draft versions are prefixed with 0xff (or something?).
+1 The QUIC guys way over engineered this so I would be fine with just doing the same thing so we don't need to bike shed on it.
For now, will go with lower bits are the draft number and upper bits are some fixed set of bits defined in the draft. Do roughly what QUIC did.
Here's what I propose we copy: URL We don't need semvar yet because each version WILL have breaking changes. I'd be totally fine with semvar for the final RFC, like one byte for the major/minor/revision. Although I also think that negotiating extensions is more flexible for a transport protocol, while semvar seems more useful for something intended for fanout like the catalog.
Per conversation, we've decided to move forward with this and do ALPN as a separate PR.I would want to consider using alpn at some point in time. Want to keep it open for URL version at some point too. This PR is fine to continue the experimentation.Looks fine to me. Sure we might do more complicated stuff later but this seems like good enough for now.

Revised text:
client, or the client receives a server version that it did not offer, the corresponding peer MUST close the connection.  <ins> [[RFC editor: please remove the remainder of this section before publication.]] </ins>  <ins> The version number for the final version of this specification (0x00000001), is reserved for the version of the protocol that is published as an RFC.  Version numbers used to identify IETF drafts are created by adding the draft number to 0xff000000.  For example, draft-ietf-moq-transport-13 would be identified as 0xff00000D. 6.1.2. </ins> Every parameter MUST appear at most once within the SETUP message. The peers SHOULD verify that and close the connection if a parameter