Phase 11 (WP-11.2) ships the MVP tier: a deduplicating, reference-counted
AssetManager over an injectable fetch, plus text, JSON, binary, and
image loaders. The §77 texture tier landed 2026-08-21 (texture.ts), and the
§78 glTF 2.0 parse tier landed 2026-08-29 (gltf.ts — its module header
states the exact tier, the refusal list, and why assembly lives in four).
§96's "asset loaders … shall treat external content as untrusted" is enforced
by the manager, not the loaders: an input-size limit
(DEFAULT_MAXIMUM_BYTES) and a whole-load deadline
(DEFAULT_TIMEOUT_SECONDS), both finite by default, both overridable
per manager. See docs/guides/security-and-untrusted-content.md.
Content hashing (§76) and the §79 manifest landed on 2026-08-21, together
with the texture loader tier (§77's assets half): load(url, loader, { expectedHash }) refuses bytes that are not the bytes a manifest named, and
createTextureLoader turns encoded images into TextureSource-shaped
TextureAssets under §96 decompression bounds. See content-hash.ts,
manifest.ts, and texture.ts.
§76's cancellation landed on 2026-08-09: load(url, loader, { signal })
rejects and gives back its reference, and — when the manager was built with an
AssetManagerOptions.abortController — the last waiter's abort cancels
the request itself. The A-18 remainder (2026-09-06) adds progress
(onProgress), stream(), dependency graphs (registerDependency /
loadGraph), worker decoding (decodeInWorker + workerFactory), and
hot reload (watch). The rules are in asset-manager.ts's module comment.
@fourjs/assets— the asset system (§76–78).Phase 11 (WP-11.2) ships the MVP tier: a deduplicating, reference-counted AssetManager over an injectable
fetch, plus text, JSON, binary, and image loaders. The §77 texture tier landed 2026-08-21 (texture.ts), and the §78 glTF 2.0 parse tier landed 2026-08-29 (gltf.ts— its module header states the exact tier, the refusal list, and why assembly lives infour).§96's "asset loaders … shall treat external content as untrusted" is enforced by the manager, not the loaders: an input-size limit (DEFAULT_MAXIMUM_BYTES) and a whole-load deadline (DEFAULT_TIMEOUT_SECONDS), both finite by default, both overridable per manager. See
docs/guides/security-and-untrusted-content.md.Content hashing (§76) and the §79 manifest landed on 2026-08-21, together with the texture loader tier (§77's assets half):
load(url, loader, { expectedHash })refuses bytes that are not the bytes a manifest named, and createTextureLoader turns encoded images intoTextureSource-shaped TextureAssets under §96 decompression bounds. Seecontent-hash.ts,manifest.ts, andtexture.ts.§76's cancellation landed on 2026-08-09:
load(url, loader, { signal })rejects and gives back its reference, and — when the manager was built with an AssetManagerOptions.abortController — the last waiter's abort cancels the request itself. The A-18 remainder (2026-09-06) adds progress (onProgress),stream(), dependency graphs (registerDependency/loadGraph), worker decoding (decodeInWorker+workerFactory), and hot reload (watch). The rules are inasset-manager.ts's module comment.