Orchestration & reliability · rule dag-unowned
Airflow DAG owner: how to set it and what it does
An Airflow DAG owner is the owner value on its tasks, usually set once through default_args. Airflow shows it in the DAGs list so people can see who runs the job.
A Metacenta review checks this under the rule Every scheduled job names an owner. Everything below applies whether or not you ever commission one.
How to set the owner
Put owner in default_args to apply it to every task. A task can override it with its own owner.
with DAG(
"daily_orders",
schedule="@daily",
start_date=datetime(2026, 1, 1),
default_args={"owner": "finance-data"},
):
load = BashOperator(task_id="load", bash_command="echo load")
report = BashOperator(task_id="report", bash_command="echo report", owner="reporting")
Why a DAG's owner says airflow
Tasks with no owner take default_owner from the [operators] config, and its default value is airflow. So a DAG that nobody assigned still shows an owner, which is why that value counts as no owner in this rule.
How to link an owner to a team
owner_links makes the owner a clickable link in the DAGs view. Each key must match an owner, and each value is an HTTP or mailto: link.
with DAG(
"daily_orders",
default_args={"owner": "finance-data"},
owner_links={"finance-data": "mailto:finance-data@example.com"},
):
...
See Airflow's owner links docs for more.
An owner doesn't send alerts
Setting owner tells people whose DAG it is, but it doesn't notify anyone when the DAG fails. Failure alerts need their own setup, which we cover in Airflow DAGs with no failure alert.
What this rule checks
This rule flags each Airflow DAG, Dagster job or Prefect flow file that declares no owner. An owner of airflow, admin, default, todo or a similar placeholder counts as none, because Airflow's own scaffolding writes owner="airflow".
Why it matters
An unowned job is fine until it breaks. Then somebody has to decide whose problem it is, during the incident rather than before it, which is the expensive time to find out.
How to fix it
Name an owner on every scheduled job. Set default_args.owner to a team or a rota, not one person who can be on holiday. For Dagster, set owners on the asset or job.
Before:
default_args = {
"owner": "airflow",
}
After:
default_args = {
"owner": "finance-data",
}
When it is fine to leave
Ownership tracked outside the DAG file, in a service catalogue or a CODEOWNERS entry, is ownership in practice. Tell us where it lives, and the finding comes out of your report.
What we need to check it
The DAG files you name to us one at a time. We never search a repository for them. We read the owner only when it is written as a literal; a value imported from a shared module reads as no owner.