dbt v1.13.0b1
dbt-core 1.13.0-b1 introduces state management bundling, v2 parser delegation, user login commands, OpenTelemetry instrumentation, and numerous bug fixes including improvements to partial parsing, selector resolution, and plugin compatibility.
dbt-core 1.13.0-b1 - October 14, 2026
Breaking Changes
- Flags introduced in 1.9 and 1.10 defaults to true (#12713)
Features
- Make MAXIMUM_SEED_SIZE_MIB configurable (#7117, #7124)
- Bundle the dbt-state plugin (>=2.18,<3.0) as an install dependency of dbt-core. The plugin is opt-in: PluginManager skips auto-discovery unless the user passes
--manage-stateon the CLI, sets DBT_ENGINE_MANAGE_STATE=true, or sets manage_state to true in the flags block of dbt_project.yml (equivalently in the config block of profiles.yml). Discovery filters disabled modules before importlib.import_module is called, so the default opt-in-off state incurs no import cost. (#13014) - Add
--use-v2-parserto delegate parsing to the fusion parser, load itsmanifest.jsoninto a runtime Manifest, and bypass dbt-core's parser. Configurable via--v2-parser/DBT_ENGINE_V2_PARSER(defaults todbt-core-experimental-parser parse) or theflags:section ofdbt_project.yml. (#13029) - Add support for user settings with flags reading writing (#13031)
- Add dbt login command (#13032)
- Tolerate dbt Fusion-specific warn_error_options names instead of erroring, emitting a note that they are ignored because they are specific to the dbt Fusion engine (#12885)
- Emit anonymous usage telemetry when state management is enabled via the --manage-state flag, DBT_ENGINE_MANAGE_STATE env var, or manage_state project config, including which surface supplied the opt-in (#15222)
- Add catalog_database field to CatalogWriteIntegrationConfig (v1) so catalogs.yml can set a database-name override for any catalog type; works in conjunction with the dbt-adapters get_catalog_database_override method to give catalog_database highest priority in generate_database_name (#15156)
- Add OpenTelemetry span instrumentation for node and hook execution, gated behind the --snowflake-projects-otel flag (off by default) (#11367)
- Add hints for cli users based on dbt usage (#15510)
- Warn users if they are using a deprecated dbt version (#15964)
- Add otel_trace_id() and otel_span_id() Jinja functions to correlate query comments and model SQL with OpenTelemetry trace/span ids (#)
- Announce dbt v2 availability as an INFO message on
dbt --version, with a link to the v2 install docs (#)
Fixes
- Reconstruct unrendered config kwarg values as readable expressions instead of raw AST repr (#15336)
- Fix partial parsing raising a duplicate-metric CompilationError after a v2 inline model entry (semantic_model: true) is modified. Non-simple metrics (cumulative, derived, ratio, conversion) stored in schema_file.metrics were not cleaned up by _delete_v2_semantic_model_for_model, leaving stale unique_ids that triggered a false duplicate on the next parse. (#13004)
- Fix deferred function references to use alias instead of bare name (#12895)
- Cap the Python recursion limit while resolving the
selector:method so a circular selector dependency raises a clean DbtRecursionError instead of crashing the process. The previous code relied on Python's default recursion limit (1000) tripping before the OS thread stack overflowed, but on platforms with smaller default stacks (notably Windows, ~1 MB vs ~8 MB on Linux/macOS) the margin can disappear once instrumentation (e.g. coverage) or stack-heavy plugins join the call chain. Lower the limit locally (restored in finally) so the catchable RecursionError fires first on every platform. (#13014) - Honor
--manage-statewhen DBT_ENGINE_MANAGE_STATE is set to false. The bundled dbt-state plugin reads DBT_ENGINE_MANAGE_STATE directly in its initialize(), so a CLI override of an opt-out env var was previously dropped silently: PluginManager loaded the plugin but the plugin self-disabled on import. PluginManager now normalizes os.environ to the Click-resolved value before importing each bundled plugin, so all three opt-in surfaces (--manage-state CLI, DBT_ENGINE_MANAGE_STATE env var, manage_state in dbt_project.yml / profiles.yml) behave consistently end-to-end. (#13014) - Strip dbt-core-only DBT_ENGINE_* env vars (e.g. DBT_ENGINE_USE_V2_PARSER, DBT_ENGINE_V2_PARSER) from the v2-parser subprocess env, and expand
~in --v2-parser paths. Fusion hard-errors on unknown DBT_ENGINE_* vars, so enabling the v2 parser via DBT_ENGINE_USE_V2_PARSER previously broke the handoff. Stripping is keyed off click-bound options, so future core-only DBT_ENGINE_* additions are handled automatically. Non-click vars (DBT_ENGINE_STATE_*, recorder, deps) pass through unchanged. (#13029) - Write manage_state user_settings in all platform login flows unless explicitly disabled (#13032)
- Make sure that expires_at in oauth_sessions is int so that its rust interoperable (#13032)
- Allow for setting of OSI documents directory as project config (#13088)
- Support lowercase "osi" directory (#13087)
- Add a
direct_parentsattribute to model nodes carrying the nearest public ancestors only, and emit it indbt ls --output=jsonfor models. Lineage consumers can now render DAG edges fromdirect_parentsinstead ofdepends_on.nodes, which carries the full transitive closure across plugin boundaries (still required for node selection and cycle detection). The new attribute is runtime-only and is stripped during manifest serialization, so the manifest.json contract is unchanged. (#) - Make the latest_version_pointer collision check quoting/case aware so an unquoted latest-version alias differing from the pointer name only by case is correctly detected on case-insensitive warehouses (#15210)
- Recognize Databricks adapter config keys (
query_tags,zorder,options,unique_tmp_table_suffix,skip_optimize) in jsonschema validation so they no longer raise spuriousCustomKeyInConfigDeprecationwarnings (dbt-databricks#1540, dbt-databricks#1302) (#N/A) - Fix intermittent "references a model that does not exist" parsing error when unit testing versioned models, caused by non-deterministic filesystem parse order (#11139)
- Fix partial parsing ghost-duplicate that raised a false "found two data_tests" error by cleaning up disabled generic and singular test nodes on schema re-parse (#)
- Update reuse relations hint text (#15510)
- Fix macro namespace resolution so a dbt project named after a macro no longer crashes with 'MacroGenerator' during dispatch (#15556)
- Persist hint_ts in dbt_home and gate rw on bare Except clause to be more defensive (#15510)
- Fix
dbt buildnode count ("X of Y") being inflated when unit tests are selected, by adding the unit test count to num_nodes exactly once instead of on every dequeue while run_count is still 0 (#11185) - Stop resolving a unit test's tested model eagerly at parse time; resolve it only in the single deterministic post-parse pass so resolution no longer depends on filesystem parse order at all (deeper fix for (#11139)
- Re-parse adapter macros from the installed adapter package after loading a Fusion-generated manifest, ensuring the user's installed dbt- version is used instead of Fusion's compile-time bundled copy (#15527)
- Fix OpenTelemetry hook spans: name them by hook and transaction phase, skip calls that run no hooks, and add node context and status. (#11367)
- Re-parse the built-in generic tests (test_not_null, test_unique, test_accepted_values, test_relationships) after loading a Fusion-generated manifest, so they are not permanently evicted and left undefined at test-compile time (#15914)
- Write target/manifest.json from the corrected in-memory manifest after loading a Fusion-generated manifest, so the on-disk artifact reflects the rediscovered adapter macros actually used for compilation instead of Fusion's raw bundled macros (#)
- Send the
x-ms-blob-type: BlockBlobheader and accept201 Createdwhen uploading artifacts to an Azure Blob Storage signed URL, so artifact ingestion no longer fails with400 MissingRequiredHeaderon Azure-hosted regions. Upload errors now include the storage provider's error code alongside the status code. (#N/A) - Capture and re-emit fusion parser subprocess output through dbt-core's event system instead of letting it pass through to raw stdout/stderr, re-leveling each line by its json-compat severity when available (#15672)
- Validate that a resolved package installation path stays within the configured packages-install-path (#N/A)
- Relay the v2 (Fusion) parser's log output via --log-format otel instead of json-compat, dropping span noise, keeping fusion's error/warning codes, and fixing a latent bug where a stray fusion stderr line could abort the run under --warn-error (#)
- Fix
Dimensionto satisfy themetricflow-semantic-interfacesprotocol and bump themetricflowfloor to 0.213.0 (#, #) - Bare wildcard FQN selectors (e.g.
-s "f_*") now match nested models regardless of subfolder depth (#) - Fix cumulative metrics with an
input_metricand a top-levelwindowfield (v2 metric spec) incorrectly failing to parse with a legacy nested-type_paramserror (#N/A) - Fix compiled_code not persisted to manifest.json when using --use-v2-parser (#)
- Include
semantic_manifest.jsonin the artifact set uploaded by--upload-to-artifacts-ingest-api, matching other run artifacts (#N/A) - Validate that tarball package download locations stay within the dbt downloads directory (#)
Under the Hood
- Allow-list additional DBT_ENGINE_STATE_* engine env vars (EMIT_REUSED_STATUS, OAUTH_CLIENT_ID, AUTH_URL, TOKEN_URL, API_URL) (#13002)
- sync JSON schemas from dbt-fusion (#N/A)
- Add v2-parser telemetry — forward dbt-core's invocation_id and set DBT_INVOCATION_ENV=dbt-core-v2-parser on the parser subprocess so embedded telemetry correlates with the host invocation, and emit V2ParserStart/V2ParserEnd events around the handoff so pre-startup failures (missing binary, schema mismatch) are also captured. Bumps dbt-protos lower bound to 1.0.514 for the new event messages. (#13029)
- sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- Point CI workflows at the
1.latestbranch in preparation for themainbranch cutover to the Rust parser. (#13065) - sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- sync JSON schemas from dbt-fusion (#N/A)
- Reduce parse-time memory and macro-generation overhead by virtualizing macros and switching flat_graph/WritableManifest to lazy no-copy views (#15524)
- Allow pinning the passive OAuth resolver to a dbt platform account so a session cache holding several accounts resolves the configured one (#)
- Add a banner to the
dbt-corePyPI description pointing users to the v2 install docs (#) - Rename internal "Fusion" naming to "v2" for the v2 parser integration (exceptions, module, and test names); no user-facing behavior change (#N/A)
Dependencies
- Bump the minimum
dbt-core-experimental-parserto2.0.0a1(#13065) - Bump the minimum
dbt-core-experimental-parserto2.0.0a3(#15391) - Bump ca-certificates, libpq-dev, and openssh-client in Docker image to current bullseye versions to fix Docker release build failure caused by superseded package versions (#NA)
- Bump the minimum
dbt-core-experimental-parserto2.0.0a4(#13065) - Bump dbt-adapters to 1.24.5 lowerbound (#, #)
- Bump dbt-core-experimental-parser to 2.0.0b1 lowerbound (#)
- Require
sqlparse>=0.5.5,<0.7.0,sqlparse0.6.0 is the fixed release for CVE-2026-54284, CVE-2026-59893, CVE-2026-59894 and CVE-2026-71491 (parser denial-of-service). (#15988)
Contributors
- @ (#)
- @MichelleArk (#15336)
- @QMalcolm (#13088, #13087)
- @aahel (#15156, #15210)
- @acurtis-evi (#7117, #7124)
- @aiguofer (#13029, #13029, #15527, #15914, #, #15672, #, #13029, #N/A)
- @ajnovice (#12885, #NA)
- @ash2shukla (#13031, #13032, #15510, #15964, #13032, #13032, #15510, #15556, #15510, #N/A, #N/A, #, #15524, #, #)
- @ayshukla (#N/A)
- @b-per (#, #13004)
- @colin-rogers-dbt (#13014, #13014, #13014, #13002)
- @colinrogers (#15222)
- @fa-assistant (#N/A, #N/A, #N/A, #N/A, #N/A, #N/A, #N/A, #N/A, #N/A, #N/A, #N/A)
- @fothergill (#12895)
- @itsnamangoyal (#12713, #11139, #, #11139, #, #, #)
- @izeigerman (#)
- @noppaz (#7117, #7124)
- @peterallenwebb (#15524)
- @sd-db (#N/A)
- @sfc-gh-ppruett (#11367)
- @sfc-gh-vguttha (#11367)
- @sriramr98 (#)
- @tauhid621 (#, #11185, #11367, #N/A, #13065, #, #13065, #15391, #13065, #)
- @ulixius9 (#15988)
Source: original entry ↗
More from dbt
Follow dbt to get its new changes in your feed and email digest.
v2.0.8
dbt 2.0.8 lowers the minimum Python version to 3.10, fixes TableNotFound errors during analyze operations on MapReduce, restores catalog.json writing for dbt build, and adds test helpers for integration testing.
dbt 2.0.0-dev.41
Added Lake Compute support for reading AWS Databricks Unity Catalog tables with PAT/OAuth M2M credentials. Fixed multiple issues including modules.re keyword argument handling, column-tag diffs in Databricks, and test config inheritance from dbt-core.
BigQuery drivers continue on ADBC.GetObjects errors
Fixed an issue where BigQuery drivers would fail on ADBC.GetObjects 404/403 errors, which was causing incorrect use of REPLACE TABLE instead of MERGE for incremental tables. The drivers now continue gracefully when encountering these errors.