The assets an instance requires resident, with their byte sizes. For a simple product this is one asset; mapped/instanced representations return the same assetID from many instances — that sharing is the point.
The instance (product local ID in the geometry case).
The instance's assets.
Discard an asset's payload (called exactly once per residency, on the 1→0 reference, after its chunks are already back in the pool).
The asset to discard.
Materialise an asset's payload (called exactly once per residency, on the 0→1 reference). In production: run the wasm extract/tessellate and write the result into the asset's pool chunks.
The asset to materialise.
The domain half the tile pool delegates to: what assets an instance is made of, and how to materialise / discard one asset's payload. This is the seam the production conway-geom surface implements (extract → tessellate into the asset's chunks; discard on last release); tests implement it with recording mocks.