Mature behavior flags
When a behavior change flag reaches maturity, its default value switches from false to true. This page covers two categories of flags:
- Mature flags: Flags that have already reached maturity and are enabled by default
- Flags reaching maturity: Flags planned to reach maturity on the dbt platform Latest release track, where the default will switch to
true
For each flag, this page describes what the change means for your project and how to preserve the previous behavior. For flags still in the introduction phase, refer to Behavior flag introduction.
Mature flags
The following flags have reached maturity:
| Loading table... |
To opt out of mature flags and preserve the previous behavior, set them explicitly to false in your dbt_project.yml:
flags:
require_explicit_package_overrides_for_builtin_materializations: false
require_resource_names_without_spaces: false
source_freshness_run_project_hooks: false
require_generic_test_arguments_property: false
require_explicit_package_overrides_for_builtin_materializations
Installed packages can no longer override built-in materializations without your explicit opt-in. A materialization defined in a package that matches the name of a built-in materialization is no longer included in the search and resolution order. Unlike macros, materializations don't use the search_order defined in the project dispatch config.
The built-in materializations are 'view', 'table', 'incremental', 'materialized_view' for models as well as 'test', 'unit', 'snapshot', 'seed', and 'clone'.
You can still explicitly override built-in materializations by reimplementing the built-in materialization in your root project and wrapping the package implementation.
{% materialization view, snowflake %}
{{ return(my_installed_package_name.materialization_view_snowflake()) }}
{% endmaterialization %}
In the future, we may extend the project-level dispatch configuration to support a list of authorized packages for overriding built-in materialization.
require_resource_names_without_spaces
dbt now raises an error if it detects a space in a resource name, rather than a deprecation warning. Resource names should contain letters, numbers, and underscores only.
-- This model file should be renamed to model_name_with_underscores.sql
source_freshness_run_project_hooks
Project hooks (on-run-start / on-run-end) now run as part of the dbt source freshness command by default. If you have hooks that should not run before or after dbt source freshness, add a conditional check:
on-run-start:
- "{{ ... if flags.WHICH != 'freshness' }}"
require_generic_test_arguments_property
dbt supports parsing key-value arguments that are inputs to generic tests when specified under the arguments property. In the past, dbt didn't support a way to clearly disambiguate between properties that were inputs to generic tests and framework configurations, and only accepted arguments as top-level properties.
If you are on an older Core version where the flag is false, dbt will recognize the arguments property but raise the ArgumentsPropertyInGenericTestDeprecation warning.
Here's an example using the new arguments property:
models:
- name: my_model_with_generic_test
data_tests:
- dbt_utils.expression_is_true:
arguments:
expression: "order_items_subtotal = subtotal"
Here's an example using the alternative test_name format:
models:
- name: my_model_with_generic_test
data_tests:
- name: arbitrary_name
test_name: dbt_utils.expression_is_true
arguments:
expression: "order_items_subtotal = subtotal"
config:
where: "1=1"
With this flag enabled, dbt will:
- Parse any key-value pairs under
argumentsin generic tests as inputs to the generic test macro. - Raise a
MissingArgumentsPropertyInGenericTestDeprecationwarning if additional non-config arguments are specified outside of theargumentsproperty.
Flags reaching maturity
Several behavior change flags on the dbt platform Latest release track are planned to reach maturity on June 23, 2026, switching their default values from false to true. For intro dates, refer to the dbt Core behavior changes table.
| Loading table... |
skip_nodes_if_on_run_start_fails
If your project uses on-run-start hooks for non-critical work (for example, telemetry, notifications, audit inserts, attaching session settings), your build will stop producing output whenever a hook fails. Tables and views that previously refreshed daily will stop updating the next time the hook fails.
For more information, refer to on-run-start / on-run-end.
require_nested_cumulative_type_params
Any project with a cumulative metric still using the un-nested syntax stops parsing entirely on the first command. Because parsing fails, the error affects every dbt command: run, build, test, compile, docs generate, the Semantic Layer, and more.
require_all_warnings_handled_by_warn_error
This only affects projects that use warn_error: true or --warn-error — common in CI or in dbt platform production jobs configured for strict mode. Projects without --warn-error are not affected.
Example warnings that switch from "log only" to "error" for warn_error: true users after the flag matures:
JinjaLogWarning— emitted for column types declared for non-existent seed columnsWarnStateTargetEqual— emitted when the--stateand--targetdirectories are the same pathSelectExcludeIgnoredWithSelectorWarning— emitted when the legacy--selectorflag is combined with--selector--excludeRunResultWarningMessage— emitted when a test or model returnsWARNstatus- Various adapter-level warnings not previously handled by
--warn-error
require_batched_execution_for_custom_microbatch_strategy
This flag is only relevant if your project has a custom get_incremental_microbatch_sql macro. If you don't have a custom microbatch macro, you don't need to set this flag.
If you have overridden get_incremental_microbatch_sql — typically to work around an adapter limitation or implement a custom partition strategy — your macro is invoked under a batched contract for which it was never written. Possible outcomes:
- The macro ignores the smaller
event_time_start/event_time_endwindow and re-processes the full range every batch, leading to wasted compute, duplicate rows, orMERGE/INSERTconflicts. - The macro errors because it expects a single invocation per run.
- Row counts in the destination table differ between flag values.
Projects without a custom microbatch macro are unaffected; the built-in macro already runs in batches.
state_modified_compare_more_unrendered_values
Setting the default to true for this flag silently changes the state:modified selection set that most CI, Slim CI, and dbt build --defer workflows rely on. There are two ways this surfaces:
- False "modified" on the first run after the flag is set to
true. If the baseline manifest was captured before the flag is set (rendered values stored) and the current parse runs after the setting change (literal text stored), every node whose YAML config contains Jinja will appear asstate:modified, even if nothing has changed. This causes a full rebuild on the first CI run after the upgrade. - New positives going forward. After both manifests are captured with the flag enabled,
state:modifiedwill catch cases where two equivalent Jinja expressions render to the same value (for example, switching from"{{ env_var('MAT', 'view') }}"toview).
require_yaml_configuration_for_mf_time_spines
This flag has no functional impact; the legacy time-spine model continues to work in both cases. The only visible changes are:
- The
MFTimespineWithoutYamlConfigurationDeprecationwarning no longer appears in logs. - If you use
--warn-error, the warning no longer fires and will no longer escalate to an error.
For more information, refer to MetricFlow timespine.
validate_macro_args
On its own, the flag emits warnings and builds continue. However, these warnings use the force-handled path and respect --warn-error, so projects with --warn-error set will see build failures at parse time.
This affects projects where the arguments: listed in a macro's YAML patch no longer match the macro's actual Jinja signature. For those projects, every command fails at parse time until you either update the YAML arguments to match the macro or remove the arguments: block entirely.
Was this page helpful?
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.