lineage
A layered DAG, not a pile of queries
Staging views one per source, intermediate models for the awkward aggregations, marts as tables. Everything flows through ref(), so the lineage graph is real documentation: you can see exactly where any number comes from and what breaks if a source changes.
modelling
Star schemas with the grain decided first
Kimball-style facts and dimensions joined on surrogate keys, with relationships tests enforcing referential integrity. The grain of every table is stated before it's built, because most bad numbers are really grain mistakes in disguise.
semantic layer
Metrics defined once, above the marts
Revenue, AOV and repeat rate get one definition in the semantic layer, then every dashboard consumes it. No maths hidden inside report visuals, no three versions of "revenue" arguing in a meeting. I build these as Power BI semantic models over dbt marts.
trust
Tested and reconciled, not assumed
Keys carry unique and not_null, categoricals carry accepted_values, composite grains get their own tests, and singular tests reconcile the warehouse back to the source system. Legitimate mismatches run at warn severity so they're surfaced, not silenced.