--- id: LSN-0023 ticket: pbs-low-level-asset-manager-surface title: LowAssets Runtime-Aligned SDK Surface created: 2026-03-27 tags: [compiler, pbs, runtime, asset-manager, host-abi, stdlib, asset] --- ## Context PBS needed a canonical low-level asset host surface that matched the runtime ABI already published by `../runtime`. Without that surface, a future author-facing asset API would have no stable lowering target, and the SDK would remain inconsistent with existing host-backed areas such as `log` and `gfx`. ## Key Decisions ### Lock `LowAssets` As The PBS Low-Level Owner **What:** PBS now exposes the runtime asset host ABI through `declare host LowAssets` in `@sdk:asset`. **Why:** The runtime contract had already converged on `asset.load`, `asset.status`, `asset.commit`, and `asset.cancel`, so PBS needed one canonical editorial owner that maps to those same operational identities. **Trade-offs:** `LowAssets` is a source-level naming choice only. It improves SDK readability, but engineers must remember that runtime identity still comes from `module`, `name`, `version`, and capability metadata, not from the PBS owner name. ### Keep Runtime Identity Singular And ABI-Faithful **What:** The canonical bindings remain `module = "asset"` and `Capability(name = "asset")`, with the v1 signatures: - `load(asset_id: int, slot: int) -> (status: int, loading_handle: int)` - `status(loading_handle: int) -> int` - `commit(loading_handle: int) -> int` - `cancel(loading_handle: int) -> int` **Why:** The runtime registry and cartridge capability map already use singular `asset`, and the low-level SDK surface must not drift from that published ABI. **Trade-offs:** This leaves v1 with raw `int` values for `asset_id`, `slot`, handle, and status. That is less type-safe than nominal wrappers, but it avoids inventing editorial types before the lowering contract is stable. ## Patterns and Algorithms - Separate editorial source ownership from runtime operational identity. `LowAssets` is the PBS owner, while `("asset", method, 1)` and capability `asset` remain the executable contract. - Introduce new host-backed SDK modules by mirroring the established stdlib pattern: `main.pbs` declares the host owner and `mod.barrel` exports it. - Pin the surface in three places at once: normative specs, stdlib resources, and compiler tests. This prevents drift between documentation, packaged SDK modules, and host-binding validation. ## Pitfalls - Do not derive runtime identity from the PBS owner name. `LowAssets` does not imply module `assets` or capability `assets`. - Do not reintroduce the retired name-based load path. The low-level contract is `asset_id + slot`, not `asset_name`, `bank_type`, or other symbolic references. - Do not add a higher-level `Assets` facade in the same change unless a separate decision explicitly closes that API shape. ## Takeaways - `@sdk:asset` is the canonical low-level PBS entrypoint for runtime asset syscalls. - The stable lowering target is singular runtime `asset`, even though the source owner is pluralized as `LowAssets`. - Future ergonomic asset APIs should lower into this raw host-backed surface instead of bypassing it.