# Extension Registry

> **Contracts only.** Products publish extensions; Core commercial owns the registry vocabulary.  
> Contract version: `extension-registry.v1`  
> Related: [ADR-022](../architecture/adr/ADR-022.md) Published Actions / Embed (compatible, not duplicated)

---

## 1. Purpose

The **Extension Registry** lets every PlatformProduct publish reusable extension points without ownership conflicts.

Experience may *render* some extension kinds; owning products *execute* business logic.

---

## 2. Extension kinds (open registry)

| extension_kind | Meaning |
| --- | --- |
| `widget` | UI widget surface |
| `block` | Page/builder block |
| `action` | Invocable action (aligns with Published Action keys when public) |
| `embed` | Embeddable surface (aligns with embed contract when public) |
| `connector` | External system connector |
| `template` | Starter template |
| `report` | Report definition shell |
| `dashboard` | Dashboard shell |
| `theme` | Theme pack |
| `integration` | Integration pack |
| `validator` | Validation plugin |
| `automation_pack` | Ref to Automation Catalog pack |
| `ai_skill` | AI skill declaration |

Additional kinds MAY be registered without architecture changes.

---

## 3. ExtensionDefinition

| Field | Type | Meaning |
| --- | --- | --- |
| `extension_code` | string | Stable unique code |
| `extension_kind` | string | Open kind |
| `display_name` | string | |
| `publisher_product_code` | string | Publishing PlatformProduct |
| `owner_service_identifier` | string | Runtime owner |
| `required_capability_codes[]` | string[] | |
| `supported_surfaces[]` | string[] | Open (e.g. `admin`, `tenant`, `public`, `embed`) |
| `permission` | string? | |
| `feature_toggle` | string? | |
| `status` | enum | `draft` \| `active` \| `deprecated` |
| `documentation_ref` | string? | |
| `ext` | object | |

---

## 4. Ownership rules (no conflicts)

| Concern | Owner |
| --- | --- |
| Extension registry vocabulary | Core commercial (contracts) |
| Extension business execution | `owner_service_identifier` / publisher product |
| Public action/embed presentation | Experience (ADR-022) when surface is public |
| Commercial enablement | License / entitlement / visibility |

**Forbidden:** Experience owning another product’s connector logic; Marketplace absorbing unrelated extensions; bundles embedding extension implementations.

---

## 5. Illustrative extension matrix (examples)

| extension_code | Kind | Publisher (example) |
| --- | --- | --- |
| `ext.pay.checkout_widget` | widget | product.pay |
| `ext.crm.pipeline_block` | block | product.crm |
| `ext.pages.form_action` | action | product.pages |
| `ext.loyalty.card_embed` | embed | product.loyalty |
| `ext.driver.dispatch_connector` | connector | product.driver |
| `ext.accounting.invoice_template` | template | product.accounting |
| `ext.analytics.sales_report` | report | product.pages / analytics capability |
| `ext.hospitality.floor_dashboard` | dashboard | product.restaurant |
| `ext.experience.theme_pack` | theme | product.pages |
| `ext.comm.sms_validator` | validator | product.communication |
| `ext.pack.onboarding_sms` | automation_pack | *(pack ref, not product)* |
| `ext.ai.support_skill` | ai_skill | product.ai.* |

---

## 6. Invariants

1. Unlimited extensions via registry entries.
2. Extension codes must not collide across publishers (prefix by product recommended).
3. Bundles reference `extension_code`s; they never ship extension payloads.
