dbt Core changelog
All notable changes to this project will be documented in this file.
- This file covers dbt Core v2.0. For changelogs for other dbt Engines, refer to:
- Changes are listed under the (pre)release in which they first appear. Subsequent releases include changes from previous releases.
- "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version.
- Do not edit this file directly. This file is auto-generated using changie. For details on how to document a change, see the contributing guide.
2.0.0-alpha.5
Released July 20, 2026
Features
- Migrate Redshift catalog macros to SHOW TABLES and SVV_REDSHIFT_COLUMNS when datasharing is enabled, so catalog generation works for cross-database relation
- Adds
defer_job_id support via DBT_CLOUD_DEFER_JOB_ID env var. When set alongside defer_env_id, appends ?job_id= to the manifest download URL for job-specific deferral.
- Add catalog_database support to v2 catalogs.yml: when set, catalog_database takes highest priority in generate_database_name over model database config and target.database. Uses the existing build_catalog_relation pattern — no new adapter method. Supported for Snowflake (all types), BigQuery (biglake_metastore), and Databricks (unity, optional, falls back to catalog_name).
- Fire telemetry event on static analysis propagation completion
- Add POST /api/v1/analytics/events relay endpoint (docs v2 → Vortex)
- docs analytics: add distribution field and hydrate server-authoritative fields (distribution, dbt_version, is_logged_in, dbt Cloud IDs) on POST /api/v1/analytics/events
Fixes
- Populate defer_relation on graph.nodes entries (models, snapshots, seeds) so node.defer_relation works in Jinja, matching dbt-core
- Correct defer_relation wire shape on graph.nodes to match dbt-core's DeferRelation dataclass (drop unique_id, add description/compiled_code/meta/tags/config)
- Prevent panic when calling
insert() on a mutable list with an out-of-bounds index; return a proper template error instead. This was the primary panic causing cascading lock poisoned panics in minijinja's MutableVec.
- Parse-time
config.get(name) now matches dbt-core's ParseConfigObject.get (core/dbt/context/providers.py:554) by returning "" for every key except meta. The meta key keeps a permissive chainable stub (ParseConfigValue) so dbt-autofix's recommended config.get('meta').custom_key migration pattern (see dbt-autofix/manual_fixes/custom_configuration.md) keeps working during Fusion's static-analysis compile of materialization bodies. Separately, adapter.get_relation now coerces None/Undefined args to "" at the strict &str unwrap so the compile-phase CompileConfig.get('database') → None path (mirroring Python's RuntimeConfigObject.get) flows through without crashing the prefetch-recording call. Together this unblocks the Anisi customer project (account 303 / project 3580) whose snowflake_external_table materialization in dbt_external_tables calls adapter.get_relation(database=config.get('database'), ...). Broader audit of where the same None-tolerance coercion belongs across other adapter methods is a follow-up dbt-core ↔ dbt-fusion parity investigation.
- Add +resource_tags config support for seeds and snapshots in dbt_project.yml
- stop using schema cache (prefetch at parse time) for adapter.get_columns_in_relation if it's using in a selected node without using strict static analysis.
- Resolve event_time from seed and snapshot inputs for microbatch models (matches core v1)
- dbt State view reuse during full-refresh runs
- Generic test nodes with long names no longer have empty depends_on.macros in the manifest
- Spark: fix schema existence and listing on the Hive metastore.
check_schema_exists now resolves via show databases instead of the nonexistent information_schema.schemata (fixing snapshots and other guard-then-create paths), and list_schemas reads the show databases result column name-agnostically (namespace on OSS Spark, databaseName on Databricks). Databricks behavior is unchanged.
- Implement symbolic linter
- Replace panic with a user-facing error when an exposure depends_on entry does not resolve to a ref(), source(), or metric() call
- Improve the Snowflake dbt State metadata error when database or schema is empty.
- model.original_file_path now resolves to the correct path in Jinja macro context during parse phase instead of returning '.'.
- persist_docs: warn about and skip columns documented in YAML that are not present in the database, instead of failing the model build or silently mis-applying column comments (ports dbt-labs/dbt-adapters#1690)
- Stop /api/v1/health from leaking the absolute index_dir path; replace with project_loaded + generation (snapshot timestamp) and an X-Docs-Generation header
- Reduce dbt State auth token request timeout to 15 seconds and retry transient auth service failures.
- Add graceful shutdown/drain to dbt docs server so rollout restarts don't reset in-flight readers
- Implement
normalize() on pytz timezone objects so unit-test fixtures using modules.pytz.timezone(...).normalize(...) parse instead of failing with an opaque dbt1013 deserialization error
- Treat an empty or zero-byte selectors.yml as no selector definitions, matching dbt Core behavior instead of raising SelectorError dbt1600
- Analysis nodes now have compiled, compiled_code, and compiled_path populated in the manifest after dbt compile
- state:modified no longer flags models whose persist_docs config is set as environment-aware Jinja.
- Include YAML-supplied generic test config in manifest raw_code.
- Restore the Snowflake warehouse using its canonical upper-cased name (matching dbt Core's
current_warehouse()-based restore), so per-model snowflake_warehouse overrides no longer cause record/replay SQL mismatches
- Snapshots no longer appear in their own depends_on.macros; fixed by skipping self-referential macro dep recording in the DAG listener
- LSP fix deferral for show (preview CTE) and compile file (#14542)
- Match Python re.sub behavior for empty regex matches in dbt Jinja modules.re.
- Bump Snowflake Driver to 0.21.14 to fix Timestamp Freshness
- BigQuery: treat 403 access-control failures (missing bigquery.datasets.create IAM permission or VPC Service Controls policy violations) as ignorable permission errors during schema creation, matching dbt-core; runs against centrally-provisioned datasets in governed/VPC-SC environments no longer fail on the eager CREATE SCHEMA step
- BigQuery unit tests: fixture values that are SQL expressions for STRUCT or GEOGRAPHY columns (e.g. STRUCT(...), ST_GEOGPOINT(...)) are now injected verbatim instead of being single-quoted as string literals, so BigQuery can CAST them to the target type; matches dbt-core
- Bump pyo3 workspace dependency from 0.27 to 0.29 to support Python 3.15 in CI runner images
- Fix a client-cancellation panic in the Snowflake ADBC driver on long-running queries.
- Resolve project flags case-insensitively in the Jinja flags context so a flag set in dbt_project.yml is reachable whether a macro reads it lower-case or upper-case, matching dbt Core
- Fix
show --inline broken when root package is disabled
- Redshift POSIX regex-negation operators
!~ and !~* no longer raise a false-positive dbt0101 SyntaxInvalid diagnostic (#15249)
- Report cached dbt State data tests attached to unchanged views as no-change reuse.
- Stop raising a false
dbt1159 "Test cannot have the same key '' at the top-level and in config" when a data test has a top-level config key (e.g. where) and a config: block that does not set that key
- state:modified no longer flags data tests whose schema.yml config uses environment-aware Jinja (where/severity/tags/meta), and now correctly detects genuine changes to a test's where/limit/severity: data tests join the wholesale unrendered_config comparison (dbt-core#15286).
- Remove synthetic materialization macro call coordinates from runtime error locations.
- Filter synthetic snapshot macro uids (snapshot..snapshot_) from depends_on.macros in snapshot nodes; these Fusion-internal uids never appear in manifest.macros and caused a dangling reference.
- Fix unit tests on Redshift failing with an internal error (SQLSTATE XX000) when the tested model uses QUALIFY
- state:modified no longer flags seeds or snapshots whose config uses environment-aware Jinja (e.g. persist_docs, quote_columns, grants, meta), and now correctly detects genuine changes to a snapshot's meta while no longer over-selecting snapshot group-only changes: seeds and snapshots join the wholesale unrendered_config comparison (dbt-core#15286).
- Allow default generic tests to aggregate and render task-time aggregation SQL
- Prevent dbt State metadata MapReduce from stalling behind a speculative connection attempt after worker results are ready.
- Normalized back-slashes to forward-slashes for path, original_file_path and patch_path
- state:modified — retire the per-key unrendered config grafts for models and sources
- Support meta_get on Jinja map values that represent dbt node configs.
- Support context-backed Jinja map caches that use get and update.
- state:modified for data tests now follow dbt-core
TestConfig key allowlist
- Report an accurate, path-normalized error when a local: package cannot be resolved: distinguish a missing package directory ("Package directory not found") from a directory that lacks a dbt_project.yml, resolve
.. segments in the reported path, and add dbt Core-style guidance
- Tolerate a partially-migrated package-lock.yml that mixes the name/no-name entry forms: the deprecated lock parser now accepts (and ignores) a
name key instead of failing the build with UnusedConfigKey (dbt1060) errors, matching dbt Core
- Expose
model.path relative to the resource root (e.g. staging/orders.sql) in both the config() block and the model body, matching dbt-core; previously it was empty inside config() and carried the models/ prefix in the body
- Fix microbatch lookback off-by-one so a lookback of N produces N+1 batches (current batch plus N previous), matching dbt-core and the microbatch docs (#15477)
- dbt retry now preserves --full-refresh from the original run, so incremental models retried after a failed full-refresh build use full-refresh (drop + recreate) semantics instead of incremental merge semantics
- Hide the internal --write-metadata flag in favor of --write-index, fix 'dbt parse --write-index' to generate the index instead of failing with a save_artifact_meta IO error, and make the dbt-index warnings reference --write-index and respect warn_error_options
- Reduce BigQuery dbt State freshness fanout by using schema-level metadata refreshes for non-override submit-time misses.
- Quote grantees when revoking grants, so revoking a grant whose name contains special characters no longer fails with a syntax error.
- Jinja parser now accepts keyword-argument names spelled like literal keywords (none, true, false), e.g. namespace(gold=0, unknown=0, none=0), matching dbt Core. Previously these raised MacroSyntaxInvalid (dbt1502): non-keyword arg after keyword arg.
- Support non-ASCII Jinja macro names in Fusion parsing.
- Ensure data tests submit zero freshness tolerance to dbt State.
- Translate legacy BigQuery seed
+column_types aliases (e.g. float, integer, text) to their canonical types (FLOAT64/INT64/STRING) instead of failing with 'Invalid column description', matching dbt Core
- Allow dbt State submissions to include upstream dependencies whose last modified timestamp could not be resolved, instead of bypassing state for the model.
- Bump BigQuery ADBC driver to 0.21.0.dev+dbt0.21.13, wiring HTTPS_PROXY/NO_PROXY support into the OAuth token-exchange transport
Under the Hood
- Serialize config for macros for manifest parity with core
- remove unused calculate_freshness_from_metadata_batch method
- Add live Snowflake ADBC client cancellation regression test
- Generic and column data tests now include their schema.yml config (where, severity, limit, tags, meta, ...) in unrendered_config, matching models/seeds/snapshots. Preparatory for correct state:modified comparison of data tests.
- Add ClickHouse to the list of non experimental adapters.
- Publish pre-release versions to Homebrew and winget during the pre-stable window, and fix the empty-version bug in the release-v2 publish jobs.
- Add clickhouse-0.1.0 ADBC driver to CDN checksums
Security
- Remove unused ad-hoc SQL query endpoints (POST /api/v1/query, GET /api/v1/tables) from dbt docs server
Contributors
2.0.0-alpha.4
Released July 06, 2026
Features
- [dbt-fusion] DuckDB: read-write Horizon and Unity (Iceberg REST) catalogs via duckdb 1.5.4 / duckdb-iceberg#1017 write-compat ATTACH options (stage_create_tables, disable_multi_table_commit, etc.). Upgrades the read-only support from the base PR.
- [dbt-fusion] DuckDB catalogs.yml v2: DuckLake, Iceberg REST, and local filesystem catalogs with catalog-aware materializations, plus read-only Horizon and Unity attachments (writes land with duckdb 1.5.4, #10950)
- [dbt-fusion] [Redshift] Switch the database context per node via
USE / RESET USE when datasharing is enabled and the node targets a non-default database
- [dbt-fusion] dbt-agent: add guidance for surrogate key dbt_project.yml vars, incremental full-refresh after logic changes, staging enrichment LEFT JOIN, fct-to-dim LEFT JOIN, pre-computed age field warning, and cumulative standings MAX vs ROW_NUMBER
- [dbt-fusion] dbt-agent: add guidance for propagating source column type changes (INT→VARCHAR) to all downstream models
- [dbt-fusion] dbt-agent: add guidance for staging column inference vs source reuse, missing-column add-not-remove, enumerate-all-affected-models, time-bounded seed+JOIN pattern, mandatory full-refresh after surrogate_key rename
- [dbt-fusion] dbt-agent: mandatory --full-refresh after surrogate_key rename prominently in surrogate_key.md
- [dbt-fusion] Extract dbt-agent into dedicated crate with prompts, runner, integration tests, and benchmark scripts
- [fusion] Add GET /api/v1/identity endpoint to dbt-docs-server
- [fusion] Bump bundled dbt-docs-v2 UI to 862e5855aaa42463d3b5c34f4b53622ca32721fb
- [fusion] Add compiled code toggle to the Code tab and consolidate exposure metadata fields into the unified Metadata section
- [fusion] Show row count stat in the model list view
Fixes
- [dbt-fusion] BigQuery: qualify schema name with target project in create_schema and drop_schema so datasets are created in the correct project when execution_project differs from database
- [dbt-fusion] (dbt-auth) SparkConnect auth profiles have clear internal representaiton. To the user view, no "user" is required (but may be provided). An ambient authentication mode which entrusts connections to the networking layer et. al is added."
- [dbt-fusion] Accept comma-separated ref()/source() calls within a single depends_on list item and tolerate a trailing } after a Jinja expression in descriptions, matching dbt-core leniency.
- [dbt-fusion] dbt agent build: surface YAML parse errors via OTEL probe; fix panic on wrapped-negative line numbers in context_snippet; use --write-metadata instead of --write-index
- [dbt-fusion] Fix Databricks incremental run SQL error when using custom PK constraints: correctly expose constraint attributes (type, name, render) to Jinja templates and normalize custom PK expressions for stable incremental diffs
- [fusion] Fix panic when a query result contains a map with non-scalar (struct) values, e.g. map<string,struct<...>>. dbt-agate now has a StructConverter so struct columns render as dicts instead of failing an unsupported Struct->Utf8 cast.
- [fusion] Fix unique_id parity with dbt-core for singular and schema tests
- [fusion] Fix ambiguous ref panic for cross-project publication models when used as v2 parser
- [fusion] Fix operation nodes missing alias, database, schema, tags, config, and index in manifest
- [dbt-core] Fix macro original_file_path prefixed with dbt_packages/ instead of being package-relative (#11381)
- [dbt-core] state:modified no longer flags seeds whose meta config is set as environment-aware Jinja in dbt_project.yml. (#15286)
- [dbt-core] state:modified no longer flags snapshots whose target_schema, target_database, or alias configs are set as environment-aware Jinja in dbt_project.yml. (#15286)
- [fusion] Fix explorer breadcrumbs, layout, and filter view behavior; hide analyses everywhere when the hasAnalysis feature flag is off
- [fusion] Read has_dbt_state from the capabilities API instead of hardcoding false; hide the dbt State upsell for projects that already have dbt state enabled
- [fusion] When warn_error_options upgrades a Jinja exceptions.warn() call to an error, the node message in run_results.json now shows a clean Compilation Error with the warning text, matching dbt-core behavior
- [dbt-index] Redshift warehouse tools now accept 'dbname' field in profiles.yml (standard dbt-redshift field name)
- [fusion] Use unrendered configs to flag changes for models and sources in state:modified selector
- [dbt-core] state:modified no longer flags snapshots whose dbt_valid_to_current config is set as environment-aware Jinja in dbt_project.yml. (#15286)
- [fusion] Fix dbt State evaluate_volatile_sql config semantics so true evaluates volatile SQL and false allows reuse.
- [dbt-core] Include the snapshot filename in the snapshot fqn to match dbt-core, fixing false-positive state:modified results when dbt-core compares against a Fusion-generated manifest (#15286)
- [dbt-index] Fix dbt-index regressions: CLL parquet not produced on baseline→strict static-analysis transition
- [internal] route tests to manifest.disabled when both parent model and test are explicitly disabled
- [fusion] Hide the
completions subcommand from dbt help output
- [dbt-core] state:modified no longer flags data tests whose tags or meta configs are set as environment-aware Jinja in dbt_project.yml. (#15286)
- [fusion] Use redshift_database_name when checking Redshift SVV_EXTERNAL_TABLES.
Under the Hood
- [fusion] Resolve send_anonymous_usage_stats for docs serve with precedence --no-send-anonymous-usage-stats > DBT_SEND_ANONYMOUS_USAGE_STATS env > dbt_project.yml flags block > default true, and wire it into analytics_enabled on GET /api/v1/identity
- [fusion] Migrate dbt-docs-v2 data layer from hand-rolled fetch hooks to TanStack Query
- [fusion] Consolidate nine near-identical FilterView components into a shared GenericFilterView adapter, removing ~1100 lines of duplication
- [fusion] Implement array_except as a native DuckDB extension function (sf_array_except) instead of a SQL macro
Contributors
2.0.0-alpha.3
Released June 29, 2026
Features
- [dbt-fusion] Sqlfluff parity
- [dbt-fusion] For versioned models, automatically create a view at the unsuffixed model name (e.g.
dim_customers) pointing to the latest version (e.g. dim_customers_v2). Enabled by default; disable per-model with latest_version_pointer: {enabled: false} or globally with the project flag latest_version_pointer_enabled_by_default: false. Customize the pointer alias via the latest_version_pointer.alias config or by overriding the generate_latest_version_pointer_alias macro.
- [dbt-fusion] Redshift: use SHOW GRANTS ON TABLE for grants when datasharing is enabled
- [dbt-fusion] Make the maximum seed size hashed for state:modified comparison configurable via --maximum-seed-size-mib, the DBT_MAXIMUM_SEED_SIZE_MIB (or DBT_ENGINE_MAXIMUM_SEED_SIZE_MIB) env var, and dbt_project.yml flags (default 1 MiB; 0 disables the limit). Seed contents are now hashed incrementally with line-ending normalization, plus a Windows legacy-checksum fallback for state comparison.
- [dbt-extension] Signing in from the extension now uses the dbt login command.
- [dbt-fusion] Support catalog federation between Snowflake Horizon and Unity Catalog
- [dbt-fusion] Added support for Javascript UDFs in Snowflake and BigQuery
- [dbt-fusion] Setup catalogs.yml to provide json schemas.
- [dbt-fusion] Add
dbt man --schema catalogs to export a type-discriminated JSON schema for catalogs.yml v2
- [dbt-fusion] Issue compatibility warnings for package versions based on manual compatibility verification when available in Package Hub
- [dbt-fusion] Support the insert_overwrite incremental strategy for the Spark adapter
- [dbt-fusion] Classification
- [dbt-fusion] Honor per-node
+compute config on unit_test nodes, allowing a unit_test to override the global --compute flag (e.g. +compute: sidecar under global --compute remote).
- [dbt-fusion] Support the
reservation config for BigQuery, allowing query jobs to be routed to a specific BigQuery reservation at the profile, project (+reservation), or model ({{ config(reservation=...) }}) level.
- [dbt-fusion] Allow the source application identifier sent during OAuth login to be configured via AuthChainBuilder or the DBT_OAUTH_SOURCE_APP environment variable
- [dbt-fusion] Expose has_dbt_state on GET /api/v1/capabilities
- [dbt-core] support the latest duckdb version 1.5.4 (#15279)
Fixes
- [dbt-fusion] BigQuery source freshness now correctly handles dotted project IDs (e.g. mycompany.io) by using relation component accessors instead of splitting the FQN on '.'. Also fixes a secondary bug where each per-dataset query included a redundant table_id IN (...) filter built from relations in unrelated datasets.
- [dbt-fusion] (fix redshift) always quote materialized view path
- [dbt-fusion] --write-index no longer produces catalog.json (was unintended side effect of #10750; pass --write-index --write-catalog to restore). --write-metadata alone no longer queries the warehouse. Catalog data is now fetched at most once per invocation and shared across all consumers.
- [dbt-fusion] Discover source() calls inside conditional branches that evaluate to false during the parse render.
- [dbt-fusion] Fix field-level manifest conformance gaps for metrics and semantic_models: metric label falls back to name at resolve time (matching dbt-core); semantic model entity description defaults to empty string and entity config defaults to {meta: {}} when unset. Fields where Fusion emits richer values than dbt-core (tags, meta, unrendered_config) are left as-is — these are improvements, not bugs.
- [dbt-fusion] Databricks: under catalogs v2, use CREATE OR REPLACE TABLE for managed Iceberg tables (table_format: iceberg) regardless of file_format, instead of plain CREATE TABLE
- [dbt-fusion] Support incremental materializations on the Spark adapter (append strategy)
- [dbt-fusion] Surface cached data test failures in dbt State builds
- [dbt-fusion] LSP fix code lens when static analysis off
- [dbt-fusion] Report dbt State-reused data tests as reused in dbt test output
- [dbt-fusion] sidecar: empty-string CAST to NULL, *_from_parts zero-tuple to NULL, unknown format string to NULL, timestamp_ltz_from_parts bridges
- [dbt-fusion] Snapshot nodes now correctly serialize config.materialized as snapshot instead of table in the manifest
- [dbt-fusion] ISO date format support for microbatch dates.
- [dbt-fusion] Accept dbt-core-style type annotations on macro arguments (e.g.
param: str)
- [dbt-fusion] Singular tests whose ref() or source() calls target a node that doesn't exist in the project are now excluded from the schedule (NodeNotFoundOrDisabled warning at parse time, no execution), matching dbt-core behavior. Previously Fusion scheduled and executed those tests, hitting a dbt1501 render error.
- [dbt-fusion] Accept dotted snapshot block names (e.g.
{% snapshot snp.sql %}) by stopping at the first dot, matching dbt-core behavior
- [dbt-fusion] Support comma-separated expression lists in Jinja
do blocks (e.g. {%- do a.append(x), b.append(y) -%})
- [dbt-fusion] fix standardize_grants_dict crash when show_grants returns 0 rows (Redshift, Snowflake, Databricks)
- [dbt-fusion] Support Jinja2 filter postfix attribute access (e.g.
rows|first.col) in minijinja parser
- [dbt-fusion] Spark: correctly classify existing relations as views so view models drop with DROP VIEW instead of DROP TABLE
- [dbt-fusion] Promote SA to strict for unit tests with overridden compute, allow unit test nodes to access LP if compute is sidecar.
- [dbt-fusion] Test nodes on disabled models are now emitted into manifest.disabled instead of being silently dropped
- [dbt-fusion] Give each microbatch batch its own statement-result registry so concurrent_batches=true models no longer fail with "The 'statement' result named '' has already been loaded into a variable"
- [dbt-fusion] Unit tests on models that call dbt UDFs via function() no longer fail with a spurious JinjaError (dbt1501); the tested model's function dependencies are now allowed during unit test rendering
- [dbt-fusion] finally and consciously decouple the DuckDB adapter from it's weird cousin Extended
- [dbt-fusion] Fix BigQuery get_relation crash during replay when the INFORMATION_SCHEMA.SCHEMATA location query returns an empty (zero-column) batch; get_dataset_location now returns no location instead of erroring.
- [dbt-fusion] Map Spark EXTERNAL/MANAGED relation types to table so DROP renders a valid
drop table instead of an invalid drop external. Spark 4 reports managed Hive tables as EXTERNAL (TRANSLATED_TO_EXTERNAL), which broke --full-refresh over Thrift
- [dbt-fusion] Prevent
dbt system uninstall from removing a binary owned by Homebrew, pip, or winget; surface the package manager's uninstall command instead
- [dbt-fusion] preserve legacy seed checksum compatibility
- [dbt-fusion] Ensure that persisted_docs configs for seeds are deserialized to the manifest.
- [dbt-fusion] Add support for databricks configs view_update_via_alter, incremental_apply_config_changes, and use_safer_relation_operations
- [dbt-fusion] Fix dbt State support for custom materializations
- [dbt-fusion] Fix manifest emission of null for adapter-specific config fields (sources: external_location, formatter, sync, schema_origin; models: compute, sync, and other adapter extras) — these are now omitted when unset, matching dbt-core behavior
- [dbt-fusion] dbt docs serve now emits a clear error when target/index is missing instead of silently exiting with code 1
- [dbt-fusion] Log when commands auto-install dependencies without an existing package-lock.yml.
- [dbt-fusion] Fix wizard subagents hanging indefinitely due to deadlocked event forwarding, unbounded wait_agent retries, and DuckDB checkpoint race
- [fusion] (dbt-adapter): all ambiguous to_rfc3339 calls are mapped to microsecond precision for Bigquery. Unblocks bigquery microbatch use cases.
- [fusion] Support lag_tolerance seconds period
- [dbt-core] state:modified no longer flags environment-aware warehouse-specific configs (e.g. copy_grants) set as Jinja in dbt_project.yml. (#15263)
- [fusion] Fix cached dbt State warning tests
- [fusion] Per-version access field on versioned models is now respected
- [fusion] ref() version pins now preserve original type (int/float/string) in manifest refs
- [dbt-core] state:modified no longer flags environment-aware grants configs set as Jinja in dbt_project.yml (e.g. grants driven by target.name). The unrendered grants config is compared instead of the target-rendered values. Affects seeds in particular. (#15302)
- [fusion] Allow tests attached to disabled models to preserve manifest metadata without failing on legacy generic test argument syntax.
- [dbt-core] Fix state:modified to no longer flag seeds whose column_types config is set as environment-aware Jinja in dbt_project.yml. (#15286)
- [dbt-core] state:modified no longer flags seeds whose quote_columns config is set as environment-aware Jinja in dbt_project.yml. (#15286)
- [dbt-core] Report CV10 quoted literal style violations with their own rule identity instead of CV11 casting style. (#15328)
- [fusion] Yaml: fix quoted string values parsed as numbers
Under the Hood
- [dbt-index] grain_declared falls back to primary_key inferred during parse when no compile data is present
- [dbt-fusion] Added snowflake config in UDF configs
- [dbt-fusion] Add a catalog-free untyped BigQuery binder (bigquery-untyped dialect) for column lineage, producing the same LP shape and column names as the typed binder
- [dbt-fusion] Match Fusion manifest serialization for exposures with Core for manifest parity
- [dbt-fusion] Reuse the Bigquery grammar and binder for BigqueryUntyped column lineage, removing the duplicate parser, lexer, and grammar."
- [dbt-fusion] Emit a Vortex Login event on dbt login with success/failure, login type, user cookie, project ID, and platform identity fields from the JWT.
- [dbt-fusion] Removed DataFusion-backed task execution
- [dbt-fusion] Fix implementation of legacy
valid_snapshot_target
- [dbt-fusion] Add unit tests for Spark incremental materializations
- [dbt-fusion] Group CommonArgs flags into labeled help sections (Project, Selection, Execution, Logging, Artifacts, Event Time) and add a Sample heading to the node-selection commands so per-subcommand
--help shows a focused summary
- [dbt-fusion] Upgrade Rust toolchain to 1.96
- [dbt-fusion] Errors and logs now show phase accurate paths for analyses, funcs, seeds and sources
- [dbt-fusion] Errors and logs now report phase accurate paths for exposures, macros, hooks, and metrics
- [dbt-fusion] Add
manage_state to invocation telemetry to track dbt State management (auto-deferral) enablement
- [internal] Allows the source application used in analytics to be specified when creating an interactive
AuthChain or an OAuthInteractiveResolver directly.
- [internal] Bump up the duckdb driver checksums
- [internal] Add anonymous IDs to dbt Wizard error telemetry.
- [dbt-fusion] Update driver
- [dbt-fusion] Improve salesforce adapter jinja
- [fusion] Add registry-backed JSON deserialization support for dbt-tracing telemetry records.
- [internal] dbt-ci:
pypi publish --download-base-url <url> --target <triple>... builds the download-at-install sdist (downloads the release wheels, hashes the live bytes, assembles the sdist) and publishes it (filetype=sdist) to PyPI
- [fusion] Bump Databricks
- [fusion] Fix subtraction underflow panic in partial-parse when operations have invalid spans after JSON deserialization
- [internal] Bump the extended DuckDB driver
Contributors
2.0.0-alpha.2
Released June 18, 2026
Features
- [dbt-fusion] Added --empty support in seed command.
- [dbt-fusion] Homebrew distribution: install the dbt Fusion CLI with
brew install dbt from the official tap.
- [dbt-fusion] GET /api/v1/models: add catalog field (row_count_stat, bytes_stat, last_modified_stat from warehouse INFORMATION_SCHEMA) and materialized field; dbt build --write-index now queries warehouse catalog stats and writes them to the parquet index
- [dbt-fusion] Detect how dbt was installed (Homebrew, pip, winget, or the standalone installer) and surface the matching upgrade command;
dbt system update now refuses to overwrite a binary managed by a package manager unless --force is passed.
- [dbt-fusion] Redshift: use SHOW TABLES FROM SCHEMA for cross-database source freshness when datasharing is enabled
- [dbt-fusion] Emit project-wide catalogs count on the parse-time ResourceCounts telemetry event
- [dbt-fusion] (fabric) supports dbt init
- [dbt-fusion] Interactive dbt login honors the DBT_OAUTH_SCOPES env var to request additional OAuth scopes.
- [dbt-fusion] dbt docs serve reports actual login status in GET /api/v1/distribution
- [dbt-fusion] Add Workload Identity Federation auth for BigQuery via Microsoft Entra
- [internal] Add daily conformance-analysis collection: scheduled GHA collects the previous UTC day and uploads per-day error-lines parquet to S3; new
cargo conformance fetch/push sync the bucket and collect --start/--end + log-overlap --days N enable multi-day analysis
- [internal] Add
cargo conformance report: a self-contained static HTML UI for an log-overlap run — templates ranked by impact, the concrete strings filling each drain3 <*> wildcard, and drill-down into the original log lines