What you'll see
dbt-plan -- 4 model(s) changed
dialect: snowflake (default; adapter: unknown)
baseline: unknown revision, unknown snapshot time
DESTRUCTIVE int_order_enriched (incremental, sync_all_columns)
ADD COLUMN billing_method
ADD COLUMN shipping_city
DROP COLUMN billing_info
DROP COLUMN shipping_info
Downstream: dim_customers, fct_daily_sales (2 model(s))
>> BROKEN_REF fct_daily_sales: reads dropped column(s): shipping_info
SAFE dim_customers (table)
CREATE OR REPLACE TABLE
SAFE dim_publishers (table)
CREATE OR REPLACE TABLE
SAFE fct_daily_sales (incremental, append_new_columns)
ADD COLUMN total_sales
Causal explanations (before policy)
- DESTRUCTIVE cascade.broken_ref: source model.sample.int_order_enriched; affected model.sample.fct_daily_sales
reads dropped column(s): shipping_info
Source change: added billing_method, shipping_city; removed billing_info, shipping_info
Affected/evidence columns: (not recorded); evidence: legacy_cascade / unknown / provenance_unavailable; raw risk: broken_ref; waiver eligible: false
Review: provenance_unavailable
Source config: materialized=incremental; on_schema_change=None
Affected config: materialized=incremental; on_schema_change=None
Step: model.sample.int_order_enriched -> model.sample.fct_daily_sales; exact direct compiled read; root attribution not established; removed shipping_info
Config: materialized=incremental; on_schema_change=None
- DESTRUCTIVE ddl.drop_column: source model.sample.int_order_enriched; affected model.sample.int_order_enriched
DROP COLUMN; column: billing_info
Source change: added billing_method, shipping_city; removed billing_info, shipping_info
Affected/evidence columns: billing_info, billing_method, customer_id, order_date, order_id, revenue, shipping_city, shipping_info; 1 columns omitted; evidence: compiled_sql / exact / column_diff_checked; raw risk: destructive; waiver eligible: true
Compiled SQL (not a source/Jinja line): target/compiled/sample/models/int_order_enriched.sql
Source config: materialized=incremental; on_schema_change=None
Affected config: materialized=incremental; on_schema_change=None
- DESTRUCTIVE ddl.add_column: source model.sample.int_order_enriched; affected model.sample.int_order_enriched
ADD COLUMN; column: billing_method
Source change: added billing_method, shipping_city; removed billing_info, shipping_info
Affected/evidence columns: billing_info, billing_method, customer_id, order_date, order_id, revenue, shipping_city, shipping_info; 1 columns omitted; evidence: compiled_sql / exact / column_diff_checked; raw risk: destructive; waiver eligible: true
Compiled SQL (not a source/Jinja line): target/compiled/sample/models/int_order_enriched.sql
Source config: materialized=incremental; on_schema_change=None
Affected config: materialized=incremental; on_schema_change=None
- DESTRUCTIVE ddl.add_column: source model.sample.int_order_enriched; affected model.sample.int_order_enriched
ADD COLUMN; column: shipping_city
Source change: added billing_method, shipping_city; removed billing_info, shipping_info
Affected/evidence columns: billing_info, billing_method, customer_id, order_date, order_id, revenue, shipping_city, shipping_info; 1 columns omitted; evidence: compiled_sql / exact / column_diff_checked; raw risk: destructive; waiver eligible: true
Compiled SQL (not a source/Jinja line): target/compiled/sample/models/int_order_enriched.sql
Source config: materialized=incremental; on_schema_change=None
Affected config: materialized=incremental; on_schema_change=None
- DESTRUCTIVE ddl.drop_column: source model.sample.int_order_enriched; affected model.sample.int_order_enriched
DROP COLUMN; column: shipping_info
Source change: added billing_method, shipping_city; removed billing_info, shipping_info
Affected/evidence columns: billing_info, billing_method, customer_id, order_date, order_id, revenue, shipping_city, shipping_info; 1 columns omitted; evidence: compiled_sql / exact / column_diff_checked; raw risk: destructive; waiver eligible: true
Compiled SQL (not a source/Jinja line): target/compiled/sample/models/int_order_enriched.sql
Source config: materialized=incremental; on_schema_change=None
Affected config: materialized=incremental; on_schema_change=None
- WARNING input.refusal: source model.sample.dim_customers; affected model.sample.dim_customers
Unresolved compiled SQL read from int_order_enriched while checking int_order_enriched; affected columns: billing_info, shipping_info
Source change: not recorded
Affected/evidence columns: (not recorded); evidence: input / unknown / read_unresolved; raw risk: warning; waiver eligible: false
Review: read_unresolved
Source config: materialized=table; on_schema_change=None
Affected config: materialized=table; on_schema_change=None
- SAFE ddl.replace_table: source model.sample.dim_customers; affected model.sample.dim_customers
CREATE OR REPLACE TABLE
Source change: not recorded
Affected/evidence columns: country, created_at, customer_id, customer_tier; evidence: compiled_sql / exact / column_diff_checked; raw risk: safe; waiver eligible: true
Compiled SQL (not a source/Jinja line): target/compiled/sample/models/dim_customers.sql
Source config: materialized=table; on_schema_change=None
Affected config: materialized=table; on_schema_change=None
- SAFE ddl.replace_table: source model.sample.dim_publishers; affected model.sample.dim_publishers
CREATE OR REPLACE TABLE
Source change: not recorded
Affected/evidence columns: end_date, publisher_id, publisher_name, start_date; evidence: compiled_sql / exact / column_diff_checked; raw risk: safe; waiver eligible: true
Compiled SQL (not a source/Jinja line): target/compiled/sample/models/dim_publishers.sql
Source config: materialized=table; on_schema_change=None
Affected config: materialized=table; on_schema_change=None
- SAFE ddl.add_column: source model.sample.fct_daily_sales; affected model.sample.fct_daily_sales
ADD COLUMN; column: total_sales
Source change: added total_sales; removed (not recorded)
Affected/evidence columns: order_count, order_date, shipping_info, store_id, total_sales, unique_customers; evidence: compiled_sql / exact / column_diff_checked; raw risk: safe; waiver eligible: true
Compiled SQL (not a source/Jinja line): target/compiled/sample/models/fct_daily_sales.sql
Source config: materialized=incremental; on_schema_change=None
Affected config: materialized=incremental; on_schema_change=None
Observation: model.sample.int_order_enriched -> model.sample.dim_customers; unknown read check; not a column-flow edge; columns (not recorded); read_unresolved
Explanation detail omitted: 0 associations; 0 graph edges not displayed. Full relevant graph and findings: JSON.
External consumer coverage: unknown. Exposures are declared consumers only.
dbt-plan: 4 checked, 3 safe, 0 warning, 1 destructive, 1 cascade risk(s)
Configuration
Create .dbt-plan.yml in your project root, or use environment variables.
# .dbt-plan.yml
# Skip known-safe models
ignore_models: [scratch_model, staging_temp]
# SQL dialect (default: snowflake)
dialect: bigquery
# Custom compile command (for uv, poetry, etc.)
compile_command: uv run dbt compile
# Exit code for warnings (default: 2, set 0 to pass CI)
warning_exit_code: 0
All settings also work as environment variables (for CI):
DBT_PLAN_DIALECT=bigquery
DBT_PLAN_COMPILE_COMMAND="uv run dbt compile"
DBT_PLAN_IGNORE_MODELS="scratch_model,staging_temp"
DBT_PLAN_FORMAT=json
DBT_PLAN_WARNING_EXIT_CODE=0
Priority: CLI flags > environment variables > .dbt-plan.yml > defaults