Airflow's scheduler treats a pipeline as a Directed Acyclic Graph: task t only becomes eligible once every task in parents(t) has finished with state success — never on a fixed clock offset like cron.
eligible(t) = ∀ p ∈ parents(t): state(p) = success
makespan ≈ max over paths P of Σ_(t∈P) duration(t) — critical path, unlimited slots
- Executor slots — how many tasks a bounded worker pool can run at once; a graph that allows 4-way concurrency still queues if only 2 slots are free, exactly like Celery/Kubernetes executors in production.
- Failure probability — a task can fail on completion; it retries with backoff up to twice, and once retries are exhausted it turns failed and every downstream task is marked upstream_failed and skipped — the same red cascade you'd see in the Airflow graph view.
- Backfill — replays the identical DAG for several logical dates in a row. This is only safe because each task is idempotent: re-running a logical date overwrites that date's partition instead of double-counting it.
The moving dots along each edge represent a completed task unlocking its children — the scheduler's actual job is exactly this: continuously re-scan the graph for newly-eligible tasks and hand them to a free executor slot.