rdt-model-policy
rdt-model-policy is the DQ rule compiler. It manages a shared library of CEL-based validation rules and compiles them to multiple execution targets: dbt tests (batch enforcement at scale via dbt Cloud) and Snowflake UDFs (interactive single-value validation from steward UI).
Rules are defined once in rules/library/ using CEL (Common Expression Language) and bound to entity properties via models/{entity}/rules.yaml. See ADR 0013 and the DQ Rule Library reference for the full design.
Pipeline phase: Phase 4 — Deploy
Subcommands
Section titled “Subcommands”compile
Section titled “compile”Compiles entity bindings into dbt tests and Snowflake UDFs. If model.json exists for the entity, binding properties are validated against model fields first (fail-early on unknown columns).
rdt-model-policy --target dev --entity <name> compilerdt-model-policy --target dev --entity <name> compile --granular-testsrdt-model-policy --target dev --entity <name> --dry-run compile| Flag | Effect |
|---|---|
--granular-tests | One file per rule instead of combined dq_all_rules.sql |
Output:
| File | Format | Description |
|---|---|---|
dbt/tests/{entity}/dq_all_rules.sql | SQL | Combined dbt test — UNION ALL across all rules (default) |
dbt/tests/{entity}/dq_{rule_id}.sql | SQL | Per-rule dbt test (with --granular-tests) |
snowflake/udf/dq_{rule_id}.sql | SQL | Snowflake UDF DDL (Python for Tier 1, SQL for Tier 2+) |
catalog
Section titled “catalog”Regenerates rules/registry.yaml — the searchable index of all rules in the library. Includes SHA-256 content hashes for duplicate detection.
rdt-model-policy --target dev catalogrdt-model-policy --target dev catalog --strict| Flag | Effect |
|---|---|
--strict | Exit non-zero if duplicate CEL expressions are detected across rules |
validate-bindings
Section titled “validate-bindings”Cross-references binding properties against entity model fields. Catches references to non-existent columns before they cause dbt runtime failures.
rdt-model-policy --target dev --entity <name> validate-bindingsComparison is case-insensitive (model fields are UPPER_CASE SQL names, bindings use lowercase targeting the Silver view).
eval-rule
Section titled “eval-rule”Evaluates a single rule against a JSON value locally using cel-interpreter. Tier 1 only (Tier 2+ requires Snowflake connectivity).
rdt-model-policy --target dev eval-rule --rule valid-roche-email --value '{"email":"user@roche.com"}'Output:
{ "rule_id": "valid-roche-email", "passed": true, "message": ""}test-rule
Section titled “test-rule”Tests a rule against a fixture file with multiple test cases.
rdt-model-policy --target dev test-rule --rule positive-number --fixtures rules/fixtures/positive-number-test.jsonFixture format:
{ "cases": [ {"input": {"amount": 42}, "expected": true}, {"input": {"amount": -1}, "expected": false} ]}Configuration
Section titled “Configuration”| Key | Source | Description |
|---|---|---|
rules/library/ | Repository | Shared rule definitions (CEL YAML) |
models/{entity}/rules.yaml | Repository | Entity-specific rule bindings |
rules/registry.yaml | Generated | Auto-generated rule catalog |
Dependencies
Section titled “Dependencies”rules/library/— shared DQ rule definitionsmodels/{entity}/rules.yaml— entity bindings (new format, references library rules)