Governance Rules¶
Governance rules enforce standards, naming conventions, and policies across your streaming projects. They're checked during streamt validate.
Overview¶
Rules are defined in stream_project.yml:
rules:
topics:
min_partitions: 6
naming_pattern: "^[a-z]+\\.[a-z]+\\.v[0-9]+$"
models:
require_description: true
require_tests: true
sources:
require_schema: true
security:
require_classification: true
Topic Rules¶
Control Kafka topic configuration:
rules:
topics:
# Partition requirements
min_partitions: 3
max_partitions: 128
# Replication requirements
min_replication_factor: 2
# Naming conventions
naming_pattern: "^[a-z]+\\.[a-z-]+\\.v[0-9]+$"
forbidden_prefixes:
- "_"
- "test"
- "tmp"
- "dev"
# Maximum replication
max_replication_factor: 3
# Suffix restrictions
forbidden_suffixes:
- "_test"
- "_temp"
- "_debug"
# Required configurations
required_config:
- retention.ms
- min.insync.replicas
Rule Reference¶
| Rule | Type | Description |
|---|---|---|
min_partitions |
int | Minimum partition count |
max_partitions |
int | Maximum partition count |
min_replication_factor |
int | Minimum replication factor |
naming_pattern |
regex | Required topic name pattern |
forbidden_prefixes |
list | Disallowed name prefixes |
max_replication_factor |
int | Maximum replication factor |
forbidden_suffixes |
list | Disallowed name suffixes |
required_config |
list | Configs that must be set |
Naming Pattern Examples¶
# Domain.entity.version pattern
naming_pattern: "^[a-z]+\\.[a-z-]+\\.v[0-9]+$"
# Matches: orders.created.v1, payments.processed.v2
# Rejects: Orders.Created, orders_created_v1
# Environment prefix pattern
naming_pattern: "^(prod|staging|dev)\\.[a-z]+\\.[a-z]+$"
# Matches: prod.orders.raw, staging.users.events
# Team namespace pattern
naming_pattern: "^team-[a-z]+\\.[a-z-]+$"
# Matches: team-payments.transactions, team-fraud.alerts
Model Rules¶
Enforce documentation and quality standards:
rules:
models:
# Documentation requirements
require_description: true
require_owner: true
# Testing requirements
require_tests: true
# Complexity limits
max_dependencies: 10
Rule Reference¶
| Rule | Type | Description |
|---|---|---|
require_description |
bool | Models must have description |
require_owner |
bool | Models must have owner |
require_tests |
bool | Models must have tests |
max_dependencies |
int | Max upstream dependencies |
Source Rules¶
Ensure sources are well-documented:
rules:
sources:
# Schema requirements
require_schema: true
# Freshness monitoring
require_freshness: true
Rule Reference¶
| Rule | Type | Description |
|---|---|---|
require_schema |
bool | Must reference Schema Registry |
require_freshness |
bool | Must have freshness SLA |
Security Rules¶
Enforce data protection policies:
rules:
security:
# Classification requirements
require_classification: true
# Masking requirements
sensitive_columns_require_masking: true
Rule Reference¶
| Rule | Type | Description |
|---|---|---|
require_classification |
bool | Columns must have classification |
sensitive_columns_require_masking |
bool | Sensitive data must be masked |
Classification Levels¶
| Level | Description | Typical Rules |
|---|---|---|
public |
Open data | No restrictions |
internal |
Internal use | No external exposure |
confidential |
Business sensitive | Limited access |
sensitive |
PII, personal data | Masking required |
highly_sensitive |
Regulated (PCI, HIPAA) | Encryption + audit |
Data Residency Rules¶
Control where data can be processed:
Models and sources declare their region:
models:
- name: eu_orders
region: EU
sql: ...
sources:
- name: eu_events
region: EU
topic: eu.events.v1
The validator errors if a model or source declares a region not in allowed_regions.
Rule Reference¶
| Rule | Type | Description |
|---|---|---|
allowed_regions |
list | Regions that models/sources may declare |
Schema Versioning¶
Models support a version field for managing schema evolution:
models:
- name: users
version: 1
sql: SELECT id, name FROM {{ source("raw_users") }}
- name: users
version: 2
sql: SELECT id, name, email FROM {{ source("raw_users") }}
The validator checks: - Duplicate versions — error if same model name has duplicate version numbers - Version gaps — warning if version N exists without version N-1
Validation Output¶
When rules are violated:
$ streamt validate
✗ Project 'my-pipeline' has validation errors
Errors:
✗ Model 'orders_raw_v2' violates topic naming pattern
Expected: ^[a-z]+\.[a-z-]+\.v[0-9]+$
Got: orders_raw_v2
✗ Model 'customer_metrics' missing required tests
Rule: require_tests = true
Warnings:
⚠ Source 'events' missing freshness configuration
Rule: require_freshness = true
⚠ Column 'email' in 'users' appears to be PII but lacks classification
Rule: pii_column_patterns includes 'email'
Summary: 2 errors, 2 warnings
Strict Mode¶
In strict mode, warnings become errors:
Use in CI/CD to enforce all rules.
Environment-Specific Rules¶
Use different rules per environment:
Best Practices¶
1. Start Permissive, Tighten Over Time¶
# Week 1: Basic requirements
rules:
models:
require_description: true
# Month 1: Add testing requirements
rules:
models:
require_description: true
require_tests: true
# Quarter 1: Full governance
rules:
models:
require_description: true
require_tests: true
require_owner: true
security:
require_classification: true
2. Document Rule Rationale¶
rules:
topics:
# Minimum 6 partitions for adequate parallelism
# across our 6-node Kafka cluster
min_partitions: 6
# Pattern: domain.entity.version
# Examples: orders.created.v1, payments.processed.v2
naming_pattern: "^[a-z]+\\.[a-z-]+\\.v[0-9]+$"