dbt
Mid-levelHow do I know what breaks downstream before I change a dbt model?
The lineage graph already exists in every dbt run's manifest.json. The question is whether you're checking it before a change ships, or finding out from a broken dashboard after.
A renamed column or a dropped model looks safe in a PR diff if nothing downstream is visibly referencing it in the same file - which tells you nothing about what actually consumes it three models away.
The lineage graph already exists - you're probably not reading it
Every dbt run produces manifest.json, which fully encodes the project's dependency graph - every model's upstream sources and downstream consumers, already computed. dbt ls --select +my_model+ lists every upstream and downstream model for a given one directly from that graph, without opening dbt docs or tracing folder structure by hand.
Exposures turn "downstream" into something concrete
An exposures.yml entry ties a model to an actual consumer outside dbt's own DAG - a dashboard, a reverse-ETL sync, a report someone actually looks at. Without exposures, "nothing depends on this model" only means nothing inside dbt depends on it, which is a weaker and often misleading claim if the real consumer is a BI tool dbt has no visibility into.
Doing this before a breaking change, not after
Running dbt ls --select +model_name against a changed model's selector as a pre-merge CI check catches the case where a rename or a dropped column breaks three downstream marts before the PR merges - not after someone notices a dashboard is quietly wrong days later.
See what this looks like on your own pipeline.
Upload a real Spark event log, dbt run_results.json, or Flink metrics export and get
concrete, approve-before-apply recommendations back - not another rule of thumb.