Skip to content
Back to skills

Dbt Core

ASecurity

dbt Core skill for SQL-based data transformation in warehouses. Deep expertise in project structure, materializations (view, table, incremental, microbatch), Jinja templating, testing framework, macros, packages, MetricFlow, dbt Mesh, and CI/CD workflows. WHEN: \"dbt\", \"dbt Core\", \"dbt run\", \"dbt build\", \"dbt test\", \"ref()\", \"source()\", \"incremental model\", \"dbt macro\", \"dbt snapshot\", \"dbt seed\", \"Jinja SQL\", \"dbt materialization\", \"dbt package\", \"dbt_utils\", \"d...

  • 4 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 24, 2026
code-qualitygobashsqltestingdebugginggitapidatabaseci/cdsecurity

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 8 files and shows the line behind each finding

Scanned September 24, 2026

npx -y skills add chrishuffman5/domain-expert --skill dbt-core --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Dbt Core?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Dbt Core
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/chrishuffman5-dbt-core/badge)](https://www.skillsdirectory.com/skills/chrishuffman5-dbt-core)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: dbt-core
description: "dbt Core skill for SQL-based data transformation in warehouses. Deep expertise in project structure, materializations (view, table, incremental, microbatch), Jinja templating, testing framework, macros, packages, MetricFlow, dbt Mesh, and CI/CD workflows. WHEN: \"dbt\", \"dbt Core\", \"dbt run\", \"dbt build\", \"dbt test\", \"ref()\", \"source()\", \"incremental model\", \"dbt macro\", \"dbt snapshot\", \"dbt seed\", \"Jinja SQL\", \"dbt materialization\", \"dbt package\", \"dbt_utils\", \"dbt project\", \"profiles.yml\", \"dbt_project.yml\", \"dbt incremental\", \"dbt microbatch\", \"dbt Mesh\", \"MetricFlow\", \"dbt semantic layer\", \"model contract\", \"dbt unit test\", \"staging intermediate marts\", \"dbt CI\", \"state:modified\", \"dbt compile\", \"dbt debug\". Do NOT use for dbt Cloud-only surfaces (Cloud IDE/Studio, Canvas, Copilot, Cloud scheduling, Discovery/Admin API, RBAC/SSO) -- use the `dbt-cloud` skill."
license: MIT
---

# dbt Core

This skill covers dbt Core (data build tool), the open-source SQL transformation framework for the ELT pattern. It provides deep knowledge of project structure, materializations, Jinja2 templating, the testing framework, incremental strategies, macros, packages, MetricFlow, dbt Mesh, and CI/CD workflows. Coverage spans the current release (dbt Core 1.11) and recent major features (1.8-1.10). For dbt Cloud-specific features (IDE, scheduling, Canvas, Copilot, Explorer), see the `dbt-cloud` skill.

## When to Use This Skill
- "How do I structure a dbt project?"
- "Incremental model not merging correctly"
- "Write a Jinja macro for dynamic pivoting"
- "dbt test failures in CI"
- "Optimize a slow dbt model"
- "Set up dbt Mesh cross-project references"
- "Define a metric with MetricFlow"
- "Migrate from views to incremental models"
- "dbt snapshot SCD Type 2 setup"
- "dbt build vs dbt run + dbt test"
- "CI pipeline with state:modified"
- "Which incremental strategy for 500M rows?"

**See a different skill for:**
- dbt Cloud IDE, scheduling, Canvas, Copilot, Explorer --> `dbt-cloud` skill
- Spark DataFrame transformations --> `spark` skill
- Warehouse-specific tuning (Snowflake, BigQuery, Redshift) --> the database plugin's `{platform}` skill
- Comparing dbt vs Spark vs DuckDB --> `transformation` skill
- ETL architecture, tool selection --> `overview` skill

## How to Approach Tasks

1. **Classify** the request:
   - **Project structure/conventions** -- Load `references/best-practices.md` for staging/intermediate/marts, naming, code style
   - **Architecture/internals** -- Load `references/architecture.md` for execution model, materializations, Jinja, adapters, DAG
   - **Performance/debugging** -- Load `references/diagnostics.md` for error messages, compiled SQL, slow models, CI failures
   - **Best practices/patterns** -- Load `references/best-practices.md` for incrementals, testing, CI/CD, cost optimization
   - **dbt Cloud feature** -- See the `dbt-cloud` skill

2. **Determine context** -- Ask if unclear: which warehouse adapter (Snowflake, BigQuery, Redshift, Databricks, Postgres), dbt version, data volume, team size.

3. **Analyze** -- Apply dbt-specific reasoning: materialization choice, incremental strategy, ref/source dependency graph, Jinja compilation, test coverage.

4. **Recommend** -- Provide actionable guidance with SQL/YAML/Jinja examples, specific CLI commands, and config snippets. Explain trade-offs.

5. **Verify** -- Suggest validation: `dbt compile` for SQL inspection, `dbt debug` for connection, `dbt show` for preview, compiled SQL in `target/compiled/`.

## Core Architecture

### Execution Model

dbt transforms SQL SELECT statements into tables and views in the warehouse. It compiles Jinja-templated SQL, resolves dependencies via `ref()` and `source()`, builds a DAG, and executes models in topological order.

```
SQL + Jinja Models (.sql files)
    |
    v
Jinja Compilation (resolve ref/source/config/var/macros)
    |
    v
DAG Resolution (topological sort by ref/source dependencies)
    |
    v
Compiled SQL (target/compiled/)
    |
    v
DDL/DML Generation (CREATE TABLE AS, INSERT, MERGE)
    |
    v
Warehouse Execution (adapter sends SQL to database)
```

**Key concepts:**
- **ref()**: Declares a dependency on another model. `{{ ref('stg_orders') }}` resolves to the correct database.schema.table and registers a DAG edge.
- **source()**: Declares a dependency on a raw table. `{{ source('stripe', 'payments') }}` enables lineage tracking and freshness monitoring.
- **Materializations**: How dbt persists model output -- view, table, incremental, ephemeral, materialized view.
- **Jinja2**: Templating engine that adds control flow (if/for), macros, variables, and environment access to SQL.

### Project Structure

```
my_project/
 dbt_project.yml          # Project configuration
 profiles.yml             # Connection profiles (~/.dbt/ for security)
 packages.yml             # Package dependencies
 models/                  # SQL transformation models
   staging/               # Source-conformed cleaning (views)
   intermediate/          # Business logic (ephemeral/views)
   marts/                 # Business-ready output (tables/incremental)
 seeds/                   # CSV reference data
 snapshots/               # SCD Type 2 tracking
 tests/                   # Singular data tests
 macros/                  # Reusable Jinja functions
 functions/               # UDFs (1.11+)
 target/                  # Compiled output (gitignored)
 dbt_packages/            # Installed packages (gitignored)
```

### Materializations

| Type | Mechanism | Storage | Freshness | Best For |
|---|---|---|---|---|
| **view** (default) | `CREATE VIEW AS` | None | Always current | Staging models, lightweight transforms |
| **table** | `CREATE TABLE AS` | Full copy | On `dbt run` only | BI-facing marts, frequently queried |
| **incremental** | `INSERT`/`MERGE`/`DELETE+INSERT` | Full + appends | New/changed rows | Large event tables, time-series |
| **ephemeral** | Inlined as CTE | None | N/A (not queryable) | Lightweight intermediate logic |
| **materialized_view** | Database-native MV | Managed by DB | Database-managed | Auto-refresh needed |

**Golden rule**: Start with views. When they take too long to query, make them tables. When the tables take too long to build, make them incremental.

## Model Patterns

### Staging Model

```sql
-- models/staging/stripe/stg_stripe__payments.sql
with source as (
    select * from {{ source('stripe', 'payments') }}
),

renamed as (
    select
        id as payment_id,
        order_id,
        amount::numeric(16, 2) as amount,
        status,
        created_at
    from source
)

select * from renamed
```

### Incremental Model

```sql
-- models/marts/fct_events.sql
{{ config(
    materialized='incremental',
    incremental_strategy='merge',
    unique_key='event_id',
    on_schema_change='append_new_columns'
) }}

select
    event_id,
    user_id,
    event_type,
    event_timestamp,
    properties
from {{ ref('stg_events') }}
{% if is_incremental() %}
where event_timestamp > (
    select max(event_timestamp) - interval '2 hours'
    from {{ this }}
)
{% endif %}
```

### Microbatch Model (1.9+)

```sql
-- models/marts/fct_page_views.sql
{{ config(
    materialized='incremental',
    incremental_strategy='microbatch',
    event_time='viewed_at',
    begin='2023-01-01',
    batch_size='day',
    lookback=3
) }}

select * from {{ ref('stg_page_views') }}
```

No `is_incremental()` logic needed. Each batch is independent and idempotent. Parallel execution across batches. Selective backfill via `--event-time-start` and `--event-time-end`.

## Incremental Strategy Selection

| Scenario | Strategy | Why |
|---|---|---|
| Append-only event stream | `append` | No dedup needed, fastest |
| Small-medium table with unique key | `merge` | Standard upsert |
| Large table (>100M rows) with unique key | `delete+insert` | 3.4x faster than merge at scale |
| Date-partitioned data | `insert_overwrite` | Replace full partitions |
| Large time-series (>1B rows) | `microbatch` | Parallel batches, automatic late-data handling |

## Testing Framework

### Generic Tests (YAML)

```yaml
models:
  - name: fct_orders
    columns:
      - name: order_id
        data_tests:
          - unique
          - not_null
      - name: status
        data_tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'returned']
      - name: customer_id
        data_tests:
          - relationships:
              to: ref('dim_customers')
              field: customer_id
```

### Unit Tests (1.8+)

```yaml
unit_tests:
  - name: test_order_total
    model: fct_orders
    given:
      - input: ref('stg_orders')
        rows:
          - {order_id: 1, amount: 100, status: completed}
          - {order_id: 2, amount: 200, status: returned}
    expect:
      rows:
        - {order_id: 1, amount: 100, is_valid: true}
        - {order_id: 2, amount: 200, is_valid: false}
```

### What to Always Test

- Primary keys: `unique` + `not_null` on every model
- Foreign keys: `relationships` on join columns
- Critical business columns: `not_null` on required fields
- Source freshness: `freshness` config on all source tables

## CLI Quick Reference

| Command | Purpose |
|---|---|
| `dbt build` | Run + test + snapshot + seed in DAG order (preferred) |
| `dbt run` | Build models only |
| `dbt test` | Run data tests only |
| `dbt build --select state:modified+ --defer --state ./prod-artifacts/` | Slim CI |
| `dbt run --full-refresh --select my_model` | Force complete rebuild |
| `dbt compile` | Compile SQL without executing |
| `dbt debug` | Validate connection and configuration |
| `dbt show --select my_model --limit 10` | Preview query results |
| `dbt source freshness` | Check source data freshness |
| `dbt deps` | Install package dependencies |
| `dbt docs generate && dbt docs serve` | Generate and serve documentation |

## dbt Mesh (Multi-Project)

For scaling data teams across organizational boundaries:

- **Cross-project refs**: `{{ ref('upstream_project', 'shared_model') }}`
- **Access modifiers**: `private` (same group), `protected` (same project, default), `public` (any project)
- **Model contracts**: Enforce column names, types, and constraints at build time
- **Model versions**: Treat public models as APIs with versioning and deprecation dates

```yaml
models:
  - name: dim_customers
    access: public
    config:
      contract:
        enforced: true
    columns:
      - name: customer_id
        data_type: int
      - name: customer_name
        data_type: varchar(100)
```

## Anti-Patterns

1. **Skipping tests** -- dbt tests are zero-cost to define and catch data quality issues before they reach dashboards. At minimum: `unique` + `not_null` on every primary key.

2. **`source()` outside staging** -- Only staging models should reference `source()`. All other models use `ref()`. This enforces a single entry point from raw data.

3. **Complex logic in staging** -- Staging models should only rename, cast, and filter. Business logic belongs in intermediate or marts layers.

4. **`SELECT *` in production models** -- Pulling all columns wastes compute and breaks when source schemas change. Select explicitly.

5. **Skipping `--defer` in CI** -- Without `--defer`, CI must build the entire upstream DAG. Use `--defer --state ./prod-artifacts/` to reference production tables for unmodified models.

6. **Tables for staging** -- Staging models should be views. Tables waste storage and add build time for models that are simple passthrough transforms.

7. **Ignoring incremental for large tables** -- Full table rebuilds on 100M+ row tables burn compute. Switch to incremental with an appropriate strategy.

8. **Over-abstracting with macros** -- Macros should simplify, not obscure. If a macro requires more than a few parameters and conditional blocks, the SQL is likely clearer written directly.

## Key Packages

| Package | Purpose |
|---|---|
| **dbt-utils** | Surrogate keys, pivot, union, date spine, generic tests |
| **dbt-expectations** | 40+ data quality tests (Great Expectations-inspired) |
| **codegen** | Auto-generate base models, YAML schema files, sources |
| **audit-helper** | Compare datasets for migration validation |
| **dbt-project-evaluator** | Lint project structure against best practices |

## Cross-Domain References

| Technology | Reference | When |
|---|---|---|
| dbt Cloud | `dbt-cloud` skill | IDE, scheduling, Canvas, Copilot, Explorer, Semantic Layer API |
| Spark | `spark` skill | When transformations exceed SQL (ML, complex parsing, >TB scale) |
| Transformation | `transformation` skill | Comparing dbt vs Spark vs DuckDB |
| ETL Domain | `overview` skill | Cross-platform ETL architecture |

## Reference Files

Load these when you need deep knowledge for a specific area:

- `references/architecture.md` -- Execution model (DAG, ref/source, compilation), materializations, Jinja templating (syntax, macros, key functions), adapters (official and community), testing framework (generic, singular, unit), documentation system, packages, dbt Mesh, MetricFlow/Semantic Layer, incremental strategies, snapshots
- `references/best-practices.md` -- Project structure (staging/intermediate/marts), naming conventions, incremental model selection, testing strategy, performance optimization (partitioning, clustering, query tips), CI/CD workflows (Slim CI, state:modified, --defer), code style guide (SQL formatting, CTE organization, Jinja patterns)
- `references/diagnostics.md` -- Error categories (runtime, compilation, dependency, database), common errors and solutions, debugging tools (dbt debug, compiled SQL, logs, artifacts), performance diagnostics (slow models, full refresh triggers, warehouse tuning), CI/CD diagnostics (state comparison, environment issues, pipeline failures)

## Diagnostic Scripts

Ready-made artifact-inspection scripts (bash + jq over `target/*.json`) in `scripts/`, numbered by investigation order. All read-only.

- `scripts/01-run-results-summary.sh` -- Last invocation: status mix, errors/failures, slowest models
- `scripts/02-model-timing.sh` -- All models ranked by execution time (incremental-strategy review list)
- `scripts/03-test-failures.sh` -- Failed and warning data-quality tests with violating row counts
- `scripts/04-manifest-governance-audit.sh` -- Models missing tests or descriptions (governance gaps)

Files in this skill

  • SKILL.md14.2 KB
  • references/architecture.md10.4 KB
  • references/best-practices.md10.9 KB
  • references/diagnostics.md12 KB
  • scripts/01-run-results-summary.sh1.5 KB
  • scripts/02-model-timing.sh1.2 KB
  • scripts/03-test-failures.sh1.3 KB
  • scripts/04-manifest-governance-audit.sh1.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…