Skip to content

Commit 5cae3f0

Browse files
3x3xX3N0Nclaude
andcommitted
The missing version field, named; positioning and walk-backs made standing docs
Authored by the parallel "MOQ over time since 1999" session, reviewed and committed here after verifying its central claim against the code: Wire.VERSION (0x54530000) only tags the build - nothing writes a version into any packet, so today a wire-format skew between builds is an undiagnosable decode failure rather than a named mismatch. SPEC had listed "version negotiation + greased versions" in the Keep column for all of v0; it was never built. - docs/TODO.md gains section 11: what would settle it (a version field, a defined mismatch response, and a two-build test asserting the receiver NAMES the mismatch), why waiting compounds (every pre-field wire change is one no deployed peer can detect, and the independent decoder of section 7 will encode whatever v0 is on the day it is written), and that it is blocked on nothing. - docs/SPEC.md moves the row to a new "Claimed, not implemented" column instead of deleting it - the gap between claim and code is the interesting part - and fixes the :288 note that would have gone stale with the move. - CLAUDE.md gains "Why this exists" (the no-Google rule is the experiment, not licensing hygiene; RLNC is the load-bearing bet; forced convergence back onto an RFC is data) and a standing walk-backs list, seeded with the Retry reversal and this inverse case - never rejected, never built, caught by pinning golden wire vectors rather than by reading the ledger. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent b0ddbdc commit 5cae3f0

3 files changed

Lines changed: 58 additions & 4 deletions

File tree

CLAUDE.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,36 @@ Homa, RLNC literature, CUBIC/HyStart++, and IETF specifications implemented from
1010
records what was deliberately borrowed and what was rejected; `NOTICE` records provenance per mechanism. Keep
1111
that table current when adding anything.
1212

13+
## Why this exists (read before touching the constraint above)
14+
15+
The no-Google rule is not licensing hygiene, it is the experiment. Tessera re-runs the choice the transport
16+
world made in 2000, when SCTP failed to deploy because middleboxes dropped an unknown IP protocol number, and
17+
QUIC's answer a decade later was to hide a new transport inside UDP. Tessera takes that answer and declines
18+
the rest of the package: it sits at QUIC's layer rather than above it, where MoQ and WebTransport sit.
19+
20+
Two things follow, and they are the reason to keep the provenance table honest:
21+
22+
- **The load-bearing bet is RLNC.** Every deployed transport on both the web and media lineages recovers loss
23+
by asking again — at minimum one RTT per loss — and nothing has revisited that since 1999. Coded repair is
24+
the only mechanism here that could not be obtained by configuring an existing QUIC stack. If the flat-tail
25+
claim survives real radios, that is the result. Everything else is a defensible variation.
26+
- **Forced convergence is data, not defeat.** Implementing RFC 9000/9001/9002 from the documents makes this an
27+
independent reading of them. Every place the reimplementation *had* to come back to the spec says something
28+
about which parts of QUIC are essential rather than incidental. Those are findings; write them down.
29+
30+
## Walk-backs — mechanisms rejected, then readopted
31+
32+
A standing list, because this class of event recurs and is worth more than the individual fixes. When a
33+
"leave behind" decision reverses, add it here as well as in the `docs/SPEC.md` ledger.
34+
35+
- **Retry / address validation** (v0.7). Originally rejected as QUIC ceremony. Wrong: the amplification limit
36+
and ticket binding bound *reflected bytes*, not *CPU*, and the ML-KEM operation ran before anything had
37+
authenticated the sender — a cost RFC 9000 could not have anticipated but that its mechanism happens to
38+
cover. Retry now ships, gated on pressure so 0-RTT survives the common case. `docs/SPEC.md`, the struck row.
39+
- **Version negotiation** (open, `docs/TODO.md` §11). The inverse case: never rejected, listed as kept for the
40+
whole of v0, and never built. Caught by pinning golden wire vectors, not by reading the ledger — which is
41+
the argument for pinning things.
42+
1343
## Layout
1444

1545
| Module | Contents |

