docs(link): the phase the measurement cancelled, and the 452 wrong pictures it found on the way (Phase 6) #241

Merged
whitlocktech merged 1 commits from docs/asset-bridge-p6 into main 2026-09-14 06:15:33 +00:00
Member

What & why

Records Asset Bridge phase 6, which is not the phase §16 planned — and the reason is worth the section it gets.

§16 said "deep animation keys (body/<id>/a<n>/f<n>) for the future project, plus the bulk-fill switch". The measurement came first, as in every phase here, and changed what the phase was worth:

§11 estimated Measured (§11.2)
Bodies with art at some action 1,022 1,096
Action keys with frames 26,274
Frames ~119,000 174,453
As PNG ~117 MB 281.5 MB
Per body median 118 KB, p90 536 KB, max 9.6 MB
Decode + encode the lot 104 s

Plus the shape fact any frame design has to answer: 23,818 of 26,274 actions have frames that differ in size, each with its own centre offset, so a key returning only a PNG produces an animation that jitters and nothing downstream can tell.

Put to the org lead with that in hand, the answer was that the site displays still pictures and had never planned otherwise. So the deep keys, the frames manifest, the 281 MB store, the warm pass and the bulk-fill switch were not built — all of it consumer-side machinery for a consumer that does not exist. body/<id>/a<n>/f<k> stays named in §5 and refused in practice; reviving it is a reader and a store, not a protocol change, which is what §5's key scheme was for.

§4.10 is what the walk found instead, and it is the same failure this document keeps meeting from new directions. A body's actions are a contiguous band; the next body's slots begin immediately after. One action past the ceiling:

Bodies (of 795 legacy)
Refused by §4.5's validator 152
Passes every check and decodes 643
...byte-identical to body+1's action 0 452

Body 1 action 22 is an ettin; body 3's is an imp. Phase 0's validator cannot catch it — the record is real — so the ceiling refuses the address. And it is the banding, not Animations.GetAnimLength: those two disagree by nine actions on one body of this client.

What shipped: 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 reading it instead of hardcoding a0 (§12.1 — with the COALESCE that stops an upgrade taking every portrait off the site), and the ceiling that makes the fallback walk safe. Catalogue 1,022 → 1,095; EXTRACTOR_VERSION 2 → 3; protocol stays 8.

Sections touched: §4.10 (new), §5 + §5's key block, §11.2 (new), §11's tables and its two now-wrong forward references, §12.1, §14, §16, §17 (decision 11). Plus website/SPAWN_ATLAS.md (1,022 → 1,095 portraits) and modules/uo/SCHEMA.md (the action column).

Code: servuo-plugins#33, Module-uo#39.

How it was tested

Every number in §4.10 and §11.2 was measured on this machine's stock client through the overlay's own reader, and the end-to-end claims through the real rig (sidecar → ServUO → REST): 1,095 manifest rows in one 1,991 ms page, body/820/a23 fetched and looked at, body/820/a0 / body/400/a2 / body/1/a22 / body/400/a0/f3 all unsupported.

Checklist

  • I have read CONTRIBUTING.md.
  • The change builds and existing tests/checks pass locally.
  • I have added or updated tests/docs where it makes sense.
  • My commits are reasonably scoped with clear messages.

AI-assisted contributions (required)

  • AI tools were used. Tool(s): Claude Code (Opus 5). I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with a Co-Authored-By trailer.

🤖 Generated with Claude Code

https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4

