{"record":{"id":"340305eb100d39b9","repo":"dbt-labs/dbt-core","slug":"invalidconfig","errorCode":"InvalidConfig","errorMessage":"Resource path `{key_path}` in dbt_project.yml starts with `+`. This will be deprecated in future versions of dbt.","messagePattern":"Resource path `(.+?)` in dbt_project\\.yml starts with `\\+`\\. This will be deprecated in future versions of dbt\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"crates/dbt-parser/src/dbt_project_config.rs","lineNumber":482,"sourceCode":"    };\n\n    // Case 1: `value` is non-default, meaning there is a valid config inside it somewhere.\n    // We definitely know a config value was set, because it must have this shape:\n    //\n    // ```\n    // +key:\n    //   +some_config: some_value\n    // ```\n    //\n    // This is just an approximation and will miss cases where the config is explicitly set to\n    // default.\n    let valid_config_exists = value.has_set_fields();\n\n    // We want to throw warnings at the location of the topmost +-prefixed key, so we throw exactly\n    // one warning per offending resource path.\n    let is_parent_plus = key_is_plus && !inside_plus;\n    if is_parent_plus && valid_config_exists {\n        warn();\n        return key_is_plus;\n    }\n\n    // Case 2: Any non-config children start with +, or any descendants fall under case 1.\n    let mut any_child_plus = false;\n    for (child_key, child_variant) in value.iter_children() {\n        let child_is_plus = match child_variant {\n            ShouldBe::AndIs(child) => warn_plus_prefixed_resource_paths::<S>(\n                child_key,\n                child,\n                &key_path,\n                inside_plus || key_is_plus,\n            ),\n            ShouldBe::ButIsnt(..) => child_key.starts_with('+'),\n        };\n        any_child_plus |= child_is_plus;\n    }\n    if is_parent_plus && any_child_plus {","sourceCodeStart":464,"sourceCodeEnd":500,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-parser/src/dbt_project_config.rs#L464-L500","documentation":"A deprecation warning from the dbt project-file parser: a resource-path key under a config section (models, seeds, snapshots, etc.) in dbt_project.yml starts with '+', and the sub-tree carries actual config values (value.has_set_fields() is true). The '+' prefix convention for configs in dbt_project.yml is being deprecated, so warn_plus_prefixed_resource_paths emits one warning at the topmost '+'-prefixed key of each offending resource path (code InvalidConfig). Parsing continues; the config still applies today.","triggerScenarios":"dbt_project.yml contains e.g. 'models: { +my_model: { +materialized: table } }' or any '+'-prefixed resource key whose nested value sets at least one config field; triggered at the outermost plus key (inside_plus == false).","commonSituations":"Upgrading from dbt versions where '+key:' was the documented convention; mixed legacy/new configs after migration; linters or generators that still emit '+'-prefixed project configs.","solutions":["Remove the '+' prefix from resource-path keys in dbt_project.yml: use 'my_model: materialized: table' style nested configs","Keep '+' prefixes only where still required (e.g. seed/test config keys under subdirectories if applicable) and audit each section of dbt_project.yml","Run dbt parse/dbt debug and clear each reported path until no warnings remain"],"exampleFix":"# before (dbt_project.yml)\nmodels:\n  my_project:\n    +materialized: table\n# after\nmodels:\n  my_project:\n    config:\n      materialized: table","handlingStrategy":"validation","validationCode":"import yaml\ndef find_plus_keys(node, path=\"\"):\n    if isinstance(node, dict):\n        for k, v in node.items():\n            p = f\"{path}.{k}\" if path else k\n            if k.startswith('+'):\n                print(f\"Deprecated '+' prefix: {p}\")\n            find_plus_keys(v, p)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Lint dbt_project.yml in CI for '+'-prefixed keys under models/seeds/snapshots","Migrate to explicit 'config:' blocks when upgrading dbt versions","Read the dbt release notes for deprecation timelines of the '+' convention"],"tags":["dbt","config","deprecation","yaml"],"backgroundTag":"deprecated-api-usage","analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}