You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ka...@apache.org on 2025/04/09 22:30:57 UTC

(airflow) branch main updated: Rename `is_active` to `is_stale` column in ``dag`` table (#49018)

This is an automated email from the ASF dual-hosted git repository.

kaxilnaik pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new bf74cafad6b Rename `is_active` to `is_stale` column in ``dag`` table (#49018)
bf74cafad6b is described below

commit bf74cafad6b1d20c56df0fcadc86ff7bcd2b001d
Author: Kaxil Naik <ka...@apache.org>
AuthorDate: Thu Apr 10 04:00:51 2025 +0530

    Rename `is_active` to `is_stale` column in ``dag`` table (#49018)
    
    closes https://github.com/apache/airflow/issues/41519
---
 airflow-core/docs/img/airflow_erd.sha256           |  2 +-
 airflow-core/docs/img/airflow_erd.svg              | 12 ++---
 airflow-core/docs/migrations-ref.rst               |  5 ++-
 .../src/airflow/api_fastapi/common/parameters.py   | 12 ++---
 .../api_fastapi/core_api/datamodels/dags.py        |  2 +-
 .../api_fastapi/core_api/openapi/v1-generated.yaml | 30 ++++++-------
 .../api_fastapi/core_api/routes/public/dag_run.py  |  2 +-
 .../api_fastapi/core_api/routes/public/dags.py     | 18 +++++---
 .../airflow/api_fastapi/core_api/routes/ui/dags.py |  6 +--
 .../api_fastapi/execution_api/routes/dag_runs.py   |  4 +-
 airflow-core/src/airflow/assets/manager.py         |  4 +-
 .../src/airflow/cli/commands/dag_command.py        |  4 +-
 .../src/airflow/dag_processing/collection.py       |  4 +-
 airflow-core/src/airflow/dag_processing/manager.py |  4 +-
 ..._0_0_rename_is_active_to_is_stale_column_in_.py | 52 ++++++++++++++++++++++
 airflow-core/src/airflow/models/asset.py           |  2 +-
 airflow-core/src/airflow/models/dag.py             | 23 ++++++----
 airflow-core/src/airflow/models/dagrun.py          |  6 +--
 airflow-core/src/airflow/models/dagwarning.py      |  6 +--
 airflow-core/src/airflow/models/serialized_dag.py  |  4 +-
 .../src/airflow/ui/openapi-gen/queries/common.ts   | 12 ++---
 .../ui/openapi-gen/queries/ensureQueryData.ts      | 20 ++++-----
 .../src/airflow/ui/openapi-gen/queries/prefetch.ts | 20 ++++-----
 .../src/airflow/ui/openapi-gen/queries/queries.ts  | 30 ++++++-------
 .../src/airflow/ui/openapi-gen/queries/suspense.ts | 20 ++++-----
 .../airflow/ui/openapi-gen/requests/schemas.gen.ts | 18 ++++----
 .../ui/openapi-gen/requests/services.gen.ts        | 12 ++---
 .../airflow/ui/openapi-gen/requests/types.gen.ts   | 12 ++---
 .../src/airflow/ui/src/mocks/handlers/dag.ts       |  2 +-
 .../src/airflow/ui/src/mocks/handlers/dags.ts      |  8 ++--
 .../airflow/ui/src/pages/DagsList/DagCard.test.tsx |  2 +-
 airflow-core/src/airflow/utils/db.py               |  2 +-
 .../core_api/routes/public/test_backfills.py       |  2 +-
 .../core_api/routes/public/test_dag_run.py         |  4 +-
 .../core_api/routes/public/test_dag_stats.py       |  6 +--
 .../core_api/routes/public/test_dag_tags.py        |  2 +-
 .../core_api/routes/public/test_dags.py            | 44 +++++++++---------
 .../core_api/routes/ui/test_backfills.py           |  2 +-
 airflow-core/tests/unit/assets/test_manager.py     |  8 ++--
 .../tests/unit/dag_processing/test_collection.py   |  2 +-
 .../tests/unit/dag_processing/test_manager.py      | 10 ++---
 airflow-core/tests/unit/jobs/test_scheduler_job.py |  2 +-
 airflow-core/tests/unit/models/test_asset.py       |  2 +-
 airflow-core/tests/unit/models/test_dag.py         | 12 ++---
 airflow-core/tests/unit/models/test_dagbag.py      |  6 +--
 airflow-core/tests/unit/models/test_dagrun.py      |  4 +-
 airflow-core/tests/unit/models/test_dagwarning.py  |  2 +-
 .../tests/unit/models/test_serialized_dag.py       |  2 +-
 48 files changed, 269 insertions(+), 201 deletions(-)

diff --git a/airflow-core/docs/img/airflow_erd.sha256 b/airflow-core/docs/img/airflow_erd.sha256
index b53496eee22..ec5a663b342 100644
--- a/airflow-core/docs/img/airflow_erd.sha256
+++ b/airflow-core/docs/img/airflow_erd.sha256
@@ -1 +1 @@
-11cbcf4e71543241568358521f85d6b04d7aa51c862986404092ff05fc31bda4
\ No newline at end of file
+20aac73bfb0e08226c687304b997ed93d9cf796d3b761d14e45d732ef4f6c01e
\ No newline at end of file
diff --git a/airflow-core/docs/img/airflow_erd.svg b/airflow-core/docs/img/airflow_erd.svg
index 6379d20ce6d..dbcc7d4060e 100644
--- a/airflow-core/docs/img/airflow_erd.svg
+++ b/airflow-core/docs/img/airflow_erd.svg
@@ -1780,13 +1780,13 @@
 <text text-anchor="start" x="651" y="-1997.3" font-family="Helvetica,sans-Serif" font-size="14.00"> [BOOLEAN]</text>
 <text text-anchor="start" x="735" y="-1997.3" font-family="Helvetica,sans-Serif" font-size="14.00"> NOT NULL</text>
 <polygon fill="none" stroke="black" points="444,-1962.5 444,-1987.5 848,-1987.5 848,-1962.5 444,-1962.5"/>
-<text text-anchor="start" x="449" y="-1972.3" font-family="Helvetica,sans-Serif" font-size="14.00">is_active</text>
-<text text-anchor="start" x="509" y="-1972.3" font-family="Helvetica,sans-Serif" font-size="14.00"> </text>
-<text text-anchor="start" x="514" y="-1972.3" font-family="Helvetica,sans-Serif" font-size="14.00"> [BOOLEAN]</text>
+<text text-anchor="start" x="449" y="-1972.3" font-family="Helvetica,sans-Serif" font-size="14.00">is_paused</text>
+<text text-anchor="start" x="519" y="-1972.3" font-family="Helvetica,sans-Serif" font-size="14.00"> </text>
+<text text-anchor="start" x="524" y="-1972.3" font-family="Helvetica,sans-Serif" font-size="14.00"> [BOOLEAN]</text>
 <polygon fill="none" stroke="black" points="444,-1937.5 444,-1962.5 848,-1962.5 848,-1937.5 444,-1937.5"/>
-<text text-anchor="start" x="449" y="-1947.3" font-family="Helvetica,sans-Serif" font-size="14.00">is_paused</text>
-<text text-anchor="start" x="519" y="-1947.3" font-family="Helvetica,sans-Serif" font-size="14.00"> </text>
-<text text-anchor="start" x="524" y="-1947.3" font-family="Helvetica,sans-Serif" font-size="14.00"> [BOOLEAN]</text>
+<text text-anchor="start" x="449" y="-1947.3" font-family="Helvetica,sans-Serif" font-size="14.00">is_stale</text>
+<text text-anchor="start" x="501" y="-1947.3" font-family="Helvetica,sans-Serif" font-size="14.00"> </text>
+<text text-anchor="start" x="506" y="-1947.3" font-family="Helvetica,sans-Serif" font-size="14.00"> [BOOLEAN]</text>
 <polygon fill="none" stroke="black" points="444,-1912.5 444,-1937.5 848,-1937.5 848,-1912.5 444,-1912.5"/>
 <text text-anchor="start" x="449" y="-1922.3" font-family="Helvetica,sans-Serif" font-size="14.00">last_expired</text>
 <text text-anchor="start" x="533" y="-1922.3" font-family="Helvetica,sans-Serif" font-size="14.00"> </text>
diff --git a/airflow-core/docs/migrations-ref.rst b/airflow-core/docs/migrations-ref.rst
index 73f9626b738..dbed28f9486 100644
--- a/airflow-core/docs/migrations-ref.rst
+++ b/airflow-core/docs/migrations-ref.rst
@@ -39,7 +39,10 @@ Here's the list of all the Database Migrations that are executed via when you ru
 +-------------------------+------------------+-------------------+--------------------------------------------------------------+
 | Revision ID             | Revises ID       | Airflow Version   | Description                                                  |
 +=========================+==================+===================+==============================================================+
-| ``0e9519b56710`` (head) | ``ec62e120484d`` | ``3.0.0``         | Rename run_type from 'dataset_triggered' to                  |
+| ``959e216a3abb`` (head) | ``0e9519b56710`` | ``3.0.0``         | Rename ``is_active`` to ``is_stale`` column in ``dag``       |
+|                         |                  |                   | table.                                                       |
++-------------------------+------------------+-------------------+--------------------------------------------------------------+
+| ``0e9519b56710``        | ``ec62e120484d`` | ``3.0.0``         | Rename run_type from 'dataset_triggered' to                  |
 |                         |                  |                   | 'asset_triggered' in dag_run table.                          |
 +-------------------------+------------------+-------------------+--------------------------------------------------------------+
 | ``ec62e120484d``        | ``be2cc2f742cf`` | ``3.0.0``         | Add new otel span fields.                                    |
diff --git a/airflow-core/src/airflow/api_fastapi/common/parameters.py b/airflow-core/src/airflow/api_fastapi/common/parameters.py
index d7ce038d104..e68001d5b53 100644
--- a/airflow-core/src/airflow/api_fastapi/common/parameters.py
+++ b/airflow-core/src/airflow/api_fastapi/common/parameters.py
@@ -111,17 +111,17 @@ class OffsetFilter(BaseParam[NonNegativeInt]):
         return cls().set_value(offset)
 
 
-class _OnlyActiveFilter(BaseParam[bool]):
-    """Filter on is_active."""
+class _ExcludeStaleFilter(BaseParam[bool]):
+    """Filter on is_stale."""
 
     def to_orm(self, select: Select) -> Select:
         if self.value and self.skip_none:
-            return select.where(DagModel.is_active == self.value)
+            return select.where(DagModel.is_stale != self.value)
         return select
 
     @classmethod
-    def depends(cls, only_active: bool = True) -> _OnlyActiveFilter:
-        return cls().set_value(only_active)
+    def depends(cls, exclude_stale: bool = True) -> _ExcludeStaleFilter:
+        return cls().set_value(exclude_stale)
 
 
 class _SearchParam(BaseParam[str]):
@@ -518,7 +518,7 @@ QueryPausedFilter = Annotated[
     FilterParam[Optional[bool]],
     Depends(filter_param_factory(DagModel.is_paused, Optional[bool], filter_name="paused")),
 ]
-QueryOnlyActiveFilter = Annotated[_OnlyActiveFilter, Depends(_OnlyActiveFilter.depends)]
+QueryExcludeStaleFilter = Annotated[_ExcludeStaleFilter, Depends(_ExcludeStaleFilter.depends)]
 QueryDagIdPatternSearch = Annotated[
     _SearchParam, Depends(search_param_factory(DagModel.dag_id, "dag_id_pattern"))
 ]
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py
index e7067780db9..8f2874c1aa0 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py
@@ -58,7 +58,7 @@ class DAGResponse(BaseModel):
     dag_id: str
     dag_display_name: str
     is_paused: bool
-    is_active: bool
+    is_stale: bool
     last_parsed_time: datetime | None
     last_expired: datetime | None
     bundle_name: str | None
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
index f176fb7003a..d797247793a 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
+++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
@@ -180,13 +180,13 @@ paths:
           - type: string
           - type: 'null'
           title: Dag Display Name Pattern
-      - name: only_active
+      - name: exclude_stale
         in: query
         required: false
         schema:
           type: boolean
           default: true
-          title: Only Active
+          title: Exclude Stale
       - name: paused
         in: query
         required: false
@@ -3219,13 +3219,13 @@ paths:
           - type: string
           - type: 'null'
           title: Dag Display Name Pattern
-      - name: only_active
+      - name: exclude_stale
         in: query
         required: false
         schema:
           type: boolean
           default: true
-          title: Only Active
+          title: Exclude Stale
       - name: paused
         in: query
         required: false
@@ -3388,13 +3388,13 @@ paths:
           - type: string
           - type: 'null'
           title: Dag Id Pattern
-      - name: only_active
+      - name: exclude_stale
         in: query
         required: false
         schema:
           type: boolean
           default: true
-          title: Only Active
+          title: Exclude Stale
       - name: paused
         in: query
         required: false
@@ -8525,9 +8525,9 @@ components:
         is_paused:
           type: boolean
           title: Is Paused
-        is_active:
+        is_stale:
           type: boolean
-          title: Is Active
+          title: Is Stale
         last_parsed_time:
           anyOf:
           - type: string
@@ -8704,7 +8704,7 @@ components:
       - dag_id
       - dag_display_name
       - is_paused
-      - is_active
+      - is_stale
       - last_parsed_time
       - last_expired
       - bundle_name
@@ -8763,9 +8763,9 @@ components:
         is_paused:
           type: boolean
           title: Is Paused
-        is_active:
+        is_stale:
           type: boolean
-          title: Is Active
+          title: Is Stale
         last_parsed_time:
           anyOf:
           - type: string
@@ -8867,7 +8867,7 @@ components:
       - dag_id
       - dag_display_name
       - is_paused
-      - is_active
+      - is_stale
       - last_parsed_time
       - last_expired
       - bundle_name
@@ -9288,9 +9288,9 @@ components:
         is_paused:
           type: boolean
           title: Is Paused
-        is_active:
+        is_stale:
           type: boolean
-          title: Is Active
+          title: Is Stale
         last_parsed_time:
           anyOf:
           - type: string
@@ -9403,7 +9403,7 @@ components:
       - dag_id
       - dag_display_name
       - is_paused
-      - is_active
+      - is_stale
       - last_parsed_time
       - last_expired
       - bundle_name
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
index 371c960fafc..8c701a9665d 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
@@ -389,7 +389,7 @@ def trigger_dag_run(
     session: SessionDep,
 ) -> DAGRunResponse:
     """Trigger a DAG."""
-    dm = session.scalar(select(DagModel).where(DagModel.is_active, DagModel.dag_id == dag_id).limit(1))
+    dm = session.scalar(select(DagModel).where(~DagModel.is_stale, DagModel.dag_id == dag_id).limit(1))
     if not dm:
         raise HTTPException(status.HTTP_404_NOT_FOUND, f"DAG with dag_id: '{dag_id}' not found")
 
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py
index c5d95f78210..a70034e8359 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py
@@ -36,10 +36,10 @@ from airflow.api_fastapi.common.parameters import (
     QueryDagDisplayNamePatternSearch,
     QueryDagIdPatternSearch,
     QueryDagIdPatternSearchWithNone,
+    QueryExcludeStaleFilter,
     QueryLastDagRunStateFilter,
     QueryLimit,
     QueryOffset,
-    QueryOnlyActiveFilter,
     QueryOwnersFilter,
     QueryPausedFilter,
     QueryTagsFilter,
@@ -78,7 +78,7 @@ def get_dags(
     owners: QueryOwnersFilter,
     dag_id_pattern: QueryDagIdPatternSearch,
     dag_display_name_pattern: QueryDagDisplayNamePatternSearch,
-    only_active: QueryOnlyActiveFilter,
+    exclude_stale: QueryExcludeStaleFilter,
     paused: QueryPausedFilter,
     last_dag_run_state: QueryLastDagRunStateFilter,
     dag_run_start_date_range: Annotated[
@@ -131,7 +131,7 @@ def get_dags(
     dags_select, total_entries = paginated_select(
         statement=generate_dag_with_latest_run_query(dag_runs_select),
         filters=[
-            only_active,
+            exclude_stale,
             paused,
             dag_id_pattern,
             dag_display_name_pattern,
@@ -269,7 +269,7 @@ def patch_dags(
     tags: QueryTagsFilter,
     owners: QueryOwnersFilter,
     dag_id_pattern: QueryDagIdPatternSearchWithNone,
-    only_active: QueryOnlyActiveFilter,
+    exclude_stale: QueryExcludeStaleFilter,
     paused: QueryPausedFilter,
     last_dag_run_state: QueryLastDagRunStateFilter,
     editable_dags_filter: EditableDagsFilterDep,
@@ -293,7 +293,15 @@ def patch_dags(
 
     dags_select, total_entries = paginated_select(
         statement=generate_dag_with_latest_run_query(),
-        filters=[only_active, paused, dag_id_pattern, tags, owners, last_dag_run_state, editable_dags_filter],
+        filters=[
+            exclude_stale,
+            paused,
+            dag_id_pattern,
+            tags,
+            owners,
+            last_dag_run_state,
+            editable_dags_filter,
+        ],
         order_by=None,
         offset=offset,
         limit=limit,
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py
index 1c2282cb4e4..da57a6fc02f 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py
@@ -32,10 +32,10 @@ from airflow.api_fastapi.common.parameters import (
     FilterParam,
     QueryDagDisplayNamePatternSearch,
     QueryDagIdPatternSearch,
+    QueryExcludeStaleFilter,
     QueryLastDagRunStateFilter,
     QueryLimit,
     QueryOffset,
-    QueryOnlyActiveFilter,
     QueryOwnersFilter,
     QueryPausedFilter,
     QueryTagsFilter,
@@ -76,7 +76,7 @@ def recent_dag_runs(
     ],
     dag_id_pattern: QueryDagIdPatternSearch,
     dag_display_name_pattern: QueryDagDisplayNamePatternSearch,
-    only_active: QueryOnlyActiveFilter,
+    exclude_stale: QueryExcludeStaleFilter,
     paused: QueryPausedFilter,
     last_dag_run_state: QueryLastDagRunStateFilter,
     readable_dags_filter: ReadableDagsFilterDep,
@@ -124,7 +124,7 @@ def recent_dag_runs(
     dags_with_recent_dag_runs_select_filter, _ = paginated_select(
         statement=dags_with_recent_dag_runs_select,
         filters=[
-            only_active,
+            exclude_stale,
             paused,
             dag_id_pattern,
             dag_ids,
diff --git a/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py
index a4398601138..9044f9bb65d 100644
--- a/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py
+++ b/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py
@@ -57,7 +57,7 @@ def trigger_dag_run(
     session: SessionDep,
 ):
     """Trigger a DAG Run."""
-    dm = session.scalar(select(DagModel).where(DagModel.is_active, DagModel.dag_id == dag_id).limit(1))
+    dm = session.scalar(select(DagModel).where(~DagModel.is_stale, DagModel.dag_id == dag_id).limit(1))
     if not dm:
         raise HTTPException(
             status.HTTP_404_NOT_FOUND,
@@ -108,7 +108,7 @@ def clear_dag_run(
     session: SessionDep,
 ):
     """Clear a DAG Run."""
-    dm = session.scalar(select(DagModel).where(DagModel.is_active, DagModel.dag_id == dag_id).limit(1))
+    dm = session.scalar(select(DagModel).where(~DagModel.is_stale, DagModel.dag_id == dag_id).limit(1))
     if not dm:
         raise HTTPException(
             status.HTTP_404_NOT_FOUND,
diff --git a/airflow-core/src/airflow/assets/manager.py b/airflow-core/src/airflow/assets/manager.py
index aa90fe4e5c6..36882e060cb 100644
--- a/airflow-core/src/airflow/assets/manager.py
+++ b/airflow-core/src/airflow/assets/manager.py
@@ -161,7 +161,7 @@ class AssetManager(LoggingMixin):
         session.flush()  # Ensure the event is written earlier than DDRQ entries below.
 
         dags_to_queue_from_asset = {
-            ref.dag for ref in asset_model.consuming_dags if ref.dag.is_active and not ref.dag.is_paused
+            ref.dag for ref in asset_model.consuming_dags if not ref.dag.is_stale and not ref.dag.is_paused
         }
 
         dags_to_queue_from_asset_alias = set()
@@ -181,7 +181,7 @@ class AssetManager(LoggingMixin):
                 dags_to_queue_from_asset_alias |= {
                     alias_ref.dag
                     for alias_ref in asset_alias_model.consuming_dags
-                    if alias_ref.dag.is_active and not alias_ref.dag.is_paused
+                    if not alias_ref.dag.is_stale and not alias_ref.dag.is_paused
                 }
 
         dags_to_queue_from_asset_ref = set(
diff --git a/airflow-core/src/airflow/cli/commands/dag_command.py b/airflow-core/src/airflow/cli/commands/dag_command.py
index 44e14352ad1..197273e4be6 100644
--- a/airflow-core/src/airflow/cli/commands/dag_command.py
+++ b/airflow-core/src/airflow/cli/commands/dag_command.py
@@ -89,7 +89,7 @@ class DAGSchema(SQLAlchemySchema):
     bundle_name = auto_field(dump_only=True)
     bundle_version = auto_field(dump_only=True)
     is_paused = auto_field()
-    is_active = auto_field(dump_only=True)
+    is_stale = auto_field(dump_only=True)
     last_parsed_time = auto_field(dump_only=True)
     last_expired = auto_field(dump_only=True)
     fileloc = auto_field(dump_only=True)
@@ -293,7 +293,7 @@ def _get_dagbag_dag_details(dag: DAG) -> dict:
         "bundle_name": dag.get_bundle_name(),
         "bundle_version": dag.get_bundle_version(),
         "is_paused": dag.get_is_paused(),
-        "is_active": dag.get_is_active(),
+        "is_stale": dag.get_is_stale(),
         "last_parsed_time": None,
         "last_expired": None,
         "fileloc": dag.fileloc,
diff --git a/airflow-core/src/airflow/dag_processing/collection.py b/airflow-core/src/airflow/dag_processing/collection.py
index 4af608d7712..591ad687f99 100644
--- a/airflow-core/src/airflow/dag_processing/collection.py
+++ b/airflow-core/src/airflow/dag_processing/collection.py
@@ -431,7 +431,7 @@ class DagModelOperation(NamedTuple):
             dm.fileloc = dag.fileloc
             dm.relative_fileloc = dag.relative_fileloc
             dm.owners = dag.owner or conf.get("operators", "default_owner")
-            dm.is_active = True
+            dm.is_stale = False
             dm.has_import_errors = False
             dm.last_parsed_time = utcnow()
             if hasattr(dag, "_dag_display_property_value"):
@@ -573,7 +573,7 @@ def _find_active_assets(name_uri_assets: Iterable[tuple[str, str]], session: Ses
                 tuple_(AssetModel.name, AssetModel.uri).in_(name_uri_assets),
                 AssetModel.active.has(),
                 AssetModel.consuming_dags.any(
-                    DagScheduleAssetReference.dag.has(DagModel.is_active & ~DagModel.is_paused)
+                    DagScheduleAssetReference.dag.has(~DagModel.is_stale & ~DagModel.is_paused)
                 ),
             )
         )
diff --git a/airflow-core/src/airflow/dag_processing/manager.py b/airflow-core/src/airflow/dag_processing/manager.py
index 0f5c521df12..7bc046cd663 100644
--- a/airflow-core/src/airflow/dag_processing/manager.py
+++ b/airflow-core/src/airflow/dag_processing/manager.py
@@ -286,7 +286,7 @@ class DagFileProcessorManager(LoggingMixin):
             DagModel.fileloc,
             DagModel.last_parsed_time,
             DagModel.relative_fileloc,
-        ).where(DagModel.is_active, DagModel.bundle_name.in_(bundle_names))
+        ).where(~DagModel.is_stale, DagModel.bundle_name.in_(bundle_names))
         dags_parsed = session.execute(query)
 
         for dag in dags_parsed:
@@ -304,7 +304,7 @@ class DagFileProcessorManager(LoggingMixin):
             deactivated_dagmodel = session.execute(
                 update(DagModel)
                 .where(DagModel.dag_id.in_(to_deactivate))
-                .values(is_active=False)
+                .values(is_stale=True)
                 .execution_options(synchronize_session="fetch")
             )
             deactivated = deactivated_dagmodel.rowcount
diff --git a/airflow-core/src/airflow/migrations/versions/0067_3_0_0_rename_is_active_to_is_stale_column_in_.py b/airflow-core/src/airflow/migrations/versions/0067_3_0_0_rename_is_active_to_is_stale_column_in_.py
new file mode 100644
index 00000000000..09b0aa8e1d6
--- /dev/null
+++ b/airflow-core/src/airflow/migrations/versions/0067_3_0_0_rename_is_active_to_is_stale_column_in_.py
@@ -0,0 +1,52 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+"""
+Rename ``is_active`` to ``is_stale`` column in ``dag`` table.
+
+Revision ID: 959e216a3abb
+Revises: 0e9519b56710
+Create Date: 2025-04-09 17:11:08.379065
+"""
+
+from __future__ import annotations
+
+import sqlalchemy as sa
+from alembic import op
+
+revision = "959e216a3abb"
+down_revision = "0e9519b56710"
+branch_labels = None
+depends_on = None
+airflow_version = "3.0.0"
+
+
+def upgrade():
+    """Rename is_active to is_stale column in DAG table."""
+    with op.batch_alter_table("dag", schema=None) as batch_op:
+        batch_op.alter_column("is_active", new_column_name="is_stale", type_=sa.Boolean)
+
+    op.execute("UPDATE dag SET is_stale = NOT is_stale")
+
+
+def downgrade():
+    """Revert renaming of is_active to is_stale column in DAG table."""
+    with op.batch_alter_table("dag", schema=None) as batch_op:
+        batch_op.alter_column("is_stale", new_column_name="is_active", type_=sa.Boolean)
+
+    op.execute("UPDATE dag SET is_active = NOT is_active")
diff --git a/airflow-core/src/airflow/models/asset.py b/airflow-core/src/airflow/models/asset.py
index 6057f5232da..f14bf3a6367 100644
--- a/airflow-core/src/airflow/models/asset.py
+++ b/airflow-core/src/airflow/models/asset.py
@@ -111,7 +111,7 @@ def remove_references_to_deleted_dags(session: Session):
     for model in models_to_check:
         session.execute(
             delete(model)
-            .where(model.dag_id.in_(select(DagModel.dag_id).where(~DagModel.is_active)))
+            .where(model.dag_id.in_(select(DagModel.dag_id).where(DagModel.is_stale)))
             .execution_options(synchronize_session="fetch")
         )
 
diff --git a/airflow-core/src/airflow/models/dag.py b/airflow-core/src/airflow/models/dag.py
index f60e53d647b..665210331a5 100644
--- a/airflow-core/src/airflow/models/dag.py
+++ b/airflow-core/src/airflow/models/dag.py
@@ -749,7 +749,12 @@ class DAG(TaskSDKDag, LoggingMixin):
     @provide_session
     def get_is_active(self, session=NEW_SESSION) -> None:
         """Return a boolean indicating whether this DAG is active."""
-        return session.scalar(select(DagModel.is_active).where(DagModel.dag_id == self.dag_id))
+        return session.scalar(select(~DagModel.is_stale).where(DagModel.dag_id == self.dag_id))
+
+    @provide_session
+    def get_is_stale(self, session=NEW_SESSION) -> None:
+        """Return a boolean indicating whether this DAG is stale."""
+        return session.scalar(select(DagModel.is_stale).where(DagModel.dag_id == self.dag_id))
 
     @provide_session
     def get_is_paused(self, session=NEW_SESSION) -> None:
@@ -1939,7 +1944,7 @@ class DAG(TaskSDKDag, LoggingMixin):
         if not active_dag_ids:
             return
         for dag in session.scalars(select(DagModel).where(~DagModel.dag_id.in_(active_dag_ids))).all():
-            dag.is_active = False
+            dag.is_stale = True
             session.merge(dag)
         session.commit()
 
@@ -1955,14 +1960,14 @@ class DAG(TaskSDKDag, LoggingMixin):
         :return: None
         """
         for dag in session.scalars(
-            select(DagModel).where(DagModel.last_parsed_time < expiration_date, DagModel.is_active)
+            select(DagModel).where(DagModel.last_parsed_time < expiration_date, ~DagModel.is_stale)
         ):
             log.info(
                 "Deactivating DAG ID %s since it was last touched by the scheduler at %s",
                 dag.dag_id,
                 dag.last_parsed_time.isoformat(),
             )
-            dag.is_active = False
+            dag.is_stale = True
             session.merge(dag)
             session.commit()
 
@@ -2155,7 +2160,7 @@ class DagModel(Base):
     is_paused_at_creation = airflow_conf.getboolean("core", "dags_are_paused_at_creation")
     is_paused = Column(Boolean, default=is_paused_at_creation)
     # Whether that DAG was seen on the last DagBag load
-    is_active = Column(Boolean, default=False)
+    is_stale = Column(Boolean, default=True)
     # Last time the scheduler started
     last_parsed_time = Column(UtcDateTime)
     # Time when the DAG last received a refresh signal
@@ -2304,7 +2309,7 @@ class DagModel(Base):
 
     def get_is_active(self, *, session: Session | None = None) -> bool:
         """Provide interface compatibility to 'DAG'."""
-        return self.is_active
+        return not self.is_stale
 
     @staticmethod
     @provide_session
@@ -2389,14 +2394,14 @@ class DagModel(Base):
             .options(
                 load_only(
                     cls.relative_fileloc,
-                    cls.is_active,
+                    cls.is_stale,
                 ),
             )
         )
 
         for dm in dag_models:
             if dm.relative_fileloc not in rel_filelocs:
-                dm.is_active = False
+                dm.is_stale = True
 
     @classmethod
     def dags_needing_dagruns(cls, session: Session) -> tuple[Query, dict[str, datetime]]:
@@ -2469,7 +2474,7 @@ class DagModel(Base):
             select(cls)
             .where(
                 cls.is_paused == expression.false(),
-                cls.is_active == expression.true(),
+                cls.is_stale == expression.false(),
                 cls.has_import_errors == expression.false(),
                 or_(
                     cls.next_dagrun_create_after <= func.now(),
diff --git a/airflow-core/src/airflow/models/dagrun.py b/airflow-core/src/airflow/models/dagrun.py
index 83097c7ca9e..3f668e1618f 100644
--- a/airflow-core/src/airflow/models/dagrun.py
+++ b/airflow-core/src/airflow/models/dagrun.py
@@ -57,7 +57,7 @@ from sqlalchemy.exc import IntegrityError
 from sqlalchemy.ext.associationproxy import association_proxy
 from sqlalchemy.ext.mutable import MutableDict
 from sqlalchemy.orm import declared_attr, joinedload, relationship, synonym, validates
-from sqlalchemy.sql.expression import case, false, select, true
+from sqlalchemy.sql.expression import case, false, select
 from sqlalchemy.sql.functions import coalesce
 
 from airflow.callbacks.callback_requests import DagCallbackRequest
@@ -509,7 +509,7 @@ class DagRun(Base, LoggingMixin):
             .join(BackfillDagRun, BackfillDagRun.dag_run_id == DagRun.id, isouter=True)
             .where(
                 DagModel.is_paused == false(),
-                DagModel.is_active == true(),
+                DagModel.is_stale == false(),
             )
             .options(joinedload(cls.task_instances))
             .order_by(
@@ -560,7 +560,7 @@ class DagRun(Base, LoggingMixin):
                 and_(
                     DagModel.dag_id == cls.dag_id,
                     DagModel.is_paused == false(),
-                    DagModel.is_active == true(),
+                    DagModel.is_stale == false(),
                 ),
             )
             .join(
diff --git a/airflow-core/src/airflow/models/dagwarning.py b/airflow-core/src/airflow/models/dagwarning.py
index 65043ecd783..b88158683ea 100644
--- a/airflow-core/src/airflow/models/dagwarning.py
+++ b/airflow-core/src/airflow/models/dagwarning.py
@@ -20,7 +20,7 @@ from __future__ import annotations
 from enum import Enum
 from typing import TYPE_CHECKING
 
-from sqlalchemy import Column, ForeignKeyConstraint, Index, String, Text, delete, false, select
+from sqlalchemy import Column, ForeignKeyConstraint, Index, String, Text, delete, select, true
 
 from airflow.models.base import Base, StringID
 from airflow.models.dag import DagModel
@@ -80,10 +80,10 @@ class DagWarning(Base):
         :return: None
         """
         if session.get_bind().dialect.name == "sqlite":
-            dag_ids_stmt = select(DagModel.dag_id).where(DagModel.is_active == false())
+            dag_ids_stmt = select(DagModel.dag_id).where(DagModel.is_stale == true())
             query = delete(cls).where(cls.dag_id.in_(dag_ids_stmt.scalar_subquery()))
         else:
-            query = delete(cls).where(cls.dag_id == DagModel.dag_id, DagModel.is_active == false())
+            query = delete(cls).where(cls.dag_id == DagModel.dag_id, DagModel.is_stale == true())
 
         session.execute(query.execution_options(synchronize_session=False))
         session.commit()
diff --git a/airflow-core/src/airflow/models/serialized_dag.py b/airflow-core/src/airflow/models/serialized_dag.py
index f78d9492830..35f7ca55a82 100644
--- a/airflow-core/src/airflow/models/serialized_dag.py
+++ b/airflow-core/src/airflow/models/serialized_dag.py
@@ -647,7 +647,7 @@ class SerializedDagModel(Base):
                     & (cls.created_at == latest_sdag_subquery.c.max_created),
                 )
                 .join(cls.dag_model)
-                .where(DagModel.is_active)
+                .where(~DagModel.is_stale)
             )
             iterator = [(dag_id, json.loads(deps_data) if deps_data else []) for dag_id, deps_data in query]
         else:
@@ -662,7 +662,7 @@ class SerializedDagModel(Base):
                     & (cls.created_at == latest_sdag_subquery.c.max_created),
                 )
                 .join(cls.dag_model)
-                .where(DagModel.is_active)
+                .where(~DagModel.is_stale)
             ).all()
 
         resolver = _DagDependenciesResolver(dag_id_dependencies=iterator, session=session)
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
index 882163e72ad..d21449cb0b1 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
@@ -360,10 +360,10 @@ export const UseDagsServiceRecentDagRunsKeyFn = (
     dagIdPattern,
     dagIds,
     dagRunsLimit,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     owners,
     paused,
     tags,
@@ -373,10 +373,10 @@ export const UseDagsServiceRecentDagRunsKeyFn = (
     dagIdPattern?: string;
     dagIds?: string[];
     dagRunsLimit?: number;
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     owners?: string[];
     paused?: boolean;
     tags?: string[];
@@ -391,10 +391,10 @@ export const UseDagsServiceRecentDagRunsKeyFn = (
       dagIdPattern,
       dagIds,
       dagRunsLimit,
+      excludeStale,
       lastDagRunState,
       limit,
       offset,
-      onlyActive,
       owners,
       paused,
       tags,
@@ -778,10 +778,10 @@ export const UseDagServiceGetDagsKeyFn = (
     dagRunStartDateGte,
     dagRunStartDateLte,
     dagRunState,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     orderBy,
     owners,
     paused,
@@ -795,10 +795,10 @@ export const UseDagServiceGetDagsKeyFn = (
     dagRunStartDateGte?: string;
     dagRunStartDateLte?: string;
     dagRunState?: string[];
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     orderBy?: string;
     owners?: string[];
     paused?: boolean;
@@ -817,10 +817,10 @@ export const UseDagServiceGetDagsKeyFn = (
       dagRunStartDateGte,
       dagRunStartDateLte,
       dagRunState,
+      excludeStale,
       lastDagRunState,
       limit,
       offset,
-      onlyActive,
       orderBy,
       owners,
       paused,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
index ec3ce809f90..e3940dd917e 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
@@ -456,7 +456,7 @@ export const ensureUseConnectionServiceGetConnectionsData = (
  * @param data.dagIds
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
@@ -469,10 +469,10 @@ export const ensureUseDagsServiceRecentDagRunsData = (
     dagIdPattern,
     dagIds,
     dagRunsLimit,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     owners,
     paused,
     tags,
@@ -482,10 +482,10 @@ export const ensureUseDagsServiceRecentDagRunsData = (
     dagIdPattern?: string;
     dagIds?: string[];
     dagRunsLimit?: number;
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     owners?: string[];
     paused?: boolean;
     tags?: string[];
@@ -498,10 +498,10 @@ export const ensureUseDagsServiceRecentDagRunsData = (
       dagIdPattern,
       dagIds,
       dagRunsLimit,
+      excludeStale,
       lastDagRunState,
       limit,
       offset,
-      onlyActive,
       owners,
       paused,
       tags,
@@ -513,10 +513,10 @@ export const ensureUseDagsServiceRecentDagRunsData = (
         dagIdPattern,
         dagIds,
         dagRunsLimit,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         owners,
         paused,
         tags,
@@ -1035,7 +1035,7 @@ export const ensureUseDagWarningServiceListDagWarningsData = (
  * @param data.owners
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @param data.dagRunStartDateGte
@@ -1057,10 +1057,10 @@ export const ensureUseDagServiceGetDagsData = (
     dagRunStartDateGte,
     dagRunStartDateLte,
     dagRunState,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     orderBy,
     owners,
     paused,
@@ -1074,10 +1074,10 @@ export const ensureUseDagServiceGetDagsData = (
     dagRunStartDateGte?: string;
     dagRunStartDateLte?: string;
     dagRunState?: string[];
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     orderBy?: string;
     owners?: string[];
     paused?: boolean;
@@ -1094,10 +1094,10 @@ export const ensureUseDagServiceGetDagsData = (
       dagRunStartDateGte,
       dagRunStartDateLte,
       dagRunState,
+      excludeStale,
       lastDagRunState,
       limit,
       offset,
-      onlyActive,
       orderBy,
       owners,
       paused,
@@ -1113,10 +1113,10 @@ export const ensureUseDagServiceGetDagsData = (
         dagRunStartDateGte,
         dagRunStartDateLte,
         dagRunState,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         orderBy,
         owners,
         paused,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
index e7d9f66ea7b..f116d2ab7df 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -456,7 +456,7 @@ export const prefetchUseConnectionServiceGetConnections = (
  * @param data.dagIds
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
@@ -469,10 +469,10 @@ export const prefetchUseDagsServiceRecentDagRuns = (
     dagIdPattern,
     dagIds,
     dagRunsLimit,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     owners,
     paused,
     tags,
@@ -482,10 +482,10 @@ export const prefetchUseDagsServiceRecentDagRuns = (
     dagIdPattern?: string;
     dagIds?: string[];
     dagRunsLimit?: number;
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     owners?: string[];
     paused?: boolean;
     tags?: string[];
@@ -498,10 +498,10 @@ export const prefetchUseDagsServiceRecentDagRuns = (
       dagIdPattern,
       dagIds,
       dagRunsLimit,
+      excludeStale,
       lastDagRunState,
       limit,
       offset,
-      onlyActive,
       owners,
       paused,
       tags,
@@ -513,10 +513,10 @@ export const prefetchUseDagsServiceRecentDagRuns = (
         dagIdPattern,
         dagIds,
         dagRunsLimit,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         owners,
         paused,
         tags,
@@ -1035,7 +1035,7 @@ export const prefetchUseDagWarningServiceListDagWarnings = (
  * @param data.owners
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @param data.dagRunStartDateGte
@@ -1057,10 +1057,10 @@ export const prefetchUseDagServiceGetDags = (
     dagRunStartDateGte,
     dagRunStartDateLte,
     dagRunState,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     orderBy,
     owners,
     paused,
@@ -1074,10 +1074,10 @@ export const prefetchUseDagServiceGetDags = (
     dagRunStartDateGte?: string;
     dagRunStartDateLte?: string;
     dagRunState?: string[];
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     orderBy?: string;
     owners?: string[];
     paused?: boolean;
@@ -1094,10 +1094,10 @@ export const prefetchUseDagServiceGetDags = (
       dagRunStartDateGte,
       dagRunStartDateLte,
       dagRunState,
+      excludeStale,
       lastDagRunState,
       limit,
       offset,
-      onlyActive,
       orderBy,
       owners,
       paused,
@@ -1113,10 +1113,10 @@ export const prefetchUseDagServiceGetDags = (
         dagRunStartDateGte,
         dagRunStartDateLte,
         dagRunState,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         orderBy,
         owners,
         paused,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
index 6bdca798e7f..33c2095d8cf 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
@@ -590,7 +590,7 @@ export const useConnectionServiceGetConnections = <
  * @param data.dagIds
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
@@ -606,10 +606,10 @@ export const useDagsServiceRecentDagRuns = <
     dagIdPattern,
     dagIds,
     dagRunsLimit,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     owners,
     paused,
     tags,
@@ -619,10 +619,10 @@ export const useDagsServiceRecentDagRuns = <
     dagIdPattern?: string;
     dagIds?: string[];
     dagRunsLimit?: number;
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     owners?: string[];
     paused?: boolean;
     tags?: string[];
@@ -638,10 +638,10 @@ export const useDagsServiceRecentDagRuns = <
         dagIdPattern,
         dagIds,
         dagRunsLimit,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         owners,
         paused,
         tags,
@@ -655,10 +655,10 @@ export const useDagsServiceRecentDagRuns = <
         dagIdPattern,
         dagIds,
         dagRunsLimit,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         owners,
         paused,
         tags,
@@ -1270,7 +1270,7 @@ export const useDagWarningServiceListDagWarnings = <
  * @param data.owners
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @param data.dagRunStartDateGte
@@ -1295,10 +1295,10 @@ export const useDagServiceGetDags = <
     dagRunStartDateGte,
     dagRunStartDateLte,
     dagRunState,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     orderBy,
     owners,
     paused,
@@ -1312,10 +1312,10 @@ export const useDagServiceGetDags = <
     dagRunStartDateGte?: string;
     dagRunStartDateLte?: string;
     dagRunState?: string[];
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     orderBy?: string;
     owners?: string[];
     paused?: boolean;
@@ -1335,10 +1335,10 @@ export const useDagServiceGetDags = <
         dagRunStartDateGte,
         dagRunStartDateLte,
         dagRunState,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         orderBy,
         owners,
         paused,
@@ -1356,10 +1356,10 @@ export const useDagServiceGetDags = <
         dagRunStartDateGte,
         dagRunStartDateLte,
         dagRunState,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         orderBy,
         owners,
         paused,
@@ -3877,7 +3877,7 @@ export const useDagRunServicePatchDagRun = <
  * @param data.tagsMatchMode
  * @param data.owners
  * @param data.dagIdPattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @returns DAGCollectionResponse Successful Response
@@ -3894,10 +3894,10 @@ export const useDagServicePatchDags = <
       TError,
       {
         dagIdPattern?: string;
+        excludeStale?: boolean;
         lastDagRunState?: DagRunState;
         limit?: number;
         offset?: number;
-        onlyActive?: boolean;
         owners?: string[];
         paused?: boolean;
         requestBody: DAGPatchBody;
@@ -3915,10 +3915,10 @@ export const useDagServicePatchDags = <
     TError,
     {
       dagIdPattern?: string;
+      excludeStale?: boolean;
       lastDagRunState?: DagRunState;
       limit?: number;
       offset?: number;
-      onlyActive?: boolean;
       owners?: string[];
       paused?: boolean;
       requestBody: DAGPatchBody;
@@ -3930,10 +3930,10 @@ export const useDagServicePatchDags = <
   >({
     mutationFn: ({
       dagIdPattern,
+      excludeStale,
       lastDagRunState,
       limit,
       offset,
-      onlyActive,
       owners,
       paused,
       requestBody,
@@ -3943,10 +3943,10 @@ export const useDagServicePatchDags = <
     }) =>
       DagService.patchDags({
         dagIdPattern,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         owners,
         paused,
         requestBody,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
index 5fdc58948f1..90411f94dd4 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
@@ -567,7 +567,7 @@ export const useConnectionServiceGetConnectionsSuspense = <
  * @param data.dagIds
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
@@ -583,10 +583,10 @@ export const useDagsServiceRecentDagRunsSuspense = <
     dagIdPattern,
     dagIds,
     dagRunsLimit,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     owners,
     paused,
     tags,
@@ -596,10 +596,10 @@ export const useDagsServiceRecentDagRunsSuspense = <
     dagIdPattern?: string;
     dagIds?: string[];
     dagRunsLimit?: number;
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     owners?: string[];
     paused?: boolean;
     tags?: string[];
@@ -615,10 +615,10 @@ export const useDagsServiceRecentDagRunsSuspense = <
         dagIdPattern,
         dagIds,
         dagRunsLimit,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         owners,
         paused,
         tags,
@@ -632,10 +632,10 @@ export const useDagsServiceRecentDagRunsSuspense = <
         dagIdPattern,
         dagIds,
         dagRunsLimit,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         owners,
         paused,
         tags,
@@ -1247,7 +1247,7 @@ export const useDagWarningServiceListDagWarningsSuspense = <
  * @param data.owners
  * @param data.dagIdPattern
  * @param data.dagDisplayNamePattern
- * @param data.onlyActive
+ * @param data.excludeStale
  * @param data.paused
  * @param data.lastDagRunState
  * @param data.dagRunStartDateGte
@@ -1272,10 +1272,10 @@ export const useDagServiceGetDagsSuspense = <
     dagRunStartDateGte,
     dagRunStartDateLte,
     dagRunState,
+    excludeStale,
     lastDagRunState,
     limit,
     offset,
-    onlyActive,
     orderBy,
     owners,
     paused,
@@ -1289,10 +1289,10 @@ export const useDagServiceGetDagsSuspense = <
     dagRunStartDateGte?: string;
     dagRunStartDateLte?: string;
     dagRunState?: string[];
+    excludeStale?: boolean;
     lastDagRunState?: DagRunState;
     limit?: number;
     offset?: number;
-    onlyActive?: boolean;
     orderBy?: string;
     owners?: string[];
     paused?: boolean;
@@ -1312,10 +1312,10 @@ export const useDagServiceGetDagsSuspense = <
         dagRunStartDateGte,
         dagRunStartDateLte,
         dagRunState,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         orderBy,
         owners,
         paused,
@@ -1333,10 +1333,10 @@ export const useDagServiceGetDagsSuspense = <
         dagRunStartDateGte,
         dagRunStartDateLte,
         dagRunState,
+        excludeStale,
         lastDagRunState,
         limit,
         offset,
-        onlyActive,
         orderBy,
         owners,
         paused,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
index 52faef2db08..66b2fed275a 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
@@ -1704,9 +1704,9 @@ export const $DAGDetailsResponse = {
       type: "boolean",
       title: "Is Paused",
     },
-    is_active: {
+    is_stale: {
       type: "boolean",
-      title: "Is Active",
+      title: "Is Stale",
     },
     last_parsed_time: {
       anyOf: [
@@ -2037,7 +2037,7 @@ export const $DAGDetailsResponse = {
     "dag_id",
     "dag_display_name",
     "is_paused",
-    "is_active",
+    "is_stale",
     "last_parsed_time",
     "last_expired",
     "bundle_name",
@@ -2105,9 +2105,9 @@ export const $DAGResponse = {
       type: "boolean",
       title: "Is Paused",
     },
-    is_active: {
+    is_stale: {
       type: "boolean",
-      title: "Is Active",
+      title: "Is Stale",
     },
     last_parsed_time: {
       anyOf: [
@@ -2293,7 +2293,7 @@ export const $DAGResponse = {
     "dag_id",
     "dag_display_name",
     "is_paused",
-    "is_active",
+    "is_stale",
     "last_parsed_time",
     "last_expired",
     "bundle_name",
@@ -2925,9 +2925,9 @@ export const $DAGWithLatestDagRunsResponse = {
       type: "boolean",
       title: "Is Paused",
     },
-    is_active: {
+    is_stale: {
       type: "boolean",
-      title: "Is Active",
+      title: "Is Stale",
     },
     last_parsed_time: {
       anyOf: [
@@ -3132,7 +3132,7 @@ export const $DAGWithLatestDagRunsResponse = {
     "dag_id",
     "dag_display_name",
     "is_paused",
-    "is_active",
+    "is_stale",
     "last_parsed_time",
     "last_expired",
     "bundle_name",
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
index b322d670c8e..5436069bd8b 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
@@ -947,7 +947,7 @@ export class DagsService {
    * @param data.dagIds
    * @param data.dagIdPattern
    * @param data.dagDisplayNamePattern
-   * @param data.onlyActive
+   * @param data.excludeStale
    * @param data.paused
    * @param data.lastDagRunState
    * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
@@ -967,7 +967,7 @@ export class DagsService {
         dag_ids: data.dagIds,
         dag_id_pattern: data.dagIdPattern,
         dag_display_name_pattern: data.dagDisplayNamePattern,
-        only_active: data.onlyActive,
+        exclude_stale: data.excludeStale,
         paused: data.paused,
         last_dag_run_state: data.lastDagRunState,
       },
@@ -1709,7 +1709,7 @@ export class DagService {
    * @param data.owners
    * @param data.dagIdPattern
    * @param data.dagDisplayNamePattern
-   * @param data.onlyActive
+   * @param data.excludeStale
    * @param data.paused
    * @param data.lastDagRunState
    * @param data.dagRunStartDateGte
@@ -1733,7 +1733,7 @@ export class DagService {
         owners: data.owners,
         dag_id_pattern: data.dagIdPattern,
         dag_display_name_pattern: data.dagDisplayNamePattern,
-        only_active: data.onlyActive,
+        exclude_stale: data.excludeStale,
         paused: data.paused,
         last_dag_run_state: data.lastDagRunState,
         dag_run_start_date_gte: data.dagRunStartDateGte,
@@ -1763,7 +1763,7 @@ export class DagService {
    * @param data.tagsMatchMode
    * @param data.owners
    * @param data.dagIdPattern
-   * @param data.onlyActive
+   * @param data.excludeStale
    * @param data.paused
    * @param data.lastDagRunState
    * @returns DAGCollectionResponse Successful Response
@@ -1781,7 +1781,7 @@ export class DagService {
         tags_match_mode: data.tagsMatchMode,
         owners: data.owners,
         dag_id_pattern: data.dagIdPattern,
-        only_active: data.onlyActive,
+        exclude_stale: data.excludeStale,
         paused: data.paused,
         last_dag_run_state: data.lastDagRunState,
       },
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
index 2b22c105fd8..b56aab97539 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
@@ -544,7 +544,7 @@ export type DAGDetailsResponse = {
   dag_id: string;
   dag_display_name: string;
   is_paused: boolean;
-  is_active: boolean;
+  is_stale: boolean;
   last_parsed_time: string | null;
   last_expired: string | null;
   bundle_name: string | null;
@@ -608,7 +608,7 @@ export type DAGResponse = {
   dag_id: string;
   dag_display_name: string;
   is_paused: boolean;
-  is_active: boolean;
+  is_stale: boolean;
   last_parsed_time: string | null;
   last_expired: string | null;
   bundle_name: string | null;
@@ -784,7 +784,7 @@ export type DAGWithLatestDagRunsResponse = {
   dag_id: string;
   dag_display_name: string;
   is_paused: boolean;
-  is_active: boolean;
+  is_stale: boolean;
   last_parsed_time: string | null;
   last_expired: string | null;
   bundle_name: string | null;
@@ -1915,10 +1915,10 @@ export type RecentDagRunsData = {
   dagIdPattern?: string | null;
   dagIds?: Array<string> | null;
   dagRunsLimit?: number;
+  excludeStale?: boolean;
   lastDagRunState?: DagRunState | null;
   limit?: number;
   offset?: number;
-  onlyActive?: boolean;
   owners?: Array<string>;
   paused?: boolean | null;
   tags?: Array<string>;
@@ -2135,10 +2135,10 @@ export type GetDagsData = {
   dagRunStartDateGte?: string | null;
   dagRunStartDateLte?: string | null;
   dagRunState?: Array<string>;
+  excludeStale?: boolean;
   lastDagRunState?: DagRunState | null;
   limit?: number;
   offset?: number;
-  onlyActive?: boolean;
   orderBy?: string;
   owners?: Array<string>;
   paused?: boolean | null;
@@ -2150,10 +2150,10 @@ export type GetDagsResponse = DAGCollectionResponse;
 
 export type PatchDagsData = {
   dagIdPattern?: string | null;
+  excludeStale?: boolean;
   lastDagRunState?: DagRunState | null;
   limit?: number;
   offset?: number;
-  onlyActive?: boolean;
   owners?: Array<string>;
   paused?: boolean | null;
   requestBody: DAGPatchBody;
diff --git a/airflow-core/src/airflow/ui/src/mocks/handlers/dag.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/dag.ts
index 99875d862c4..cd4a0eaee43 100644
--- a/airflow-core/src/airflow/ui/src/mocks/handlers/dag.ts
+++ b/airflow-core/src/airflow/ui/src/mocks/handlers/dag.ts
@@ -36,9 +36,9 @@ export const MOCK_DAG = {
   fileloc: "/airflow/dags/tutorial_taskflow_api.py",
   has_import_errors: false,
   has_task_concurrency_limits: false,
-  is_active: true,
   is_paused: false,
   is_paused_upon_creation: null,
+  is_stale: false,
   last_expired: null,
   last_parsed: "2025-01-13T04:33:54.141792Z",
   last_parsed_time: "2025-01-13T04:34:13.543097Z",
diff --git a/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts
index 00fceee83af..85c82d5c6e3 100644
--- a/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts
+++ b/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts
@@ -32,8 +32,8 @@ export const handlers: Array<HttpHandler> = [
       fileloc: "/airflow/dags/tutorial_taskflow_api.py",
       has_import_errors: false,
       has_task_concurrency_limits: false,
-      is_active: true,
       is_paused: false,
+      is_stale: false,
       last_parsed_time: "2025-01-13T07:34:01.593459Z",
       latest_dag_runs: [
         {
@@ -68,8 +68,8 @@ export const handlers: Array<HttpHandler> = [
       fileloc: "/airflow/dags/tutorial_taskflow_api_failed.py",
       has_import_errors: false,
       has_task_concurrency_limits: false,
-      is_active: true,
       is_paused: false,
+      is_stale: false,
       last_parsed_time: "2025-01-13T07:34:01.593459Z",
       latest_dag_runs: [
         {
@@ -126,8 +126,8 @@ export const handlers: Array<HttpHandler> = [
       fileloc: "/airflow/dags/tutorial_taskflow_api_failed.py",
       has_import_errors: false,
       has_task_concurrency_limits: false,
-      is_active: true,
       is_paused: false,
+      is_stale: false,
       last_expired: null,
       last_parsed_time: "2025-01-13T06:45:33.009609Z",
       max_active_runs: 16,
@@ -152,8 +152,8 @@ export const handlers: Array<HttpHandler> = [
       fileloc: "/airflow/dags/tutorial_taskflow_api_success.py",
       has_import_errors: false,
       has_task_concurrency_limits: false,
-      is_active: true,
       is_paused: false,
+      is_stale: false,
       last_expired: null,
       last_parsed_time: "2025-01-13T06:45:33.009609Z",
       max_active_runs: 16,
diff --git a/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx b/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx
index d5b15934de3..6efc81a674d 100644
--- a/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx
@@ -36,8 +36,8 @@ const mockDag = {
   fileloc: "/files/dags/nested_task_groups.py",
   has_import_errors: false,
   has_task_concurrency_limits: false,
-  is_active: true,
   is_paused: false,
+  is_stale: false,
   last_expired: null,
   last_parsed_time: "2024-08-22T13:50:10.372238+00:00",
   latest_dag_runs: [],
diff --git a/airflow-core/src/airflow/utils/db.py b/airflow-core/src/airflow/utils/db.py
index 49e9defe7ae..a563bbebb0a 100644
--- a/airflow-core/src/airflow/utils/db.py
+++ b/airflow-core/src/airflow/utils/db.py
@@ -92,7 +92,7 @@ _REVISION_HEADS_MAP: dict[str, str] = {
     "2.9.2": "686269002441",
     "2.10.0": "22ed7efa9da2",
     "2.10.3": "5f2621c13b39",
-    "3.0.0": "0e9519b56710",
+    "3.0.0": "959e216a3abb",
 }
 
 
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py
index 0cd6dc1a6c1..92bb7b80488 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_backfills.py
@@ -97,7 +97,7 @@ class TestBackfillEndpoint:
             dag_model = DagModel(
                 dag_id=f"{dag_id_prefix}_{num}",
                 fileloc=f"/tmp/dag_{num}.py",
-                is_active=True,
+                is_stale=False,
                 timetable_summary="0 0 * * *",
                 is_paused=is_paused,
             )
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
index a5c903e45ba..a560e5823fe 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
@@ -1232,7 +1232,7 @@ class TestTriggerDagRun:
             dag_id="inactive",
             fileloc="/tmp/dag_del_1.py",
             timetable_summary="2 2 * * *",
-            is_active=False,
+            is_stale=True,
             is_paused=True,
             owners="test_owner,another_test_owner",
             next_dagrun=datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
@@ -1242,7 +1242,7 @@ class TestTriggerDagRun:
             dag_id="import_errors",
             fileloc="/tmp/dag_del_2.py",
             timetable_summary="2 2 * * *",
-            is_active=True,
+            is_stale=False,
             owners="test_owner,another_test_owner",
             next_dagrun=datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
         )
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_stats.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_stats.py
index a4e15cbb714..69e9a65ac24 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_stats.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_stats.py
@@ -51,7 +51,7 @@ class TestDagStatsEndpoint:
             dag_id=DAG1_ID,
             fileloc="/tmp/dag_stats_1.py",
             timetable_summary="2 2 * * *",
-            is_active=False,
+            is_stale=True,
             is_paused=True,
             owners="test_owner,another_test_owner",
             next_dagrun=datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
@@ -76,7 +76,7 @@ class TestDagStatsEndpoint:
             dag_id=DAG2_ID,
             fileloc="/tmp/dag_stats_2.py",
             timetable_summary="2 2 * * *",
-            is_active=False,
+            is_stale=True,
             is_paused=True,
             owners="test_owner,another_test_owner",
             next_dagrun=datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
@@ -93,7 +93,7 @@ class TestDagStatsEndpoint:
             dag_id=DAG3_ID,
             fileloc="/tmp/dag_stats_3.py",
             timetable_summary="2 2 * * *",
-            is_active=False,
+            is_stale=True,
             is_paused=True,
             owners="test_owner,another_test_owner",
             next_dagrun=datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_tags.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_tags.py
index b9208b6ac9b..5b8036d500c 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_tags.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_tags.py
@@ -60,7 +60,7 @@ class TestDagEndpoint:
             dag_id=DAG3_ID,
             fileloc="/tmp/dag_del_1.py",
             timetable_summary="2 2 * * *",
-            is_active=False,
+            is_stale=True,
             is_paused=True,
             owners="test_owner,another_test_owner",
             next_dagrun=datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
index 428fa9b3c14..95693fdcbf6 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
@@ -67,7 +67,7 @@ class TestDagEndpoint:
             relative_fileloc="dag_del_1.py",
             fileloc="/tmp/dag_del_1.py",
             timetable_summary="2 2 * * *",
-            is_active=False,
+            is_stale=True,
             is_paused=True,
             owners="test_owner,another_test_owner",
             next_dagrun=datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
@@ -154,17 +154,17 @@ class TestGetDags(TestDagEndpoint):
             ({"limit": 1}, 2, [DAG1_ID]),
             ({"offset": 1}, 2, [DAG2_ID]),
             ({"tags": ["example"]}, 1, [DAG1_ID]),
-            ({"only_active": False}, 3, [DAG1_ID, DAG2_ID, DAG3_ID]),
-            ({"paused": True, "only_active": False}, 1, [DAG3_ID]),
+            ({"exclude_stale": False}, 3, [DAG1_ID, DAG2_ID, DAG3_ID]),
+            ({"paused": True, "exclude_stale": False}, 1, [DAG3_ID]),
             ({"paused": False}, 2, [DAG1_ID, DAG2_ID]),
             ({"owners": ["airflow"]}, 2, [DAG1_ID, DAG2_ID]),
-            ({"owners": ["test_owner"], "only_active": False}, 1, [DAG3_ID]),
-            ({"last_dag_run_state": "success", "only_active": False}, 1, [DAG3_ID]),
-            ({"last_dag_run_state": "failed", "only_active": False}, 1, [DAG1_ID]),
+            ({"owners": ["test_owner"], "exclude_stale": False}, 1, [DAG3_ID]),
+            ({"last_dag_run_state": "success", "exclude_stale": False}, 1, [DAG3_ID]),
+            ({"last_dag_run_state": "failed", "exclude_stale": False}, 1, [DAG1_ID]),
             ({"dag_run_state": "failed"}, 1, [DAG1_ID]),
-            ({"dag_run_state": "failed", "only_active": False}, 2, [DAG1_ID, DAG3_ID]),
+            ({"dag_run_state": "failed", "exclude_stale": False}, 2, [DAG1_ID, DAG3_ID]),
             (
-                {"dag_run_start_date_gte": DAG3_START_DATE_2.isoformat(), "only_active": False},
+                {"dag_run_start_date_gte": DAG3_START_DATE_2.isoformat(), "exclude_stale": False},
                 1,
                 [DAG3_ID],
             ),
@@ -179,7 +179,7 @@ class TestGetDags(TestDagEndpoint):
             (
                 {
                     "dag_run_end_date_lte": (datetime.now(tz=timezone.utc) + timedelta(days=1)).isoformat(),
-                    "only_active": False,
+                    "exclude_stale": False,
                 },
                 2,
                 [DAG1_ID, DAG3_ID],
@@ -188,7 +188,7 @@ class TestGetDags(TestDagEndpoint):
                 {
                     "dag_run_end_date_gte": DAG3_START_DATE_2.isoformat(),
                     "dag_run_end_date_lte": (datetime.now(tz=timezone.utc) + timedelta(days=1)).isoformat(),
-                    "only_active": False,
+                    "exclude_stale": False,
                     "last_dag_run_state": "success",
                 },
                 1,
@@ -208,7 +208,7 @@ class TestGetDags(TestDagEndpoint):
                     "dag_run_start_date_lte": (DAG3_START_DATE_1 + timedelta(days=1)).isoformat(),
                     "last_dag_run_state": "success",
                     "dag_run_state": "failed",
-                    "only_active": False,
+                    "exclude_stale": False,
                 },
                 1,
                 [DAG3_ID],
@@ -217,16 +217,16 @@ class TestGetDags(TestDagEndpoint):
             ({"order_by": "-dag_id"}, 2, [DAG2_ID, DAG1_ID]),
             ({"order_by": "-dag_display_name"}, 2, [DAG2_ID, DAG1_ID]),
             ({"order_by": "dag_display_name"}, 2, [DAG1_ID, DAG2_ID]),
-            ({"order_by": "next_dagrun", "only_active": False}, 3, [DAG3_ID, DAG1_ID, DAG2_ID]),
-            ({"order_by": "last_run_state", "only_active": False}, 3, [DAG1_ID, DAG3_ID, DAG2_ID]),
-            ({"order_by": "-last_run_state", "only_active": False}, 3, [DAG3_ID, DAG1_ID, DAG2_ID]),
+            ({"order_by": "next_dagrun", "exclude_stale": False}, 3, [DAG3_ID, DAG1_ID, DAG2_ID]),
+            ({"order_by": "last_run_state", "exclude_stale": False}, 3, [DAG1_ID, DAG3_ID, DAG2_ID]),
+            ({"order_by": "-last_run_state", "exclude_stale": False}, 3, [DAG3_ID, DAG1_ID, DAG2_ID]),
             (
-                {"order_by": "last_run_start_date", "only_active": False},
+                {"order_by": "last_run_start_date", "exclude_stale": False},
                 3,
                 [DAG1_ID, DAG3_ID, DAG2_ID],
             ),
             (
-                {"order_by": "-last_run_start_date", "only_active": False},
+                {"order_by": "-last_run_start_date", "exclude_stale": False},
                 3,
                 [DAG3_ID, DAG1_ID, DAG2_ID],
             ),
@@ -305,21 +305,21 @@ class TestPatchDags(TestDagEndpoint):
         [
             ({"update_mask": ["field_1", "is_paused"]}, {"is_paused": True}, 400, None, None),
             (
-                {"only_active": False},
+                {"exclude_stale": False},
                 {"is_paused": True},
                 200,
                 [],
                 [],
             ),  # no-op because the dag_id_pattern is not provided
             (
-                {"only_active": False, "dag_id_pattern": "~"},
+                {"exclude_stale": False, "dag_id_pattern": "~"},
                 {"is_paused": True},
                 200,
                 [DAG1_ID, DAG2_ID, DAG3_ID],
                 [DAG1_ID, DAG2_ID, DAG3_ID],
             ),
             (
-                {"only_active": False, "dag_id_pattern": "~"},
+                {"exclude_stale": False, "dag_id_pattern": "~"},
                 {"is_paused": False},
                 200,
                 [DAG1_ID, DAG2_ID, DAG3_ID],
@@ -365,7 +365,7 @@ class TestPatchDags(TestDagEndpoint):
     def test_patch_dags_should_call_authorized_dag_ids(self, mock_get_authorized_dag_ids, test_client):
         mock_get_authorized_dag_ids.return_value = {DAG1_ID, DAG2_ID}
         response = test_client.patch(
-            "/dags", json={"is_paused": False}, params={"only_active": False, "dag_id_pattern": "~"}
+            "/dags", json={"is_paused": False}, params={"exclude_stale": False, "dag_id_pattern": "~"}
         )
         mock_get_authorized_dag_ids.assert_called_once_with(user=mock.ANY, method="PUT")
         assert response.status_code == 200
@@ -421,7 +421,7 @@ class TestDagDetails(TestDagEndpoint):
             "file_token": file_token,
             "has_import_errors": False,
             "has_task_concurrency_limits": True,
-            "is_active": True,
+            "is_stale": False,
             "is_paused": False,
             "is_paused_upon_creation": None,
             "latest_dag_version": {
@@ -499,7 +499,7 @@ class TestGetDag(TestDagEndpoint):
             "fileloc": __file__,
             "file_token": file_token,
             "is_paused": False,
-            "is_active": True,
+            "is_stale": False,
             "owners": ["airflow"],
             "timetable_summary": None,
             "tags": [],
diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_backfills.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_backfills.py
index 968b8489a76..06066fa2f1f 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_backfills.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_backfills.py
@@ -63,7 +63,7 @@ class TestBackfillEndpoint:
             dag_model = DagModel(
                 dag_id=f"{dag_id_prefix}_{num}",
                 fileloc=f"/tmp/dag_{num}.py",
-                is_active=True,
+                is_stale=False,
                 timetable_summary="0 0 * * *",
                 is_paused=is_paused,
             )
diff --git a/airflow-core/tests/unit/assets/test_manager.py b/airflow-core/tests/unit/assets/test_manager.py
index 3daa6b7361b..76d47238c19 100644
--- a/airflow-core/tests/unit/assets/test_manager.py
+++ b/airflow-core/tests/unit/assets/test_manager.py
@@ -88,8 +88,8 @@ class TestAssetManager:
         asset_manager = AssetManager()
 
         asset = Asset(uri="test://asset1", name="test_asset_uri", group="asset")
-        dag1 = DagModel(dag_id="dag1", is_active=True)
-        dag2 = DagModel(dag_id="dag2", is_active=True)
+        dag1 = DagModel(dag_id="dag1", is_stale=False)
+        dag2 = DagModel(dag_id="dag2", is_stale=False)
         session.add_all([dag1, dag2])
 
         asm = AssetModel(uri="test://asset1/", name="test_asset_uri", group="asset")
@@ -107,8 +107,8 @@ class TestAssetManager:
 
     @pytest.mark.usefixtures("clear_assets")
     def test_register_asset_change_with_alias(self, session, dag_maker, mock_task_instance):
-        consumer_dag_1 = DagModel(dag_id="conumser_1", is_active=True, fileloc="dag1.py")
-        consumer_dag_2 = DagModel(dag_id="conumser_2", is_active=True, fileloc="dag2.py")
+        consumer_dag_1 = DagModel(dag_id="conumser_1", is_stale=False, fileloc="dag1.py")
+        consumer_dag_2 = DagModel(dag_id="conumser_2", is_stale=False, fileloc="dag2.py")
         session.add_all([consumer_dag_1, consumer_dag_2])
 
         asm = AssetModel(uri="test://asset1/", name="test_asset_uri", group="asset")
diff --git a/airflow-core/tests/unit/dag_processing/test_collection.py b/airflow-core/tests/unit/dag_processing/test_collection.py
index 5a19747b759..a8ee8ce5b1d 100644
--- a/airflow-core/tests/unit/dag_processing/test_collection.py
+++ b/airflow-core/tests/unit/dag_processing/test_collection.py
@@ -147,7 +147,7 @@ class TestAssetModelOperation:
             # Update `is_active` and `is_paused` properties from DAG
             dags = session.query(DagModel).all()
             for dag in dags:
-                dag.is_active = is_active
+                dag.is_stale = not is_active
                 dag.is_paused = is_paused
 
             orm_assets = asset_op.sync_assets(session=session)
diff --git a/airflow-core/tests/unit/dag_processing/test_manager.py b/airflow-core/tests/unit/dag_processing/test_manager.py
index 387b45b619f..d4d57a2bfd2 100644
--- a/airflow-core/tests/unit/dag_processing/test_manager.py
+++ b/airflow-core/tests/unit/dag_processing/test_manager.py
@@ -484,7 +484,7 @@ class TestDagFileProcessorManager:
             active_dag_count = (
                 session.query(func.count(DagModel.dag_id))
                 .filter(
-                    DagModel.is_active,
+                    ~DagModel.is_stale,
                     DagModel.relative_fileloc == str(test_dag_path.rel_path),
                     DagModel.bundle_name == test_dag_path.bundle_name,
                 )
@@ -497,7 +497,7 @@ class TestDagFileProcessorManager:
             active_dag_count = (
                 session.query(func.count(DagModel.dag_id))
                 .filter(
-                    DagModel.is_active,
+                    ~DagModel.is_stale,
                     DagModel.relative_fileloc == str(test_dag_path.rel_path),
                     DagModel.bundle_name == test_dag_path.bundle_name,
                 )
@@ -673,7 +673,7 @@ class TestDagFileProcessorManager:
         # assert code not deleted
         assert DagCode.has_dag(dag.dag_id)
         # assert dag still active
-        assert dag.get_is_active()
+        assert not dag.get_is_stale()
 
     @pytest.mark.usefixtures("testing_dag_bundle")
     def test_refresh_dags_dir_deactivates_deleted_zipped_dags(
@@ -697,7 +697,7 @@ class TestDagFileProcessorManager:
             assert DagCode.has_dag(dag_id)
             assert DagVersion.get_latest_version(dag_id)
             dag = session.scalar(select(DagModel).where(DagModel.dag_id == dag_id))
-            assert dag.is_active is True
+            assert dag.is_stale is False
 
             os.remove(zip_dag_path)
 
@@ -707,7 +707,7 @@ class TestDagFileProcessorManager:
             assert DagCode.has_dag(dag_id)
             assert DagVersion.get_latest_version(dag_id)
             dag = session.scalar(select(DagModel).where(DagModel.dag_id == dag_id))
-            assert dag.is_active is False
+            assert dag.is_stale is True
 
     def test_deactivate_deleted_dags(self, dag_maker):
         with dag_maker("test_dag1") as dag1:
diff --git a/airflow-core/tests/unit/jobs/test_scheduler_job.py b/airflow-core/tests/unit/jobs/test_scheduler_job.py
index 1c6488cb936..7e98c1683fa 100644
--- a/airflow-core/tests/unit/jobs/test_scheduler_job.py
+++ b/airflow-core/tests/unit/jobs/test_scheduler_job.py
@@ -4012,7 +4012,7 @@ class TestSchedulerJob:
     @pytest.mark.parametrize(
         "disable, enable",
         [
-            pytest.param({"is_active": False}, {"is_active": True}, id="active"),
+            pytest.param({"is_stale": True}, {"is_stale": False}, id="active"),
             pytest.param({"is_paused": True}, {"is_paused": False}, id="paused"),
         ],
     )
diff --git a/airflow-core/tests/unit/models/test_asset.py b/airflow-core/tests/unit/models/test_asset.py
index 1f334bb3b61..c255c20b0f5 100644
--- a/airflow-core/tests/unit/models/test_asset.py
+++ b/airflow-core/tests/unit/models/test_asset.py
@@ -154,7 +154,7 @@ def test_remove_reference_for_inactive_dag(
     assert set(session.execute(select_stmt)) == expected_before_clear_1
 
     def _simulate_soft_dag_deletion(dag_id):
-        session.execute(update(DagModel).where(DagModel.dag_id == dag_id).values(is_active=False))
+        session.execute(update(DagModel).where(DagModel.dag_id == dag_id).values(is_stale=True))
 
     _simulate_soft_dag_deletion("test1")
     remove_references_to_deleted_dags(session=session)
diff --git a/airflow-core/tests/unit/models/test_dag.py b/airflow-core/tests/unit/models/test_dag.py
index e83cd485541..b90c985cc11 100644
--- a/airflow-core/tests/unit/models/test_dag.py
+++ b/airflow-core/tests/unit/models/test_dag.py
@@ -992,7 +992,7 @@ class TestDag:
 
         orm_dag = session.query(DagModel).filter(DagModel.dag_id == dag_id).one()
 
-        assert orm_dag.is_active
+        assert not orm_dag.is_stale
 
         DagModel.deactivate_deleted_dags(
             bundle_name=orm_dag.bundle_name,
@@ -1000,7 +1000,7 @@ class TestDag:
         )
 
         orm_dag = session.query(DagModel).filter(DagModel.dag_id == dag_id).one()
-        assert not orm_dag.is_active
+        assert orm_dag.is_stale
 
         session.execute(DagModel.__table__.delete().where(DagModel.dag_id == dag_id))
         session.close()
@@ -2091,7 +2091,7 @@ class TestDagModel:
             has_task_concurrency_limits=False,
             next_dagrun=dag.start_date,
             next_dagrun_create_after=timezone.datetime(2038, 1, 2),
-            is_active=True,
+            is_stale=False,
         )
         session.add(orm_dag)
         session.flush()
@@ -2234,7 +2234,7 @@ class TestDagModel:
             has_task_concurrency_limits=False,
             next_dagrun=None,
             next_dagrun_create_after=None,
-            is_active=True,
+            is_stale=False,
         )
         # assert max_active_runs updated
         assert orm_dag.max_active_runs == 16
@@ -2258,7 +2258,7 @@ class TestDagModel:
             has_task_concurrency_limits=False,
             next_dagrun=DEFAULT_DATE,
             next_dagrun_create_after=DEFAULT_DATE + timedelta(days=1),
-            is_active=True,
+            is_stale=False,
         )
         session.add(orm_dag)
         session.flush()
@@ -2290,7 +2290,7 @@ class TestDagModel:
             has_task_concurrency_limits=False,
             next_dagrun=DEFAULT_DATE,
             next_dagrun_create_after=DEFAULT_DATE + timedelta(days=1),
-            is_active=True,
+            is_stale=False,
         )
         assert not orm_dag.has_import_errors
         session.add(orm_dag)
diff --git a/airflow-core/tests/unit/models/test_dagbag.py b/airflow-core/tests/unit/models/test_dagbag.py
index 2e08e8748d7..a4cc7da9e5b 100644
--- a/airflow-core/tests/unit/models/test_dagbag.py
+++ b/airflow-core/tests/unit/models/test_dagbag.py
@@ -573,15 +573,15 @@ class TestDagBag:
         dag_id = "test_deactivate_unknown_dags"
         expected_active_dags = dagbag.dags.keys()
 
-        model_before = DagModel(dag_id=dag_id, is_active=True)
+        model_before = DagModel(dag_id=dag_id, is_stale=False)
         with create_session() as session:
             session.merge(model_before)
 
         DAG.deactivate_unknown_dags(expected_active_dags)
 
         after_model = DagModel.get_dagmodel(dag_id)
-        assert model_before.is_active
-        assert not after_model.is_active
+        assert not model_before.is_stale
+        assert after_model.is_stale
 
         # clean up
         with create_session() as session:
diff --git a/airflow-core/tests/unit/models/test_dagrun.py b/airflow-core/tests/unit/models/test_dagrun.py
index 67b6d5d70b8..dacfcf7a75a 100644
--- a/airflow-core/tests/unit/models/test_dagrun.py
+++ b/airflow-core/tests/unit/models/test_dagrun.py
@@ -1037,7 +1037,7 @@ class TestDagRun:
             has_task_concurrency_limits=False,
             next_dagrun=DEFAULT_DATE,
             next_dagrun_create_after=DEFAULT_DATE + datetime.timedelta(days=1),
-            is_active=True,
+            is_stale=False,
         )
         session.add(orm_dag)
         session.flush()
@@ -1111,7 +1111,7 @@ class TestDagRun:
 
         try:
             info = dag.next_dagrun_info(None)
-            orm_dag_kwargs = {"dag_id": dag.dag_id, "has_task_concurrency_limits": False, "is_active": True}
+            orm_dag_kwargs = {"dag_id": dag.dag_id, "has_task_concurrency_limits": False, "is_stale": False}
             if info is not None:
                 orm_dag_kwargs.update(
                     {
diff --git a/airflow-core/tests/unit/models/test_dagwarning.py b/airflow-core/tests/unit/models/test_dagwarning.py
index 7819a4bf416..fea1961ee3f 100644
--- a/airflow-core/tests/unit/models/test_dagwarning.py
+++ b/airflow-core/tests/unit/models/test_dagwarning.py
@@ -39,7 +39,7 @@ class TestDagWarning:
         """
         Test that the purge_inactive_dag_warnings method deletes inactive dag warnings
         """
-        dags = [DagModel(dag_id="dag_1", is_active=False), DagModel(dag_id="dag_2", is_active=True)]
+        dags = [DagModel(dag_id="dag_1", is_stale=True), DagModel(dag_id="dag_2", is_stale=False)]
         session.add_all(dags)
         session.commit()
 
diff --git a/airflow-core/tests/unit/models/test_serialized_dag.py b/airflow-core/tests/unit/models/test_serialized_dag.py
index 189904105ab..5687961e863 100644
--- a/airflow-core/tests/unit/models/test_serialized_dag.py
+++ b/airflow-core/tests/unit/models/test_serialized_dag.py
@@ -382,7 +382,7 @@ class TestSerializedDagModel:
         assert dag_id in dependencies
 
         # Simulate deleting the DAG from file.
-        session.execute(update(DagModel).where(DagModel.dag_id == dag_id).values(is_active=False))
+        session.execute(update(DagModel).where(DagModel.dag_id == dag_id).values(is_stale=True))
         dependencies = SDM.get_dag_dependencies(session=session)
         assert dag_id not in dependencies