# Asset Identity and Runtime Contract This document explains the point that is easiest to get subtly wrong: - `asset_id` is the stable artifact identity; - `asset_name` is still a logical code-facing reference. If you flatten those two concepts into one, the architecture starts drifting immediately. ## The Stable Side: `asset_id` `asset_id` is allocated by the packer registry. It is stable within the project and appears in runtime-facing artifacts. Why this matters: - preload uses `asset_id`; - artifact identity survives move and rename; - build outputs remain structurally stable even when authoring layout changes. `asset_id` is the answer to: > “Is this the same asset as before?” ## The Logical Side: `asset_name` `asset_name` remains useful because game-facing code and runtime APIs still refer to assets by name in normal flows. Why this matters: - authors need a readable label; - game code usually references assets semantically, not by integer literal; - runtime lookup still uses names in parts of the current operational surface. `asset_name` is the answer to: > “What do humans and source code call this asset?” ## Why Not Use Only One Of Them? If you use only `asset_name`: - rename becomes identity breakage; - preload/bootstrap integrity becomes fragile; - build artifacts depend too much on mutable author intent. If you use only `asset_id` everywhere today: - source code becomes less ergonomic; - authoring workflows become harder to read; - the current runtime/game-facing API model would need stronger compile-time lowering infrastructure. So the current architecture intentionally keeps both: - stable identity for artifacts; - logical naming for authoring and API usage. ## What Actually Happens In The Artifact? The runtime-facing asset table carries both: - `asset_id` - `asset_name` But they play different roles. `asset_id`: - defines stable identity; - is used for preload/bootstrap integrity. `asset_name`: - stays in the table as descriptive/API-facing metadata; - supports name-based lookup where that still exists. ## Why This Is Still Not The End Of The Story There is still an open language/toolchain question: - should source-level asset references remain name-based forever? - or should the compiler eventually lower known references to stable IDs or resource handles? That is a separate problem from the packer artifact identity model. It belongs to language/frontend and runtime API design, not to the core packer identity rules. ## Practical Rule When reading or implementing packer behavior, use this checklist: - if the question is about stable artifact identity, think `asset_id`; - if the question is about source naming or human-facing lookup, think `asset_name`; - if the question is about preload/bootstrap correctness, prefer `asset_id`; - if the question is about runtime/game API ergonomics, `asset_name` may still be intentionally present.