Canonicalize or reject: one address, one spelling
Reading the Draft · No. 2 · Source: draft-li-rttp-iqa-addressing-00 §4.2 / §8 · Sister pillars: rttp:// (CRI 27) · iqa:// (CRI 28)
Derived addressing has a soft spot that traditional addressing does not: the address is a deterministic function of the authority string, so "two spellings of the same address" is not a style question — it is a correctness question. Two spellings mean two derivation inputs; two inputs mean two addresses; one "subject" silently splits into two. This piece answers exactly that: how do you guarantee a unique spelling?
Our answer is in Section 4.2, pointing opposite to the rest of the URI ecosystem: "The canonical form is lowercase US-ASCII. Uppercase is invalid input, not a formatting difference: a parser MUST NOT normalise it, because two distinct strings would then map onto one address." Section 8 extends the same position to internationalization: a client "MUST NOT map a Unicode label to its ASCII form (for example, by case folding or by applying an IDNA-style transformation) in order to accept it" — the reason equally plain: with no host to resolve there is no need for a label-to-ASCII transformation, and permitting one transformation introduces a second way to write one address.
The mainstream ecosystem's liberal normalization — case folding, percent-decoding, IDNA — serves one purpose: contacting a host. A spare spelling is a bit of user tolerance. The purpose of derived addressing is not to contact a host but to derive a routing value that must be consistent across every relying party — each bit of tolerance forks the derivation input directly. So the standard toolkit of normalization becomes, in our context, attack surface: fold one uppercase letter and you have opened a channel where two strings map onto one address.
So there is exactly one rule, at MUST NOT strength: the parser never repairs input. Non-conforming input is rejected, not charitably corrected. This is the same fail-closed stance as the whole specification (Section 1: "non-conforming input is rejected, never repaired") — repair is the parser's arrogance: it presumes to know what the writer meant. In an addressing context, that presumption is the doorway of impersonation.
The cost? The writer must get the lowercase right. We judge the price fair: a mistyped string does not produce a silently wrong route — it produces an explicit rejection. The error is stopped before it ever reaches derivation, and so never reaches the ledger.
One line: liberal normalization buys tolerance and sells uniqueness; we sell tolerance and buy back the mathematical fact that one address has one spelling — for derived addressing, that is not a style. It is correctness itself.