# Extension manifest Every extension is described by ONE manifest validated by `zExtensionManifest` (packages/core/src/extensions/manifest.ts). The taxonomy is closed: everything an extension can touch is a field here, and nothing else exists. First-party manifests are TypeScript objects validated at test time; `configSchema` is generated from the registry's Zod via `z.toJSONSchema`. **Runtime is a declared dependency** (ADR 0026 §2): `platform` = compiled into Mozaik's workers (first-party only — the schema refuses it for any other publisher); `sandbox` = sealed store-scoped worker (lands at P1; `extension.install` refuses it until then); `external` = standing service via webhooks (M11). Sync/async picks the interface contract, never the runtime. The machine-readable schema: [/schemas/manifest.schema.json](/schemas/manifest.schema.json). ## Fields | field | type | required | notes | |---|---|---|---| | `id` | string (/^[a-z0-9-]+\.[a-z0-9-]+$/) | yes | | | `version` | string (/^\d+\.\d+\.\d+$/) | yes | | | `publisher` | string (≤60 chars) | yes | | | `labelTR` | string (≤60 chars) | yes | | | `descriptionTR` | string (≤200 chars) | yes | | | `runtime` | "platform" \| "sandbox" \| "external" | yes | | | `scopes` | array (≤10) | yes | | | `pii` | object | no | | | ` buyer` | array<"name" \| "email" \| "phone" \| "address" \| "city" \| "ip"> (≤6) | yes | | | ` purposeTR` | string (≤200 chars) | yes | | | `provider` | object \| object \| object \| object \| object \| object \| object | no | | | `configSchema` | object | yes | | | `secrets` | array (≤8) | no | | | `webhooks` | array (≤4) | no | | | `jobs` | array (≤3) | no | | | `mail` | array (≤5) | no | | | `events` | array (≤5) | no | | | `ui` | object | no | | | ` settingsForm` | object | no | | | ` fieldLabelsTR` | object | yes | | | ` fieldHintsTR` | object | no | | | ` widgetHints` | object | no | | | ` hidden` | array (≤10) | no | | | ` order` | array (≤20) | no | | | ` selectOptions` | object | no | | | ` panels` | array (≤4) | no | | | ` actions` | array (≤3) | no | | | ` pages` | array (≤3) | no | | | ` themeSections` | array (≤3) | no | | | `csp` | object | no | | | ` scriptSrc` | array (≤4) | no | | | ` frameSrc` | array (≤4) | no | | | ` connectSrc` | array (≤4) | no | | | ` formAction` | array (≤4) | no | | ## Provider kinds The `provider` block is a discriminated union on `kind`: