# Universal Reference Contracts > **Reference contracts only.** Stable IDs for all commercial registry objects. > Contract version: `universal-reference.v1` --- ## 1. Purpose Every Commercial Foundation registry object receives a **stable universal ID** so cross-registry references never depend on service-specific database identifiers. --- ## 2. RegistryObjectId | Field | Type | Meaning | | --- | --- | --- | | `registry_object_id` | uuid | Globally unique within commercial domain | | `object_kind` | string | Open kind — §3 | | `stable_code` | string? | Human-stable code (product_code, asset_code, …) | | `version_code` | string? | When pinning a version | | `uri` | string? | Logical URI form | ### Logical URI form (documentation) ``` commercial://{object_kind}/{registry_object_id}[@{version_code}] ``` Example: `commercial://asset/3fa85f64-...@2026.07.1` --- ## 3. Object kinds (open) `product` · `bundle` · `capability` · `extension` · `automation_pack` · `automation_type` · `asset` · `policy` · `metadata` · `pricing_item` · `subscription` · `subscription_plan` · `license` · `dependency_edge` · *(future)* --- ## 4. UniversalReference | Field | Type | Meaning | | --- | --- | --- | | `ref` | RegistryObjectId \| uri string | | | `relation` | string? | Optional semantic (uses, installs, prices, …) | Used by bundles, products, policies, assets, activation payloads, and dependency edges. --- ## 5. Rules 1. **No service-specific identifiers** as commercial cross-refs (no Experience `page_id`, Payment internal PK, etc. as commercial SoT). 2. Services MAY map locally via opaque correlation tables — commercial contracts speak only `registry_object_id` / `stable_code`. 3. Aligns with ADR-022 `publish_id` for *public surfaces*; commercial refs remain distinct (`commercial://` vs publish_id). 4. Unlimited references — architecture unchanged.