# Metadata Registry

> **Generic metadata model.** Unlimited future keys — no schema changes required for new keys.  
> Contract version: `metadata-registry.v1`  
> ADR: [ADR-023](../architecture/adr/ADR-023.md) (v1.2)

---

## 1. Purpose

Every commercial registry object MAY carry a **MetadataBag** referenced by `metadata_ref` / attached `metadata`.

Metadata is descriptive and commercial-contextual. It is **not** pricing, **not** entitlement truth, and **not** implementation payload.

---

## 2. Metadata targets (open)

| `target_kind` | Examples |
| --- | --- |
| `product` | PlatformProduct |
| `bundle` | BusinessBundle |
| `capability` | CapabilityDefinition |
| `extension` | ExtensionDefinition |
| `automation_pack` | AutomationPack |
| `asset` | AssetDefinition |
| `theme` | Theme-oriented assets / packs |
| `template` | Template-oriented assets |
| `policy` | PolicyDefinition |
| `pricing_item` | Optional |
| `subscription_plan` | Optional |
| *(future)* | Any new registry kind |

---

## 3. MetadataBag

| Field | Type | Meaning |
| --- | --- | --- |
| `registry_object_id` | uuid | Universal ID of this bag |
| `target_kind` | string | Open |
| `target_id` | uuid | Target's `registry_object_id` |
| `version_code` | string | Metadata bag version |
| `attributes` | map | Open key → value (JSON-compatible) |
| `ext` | object | Additive |

### Reserved / common attribute keys (examples — not exclusive)

| Key | Meaning |
| --- | --- |
| `slug` | URL-safe identifier |
| `tags` | string[] |
| `labels` | localized label map |
| `industry` | |
| `locale` | |
| `country` | |
| `language` | |
| `currency` | |
| `timezone` | |
| `brand` | |
| `owner` | |
| `support_level` | |
| `release_channel` | `stable` \| `beta` \| `preview` \| … |
| `icon` | |
| `color` | |
| `seo` | object |
| `marketing` | object |
| `visibility` | object / string |
| `documentation` | ref/url |
| `beta` | bool |
| `deprecated` | bool |
| `custom_attributes` | object | Escape hatch for unlimited keys |

**Unlimited future keys** MAY appear under `attributes` or `custom_attributes` without architecture or schema contract changes (additive JSON).

---

## 4. Metadata Matrix (illustrative)

| Target | Typical keys |
| --- | --- |
| Product | slug, tags, industry, release_channel, icon, documentation |
| Bundle | slug, tags, marketing, visibility, industry |
| Capability | labels, documentation, deprecated |
| Extension | icon, tags, support_level |
| Automation Pack | tags, locale, language |
| Asset | slug, brand, locale, country, marketing, seo |
| Theme / Template | color, icon, industry, locale |
| Policy | visibility, documentation, beta |

---

## 5. Invariants

1. Unknown keys MUST be accepted by consumers (ignore-unknown).
2. Metadata MUST NOT store payment credentials or entitlement grant rows.
3. Visibility in metadata is advisory; Policy Engine / TenantVisibility remain authoritative when both exist.
