github dbt-labs/dbt-core v1.12.0b2
dbt-core v1.12.0b2

pre-releaseone hour ago

dbt-core 1.12.0-b2 - June 01, 2026

Features

  • Make MAXIMUM_SEED_SIZE_MIB configurable (#7117, #7124)
  • automatically create a latest-version pointer (e.g. dim_customers) for versioned models, opt-in via latest_version_pointer_enabled_by_default flag or per-model latest_version_pointer config (#7442)
  • Add support for private git packages in packages.yml and dependencies.yml. Resolves URLs from a configured environment variable when present, otherwise falls back to constructing an SSH URL. (#12874)
  • Add catalogs.yml v2 support gated behind use_catalogs_v2 flag, with adapter-owned bridge architecture (#12930)
  • Begin writing OSI SL document at end of parsing (#12786)
  • Support parsing OSI semantic layer documents from a project's OSI/ directory into the dbt manifest (#12787)
  • 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-state on 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-parser to delegate parsing to the fusion parser, load its manifest.json into a runtime Manifest, and bypass dbt-core's parser. Configurable via --v2-parser / DBT_ENGINE_V2_PARSER (defaults to dbt-core-experimental-parser parse) or the flags: section of dbt_project.yml. (#13029)
  • Add support for user settings with flags reading writing (#13031)
  • Add dbt login command (#13032)

Fixes

  • Fix version_to_str returning empty string for float NodeVersion values, causing unquoted YAML version scalars (e.g. v: 4.5) to be silently dropped and mis-routed as non-versioned models (#12947)
  • Handle Reused node status in on-run-end summary printer so plugins that emit RunResult(status=Reused, ...) don't crash with unhandled result. (#12972)
  • Skip jsonschema_validation if adapter_type is not available (#12992)
  • 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-state when 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)

Under the Hood

  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • sync JSON schemas from dbt-fusion (#N/A)
  • Annotate PARAM_TYPE_MAP to fix mypy failure with click 8.4.0 (#N/A)
  • 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)

Dependencies

  • Bump dbt-adapters lower bound to >=1.24.1 (#12985)
  • Bump the minimum dbt-core-experimental-parser to 2.0.0a1 (#13065)

Contributors

Don't miss a new dbt-core release

NewReleases is sending notifications on new releases.