docs/SPEC.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ Actually open:
127127
| Amplification limit (3×) before path validation | Only sane anti-reflection design |
128128
| ACK ranges + ECN counts + ack-delay field | Cheap, precise loss/OWD signal |
129129
| Transport-parameter TLV with grease | Extensibility that survives middleboxes |
130-
| Version negotiation + greased versions | Ossification insurance |
131130
| Header protection (encrypt PN) | Prevents middlebox PN inference; cheap |
132131
| Key update via key-phase bit | Re-key without handshake |
133132
| DPLPMTUD | Real MTU, fewer packets |
@@ -145,6 +144,10 @@ Actually open:
145144
| HTTP/3-shaped priorities | App-layer concern |
146145
| Multipath as extension | Multipath is native: per-path PN space, cross-path repair |
147146

147+
| Claimed, not implemented | State |
148+
|---|---|
149+
| Version negotiation + greased versions | The intent was ossification insurance; v0 packets carry no version field, and `Wire.VERSION` only tags the build. Listed here rather than under **Keep** because the ledger a new reader trusts first should not describe a mechanism that is absent. Open item: `docs/TODO.md` §11. |
150+
148151
## v0.3 (2026-08-22) — eight parallel modules merged, 74 tests
149152
| Module | File | Status |
150153
|---|---|---|
@@ -285,9 +288,10 @@ described something the code does not do. The code is authoritative; the spec wa
285288
1-byte PN is parseable but never emitted. The short header is 7 bytes typical, not 6.
286289
- **`0x81` is Padding**, carrying 2–257 bytes, used for PMTUD probes. Previously the `0x80+` range was described
287290
only as "extension/grease" with no assignments listed.
288-
- **There is no version field on the wire.** "Version negotiation + greased versions" is listed among the
289-
mechanisms kept from QUIC, but v0 packets carry no version; `Wire.VERSION` only tags the build. It remains a
290-
design intention, not an implemented mechanism, and is listed under open items instead.
291+
- **There is no version field on the wire.** "Version negotiation + greased versions" used to sit in the
292+
**Keep** column, but v0 packets carry no version; `Wire.VERSION` only tags the build. It is a design
293+
intention, not an implemented mechanism, and now sits under **Claimed, not implemented** above, with the
294+
open item at `docs/TODO.md` §11.
291295

292296
### Closed: native dual-stack on Windows
293297

docs/TODO.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,26 @@ Ten Vultr nodes (`sao scl jnb syd blr sgp mex icn ewr del`) are up and billing a
155155
`python bench/mesh/mesh.py destroy` is the off switch. `bench/mesh/shape.py clear all` before destroying if any
156156
node is still shaped — and verify with `show`, because `clear` has lied once already.
157157

158+
## 11. No version field on the wire — the upgrade path does not exist
159+
160+
`docs/SPEC.md` listed "version negotiation + greased versions" among the mechanisms kept from QUIC for the
161+
whole of v0. It was never built: v0 packets carry no version, and `Wire.VERSION = 0x54530000` only tags the
162+
build. The row has been moved to a **Claimed, not implemented** column rather than deleted, because the gap
163+
between the two is the interesting part.
164+
165+
This is not cosmetic. `README.md` says to expect the wire format to change, and `WireVectorsTest` notes that a
166+
peer built from an older commit no longer interoperates — so today a version skew is an undiagnosable decode
167+
failure rather than a clean mismatch. Ossification insurance is the one lesson the whole design inherits from
168+
SCTP's failure to deploy, and it is the lesson currently not applied.
169+
170+
- **What would settle it:** a version field in the long header, a defined mismatch response, and a test that
171+
runs two builds with different versions against each other and asserts the *receiver names the mismatch*
172+
rather than failing to parse. Greasing is a second step and not required to close this.
173+
- **Cost of waiting:** it compounds. Every wire change made before there is a version field is a change no
174+
deployed peer can detect, and the independent-decoder work in §7 will encode whatever v0 happens to be on
175+
the day it is written.
176+
- **Not blocked on anything.** No hardware, no nodes, no measurement — this one is only unwritten.
177+
158178
---
159179

160180
## Closed, with the argument worth keeping

0 commit comments

Comments
 (0)