diff --git a/link/v8.md b/link/v8.md index 61be5a3..355ef48 100644 --- a/link/v8.md +++ b/link/v8.md @@ -1145,6 +1145,28 @@ sending `""` — a serialisation of "I have no fingerprint to assert" — had ev a sentence naming no catalog at all ("catalog is now 8159778b"). Found by an offline probe that passed one by accident. +It was **inline in three places** by the time it was found: the body catalogue (phase 3), statics +and land (phase 5) and the tree (phase 7). All three now go through one +`BridgeAssets.CatalogMismatch`, because three copies of a comparison are three chances for the next +family to get it wrong in a way only a differently-written client would ever reveal. It is +deliberately *not* the shape `BridgeLeases` uses for its own `expected`: there the value is a world +property, where an empty string is a legitimate thing to expect and `!= null` is correct. + +Both defects are the same kind of thing and worth naming as one: **a value that means "I am not +asserting anything" has two spellings on a wire, and a stock install finds whichever one you did not +think about.** The plane is now checked against a stock ServUO install as a whole — every family, +each asked with a real catalog, an absent one and an empty one: + +``` +cliloc.table walk 67,496 rows, 12 pages +body manifest / fetch 1,095 rows; ok with a real, absent and empty catalog +static + land fetch ok with a real, absent and empty catalog +static/land carry their OWN catalog art 66a112c1 vs body 323f284f — a cross-family id is refused +tree manifest / fetch 141 files incl. BOTH empty ones; all three ways +empty files carry a VALID gzip member 2 rows gunzip to 0 bytes +a STALE catalog is still refused body, static and tree all 422 +``` + **`GZipStream` writes nothing for zero bytes of input.** The gzip header is emitted lazily on the first write, so a stream opened and closed without one yields a zero-length buffer rather than the 20-byte empty member — which is not a valid gzip stream. **Stock ServUO 57.4 ships two empty