web asset delivery plan - snp over bnp, immutable bundles, snowballs first
Design review of the emscripten asset story. Records the verdict on .snp
as the bnp alternative, why in-browser bnp patching is rejected, the
bundle/manifest architecture, measured compression numbers, and Snowballs
as the first target.
Key points:
- .snp shape is right, interface is wrong: the provider returns a
filesystem path, which is the only real blocker for wasm.
- bnp xdelta patching rejected - patching needs owned storage, browser
storage is not durable, and content addressing dissolves the problem.
- immutable versioned URLs remove quota/OPFS/eviction from the design.
- boot moves to the JS wrapper before wasm starts, so asyncify never
touches the boot path.
- bundling beats trained dictionaries by 2.7x (tiles: 6.21x bundled vs
2.31x per-file with dict); dictionary gain is size-dependent, 19.6% at
29 KB files and 3.4% at 190 KB.
- emit both .zst and .br and let Accept-Encoding negotiate; zstd window
plateaus at 8 MB so the lgwin cap is a non-issue.
- github pages cannot set Content-Encoding, so bundles go to the CDN.
- reference data is not a publish gate once formats diverge; gates are
completeness + load, with render smoke done revision-to-revision.
- snowballs is 457 files / 46.2 MB -> 12.6 MB, so it ships as one bundle
and is deliberately not tiered.
Also notes five live bugs found while reading the streamed package code,
worth fixing independently of any of this.
Registers the page in the context index and points the roadmap's W2
entry at it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgdHuFQnKiND5p1VKQogJP
max formats/coverage/roadmap: sync with typed-graduation series findings
Geometry formats: legacy Edit Mesh chunk set is corpus-absent (§10j-sept);
the modern map-channel record family located (0x0230/0x033b/0x0334/0x0338);
mapext 0x2512 leaf/empty split sharpened + typed codec pointer (§10j-huit).
Coverage page: 2026-07-17 currency note for M1-M9. Tutorial roadmap:
side-quest 5 status rewritten — export back half exists, corpus-gated;
remaining is the build_gamedata 1_export wiring.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYw97CPc6mjEGd6AQPQ26Q
drafts: fix sibling page links to ./ form (bare form resolves as subpage) across pipeline_max_design, max_geometry_formats, nel_gltf_extras, tutorial_roadmap
Codify pipeline_max design: storage lifecycle, roundtrip invariants, defects, extension rules
Tech tree: prebuilt data is bootstrap only; add headless .max pipeline side-quest
Tech tree: screenshots crop to the application render area only
Tech tree: require final-state screenshots in every tutorial
Tech tree: mark the asset-tooling-gated subset, note buildable-today coverage
Tutorial roadmap reworked into the full tech tree plan with mini-game capstones