Frontier

CDC data-change assessments

Last updated 6 September 2026

Separate from pull-request SQL comparison

CDC assessments watch Snowflake Streams for source-row changes. They are not PR SQL diffs. Do not add CDC consume/prove to the pull-request workflow. Do not run dbt build before CDC proof: the current materialized mart is the before-state baseline.

Frontier is not currently autonomous self-healing. frontier cdc prove is assessment-only unless you pass --apply, which writes the repair to the target mart. Scheduling is optional and only needed for continuous operation. The reference workflow uses workflow_dispatch; the cron schedule stays commented.

Supported CDC lifecycle

  1. Configure frontier-cdc.yml with provider snowflake_stream (no credentials in that file).
  2. frontier cdc inspect prints configured streams without consuming them.
  3. frontier cdc status reports pending or empty per stream.
  4. frontier cdc consume durably captures a batch. Empty streams print status EMPTY. Repeat consume of the same captured batch is idempotent (REUSED).
  5. DELETE/INSERT update pairs normalize into one logical update.
  6. Semantic routes convert source keys into affected entity keys.
  7. frontier cdc prove targeted-recomputes candidates and checks whether mart output changed. Consuming a stream is not the same as completing validation.
  8. frontier cdc upload sends aggregates for a completed batch without re-running proof.
pip install "frontier-runner[snowflake]==0.1.1"
frontier cdc inspect
frontier cdc status
frontier cdc consume
frontier cdc prove
frontier cdc upload

Prerequisites

  • Least-privilege CDC grants from frontier setup snowflake --cdc. Never include real credentials or customer identifiers.
  • An active semantic manifest, fetched or pinned locally.
  • Current dbt artifacts for cdc prove (target/manifest.json).
  • Optional --batch-id to select a captured or failed batch. Default prove uses the oldest CAPTURED or FAILED batch.

BASELINE_STALE means a previous completed CDC assessment was not applied or incorporated into the mart baseline. Resolve that before treating a new passed upload as current. See Troubleshooting.