diff --git a/link/v8.md b/link/v8.md index d95de90..99291e5 100644 --- a/link/v8.md +++ b/link/v8.md @@ -847,7 +847,7 @@ nothing. ## 7. The parser version applies here too -`spawnAtlasSource.js` carries `PARSER_VERSION` (currently 5) and the cliloc source carries its own, +`spawnAtlasSource.js` carries `PARSER_VERSION` (currently 6) and the cliloc source carries its own, both counted as drift so that a corrected parse reaches an install whose files never change. The asset pipeline inherits the rule and needs it more, not less: a fixed hue application or a corrected frame offset changes the bytes we derive from files that are byte-identical. @@ -1185,8 +1185,11 @@ filesystem reader walks each decoration directory with `localeCompare` while the relative paths, and those diverge the moment a directory mixes cases. So `buildFromFiles` sorts by label, ordinally, once, whatever order the files arrived in — and -`PARSER_VERSION` goes **4 → 5**, because that is identical input producing a different answer for a -handful of types, which is exactly what that number exists to push through the hash gate. The +`PARSER_VERSION` bumps, because that is identical input producing a different answer for a +handful of types, which is exactly what that number exists to push through the hash gate. It was +written here as **4 → 5** and the cutover renumbered it to **6**: `main` released a *different* 5 +meanwhile (a spawn point keeping its `UniqueId`, v1.2.2), and an install already storing 5 would +have read a phase-7 build declaring 5 as current and never re-read. See §17.15. The **source fingerprint also moved to raw bytes** at both ends: hashing decoded text hashes a UTF-8 *re-encoding*, which is identical for valid UTF-8 and different for a file that is not, and one Latin-1 character in a creature name would have made the drift gate report a change on every import @@ -1676,7 +1679,7 @@ disagree, so a split bump means the next bundle silently fails to compose. |---|---| | `servuo-plugins/` | Extraction over ServUO's own `Ultima` (§4), the cliloc decompressor (§9), body resolution (§8), the request handlers, `overlay.toml` | | `link/` | Six command families forwarded, the REST surface, **the inbound line cap (§3.3)**, `PROTOCOL_VERSION`. **Nothing in phases 4 or 5** — `assets_call` forwards a request body verbatim and `respond_assets` returns the reply verbatim, so a new key family and a new reply field both pass through untouched | -| `module-uo/` | Client calls, asset store, the atlas source backend (§10), cliloc ingest, admin surface. Phase 7 also bumped `PARSER_VERSION` 4 → 5 (§10.4) | +| `module-uo/` | Client calls, asset store, the atlas source backend (§10), cliloc ingest, admin surface. Phase 7 also bumped `PARSER_VERSION`, written as 4 → 5 and renumbered to **6** at the cutover (§10.4, §17.15) | | `website/` | Almost none — `ctx.uploads` already suffices (§12). Phase 2 deleted `server/tools/cliloc-export/`, the converter this protocol retires | | `docs/` | This file; rewrite `CLILOCS.md` §Converting and `SPAWN_ATLAS.md` §Artwork + §Configuring; **delete `UOFIDDLER.md`**; add the libgdiplus prerequisite to `SHARD_PREREQS.md` (§4.4). Phase 9a added the rest: `INTEGRATION.md` to protocol 8, an operator entry in `UPGRADE_NOTES.md`, the index rows, and the prerequisite + `doctor` row in `installer/INSTALL.md` | | `installer/` | A `doctor` check for libgdiplus on Linux hosts (§4.4) — **built in phase 9a**, Linux-only (a Windows host has nothing to check, so there is no row rather than a row saying "not applicable") and a `⚠` rather than a `✗`, because names and the spawn atlas have no pixels in them. Bundle pairing already enforces §15 | @@ -1696,10 +1699,10 @@ disagree, so a split bump means the next bundle silently fails to compose. | 4 | **DONE 2026-09-11.** The UOP animation decoder (§4.3, §4.9): `BridgeUop` + a PNG encoder that never touches `System.Drawing`, wired in beneath the legacy reader. **Two of the eight player bodies turned out to exist** (gargoyles 666/667); the other six are in no client file, and ghost ids left the player-body set (§5.2, §17.9). The same fallback added **233 other bodies**: the catalogue is **1,022 rows, 1,409 ms cold**, and all six player bodies have art for the first time. `EXTRACTOR_VERSION` 1 → 2 | servuo-plugins | | 5 | **DONE 2026-09-11.** Item statics and land on demand (§11.1): the `static` and `land` families, hue applied on the shard from `tiledata.mul`, the byte-bounded art cache, `assets.fetch` made family-aware, `families` on `assets.sources`. Website side: the warm pass, per-row `catalog` staleness, and pictures on the marketplace and the character sheet. **39,189 statics and 4,244 land tiles served; the only refusals are the 9,963 + 12,140 empty index slots §4.5 predicted.** Two traps found — the library's bitmap cache poisons a hued sprite, and `PartialHue` decides the picture from a file only the shard has. Protocol stays 8; `EXTRACTOR_VERSION` stays 2 | servuo-plugins, module-uo | | 6 | **DONE 2026-09-11, and not what this row said.** The measurement came first and changed the phase: a complete one-direction animation set is **174,453 frames / 281.5 MB**, not the ~119,000 estimated, and **the site displays still pictures** — so the deep keys and the bulk-fill switch were **not built** (§11.2, org lead 2026-09-11). What shipped is what the still-picture site was missing: the **73 bodies with no art at action 0 and real art deeper** (a horse at `body/820/a23`), the catalogue key carrying its action, the atlas join that reads it, and §4.10's per-body **action ceiling** — without which the fallback walk itself would serve **452 validated pictures of the next body**. Catalogue **1,022 → 1,095**; `EXTRACTOR_VERSION` 2 → 3; protocol stays 8 | servuo-plugins, module-uo | -| 7 | **DONE 2026-09-14.** The atlas over the sidecar (§10); shared-filesystem requirement retired. The measurement came first again and changed the shape: `tree/