a wire protocol that is versioned by forking the tree
Two nodes that must talk to each other cannot both be upgraded at the same instant, and a peer-to-peer fabric has no maintenance window in which the whole network is quiet. Every wire format we ship has to be readable by parties still running the previous one, and the moment we change a message's shape there are two populations on the network that disagree about what a message means.
The obvious answer is a compatibility layer: optional fields, negotiated capabilities, branches in the decode path. We rejected it here because a wire format is read by strangers and by adversaries, and every optional branch is a place where two implementations can quietly disagree. A decoder that accepts both shapes will eventually accept a shape nobody intended, and the failure surfaces in the field, months later, without a stack trace.
So each protocol version gets its own complete copy of the tree: the framing library, the coordinator, the client, the directory service, the deployment module and the test topology, with every internal reference rewritten to the new name. Containers are cloned from the previous version's snapshot, and the new tree must compile and pass its own tests before a single feature lands in it.
The cost is duplication and a merge burden carried by hand. What it buys is that a version can be kept alive or abandoned without untangling flags, and the difference between two versions is legible as a whole rather than as a scatter of conditionals. It is a decision to spend mechanical effort now to avoid semantic debt later, and it proves the team treats compatibility as an architectural object.
drawn from: single commit
Every note carries a codename and one idea. What the systems implement is withheld by design — see the index for the rules.