Documentation, Lineage, and Governance
This domain covers how dbt makes a project understandable and controlled: descriptions, generated documentation, lineage, exposures, ownership, groups, access, contracts, and versions. The exam tests whether you know which metadata is descriptive and which metadata actually enforces behavior.
Documentation and lineage
Descriptions live in YAML or in {% docs %} blocks referenced with {{ doc("...") }}. dbt docs generate compiles the project and produces manifest.json and catalog.json; the documentation site renders model, column, and source descriptions and a DAG built from ref() and source() edges. Lineage is therefore a byproduct of correct references, not a manually drawn diagram. persist_docs writes relation and column comments into the warehouse, but only when enabled and supported by the adapter. Exposures declare downstream consumers such as dashboards, notebooks, or applications and their dependencies, extending lineage beyond dbt models. Exposures are metadata; they are not executed by dbt.
Governance controls
Groups assign ownership. Model access levels are private, protected, and public: a private model can only be referenced by models in the same group, while public models form a cross-project interface. Model contracts, when enforced, require declared column names and data types and cause build-time failures on incompatible changes. Model versions let consumers pin a stable interface while a new version is developed; deprecation_date signals retirement. Tags and meta support selection and metadata propagation, but they do not enforce data quality.
Worked example
A finance team owns a finance group. Its revenue model is marked access: private, so only models in that group may ref() it; another group attempting the reference fails at parse time. A public orders model has an enforced contract with declared types. A dashboard exposure depends on the public model, so lineage shows the dashboard as a downstream consumer. If a column is removed from the contracted model, the build fails before the dashboard breaks silently.
Traps that cost marks
Descriptions do not appear in the database unless persist_docs is configured. Exposures do not run or refresh anything. Making a model private and then referencing it from another group breaks the project. Contracts require a complete column list with data types; partial declarations fail. Tags are selection metadata, not access control.