Deployment, Orchestration, and Project Configuration
This domain tests how a dbt project is configured, promoted across environments, and run reliably. The exam emphasizes configuration files, environment targets, artifact-based state, and the difference between running models and running a full build.
Project and profile configuration
dbt_project.yml contains project-level settings: model paths, folder-level materializations, tags, variables, and hooks. profiles.yml contains connection credentials and targets such as dev and prod; it should not be committed to the repository. target.name enables conditional configuration, for example a larger warehouse or different schema in production. env_var() injects secrets and environment-specific values. packages.yml plus dbt deps installs packages, and selectors.yml defines reusable selection sets. Hooks such as pre-hook and post-hook run SQL around model builds; grants configures privileges.
Deployment, CI, and state
In dbt Cloud, environments hold connection and credential settings, and jobs schedule commands. A production job should run dbt build so tests gate downstream models, and it should retain manifest.json as the state artifact. CI jobs compare against that artifact using --state and state:modified, often with --defer so unbuilt upstream models resolve to production relations. This is the basis of Slim CI: build only modified models and their downstream dependents. Orchestrators such as Airflow or Dagster can invoke dbt commands and parse artifacts, but dbt itself does not schedule jobs in dbt Core.
Worked example
A pull request changes one staging model. The CI command is dbt build --select state:modified+ --defer --state ./prod-state. state:modified selects the changed model, and the trailing + adds downstream dependents. --defer lets unchanged upstream ref() calls point at production instead of rebuilding everything. The production manifest must exist and match the project structure; otherwise state comparison is meaningless or fails.
Traps that cost marks
dbt run does not execute tests; use dbt build for gated deployment. --defer without --state cannot resolve upstream relations. Committing profiles.yml exposes credentials. Comparing against a stale or missing manifest produces false selections. Running --full-refresh routinely in production defeats incremental design and increases cost. Setting threads too high can overload the warehouse rather than speed up the job.