Rudder CLI Validation Rules Beta
- free
- growth
- enterprise
86 minute read
Every spec you apply with the Rudder CLI is checked against the rules in this guide before it reaches your workspace.
Each rule includes valid and invalid example specs and the diagnostics you see when validation fails.
How to use this guide
- Use the Spec version toggle to switch between
rudder/v1and legacyrudder/0.1spec.- Filter by phase or search to narrow the list.
Showing 40 of 40 rules
Project
ProjectResource kind must be supported with the specified version
Rule ID: project/resource-kind-version-valid
Examples
Kind declared with a supported version
The events kind supports rudder/v1, so this spec is accepted. The rule flags kind/version pairs where the kind is recognized but the version is not registered.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events:
- id: order_completed
name: Order CompletedKnown kind declared with an unsupported version
The transformation kind is recognized but registered only for rudder/v1, not rudder/0.1. The rule reports the unsupported kind/version pair.
version: rudder/v0.1
kind: events
metadata:
name: my-events
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/kindis not supported with version
Spec syntax must be valid
Rule ID: project/spec-syntax-valid
Examples
Spec with all required top-level fields
A well-formed spec with version, kind, metadata, and spec — the four required top-level fields.
version: rudder/v1
kind: properties
metadata:
name: my-properties
spec:
properties:
- name: MyTestProperty
type: stringSpec missing required kind
Every spec must declare a kind.
version: rudder/v1
kind:
metadata:
name: my-properties
spec:
properties:
- name: MyTestProperty
type: string- spec.yaml
/kind'kind' is required
Spec missing required version
Every spec must declare a version.
version:
kind: properties
metadata:
name: my-properties
spec:
properties:
- name: MyTestProperty
type: string- spec.yaml
/version'version' is required
Spec missing required metadata block
Every spec must declare a metadata block.
version: rudder/v1
kind: properties
spec:
properties:
- name: MyTestProperty
type: string- spec.yaml
/metadata'metadata' is required
Spec missing required spec body
Every spec must declare a spec body.
version: rudder/v1
kind: properties
metadata:
name: my-properties- spec.yaml
/spec'spec' is required
Import manifest
ProjectA (workspace_id, urn) must not be defined more than once across import-manifest files
Rule ID: import-manifest/duplicate-urn
Examples
Distinct URNs across manifest files
Two manifest files declaring different URNs in the same workspace. No collision, so the project is valid.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event-stream-source:source-a"
remote_id: "remote_a"version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event-stream-source:source-b"
remote_id: "remote_b"Same URN under different workspaces across files
The same urn maps to a different remote per workspace. Because the uniqueness key is (workspace_id, urn), this is allowed.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event-stream-source:shared"
remote_id: "remote_ws1"version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-2"
resources:
- urn: "event-stream-source:shared"
remote_id: "remote_ws2"Same (workspace, urn) in two manifest files
Both files map the same urn under the same workspace. The rule flags every occurrence across the colliding files.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event-stream-source:my-source"
remote_id: "remote_a"version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event-stream-source:my-source"
remote_id: "remote_b"- a.yaml
/spec/workspaces/0/resources/0/urnduplicate URN 'event-stream-source:my-source' in workspace 'ws-1' - b.yaml
/spec/workspaces/0/resources/0/urnduplicate URN 'event-stream-source:my-source' in workspace 'ws-1'
Same (workspace, urn) twice in one manifest file
A urn repeated under one workspace in a single file is a collision too. The rule flags every occurrence.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event-stream-source:my-source"
remote_id: "remote_1"
- urn: "event-stream-source:my-source"
remote_id: "remote_2"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnduplicate URN 'event-stream-source:my-source' in workspace 'ws-1' - import-manifest.yaml
/spec/workspaces/0/resources/1/urnduplicate URN 'event-stream-source:my-source' in workspace 'ws-1'
Every import-manifest URN must match a resource defined in the project
Rule ID: import-manifest/orphaned-urn
Examples
Manifest URN matches a resource in the project
The manifest imports event:order_completed, and an events spec defines a resource resolving to that URN, so the entry is not orphaned.
version: rudder/v1
kind: events
metadata:
name: events
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Manifest URN with no matching resource in the project
The manifest imports event:order_completed, but no spec defines a resource with that URN — a stale entry or a typo. The rule flags it for the active workspace.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnmanifest URN 'event:order_completed' does not match any resource in the project
Import-manifest spec syntax must be valid
Rule ID: import-manifest/spec-syntax-valid
Examples
Well-formed import manifest
A manifest with one workspace and urn-based resources. Every resource carries a urn and a remote_id, so the manifest is valid.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event-stream-source:my-source"
remote_id: "src_remote_456"Workspace missing workspace_id
Each workspace block must declare a workspace_id.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- resources:
- urn: "event-stream-source:my-source"
remote_id: "src_remote_456"- import-manifest.yaml
/spec/workspaces/0/workspace_idworkspace_id is required
Resource using local_id instead of urn
Manifests require urn; local_id is rejected because manifests are a forward-looking format.
version: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: "my-source"
remote_id: "src_remote_456"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnurn is required in manifests (local_id not supported)
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Categories
Data CatalogCategory names must be unique across the Data Catalog
Rule ID: datacatalog/categories/semantic-valid
Examples
Unique category names (v1)
version: rudder/v1
kind: categories
metadata:
name: my-categories
spec:
categories:
- id: user_actions
name: User Actions
- id: system_events
name: System EventsDuplicate category names across files (v1)
Duplicate category names in the resource graph fail validation.
version: rudder/v1
kind: categories
metadata:
name: my-categories
spec:
categories:
- id: user_actions_2
name: User Actions- spec.yaml
/categories/0/nameduplicate name 'User Actions' within kind 'categories'
Category names must be unique across the Data Catalog
Rule ID: datacatalog/categories/semantic-valid
Examples
Unique category names (legacy)
version: rudder/0.1
kind: categories
metadata:
name: my-categories
spec:
categories:
- id: user_actions
name: User Actions
- id: system_events
name: System EventsDuplicate category names across files (legacy)
Duplicate category names in the resource graph fail validation.
version: rudder/0.1
kind: categories
metadata:
name: my-categories
spec:
categories:
- id: user_actions_2
name: User Actions- spec.yaml
/categories/0/nameduplicate name 'User Actions' within kind 'categories'
Category spec syntax must be valid
Rule ID: datacatalog/categories/spec-syntax-valid
Examples
Valid categories spec
version: rudder/v1
kind: categories
metadata:
name: categories
spec:
categories:
- id: user_actions
name: User Actions
- id: system_events
name: System EventsCategory missing required name field
version: rudder/v1
kind: categories
metadata:
name: categories
spec:
categories:
- id: user_actions- spec.yaml
/spec/categories/0/name'name' is required
Category spec syntax must be valid
Rule ID: datacatalog/categories/spec-syntax-valid
Examples
Valid legacy categories spec
version: rudder/0.1
kind: categories
metadata:
name: legacy-categories
spec:
categories:
- id: user_actions
name: User Actions
- id: system_events
name: System EventsLegacy category missing required name field
version: rudder/0.1
kind: categories
metadata:
name: legacy-categories
spec:
categories:
- id: user_actions- spec.yaml
/spec/categories/0/name'name' is required
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Custom types
Data CatalogCustom type config must be valid for the given type
Rule ID: datacatalog/custom-types/config-valid
Examples
Valid string config with pattern
version: rudder/v1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: user_status
name: UserStatus
type: string
config:
enum: ["active", "inactive"]v1 string config with invalid format
version: rudder/v1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: user_email
name: UserEmail
type: string
config:
format: not_a_valid_format- spec.yaml
/types/0/config/formatnot_a_valid_format
Custom type config must be valid for the given type
Rule ID: datacatalog/custom-types/config-valid
Examples
Valid string config with enum (legacy)
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: user_status
name: UserStatus
type: string
config:
enum: ["active", "inactive"]
pattern: "^[a-z]+$"Valid integer config with range (legacy)
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: age
name: Age
type: integer
config:
minimum: 0
maximum: 120String config with invalid format (legacy)
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: user_email
name: UserEmail
type: string
config:
format: invalid_format- spec.yaml
/types/0/config/formatinvalid_format
Custom type references must resolve to existing resources
Rule ID: datacatalog/custom-types/semantic-valid
Examples
Unique custom type names (v1)
version: rudder/v1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: address
name: Address
type: object
- id: user_status
name: UserStatus
type: stringDuplicate custom type names across files (v1)
Duplicate custom type names in the resource graph fail validation.
version: rudder/v1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: address_v2
name: Address
type: object- spec.yaml
/types/0/nameduplicate name 'Address' within kind 'custom-types'
Custom type references must resolve to existing resources
Rule ID: datacatalog/custom-types/semantic-valid
Examples
Unique custom type names (legacy)
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: address
name: Address
type: object
- id: user_status
name: UserStatus
type: stringDuplicate custom type names across files (legacy)
Duplicate custom type names in the resource graph fail validation.
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: address_v2
name: Address
type: object- spec.yaml
/types/0/nameduplicate name 'Address' within kind 'custom-types'
Custom type spec syntax must be valid
Rule ID: datacatalog/custom-types/spec-syntax-valid
Examples
Valid custom-types spec
version: rudder/v1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: address
name: Address
type: object
- id: user_status
name: UserStatus
type: stringv1 custom type missing required id field
version: rudder/v1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- name: UserStatus
type: string- spec.yaml
/types/0/id'id' is required
Custom type spec syntax must be valid
Rule ID: datacatalog/custom-types/spec-syntax-valid
Examples
Valid legacy custom-types spec
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: address
name: Address
description: Physical address structure
type: object
- id: user_status
name: UserStatus
type: stringLegacy custom type missing required name field
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: user_status
type: string- spec.yaml
/types/0/name'name' is required
Legacy custom type missing required type field
version: rudder/0.1
kind: custom-types
metadata:
name: my-custom-types
spec:
types:
- id: address
name: Address- spec.yaml
/types/0/type'type' is required
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Events
Data CatalogEvent references must resolve to existing resources
Rule ID: datacatalog/events/semantic-valid
Examples
Unique event name and type combinations (v1)
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events:
- id: page_viewed
event_type: track
name: Page Viewed
- id: product_clicked
event_type: track
name: Product ClickedDuplicate event name and type across files (v1)
Duplicate event name and event_type pairs in the resource graph fail validation.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events:
- id: page_viewed_2
event_type: track
name: Page Viewed- spec.yaml
/events/0duplicate name 'Page Viewed' within kind 'events'
Event references must resolve to existing resources
Rule ID: datacatalog/events/semantic-valid
Examples
Unique event name and type combinations (legacy)
version: rudder/0.1
kind: events
metadata:
name: my-events
spec:
events:
- id: page_viewed
event_type: track
name: Page Viewed
- id: product_clicked
event_type: track
name: Product ClickedDuplicate event name and type across files (legacy)
Duplicate event name and event_type pairs in the resource graph fail validation.
version: rudder/0.1
kind: events
metadata:
name: my-events
spec:
events:
- id: page_viewed_2
event_type: track
name: Page Viewed- spec.yaml
/events/0duplicate name 'Page Viewed' within kind 'events'
Event spec syntax must be valid
Rule ID: datacatalog/events/spec-syntax-valid
Examples
Valid events spec
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events:
- id: page_viewed
event_type: track
name: Page Viewed
- id: user_identified
event_type: identifyv1 event missing required event_type field
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events:
- id: page_viewed
name: Page Viewed- spec.yaml
/events/0/event_type'event_type' is required
Event spec syntax must be valid
Rule ID: datacatalog/events/spec-syntax-valid
Examples
Valid legacy events spec
version: rudder/0.1
kind: events
metadata:
name: my-events
spec:
events:
- id: page_viewed
event_type: track
name: Page Viewed
description: User viewed a page
- id: user_identified
event_type: identifyLegacy event missing required id field
version: rudder/0.1
kind: events
metadata:
name: my-events
spec:
events:
- name: Page Viewed
event_type: track- spec.yaml
/events/0/id'id' is required
Legacy event with invalid event_type
version: rudder/0.1
kind: events
metadata:
name: my-events
spec:
events:
- id: my_event
event_type: custom- spec.yaml
/events/0/event_typeoneof
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Properties
Data CatalogProperty config must be valid for the given type
Rule ID: datacatalog/properties/config-valid
Examples
Valid string property config
version: rudder/v1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_email
name: User Email
type: string
config:
format: "email"
min_length: 5v1 string property config with invalid format
version: rudder/v1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_email
name: User Email
type: string
config:
format: totally_wrong- spec.yaml
/properties/0/propConfig/formattotally_wrong
Property config must be valid for the given type
Rule ID: datacatalog/properties/config-valid
Examples
Valid string property config with format (legacy)
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_email
name: User Email
type: string
propConfig:
format: "email"
minLength: 5
maxLength: 100Valid integer property config with range (legacy)
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: age
name: Age
type: integer
propConfig:
minimum: 0
maximum: 120String property config with invalid format (legacy)
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_email
name: User Email
type: string
propConfig:
format: not_valid- spec.yaml
/properties/0/propConfig/formatnot_valid
Property references must resolve to existing resources
Rule ID: datacatalog/properties/semantic-valid
Examples
Unique property name and type combinations (v1)
version: rudder/v1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_id
name: User ID
type: string
- id: email
name: Email
type: stringDuplicate property name, type, and itemTypes across files (v1)
Duplicate property name, type, and itemTypes in the resource graph fail validation.
version: rudder/v1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_id_2
name: User ID
type: string- spec.yaml
/properties/0duplicate name, type and itemTypes: 'User ID' within kind 'properties'
Property references must resolve to existing resources
Rule ID: datacatalog/properties/semantic-valid
Examples
Unique property name and type combinations (legacy)
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_id
name: User ID
type: string
- id: email
name: Email
type: stringDuplicate property name, type, and itemTypes across files (legacy)
Duplicate property name, type, and itemTypes in the resource graph fail validation.
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_id_2
name: User ID
type: string- spec.yaml
/properties/0duplicate name, type and itemTypes: 'User ID' within kind 'properties'
Property spec syntax must be valid
Rule ID: datacatalog/properties/spec-syntax-valid
Examples
Valid properties spec
version: rudder/v1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_id
name: User ID
type: string
- id: age
name: Age
type: integerv1 property missing required id field
version: rudder/v1
kind: properties
metadata:
name: my-properties
spec:
properties:
- name: User ID
type: string- spec.yaml
/properties/0/id'id' is required
Property spec syntax must be valid
Rule ID: datacatalog/properties/spec-syntax-valid
Examples
Valid legacy properties spec
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_id
name: User ID
description: Unique identifier for the user
type: string
- id: email
name: Email
type: stringLegacy property missing required id field
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- name: User ID
type: string- spec.yaml
/properties/0/id'id' is required
Legacy property missing required name field
version: rudder/0.1
kind: properties
metadata:
name: my-properties
spec:
properties:
- id: user_id
type: string- spec.yaml
/properties/0/name'name' is required
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Tracking Plans
Tracking PlansTracking Plan references must resolve to existing resources
Rule ID: datacatalog/tracking-plans/semantic-valid
Examples
Tracking Plan with unique display_name (v1)
version: rudder/v1
kind: tracking-plan
metadata:
name: my-tracking-plan
spec:
id: my_tp
display_name: My Tracking Plan
rules:
- id: signup_rule
type: event_rule
event: "#event:signup"Duplicate Tracking Plan display_name across files (v1)
Duplicate Tracking Plan display_name values in the resource graph fail validation.
version: rudder/v1
kind: tracking-plan
metadata:
name: my-tracking-plan-2
spec:
id: my_tp_2
display_name: My Tracking Plan
rules:
- id: page_rule
type: event_rule
event: "#event:page_view"- spec.yaml
/display_nameduplicate display_name 'My Tracking Plan' within kind 'tracking-plan'
Tracking Plan references must resolve to existing resources
Rule ID: datacatalog/tracking-plans/semantic-valid
Examples
Tracking Plan with unique display_name (legacy)
version: rudder/0.1
kind: tp
metadata:
name: my-tracking-plan
spec:
id: my_tp
display_name: My Tracking Plan
rules:
- id: signup_rule
type: event_rule
event:
$ref: "#/events/user-events/signup"Duplicate Tracking Plan display_name across files (legacy)
Duplicate Tracking Plan display_name values in the resource graph fail validation.
version: rudder/0.1
kind: tp
metadata:
name: my-tracking-plan-2
spec:
id: my_tp_2
display_name: My Tracking Plan
rules:
- id: page_rule
type: event_rule
event:
$ref: "#/events/user-events/page_view"- spec.yaml
/display_nameduplicate display_name 'My Tracking Plan' within kind 'tp'
Tracking Plan spec syntax must be valid
Rule ID: datacatalog/tracking-plans/spec-syntax-valid
Examples
Valid Tracking Plan spec
version: rudder/v1
kind: tracking-plan
metadata:
name: my-tracking-plan
spec:
id: my_tp
display_name: My Tracking Plan
rules:
- id: signup_rule
type: event_rule
event: "#event:signup"
properties:
- property: "#property:user_id"
required: trueTracking Plan rule missing event field
version: rudder/v1
kind: tracking-plan
metadata:
name: my-tracking-plan
spec:
id: my_tp
display_name: My Tracking Plan
rules:
- id: no_event_rule
type: event_rule
properties:
- property: "#property:user_id"
required: true- spec.yaml
/rules/0/event'event' is required
Tracking Plan spec syntax must be valid
Rule ID: datacatalog/tracking-plans/spec-syntax-valid
Examples
Valid legacy Tracking Plan spec
version: rudder/0.1
kind: tp
metadata:
name: my-tracking-plan
spec:
id: my_tp
display_name: My Tracking Plan
rules:
- id: signup_rule
type: event_rule
event:
$ref: "#/events/user-events/signup"
properties:
- $ref: "#/properties/common/user_id"
required: trueLegacy Tracking Plan rule missing event field
version: rudder/0.1
kind: tp
metadata:
name: my-tracking-plan
spec:
id: my_tp
display_name: My Tracking Plan
rules:
- id: no_event_rule
type: event_rule
properties:
- $ref: "#/properties/common/user_id"
required: true- spec.yaml
/rules/0/event'event' is required
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Data Graph
Data GraphRelationship cardinality must be valid for the source and target model types
Rule ID: datagraph/data-graph/relationship-cardinality-valid
Examples
Entity-to-entity relationship with any cardinality is valid
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-account
display_name: User Account
cardinality: one-to-one
target: "#data-graph-model:account"
source_join_key: account_id
target_join_key: account_id
- id: account
display_name: Account
type: entity
table: db.schema.accounts
primary_id: account_idEvent-to-entity relationship uses many-to-one cardinality
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: purchase
display_name: Purchase
type: event
table: db.schema.purchases
timestamp: purchased_at
relationships:
- id: purchase-user
display_name: Purchase User
cardinality: many-to-one
target: "#data-graph-model:user"
source_join_key: user_id
target_join_key: user_id
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_idEvent models cannot connect to other event models
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: purchase
display_name: Purchase
type: event
table: db.schema.purchases
timestamp: purchased_at
relationships:
- id: purchase-click
display_name: Purchase Click
cardinality: many-to-one
target: "#data-graph-model:click"
source_join_key: session_id
target_join_key: session_id
- id: click
display_name: Click
type: event
table: db.schema.clicks
timestamp: clicked_at- spec.yaml
/models/0/relationships/0/cardinalityevent models cannot be connected to other event models
Event-to-entity relationship requires many-to-one cardinality
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: purchase
display_name: Purchase
type: event
table: db.schema.purchases
timestamp: purchased_at
relationships:
- id: purchase-user
display_name: Purchase User
cardinality: one-to-many
target: "#data-graph-model:user"
source_join_key: user_id
target_join_key: user_id
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id- spec.yaml
/models/0/relationships/0/cardinalitymust have cardinality 'many-to-one'
Entity-to-event relationship requires one-to-many cardinality
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-purchase
display_name: User Purchase
cardinality: many-to-one
target: "#data-graph-model:purchase"
source_join_key: user_id
target_join_key: user_id
- id: purchase
display_name: Purchase
type: event
table: db.schema.purchases
timestamp: purchased_at- spec.yaml
/models/0/relationships/0/cardinalitymust have cardinality 'one-to-many'
Relationship target references must resolve to existing models
Rule ID: datagraph/data-graph/relationship-refs-valid
Examples
Relationship target references an existing model in the Data Graph
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-account
display_name: User Account
cardinality: one-to-one
target: "#data-graph-model:account"
source_join_key: account_id
target_join_key: account_id
- id: account
display_name: Account
type: entity
table: db.schema.accounts
primary_id: account_idRelationship target references a missing model
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-missing
display_name: User Missing
cardinality: one-to-one
target: "#data-graph-model:non-existent"
source_join_key: ref_id
target_join_key: ref_id- spec.yaml
/models/0/relationships/0/targetdoes not exist
At most one relationship is allowed per source-target model pair
Rule ID: datagraph/data-graph/relationship-unique-pair
Examples
Multiple relationships from one model to different targets are allowed
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-account
display_name: User Account
cardinality: one-to-one
target: "#data-graph-model:account"
source_join_key: account_id
target_join_key: account_id
- id: user-profile
display_name: User Profile
cardinality: one-to-one
target: "#data-graph-model:profile"
source_join_key: profile_id
target_join_key: profile_id
- id: account
display_name: Account
type: entity
table: db.schema.accounts
primary_id: account_id
- id: profile
display_name: Profile
type: entity
table: db.schema.profiles
primary_id: profile_idA-to-B and B-to-A relationships are distinct and both allowed
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-to-account
display_name: User to Account
cardinality: one-to-one
target: "#data-graph-model:account"
source_join_key: account_id
target_join_key: account_id
- id: account
display_name: Account
type: entity
table: db.schema.accounts
primary_id: account_id
relationships:
- id: account-to-user
display_name: Account to User
cardinality: one-to-one
target: "#data-graph-model:user"
source_join_key: account_id
target_join_key: account_idDuplicate source-target model pairs are not allowed
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-account-v1
display_name: User Account v1
cardinality: one-to-one
target: "#data-graph-model:account"
source_join_key: account_id
target_join_key: account_id
- id: user-account-v2
display_name: User Account v2
cardinality: one-to-many
target: "#data-graph-model:account"
source_join_key: account_id
target_join_key: id
- id: account
display_name: Account
type: entity
table: db.schema.accounts
primary_id: account_id- spec.yaml
/models/0/relationships/0at most one relationship is allowed per source-target pair - spec.yaml
/models/0/relationships/1at most one relationship is allowed per source-target pair
Data Graph spec syntax must be valid
Rule ID: datagraph/data-graph/spec-syntax-valid
Examples
Valid Data Graph spec with entity and event models
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
root: true
- id: purchase
display_name: Purchase
type: event
table: db.schema.purchases
timestamp: purchased_at
relationships:
- id: purchase-user
display_name: Purchase User
cardinality: many-to-one
target: "#data-graph-model:user"
source_join_key: user_id
target_join_key: user_idData Graph missing required account_id
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph- spec.yaml
/account_id'account_id' is required
Entity model missing required primary_id
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users- spec.yaml
/models/0/primary_id'primary_id' is required for entity models
Event model missing required timestamp
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: purchase
display_name: Purchase
type: event
table: db.schema.purchases- spec.yaml
/models/0/timestamp'timestamp' is required for event models
Model table must use catalog.schema.table format
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: schema.users
primary_id: user_id- spec.yaml
/models/0/table'table' must be a 3-part reference in the format catalog.schema.table
Model and relationship names must be unique within a Data Graph
Rule ID: datagraph/data-graph/unique-names-valid
Examples
Unique model and relationship display names within the Data Graph
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-order
display_name: User Order
cardinality: one-to-many
target: "#data-graph-model:order"
source_join_key: user_id
target_join_key: user_id
- id: order
display_name: Order
type: entity
table: db.schema.orders
primary_id: order_idDuplicate model display names within a Data Graph
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
- id: user-v2
display_name: User
type: entity
table: db.schema.users_v2
primary_id: user_id- spec.yaml
/models/0/display_nameduplicate model display name - spec.yaml
/models/1/display_nameduplicate model display name
Duplicate relationship display names within a Data Graph
version: rudder/v1
kind: data-graph
metadata:
name: my-data-graph
spec:
id: my-data-graph
account_id: wh-account-123
models:
- id: user
display_name: User
type: entity
table: db.schema.users
primary_id: user_id
relationships:
- id: user-order
display_name: Links To
cardinality: one-to-many
target: "#data-graph-model:order"
source_join_key: user_id
target_join_key: user_id
- id: order
display_name: Order
type: entity
table: db.schema.orders
primary_id: order_id
relationships:
- id: order-product
display_name: Links To
cardinality: one-to-many
target: "#data-graph-model:product"
source_join_key: order_id
target_join_key: order_id
- id: product
display_name: Product
type: entity
table: db.schema.products
primary_id: product_id- spec.yaml
/models/0/relationships/0/display_nameduplicate relationship display name - spec.yaml
/models/1/relationships/0/display_nameduplicate relationship display name
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Sources
Event StreamEvent Stream source references must resolve to existing resources
Rule ID: event-stream/source/semantic-valid
Examples
Valid source without governance
version: rudder/v1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My Python Source
type: pythonValid source with an existing Tracking Plan reference
version: rudder/v1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My Python Source
type: python
governance:
validations:
tracking_plan: "#tracking-plan:tp-main"
config: {}version: rudder/v1
kind: tracking-plan
metadata:
name: tp-main
spec:
id: tp-main
name: Main Tracking Plan
description: Default plan
rules: []v1 source references a missing Tracking Plan
version: rudder/v1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My Python Source
type: python
governance:
validations:
tracking_plan: "#tracking-plan:tp-missing"
config: {}- spec.yaml
/governance/validations/tracking_plannot found in the project
v1 source name duplicates another source in the project
version: rudder/v1
kind: event-stream-source
metadata:
name: source-a
spec:
id: src-a
name: Shared Name
type: javascriptversion: rudder/v1
kind: event-stream-source
metadata:
name: source-b
spec:
id: src-b
name: Shared Name
type: node- source-a.yaml
/nameduplicate name 'Shared Name' within kind 'event-stream-source'
V1 sources whose names differ only in case (names compare case-insensitively)
version: rudder/v1
kind: event-stream-source
metadata:
name: source-a
spec:
id: src-a
name: Web App
type: javascriptversion: rudder/v1
kind: event-stream-source
metadata:
name: source-b
spec:
id: src-b
name: web app
type: node- source-a.yaml
/nameduplicate name 'Web App' (case-insensitive match with 'web app') within kind 'event-stream-source' - source-b.yaml
/nameduplicate name 'web app' (case-insensitive match with 'Web App') within kind 'event-stream-source'
Event Stream source references must resolve to existing resources
Rule ID: event-stream/source/semantic-valid
Examples
Valid legacy source without governance
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My JavaScript Source
type: javascriptValid legacy source with an existing Tracking Plan reference
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My JavaScript Source
type: javascript
governance:
validations:
tracking_plan: "#/tp/my-group/tp-main"
config: {}version: rudder/0.1
kind: tracking-plan
metadata:
name: tp-main
spec:
id: tp-main
name: Main Tracking Plan
description: Default plan
rules: []Legacy source references a missing Tracking Plan
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My JavaScript Source
type: javascript
governance:
validations:
tracking_plan: "#/tp/my-group/tp-missing"
config: {}- spec.yaml
/governance/validations/tracking_plannot found in the project
Legacy source name duplicates another source in the project
version: rudder/0.1
kind: event-stream-source
metadata:
name: source-a
spec:
id: src-a
name: Shared Name
type: javascriptversion: rudder/0.1
kind: event-stream-source
metadata:
name: source-b
spec:
id: src-b
name: Shared Name
type: node- source-a.yaml
/nameduplicate name 'Shared Name' within kind 'event-stream-source'
Event Stream source spec syntax must be valid
Rule ID: event-stream/source/spec-syntax-valid
Examples
Valid source spec with required fields
version: rudder/v1
kind: event-stream-source
metadata:
name: my-python-source
spec:
id: src-py-1
name: My Python Source
type: pythonValid source spec with Tracking Plan governance
version: rudder/v1
kind: event-stream-source
metadata:
name: my-android-source
spec:
id: src-android-1
name: My Android Source
type: android
governance:
validations:
tracking_plan: "#tracking-plan:tp-main"
config: {}v1 source spec missing required name
version: rudder/v1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
type: javascript- spec.yaml
/name'name' is required
v1 source spec with legacy Tracking Plan reference format
version: rudder/v1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My Source
type: javascript
governance:
validations:
tracking_plan: "#/tp/my-group/tp-1"
config: {}- spec.yaml
/governance/validations/tracking_plan'tracking_plan' is invalid: must be of pattern #tracking-plan:<id>
Event Stream source spec syntax must be valid
Rule ID: event-stream/source/spec-syntax-valid
Examples
Valid legacy source spec with required fields
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: src-js-1
name: My JavaScript Source
type: javascriptValid legacy source spec with Tracking Plan governance
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-node-source
spec:
id: src-node-1
name: My Node.js Source
type: node
governance:
validations:
tracking_plan: "#/tp/my-group/tp-main"
config: {}Legacy source spec missing required id
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-source
spec:
name: My Source
type: javascript- spec.yaml
/id'id' is required
Legacy source spec with unsupported source type
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My Source
type: unknown_sdk- spec.yaml
/type'type' must be one of
Legacy source spec with invalid Tracking Plan reference format
version: rudder/0.1
kind: event-stream-source
metadata:
name: my-source
spec:
id: src-1
name: My Source
type: javascript
governance:
validations:
tracking_plan: "#tracking-plan:tp-1"
config: {}- spec.yaml
/governance/validations/tracking_plan'tracking_plan' is invalid: must be of pattern #/tp/<group>/<id>
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Connections
Event StreamAn enabled Event Stream connection needs both its endpoints enabled to deliver events
Rule ID: event-stream/connection/enabled-endpoints-valid
Examples
Enabled connection whose source and destination are both enabled
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"
enabled: trueversion: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: true
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
web: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript
enabled: trueDisabled connection may point at disabled endpoints
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"
enabled: falseversion: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: false
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
web: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript
enabled: falseEnabled connection whose source is disabled
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"version: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: true
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
web: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript
enabled: false- connections.yaml
/spec/connections/0/sourceconnection 'js-to-s3' is enabled but its source 'my-js-source' is disabled
Enabled connection whose destination is disabled
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"version: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: false
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
web: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript
enabled: true- connections.yaml
/spec/connections/0/destinationconnection 'js-to-s3' is enabled but its destination 'my-s3-destination' is disabled
Event Stream connection endpoints must exist in the project and form a valid, compatible topology
Rule ID: event-stream/connection/semantic-valid
Examples
Connection whose source and destination exist and are compatible
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"version: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: true
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
web: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascriptConnection whose source does not exist in the project
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: ghost-to-s3
source: "#event-stream-source:ghost-source"
destination: "#destination:my-s3-destination"version: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: true
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
web: cloud- connections.yaml
/spec/connections/0/sourceevent stream source 'ghost-source' not found in the project
Connection whose destination does not exist in the project
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-ghost
source: "#event-stream-source:my-js-source"
destination: "#destination:ghost-destination"version: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript- connections.yaml
/spec/connections/0/destinationdestination 'ghost-destination' not found in the project
The same source-destination pair connected twice
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"
- id: js-to-s3-again
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"version: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: true
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
web: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript- connections.yaml
/spec/connections/0connected more than once in the project - connections.yaml
/spec/connections/1connected more than once in the project
Destination that does not support the source's type
The WEBHOOK definition here supports web and android sources only; a python source connects as a cloud source, so the pairing is rejected.
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: python-to-webhook
source: "#event-stream-source:my-python-source"
destination: "#destination:my-webhook-destination"version: rudder/v1
kind: destination
metadata:
name: my-webhook-destination
spec:
id: my-webhook-destination
display_name: Production Webhook
type: WEBHOOK
enabled: true
definition_version: 1
config:
webhook_url: "https://example.com/hook"version: rudder/v1
kind: event-stream-source
metadata:
name: my-python-source
spec:
id: my-python-source
name: My Python Source
type: python- connections.yaml
/spec/connections/0/destinationdoes not support source 'my-python-source'
Destination declaring no settings for the source's type
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"version: rudder/v1
kind: destination
metadata:
name: my-s3-destination
spec:
id: my-s3-destination
display_name: Production S3
type: s3
enabled: true
definition_version: 1
config:
bucket_name: my-bucket
role_based_auth: true
iam_role_arn: "arn:aws:iam::123456789012:role/rudder"
connection_mode:
android: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript- connections.yaml
/spec/connections/0/destinationhas no 'connection_mode' entry for source type 'web'
Destination config missing a field the source type requires to connect
The WEBHOOK definition here requires webhook_url before a web source may connect in cloud mode; the config declares that mode but omits the field.
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: js-to-webhook
source: "#event-stream-source:my-js-source"
destination: "#destination:my-webhook-destination"version: rudder/v1
kind: destination
metadata:
name: my-webhook-destination
spec:
id: my-webhook-destination
display_name: Production Webhook
type: WEBHOOK
enabled: true
definition_version: 1
config:
connection_mode:
web: cloudversion: rudder/v1
kind: event-stream-source
metadata:
name: my-js-source
spec:
id: my-js-source
name: My JavaScript Source
type: javascript- connections.yaml
/spec/connections/0/destinationconfig is missing fields required to connect a 'web' source
Event Stream connection spec syntax must be valid
Rule ID: event-stream/connection/spec-syntax-valid
Examples
Valid connection linking an Event Stream source to a destination
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: android-to-s3
source: "#event-stream-source:my-android-source"
destination: "#destination:my-s3-destination"Valid connection list with an explicitly disabled entry
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: android-to-s3
source: "#event-stream-source:my-android-source"
destination: "#destination:my-s3-destination"
- id: js-to-s3
source: "#event-stream-source:my-js-source"
destination: "#destination:my-s3-destination"
enabled: falseConnection entry missing required source and destination
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: android-to-s3- spec.yaml
/spec/connections/0/source'source' is required - spec.yaml
/spec/connections/0/destination'destination' is required
Connection whose source is not a reference
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: android-to-s3
source: "my-android-source"
destination: "#destination:my-s3-destination"- spec.yaml
/spec/connections/0/source'source' is invalid: must be of pattern #event-stream-source:<id>
Connection whose source ref points at a rETL source kind
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: model-to-s3
source: "#retl-source-sql-model:my-model"
destination: "#destination:my-s3-destination"- spec.yaml
/spec/connections/0/source'source' must reference an event stream source (#event-stream-source:<id>), got a 'retl-source-sql-model' reference
Connection whose destination ref points at a source
version: rudder/v1
kind: event-stream-connections
metadata:
name: my-connections
spec:
connections:
- id: android-to-s3
source: "#event-stream-source:my-android-source"
destination: "#event-stream-source:my-js-source"- spec.yaml
/spec/connections/0/destination'destination' must reference a destination (#destination:<id>), got a 'event-stream-source' reference
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Destinations
DestinationsDestination transformation reference must resolve to a project transformation and display_name must be unique across destinations
Rule ID: destination/semantic-valid
Examples
Destination whose transformation exists in the project
version: rudder/v1
kind: destination
metadata:
name: webhook-prod
spec:
id: webhook-prod
display_name: Production Webhook
type: WEBHOOK
definition_version: 1
transformation: "#transformation:my-transformation"
config:
webhook_url: "https://example.com/hook"version: rudder/v1
kind: transformation
metadata:
name: my-transformation
spec:
id: my-transformation
name: My Transformation
language: javascript
code: "export function transformEvent(event) { return event; }"Destination references a transformation that does not exist in the project
version: rudder/v1
kind: destination
metadata:
name: webhook-prod
spec:
id: webhook-prod
display_name: Production Webhook
type: WEBHOOK
definition_version: 1
transformation: "#transformation:ghost"
config:
webhook_url: "https://example.com/hook"- destination.yaml
/transformationnot found in the project
Two destinations share the same display_name
version: rudder/v1
kind: destination
metadata:
name: webhook-a
spec:
id: webhook-a
display_name: Shared Name
type: WEBHOOK
definition_version: 1
config:
webhook_url: "https://example.com/hook-a"version: rudder/v1
kind: destination
metadata:
name: webhook-b
spec:
id: webhook-b
display_name: Shared Name
type: WEBHOOK
definition_version: 1
config:
webhook_url: "https://example.com/hook-b"- destination-a.yaml
/display_nameduplicate display_name - destination-b.yaml
/display_nameduplicate display_name
Destination spec envelope, registered type/version, transformation reference format and config must be valid
Rule ID: destination/spec-syntax-valid
Examples
Valid destination with registered type, version and config
version: rudder/v1
kind: destination
metadata:
name: webhook-prod
spec:
id: webhook-prod
display_name: Production Webhook
type: WEBHOOK
enabled: true
definition_version: 1
config:
webhook_url: "https://example.com/hook"Unknown envelope field is rejected
version: rudder/v1
kind: destination
metadata:
name: webhook-prod
spec:
id: webhook-prod
display_name: Production Webhook
type: WEBHOOK
definition_version: 1
unexpected_field: true
config:
webhook_url: "https://example.com/hook"- destination.yaml
/unexpected_fieldunknown field
Destination type not present in the definition registry
version: rudder/v1
kind: destination
metadata:
name: mystery-dest
spec:
id: mystery-dest
display_name: Mystery Destination
type: NOT_A_REAL_TYPE
definition_version: 1
config: {}- destination.yaml
/typeis not supported
Transformation reference must match #transformation:<id>
version: rudder/v1
kind: destination
metadata:
name: webhook-prod
spec:
id: webhook-prod
display_name: Production Webhook
type: WEBHOOK
definition_version: 1
transformation: "transformation/my-transformation"
config:
webhook_url: "https://example.com/hook"- destination.yaml
/transformationmust be of pattern #transformation:<id>
URNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
SQL Models
SQL ModelsURNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
RETL SQL model semantic constraints must be satisfied
Rule ID: retl/sqlmodel/semantic-valid
Examples
Valid SQL model with unique display_name
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: churn-model
spec:
id: churn-model
display_name: Churn Risk Model
account_id: acc-456
primary_key: user_id
source_definition: bigquery
sql: SELECT user_id FROM churn_signalsv1 SQL model with duplicate display_name
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: churn-model-duplicate
spec:
id: churn-model-duplicate
display_name: Churn Risk Model
account_id: acc-456
primary_key: user_id
source_definition: bigquery
sql: SELECT user_id FROM churn_signals- spec.yaml
/display_nameduplicate display_name 'Churn Risk Model' within kind 'retl-source-sql-model'
V1 SQL models whose display_names differ only in case (names compare case-insensitively)
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: churn-model-lowercase
spec:
id: churn-model-lowercase
display_name: churn risk model
account_id: acc-456
primary_key: user_id
source_definition: bigquery
sql: SELECT user_id FROM churn_signalsversion: rudder/v1
kind: retl-source-sql-model
metadata:
name: churn-model
spec:
id: churn-model
display_name: Churn Risk Model
account_id: acc-456
primary_key: user_id
source_definition: bigquery
sql: SELECT user_id FROM churn_signals- churn.yaml
/display_nameduplicate display_name 'Churn Risk Model' (case-insensitive match with 'churn risk model') within kind 'retl-source-sql-model' - churn-lowercase.yaml
/display_nameduplicate display_name 'churn risk model' (case-insensitive match with 'Churn Risk Model') within kind 'retl-source-sql-model'
V1 SQL model referencing an account that cannot back its source_definition
version: rudder/v1
kind: account
metadata:
name: prod-pg
spec:
id: prod-pg
name: Production Postgres
account_definition_name: SOURCE_POSTGRES
config:
host: db.internal
dbname: analytics
user: rudder
port: "5432"
password: "{{ .PG_PASSWORD }}"version: rudder/v1
kind: retl-source-sql-model
metadata:
name: churn-model
spec:
id: churn-model
display_name: Churn Risk Model
account: "#account:prod-pg"
primary_key: user_id
source_definition: snowflake
sql: SELECT user_id FROM churn_signals- spec.yaml
/accountaccount 'prod-pg' is a 'postgres' account (SOURCE_POSTGRES) and cannot back source_definition 'snowflake'
RETL SQL model semantic constraints must be satisfied
Rule ID: retl/sqlmodel/semantic-valid
Examples
Valid legacy SQL model with unique display_name
version: rudder/0.1
kind: retl-source-sql-model
metadata:
name: revenue-model
spec:
id: revenue-model
display_name: Revenue Model
account_id: acc-123
primary_key: id
source_definition: postgres
sql: SELECT id, amount FROM revenueLegacy SQL model with duplicate display_name
version: rudder/0.1
kind: retl-source-sql-model
metadata:
name: revenue-model-copy
spec:
id: revenue-model-copy
display_name: Revenue Model
account_id: acc-123
primary_key: id
source_definition: postgres
sql: SELECT id, amount FROM revenue- spec.yaml
/display_nameduplicate display_name 'Revenue Model' within kind 'retl-source-sql-model'
RETL SQL model spec syntax must be valid
Rule ID: retl/sqlmodel/spec-syntax-valid
Examples
Valid SQL model spec with inline SQL
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
display_name: User Orders
account_id: acc-123
primary_key: id
source_definition: snowflake
sql: SELECT id, name FROM ordersValid v1 SQL model spec referencing an account in the project instead of an account_id
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
display_name: User Orders
account: "#account:prod-snowflake"
primary_key: id
source_definition: snowflake
sql: SELECT id, name FROM ordersv1 SQL model missing required account_id
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
display_name: User Orders
primary_key: id
source_definition: bigquery
sql: SELECT id, name FROM orders- spec.yaml
/account_id'account_id' is required when 'account' is not specified
V1 SQL model specifying both account_id and account (mutually exclusive)
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
display_name: User Orders
account_id: acc-123
account: "#account:prod-snowflake"
primary_key: id
source_definition: snowflake
sql: SELECT id, name FROM orders- spec.yaml
/account_id'account_id' and 'account' cannot be specified together
v1 SQL model specifies both sql and file
version: rudder/v1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
display_name: User Orders
account_id: acc-123
primary_key: id
source_definition: postgres
sql: SELECT id FROM orders
file: ./query.sql- spec.yaml
/sql'sql' and 'file' cannot be specified together
RETL SQL model spec syntax must be valid
Rule ID: retl/sqlmodel/spec-syntax-valid
Examples
Valid legacy SQL model spec with inline SQL
version: rudder/0.1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
display_name: User Orders
account_id: acc-123
primary_key: id
source_definition: postgres
sql: SELECT id, name FROM ordersLegacy SQL model missing required display_name
version: rudder/0.1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
account_id: acc-123
primary_key: id
source_definition: postgres
sql: SELECT id, name FROM orders- spec.yaml
/display_name'display_name' is required
Legacy SQL model with unsupported source_definition
version: rudder/0.1
kind: retl-source-sql-model
metadata:
name: user-orders-model
spec:
id: user-orders-model
display_name: User Orders
account_id: acc-123
primary_key: id
source_definition: oracle
sql: SELECT id FROM orders- spec.yaml
/source_definition'source_definition' must be one of [postgres redshift snowflake bigquery mysql databricks trino]
Table sources
Table SourcesURNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
RETL table source semantic constraints must be satisfied
Rule ID: retl/table/semantic-valid
Examples
Valid table source referencing a project account of its source_definition
version: rudder/v1
kind: account
metadata:
name: prod-pg
spec:
id: prod-pg
name: Production Postgres
account_definition_name: SOURCE_POSTGRES
config:
host: db.internal
dbname: analytics
user: rudder
port: "5432"
password: "{{ .PG_PASSWORD }}"version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: Users
account: "#account:prod-pg"
source_definition: postgres
primary_key: id
schema: public
table: usersS3 table source referencing an account that cannot back its source_definition
version: rudder/v1
kind: account
metadata:
name: prod-pg
spec:
id: prod-pg
name: Production Postgres
account_definition_name: SOURCE_POSTGRES
config:
host: db.internal
dbname: analytics
user: rudder
port: "5432"
password: "{{ .PG_PASSWORD }}"version: rudder/v1
kind: retl-source-table
metadata:
name: events-bucket
spec:
id: events-bucket
display_name: Events
account: "#account:prod-pg"
source_definition: s3
bucket_name: events
object_prefix: daily/- spec.yaml
/accountaccount 'prod-pg' is a 'postgres' account (SOURCE_POSTGRES) and cannot back source_definition 's3'
Table source whose display_name differs only in case from a SQL model's (names compare case-insensitively across RETL sources)
version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: users
account_id: acc-123
source_definition: postgres
primary_key: id
schema: public
table: usersversion: rudder/v1
kind: retl-source-sql-model
metadata:
name: users-model
spec:
id: users-model
display_name: Users
account_id: acc-123
primary_key: id
source_definition: postgres
sql: SELECT id, email FROM users- spec.yaml
/display_nameduplicate display_name 'users' (case-insensitive match with 'Users') across RETL sources
RETL table source spec syntax must be valid (experimental kind)
Rule ID: retl/table/spec-syntax-valid
Examples
Valid warehouse table source
version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: Users
account_id: acc-123
source_definition: postgres
primary_key: id
schema: public
table: usersValid s3 table source
version: rudder/v1
kind: retl-source-table
metadata:
name: events-bucket
spec:
id: events-bucket
display_name: Events
account_id: acc-s3
source_definition: s3
bucket_name: events
object_prefix: daily/Valid warehouse table source referencing an account in the project instead of an account_id
version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: Users
account: "#account:prod-pg"
source_definition: postgres
primary_key: id
schema: public
table: usersS3 table source without the object prefix rudder-api requires
version: rudder/v1
kind: retl-source-table
metadata:
name: events-bucket
spec:
id: events-bucket
display_name: Events
account_id: acc-s3
source_definition: s3
bucket_name: events- spec.yaml
/object_prefix'object_prefix' is required when 'source_definition' is s3
Table source with neither account_id nor an account reference
version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: Users
source_definition: postgres
primary_key: id
schema: public
table: users- spec.yaml
/account_id'account_id' is required when 'account' is not specified
Table source specifying both account_id and account (mutually exclusive)
version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: Users
account_id: acc-123
account: "#account:prod-pg"
source_definition: postgres
primary_key: id
schema: public
table: users- spec.yaml
/account_id'account_id' and 'account' cannot be specified together
Warehouse table source missing the table it reads
version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: Users
account_id: acc-123
source_definition: postgres
primary_key: id
schema: public- spec.yaml
/table'table' is required unless 'source_definition' is s3
S3 table source declaring a primary key the s3 config cannot carry
version: rudder/v1
kind: retl-source-table
metadata:
name: events-bucket
spec:
id: events-bucket
display_name: Events
account_id: acc-s3
source_definition: s3
primary_key: id
bucket_name: events
object_prefix: daily/- spec.yaml
/primary_key'primary_key' is not allowed when 'source_definition' is s3
Table source with an unsupported source_definition
version: rudder/v1
kind: retl-source-table
metadata:
name: users-table
spec:
id: users-table
display_name: Users
account_id: acc-123
source_definition: oracle
primary_key: id
schema: public
table: users- spec.yaml
/source_definition'source_definition' must be one of [postgres redshift snowflake bigquery mysql databricks trino s3]
Transformations
TransformationsURNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Transformation imports must resolve to existing transformation libraries
Rule ID: transformations/transformation/semantic-valid
Examples
Transformation without library imports is valid
version: rudder/v1
kind: transformation
metadata:
name: my-transformations
spec:
transformations:
- id: my-transformation
name: My Transformation
language: javascript
code: |
export function transformEvent(event, metadata) {
event.properties.processed = true;
return event;
} Transformation imports a missing library
version: rudder/v1
kind: transformation
metadata:
name: my-transformations
spec:
transformations:
- id: my-transformation
name: My Transformation
language: javascript
code: |
import mathUtils from 'mathUtils';
export function transformEvent(event, metadata) {
event.properties.value = mathUtils.round(event.properties.value);
return event;
} - spec.yaml
/code'mathUtils' imported library not found
Transformation spec syntax must be valid
Rule ID: transformations/transformation/spec-syntax-valid
Examples
Valid transformation spec with inline JavaScript
version: rudder/v1
kind: transformation
metadata:
name: my-transformations
spec:
transformations:
- id: my-transformation
name: My Transformation
description: Enriches events with additional metadata
language: javascript
code: |
export function transformEvent(event, metadata) {
event.properties.enriched = true;
return event;
} Transformation spec missing required id
version: rudder/v1
kind: transformation
metadata:
name: my-transformations
spec:
transformations:
- name: My Transformation
language: javascript
code: |
export function transformEvent(event, metadata) {
return event;
} - spec.yaml
/id'id' is required
Transformation spec missing the required language
version: rudder/v1
kind: transformation
metadata:
name: my-transformations
spec:
transformations:
- id: my-transformation
name: My Transformation
code: |
export function transformEvent(event, metadata) {
return event;
} - spec.yaml
/language'language' is required
Transformation spec defined with an unsupported language
version: rudder/v1
kind: transformation
metadata:
name: my-transformations
spec:
transformations:
- id: my-transformation
name: My Transformation
language: ruby
code: |
def transform_event(event, metadata)
event
end - spec.yaml
/language'language' must be one of [javascript python]
Transformation spec missing code and file
version: rudder/v1
kind: transformation
metadata:
name: my-transformations
spec:
transformations:
- id: my-transformation
name: My Transformation
language: javascript- spec.yaml
/code'code' is required when 'file' is not specified
Transformation libraries
TransformationsURNs must be unique across the project
Rule ID: project/duplicate-urn
Examples
Distinct URNs across files
Each spec declares a different resource, so URNs do not collide.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: cart_viewed
name: Cart ViewedSame URN declared in two files
Both files declare the same event ID, which resolves to one URN. The rule flags each occurrence.
version: rudder/v1
kind: events
metadata:
name: events-a
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: events
metadata:
name: events-b
spec:
events:
- id: order_completed
name: Order Completed (duplicate)- a.yaml
/spec/events/0/idduplicate URN 'event:order_completed' - b.yaml
/spec/events/0/idduplicate URN 'event:order_completed'
A (workspace_id, urn) must not be defined in both an import-manifest and inline metadata.import with differing remote_ids
Rule ID: project/manifest-inline-conflict
Examples
Manifest and inline metadata import distinct resources
One resource is imported via the manifest, a different one via inline metadata. No URN appears in both, so the project is valid.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:cart_viewed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completed
- id: cart_viewed
name: Cart Viewedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"Same URN imported by both a manifest and inline metadata
The URN event:order_completed is declared in both the manifest and an inline metadata.import block — an ambiguous double import. The rule flags both locations; remove one.
version: rudder/v1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Manifest URN overlaps a legacy rudder/0.1 inline local_id import
The events spec uses the legacy rudder/0.1 format, whose inline imports reference resources by local_id + remote_id. The local_id order_completed resolves to the URN event:order_completed — the same URN the manifest imports. Legacy specs are still subject to the conflict rule, so both locations are flagged; remove the inline metadata entry.
version: rudder/0.1
kind: events
metadata:
name: events
import:
workspaces:
- workspace_id: "ws-1"
resources:
- local_id: order_completed
remote_id: "remote_b"
spec:
events:
- id: order_completed
name: Order Completedversion: rudder/v1
kind: import-manifest
metadata:
name: import-manifest
spec:
workspaces:
- workspace_id: "ws-1"
resources:
- urn: "event:order_completed"
remote_id: "remote_a"- import-manifest.yaml
/spec/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata - events.yaml
/metadata/import/workspaces/0/resources/0/urnURN 'event:order_completed' is defined in both an import-manifest and inline metadata
Metadata syntax must be valid
Rule ID: project/metadata-syntax-valid
Examples
Metadata with only the required name
Minimal valid metadata: a name only.
version: rudder/v1
kind: events
metadata:
name: my-events
spec:
events: []Metadata with a well-formed import block
An import block where each workspace declares workspace_id and each resource references a URN in the spec body.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- workspace_id: ws-123
resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order CompletedMetadata missing required name
Every spec metadata block must declare a name.
version: rudder/v1
kind: events
metadata:
import:
workspaces:
- workspace_id: ws-123
spec:
events: []- spec.yaml
/metadata/name'name' is required
Import workspace missing required workspace_id
Each import workspace entry must declare a workspace_id.
version: rudder/v1
kind: events
metadata:
name: my-events
import:
workspaces:
- resources:
- urn: "event:order_completed"
remote_id: ev-remote-456
spec:
events:
- id: order_completed
name: Order Completed- spec.yaml
/metadata/import/workspaces/0/workspace_id'workspace_id' is required
Transformation library must be semantically valid
Rule ID: transformations/transformation-library/semantic-valid
Examples
Transformation library with unique import_name
version: rudder/v1
kind: transformation-library
metadata:
name: my-libraries
spec:
libraries:
- id: math-utils
name: Math Utils
import_name: mathUtils
language: javascript
code: |
export function round(value) {
return Math.round(value);
} Duplicate transformation library import_name
version: rudder/v1
kind: transformation-library
metadata:
name: my-libraries
spec:
libraries:
- id: math-utils
name: Math Utils
import_name: mathUtils
language: javascript
code: |
export function round(value) {
return Math.round(value);
}
- id: math-helpers
name: Math Helpers
import_name: mathUtils
language: javascript
code: |
export function ceil(value) {
return Math.ceil(value);
} - spec.yaml
/import_nameimport_name 'mathUtils' is duplicate
Transformation library spec syntax must be valid
Rule ID: transformations/transformation-library/spec-syntax-valid
Examples
Valid transformation library spec with inline JavaScript
version: rudder/v1
kind: transformation-library
metadata:
name: my-libraries
spec:
libraries:
- id: math-utils
name: Math Utils
import_name: mathUtils
description: Utility functions for math operations
language: javascript
code: |
export function round(value) {
return Math.round(value);
} Transformation library spec missing required id
version: rudder/v1
kind: transformation-library
metadata:
name: my-libraries
spec:
libraries:
- name: Math Utils
import_name: mathUtils
language: javascript
code: |
export function round(value) {
return Math.round(value);
} - spec.yaml
/id'id' is required
Transformation library spec missing required import_name
version: rudder/v1
kind: transformation-library
metadata:
name: my-libraries
spec:
libraries:
- id: math-utils
name: Math Utils
language: javascript
code: |
export function round(value) {
return Math.round(value);
} - spec.yaml
/import_name'import_name' is required
Transformation library import_name is not camelCase of name
version: rudder/v1
kind: transformation-library
metadata:
name: my-libraries
spec:
libraries:
- id: math-utils
name: Math Utils
import_name: MathUtils
language: javascript
code: |
export function round(value) {
return Math.round(value);
} - spec.yaml
/import_name'import_name' must be camelCase of 'name'
Transformation library spec with unsupported language
version: rudder/v1
kind: transformation-library
metadata:
name: my-libraries
spec:
libraries:
- id: math-utils
name: Math Utils
import_name: mathUtils
language: ruby
code: |
def round(value)
value.round
end - spec.yaml
/language'language' must be one of [javascript python]
Questions? Let's figure it out together.
Join the RudderStack Slack community to connect with other users, customers, and the RudderStack team — or reach out for direct support.