## What & why Records Asset Bridge phase 6, which is **not the phase §16 planned** — and the reason is worth the section it gets. §16 said "deep animation keys (`body/<id>/a<n>/f<n>`) for the future project, plus the bulk-fill switch". The measurement came first, as in every phase here, and changed what the phase was worth: | | §11 estimated | Measured (§11.2) | |---|---|---| | Bodies with art at *some* action | 1,022 | **1,096** | | Action keys with frames | — | **26,274** | | Frames | ~119,000 | **174,453** | | As PNG | ~117 MB | **281.5 MB** | | Per body | — | median 118 KB, p90 536 KB, max **9.6 MB** | | Decode + encode the lot | — | **104 s** | Plus the shape fact any frame design has to answer: **23,818 of 26,274 actions have frames that differ in size**, each with its own centre offset, so a key returning only a PNG produces an animation that jitters and nothing downstream can tell. Put to the org lead with that in hand, the answer was that **the site displays still pictures** and had never planned otherwise. So the deep keys, the frames manifest, the 281 MB store, the warm pass and the bulk-fill switch were **not built** — all of it consumer-side machinery for a consumer that does not exist. `body/<id>/a<n>/f<k>` stays named in §5 and refused in practice; reviving it is a reader and a store, not a protocol change, which is what §5's key scheme was for. **§4.10 is what the walk found instead**, and it is the same failure this document keeps meeting from new directions. A body's actions are a contiguous band; the next body's slots begin immediately after. One action past the ceiling: | | Bodies (of 795 legacy) | |---|---| | Refused by §4.5's validator | 152 | | **Passes every check and decodes** | **643** | | ...**byte-identical to body+1's action 0** | **452** | Body 1 action 22 is an ettin; body 3's is an imp. Phase 0's validator cannot catch it — the record is real — so the ceiling refuses the *address*. And it is the banding, not `Animations.GetAnimLength`: those two disagree by nine actions on one body of this client. **What shipped**: 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 reading it instead of hardcoding `a0` (§12.1 — with the `COALESCE` that stops an upgrade taking every portrait off the site), and the ceiling that makes the fallback walk safe. Catalogue **1,022 → 1,095**; `EXTRACTOR_VERSION` **2 → 3**; protocol stays **8**. Sections touched: **§4.10 (new)**, §5 + §5's key block, **§11.2 (new)**, §11's tables and its two now-wrong forward references, §12.1, §14, §16, §17 (decision 11). Plus `website/SPAWN_ATLAS.md` (1,022 → 1,095 portraits) and `modules/uo/SCHEMA.md` (the `action` column). Code: servuo-plugins#33, Module-uo#39. ## How it was tested Every number in §4.10 and §11.2 was measured on this machine's stock client through the overlay's own reader, and the end-to-end claims through the real rig (sidecar → ServUO → REST): 1,095 manifest rows in one 1,991 ms page, `body/820/a23` fetched and looked at, `body/820/a0` / `body/400/a2` / `body/1/a22` / `body/400/a0/f3` all `unsupported`. ## Checklist - [x] I have read [CONTRIBUTING.md](CONTRIBUTING.md). - [x] The change builds and existing tests/checks pass locally. - [x] I have added or updated tests/docs where it makes sense. - [x] My commits are reasonably scoped with clear messages. ## AI-assisted contributions (required) - [x] AI tools were used. Tool(s): `Claude Code (Opus 5)`. I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with a `Co-Authored-By` trailer. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
wtclaude added 1 commit 2026-09-14 06:11:59 +00:00
§16 planned deep animation keys and a bulk-fill switch. Measuring first changed
the phase: a complete one-direction animation set is 174,453 frames / 281.5 MB
(not the ~119,000 / ~117 MB §11 estimated), every frame carries its own centre
and 23,818 of 26,274 actions have frames of differing size — and the site
displays still pictures. So none of it was built (§11.2, org lead 2026-09-11);
`body/<id>/a<n>/f<k>` stays named in §5 and refused in practice.

§4.10 is what the walk found instead. A body's actions are a contiguous band and
the next body's begin immediately after, so one action past the ceiling is a real
record of another creature: 643 of 795 legacy bodies pass every check there and
452 are byte-identical to body+1's action 0. `Animations.GetAnimLength` is not
the ceiling — it disagrees with the index arithmetic on one body of this client,
by nine actions.

What shipped: the 73 bodies with no art at action 0 (a horse at `body/820/a23`),
the catalogue key carrying its action, the atlas join that reads it instead of
hardcoding `a0`, and the ceiling that makes the fallback walk safe. Catalogue
1,022 -> 1,095; EXTRACTOR_VERSION 2 -> 3; protocol stays 8.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
whitlocktech merged commit 48caedd3e0 into main 2026-09-14 06:15:33 +00:00
whitlocktech deleted branch docs/asset-bridge-p6 2026-09-14 06:15:35 +00:00
Sign in to join this conversation.
No description provided.