Apache Airflow version
main at 299ca2c85 (also present in 3.2.x).
What happened?
Three options in airflow-core/src/airflow/config_templates/config.yml are never read. Their names do not appear anywhere else in the repository — not in Python, not in the React UI, not in the Helm chart, not in the docs.
| config.yml |
option |
added |
references outside config.yml |
:1140 |
[logging] color_log_error_keywords |
2.10.0 |
0 |
:1148 |
[logging] color_log_warning_keywords |
2.10.0 |
0 |
:2737 |
[scheduler] ignore_first_depends_on_past_by_default |
2.3.0 |
0 |
None of the three carries version_deprecated or deprecation_reason, so they are presented as current settings: config.yml drives both the generated airflow.cfg and the configuration reference. Someone reading the docs sets one of these and nothing happens, with no warning.
The two color_log_*_keywords entries say the keywords "should display the line in red color in UI". Nothing reads them, and error_keywords / warning_keywords appear nowhere else either — including the 597 .tsx files under airflow-core/src/airflow/ui, so it is not a case of the UI having taken the setting over under a camelCase name.
ignore_first_depends_on_past_by_default is the one I would most like a second opinion on, because it is a scheduling setting rather than a cosmetic one and its description promises real behaviour ("first task instance of a task ignore depends_on_past setting").
I could not check when each stopped being read — my clone is shallow. If that matters I am happy to look again with full history.
What you think should happen instead?
Whichever you prefer — the project already has both patterns:
- mark them with
version_deprecated / deprecation_reason, the way [traces] otel_debug_traces_on is marked ("This parameter is no longer used"), so they stay listed but honestly; or
- remove the entries.
I did not want to pick, since removing a listed option is a compatibility decision and the deprecation path is yours.
How to reproduce
$ grep -rI -w color_log_error_keywords . | grep -v config_templates/config.yml | wc -l
0
$ grep -rI -w color_log_warning_keywords . | grep -v config_templates/config.yml | wc -l
0
$ grep -rI -w ignore_first_depends_on_past_by_default . | grep -v config_templates/config.yml | wc -l
0
grep -rI covers every text file in the tree, not just Python.
Anything else?
How this was found, and what I ruled out. I parsed every option out of config.yml (323 options across 25 sections) and compared it against every place the code names a section and an option together (509 distinct pairs).
The raw comparison flagged 49 options. All but three were false positives, and the reasons are worth stating so nobody repeats them:
- Keyword form.
conf.getboolean(section="secrets", key="use_cache", fallback=False) — the two strings are not adjacent.
- Factory helpers.
_config_int_factory("dag_processor", "parsing_processes") and _config_bool_factory("scheduler", "catchup_by_default") never mention conf.
- Aliased import.
airflow_conf.getboolean("core", "dags_are_paused_at_creation") in models/dag.py.
- Whole-section reads.
conf.getsection("sentry") and conf.getsection(section, team_name=...) in BaseExecutor pull every option in [sentry] and [api] at once.
- Indirection through a dict.
sql_alchemy_connect_args_async is live but reached via {"async": "sql_alchemy_connect_args_async"} in settings.py:354, so its name is never next to "database".
- My own reading error. I first looked for
is_deprecated: true and found none, which made [traces] otel_debugging_on and [traces] otel_debug_traces_on look dead. config.yml marks retirement with version_deprecated / deprecation_reason, and both of those are already marked. They are not part of this report.
Only the three above survived, and each was then checked with a whole-repository search across all file types rather than trusting the comparison.
Are you willing to submit PR?
Gen AI usage
AI-assisted (Claude Code, Opus 5). The comparison script and this report were produced with the tool. I verified the findings myself before filing: I confirmed each of the three names has zero occurrences outside config.yml across every file type including the TypeScript UI, read settings.py to see how sql_alchemy_connect_args_async is actually reached, read the [metrics] and [traces] blocks to find the version_deprecated markers I had initially missed, and went through each false-positive class above one at a time instead of reporting the script's raw output. I understand the finding and take responsibility for it.
Code of Conduct
Apache Airflow version
mainat299ca2c85(also present in 3.2.x).What happened?
Three options in
airflow-core/src/airflow/config_templates/config.ymlare never read. Their names do not appear anywhere else in the repository — not in Python, not in the React UI, not in the Helm chart, not in the docs.:1140[logging] color_log_error_keywords:1148[logging] color_log_warning_keywords:2737[scheduler] ignore_first_depends_on_past_by_defaultNone of the three carries
version_deprecatedordeprecation_reason, so they are presented as current settings:config.ymldrives both the generatedairflow.cfgand the configuration reference. Someone reading the docs sets one of these and nothing happens, with no warning.The two
color_log_*_keywordsentries say the keywords "should display the line in red color in UI". Nothing reads them, anderror_keywords/warning_keywordsappear nowhere else either — including the 597.tsxfiles underairflow-core/src/airflow/ui, so it is not a case of the UI having taken the setting over under a camelCase name.ignore_first_depends_on_past_by_defaultis the one I would most like a second opinion on, because it is a scheduling setting rather than a cosmetic one and its description promises real behaviour ("first task instance of a task ignore depends_on_past setting").I could not check when each stopped being read — my clone is shallow. If that matters I am happy to look again with full history.
What you think should happen instead?
Whichever you prefer — the project already has both patterns:
version_deprecated/deprecation_reason, the way[traces] otel_debug_traces_onis marked ("This parameter is no longer used"), so they stay listed but honestly; orI did not want to pick, since removing a listed option is a compatibility decision and the deprecation path is yours.
How to reproduce
grep -rIcovers every text file in the tree, not just Python.Anything else?
How this was found, and what I ruled out. I parsed every option out of
config.yml(323 options across 25 sections) and compared it against every place the code names a section and an option together (509 distinct pairs).The raw comparison flagged 49 options. All but three were false positives, and the reasons are worth stating so nobody repeats them:
conf.getboolean(section="secrets", key="use_cache", fallback=False)— the two strings are not adjacent._config_int_factory("dag_processor", "parsing_processes")and_config_bool_factory("scheduler", "catchup_by_default")never mentionconf.airflow_conf.getboolean("core", "dags_are_paused_at_creation")inmodels/dag.py.conf.getsection("sentry")andconf.getsection(section, team_name=...)inBaseExecutorpull every option in[sentry]and[api]at once.sql_alchemy_connect_args_asyncis live but reached via{"async": "sql_alchemy_connect_args_async"}insettings.py:354, so its name is never next to"database".is_deprecated: trueand found none, which made[traces] otel_debugging_onand[traces] otel_debug_traces_onlook dead.config.ymlmarks retirement withversion_deprecated/deprecation_reason, and both of those are already marked. They are not part of this report.Only the three above survived, and each was then checked with a whole-repository search across all file types rather than trusting the comparison.
Are you willing to submit PR?
Gen AI usage
AI-assisted (Claude Code, Opus 5). The comparison script and this report were produced with the tool. I verified the findings myself before filing: I confirmed each of the three names has zero occurrences outside
config.ymlacross every file type including the TypeScript UI, readsettings.pyto see howsql_alchemy_connect_args_asyncis actually reached, read the[metrics]and[traces]blocks to find theversion_deprecatedmarkers I had initially missed, and went through each false-positive class above one at a time instead of reporting the script's raw output. I understand the finding and take responsibility for it.Code of Conduct