[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-astronomer-dag-factory":3,"mdc-mb7ir8-key":54,"related-repo-astronomer-dag-factory":5751,"related-org-astronomer-dag-factory":5851},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":49,"sourceUrl":52,"mdContent":53},"dag-factory","author Airflow DAGs with dag-factory","Authors Apache Airflow DAGs declaratively from dag-factory YAML configs. Use when building DAGs declaratively from YAML via dag-factory; creating\u002Fediting dag-factory templates\u002FYAML configs,reating\u002Fediting dag-factory YAML configs, defaults, dynamic tasks, datasets, or callbacks; or validating dag-factory configurations; upgrading or re-pinning dag-factory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"astronomer","Astronomer","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fastronomer.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Airflow","airflow","tag",{"name":17,"slug":18,"type":15},"Data Engineering","data-engineering",{"name":20,"slug":21,"type":15},"YAML","yaml",{"name":23,"slug":24,"type":15},"Data Pipeline","data-pipeline",412,"https:\u002F\u002Fgithub.com\u002Fastronomer\u002Fagents","2026-04-28T05:39:38.577601",null,55,[31,32,33,34,14,35,36,37,38,18,39,40,41,42,43,44,45,46,47,48],"agentic-workflow","agents","ai","ai-agents","apache-airflow","claude","cursor","dag","data-pipelines","dbt","llm","mcp","orchestrator","skills","workflow-automation","workflow-management","workflow-orchestration","workflows",{"repoUrl":26,"stars":25,"forks":29,"topics":50,"description":51},[31,32,33,34,14,35,36,37,38,18,39,40,41,42,43,44,45,46,47,48],"AI agent tooling for data engineering workflows.","https:\u002F\u002Fgithub.com\u002Fastronomer\u002Fagents\u002Ftree\u002FHEAD\u002Fskills\u002Fdag-factory","---\nname: dag-factory\ndescription: Authors Apache Airflow DAGs declaratively from dag-factory YAML configs. Use when building DAGs declaratively from YAML via dag-factory; creating\u002Fediting dag-factory templates\u002FYAML configs,reating\u002Fediting dag-factory YAML configs, defaults, dynamic tasks, datasets, or callbacks; or validating dag-factory configurations; upgrading or re-pinning dag-factory.\n---\n# DAG Factory\n\nYou are helping a user build Apache Airflow DAGs declaratively with **dag-factory**, a library that turns YAML configuration files into Airflow DAGs. Execute steps in order and prefer the simplest configuration that meets the user's needs.\n\n> **Package**: `dag-factory` on PyPI\n> **Repo**: https:\u002F\u002Fgithub.com\u002Fastronomer\u002Fdag-factory\n> **Docs**: https:\u002F\u002Fastronomer.github.io\u002Fdag-factory\u002Flatest\u002F\n> **Targets**: dag-factory **v1.0+** only. For pre-1.0 projects, see [reference\u002Fmigration.md](reference\u002Fmigration.md) before applying any guidance from this skill.\n> **Requires**: Python 3.10+, Airflow 2.4+ (Airflow 3 supported)\n\n## Before Starting\n\nConfirm with the user:\n1. **Airflow version** ≥2.4\n2. **Python version** ≥3.10\n3. **dag-factory version**: this skill targets **v1.0+**. If the project is on \u003C1.0, follow [reference\u002Fmigration.md](reference\u002Fmigration.md) to upgrade before continuing.\n4. **Use case**: dag-factory is for declarative, low-code DAG authoring. If the user needs reusable, validated Pythonic templates with Pydantic, suggest **blueprint** instead. If they need full Python flexibility, suggest the **authoring-dags** skill.\n\n---\n\n## Determine What the User Needs\n\n| User Request | Action |\n|--------------|--------|\n| \"Create a YAML DAG\" \u002F \"Convert this Python DAG to YAML\" | Go to **Defining a DAG in YAML** |\n| \"Set up dag-factory in my project\" | Go to **Project Setup** |\n| \"Share defaults across DAGs\" \u002F \"Set start_date once\" | Go to **Defaults** |\n| \"Use a custom operator\" \u002F \"Use KPO \u002F Slack \u002F Snowflake\" | Go to **Custom & Provider Operators** |\n| \"Dynamic \u002F mapped tasks\" \u002F \"expand \u002F partial\" | Go to **Dynamic Task Mapping** |\n| \"Schedule on dataset\" \u002F \"Outlets and inlets\" | Go to **Datasets** |\n| \"Add a callback\" \u002F \"Slack on failure\" | Go to **Callbacks** |\n| \"Use a timetable\" \u002F \"datetime in YAML\" \u002F \"timedelta in YAML\" | Go to **Custom Python Objects (`__type__`)** |\n| \"Lint my YAML\" \u002F \"Validate\" | Go to **Validation Commands** |\n| \"Convert Airflow 2 YAML to Airflow 3\" | Go to **Validation Commands** (`dagfactory convert`) |\n| \"Migrate from dag-factory \u003C1.0\" | See [reference\u002Fmigration.md](reference\u002Fmigration.md) |\n| dag-factory errors \u002F troubleshooting | Go to **Troubleshooting** |\n\n---\n\n## Project Setup\n\n### 1. Install the Package\n\nAdd to `requirements.txt`:\n\n```\ndag-factory>=1.0.0\n```\n\ndag-factory **does not** install Airflow providers automatically. Install any provider packages your YAML references (e.g., `apache-airflow-providers-slack`, `apache-airflow-providers-cncf-kubernetes`).\n\n### 2. Create the Loader\n\nCreate `dags\u002Fload_dags.py` so Airflow's DAG processor will pick it up:\n\n```python\nimport os\nfrom pathlib import Path\n\nfrom dagfactory import load_yaml_dags\n\nCONFIG_ROOT_DIR = Path(os.getenv(\"CONFIG_ROOT_DIR\", \"\u002Fusr\u002Flocal\u002Fairflow\u002Fdags\u002F\"))\n\n# Option A: load every *.yml \u002F *.yaml under a folder\nload_yaml_dags(globals_dict=globals(), dags_folder=str(CONFIG_ROOT_DIR))\n\n# Option B: load a single file\n# load_yaml_dags(globals_dict=globals(), config_filepath=str(CONFIG_ROOT_DIR \u002F \"my_dag.yml\"))\n\n# Option C: load from an in-Python dict\n# load_yaml_dags(globals_dict=globals(), config_dict={...})\n```\n\n`globals_dict=globals()` is required so generated DAG objects are registered into the module namespace where Airflow can discover them.\n\n### 3. Verify Installation\n\n```bash\ndagfactory --version\n```\n\n---\n\n## Defining a DAG in YAML\n\nEach top-level YAML key (other than `default`) defines a DAG. The key becomes the `dag_id`. **Use the list format for `tasks` and `task_groups`** — it is the recommended format since v1.0.0.\n\n```yaml\n# dags\u002Fexample_dag_factory.yml\ndefault:\n  default_args:\n    start_date: 2024-11-11\n\nbasic_example_dag:\n  default_args:\n    owner: \"custom_owner\"\n  description: \"this is an example dag\"\n  schedule: \"0 3 * * *\"\n  catchup: false\n  task_groups:\n    - group_name: \"example_task_group\"\n      tooltip: \"this is an example task group\"\n      dependencies: [task_1]\n  tasks:\n    - task_id: \"task_1\"\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 1\"\n    - task_id: \"task_2\"\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 2\"\n      dependencies: [task_1]\n    - task_id: \"task_3\"\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 3\"\n      dependencies: [task_1]\n      task_group_name: \"example_task_group\"\n```\n\n### Key Fields\n\n| Field | Where | Purpose |\n|-------|-------|---------|\n| `default` | top-level | Shared DAG-level args applied to every DAG in this file |\n| `default_args` | DAG or `default` block | Standard Airflow `default_args` (owner, retries, start_date, ...) |\n| `schedule` | DAG | Cron expression, preset (`@daily`), Dataset list, or `__type__` timetable |\n| `catchup` \u002F `description` \u002F `tags` | DAG | Standard Airflow DAG kwargs |\n| `tasks` | DAG | List of task dicts; each requires `task_id` and `operator` |\n| `operator` | task | **Full import path** to operator class (e.g. `airflow.operators.bash.BashOperator`) |\n| `dependencies` | task \u002F task_group | List of upstream `task_id`s or `group_name`s |\n| `task_groups` | DAG | List of group dicts; each requires `group_name` |\n| `task_group_name` | task | Assigns a task to a task group |\n\nTasks do **not** need to be ordered by dependency in the YAML — dag-factory resolves the DAG topology.\n\n### Dictionary Format (Legacy)\n\nPre-1.0 dictionary format (where `tasks` is a dict keyed by `task_id`) still works for backward compatibility, but prefer the list format for new code.\n\n---\n\n## Defaults\n\nThere are four ways to set defaults, in **precedence order** (highest first):\n\n1. `default_args` \u002F DAG-level keys inside an individual DAG\n2. The top-level `default:` block in the same YAML file\n3. `defaults_config_dict=` argument to `load_yaml_dags`\n4. A `defaults.yml` (or `defaults.yaml`) file via `defaults_config_path=` (or auto-detected next to the DAG YAML)\n\n> Note: loader argument names and several other field names changed in v1.0.0. See [reference\u002Fmigration.md](reference\u002Fmigration.md) if you're working on an older project.\n\n### `default` Block in the Same File\n\nPowerful for templating multiple DAGs from one file:\n\n```yaml\ndefault:\n  default_args:\n    owner: \"data-team\"\n    start_date: 2025-01-01\n    retries: 2\n  catchup: false\n  schedule: \"@daily\"\n\ndag_one:\n  description: \"first DAG\"\n  tasks:\n    - task_id: t1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo one\"\n\ndag_two:\n  description: \"second DAG\"\n  tasks:\n    - task_id: t1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo two\"\n```\n\n### `defaults.yml` File\n\nPlace a `defaults.yml` next to the DAG YAML, or point `defaults_config_path` at a parent directory. dag-factory **merges** all `defaults.yml` files walking up the directory tree, with the file closest to the DAG YAML winning. DAG-level args (e.g. `schedule`, `catchup`) go at the root of `defaults.yml`; per-task defaults go under `default_args`.\n\n```yaml\n# defaults.yml\nschedule: 0 1 * * *\ncatchup: false\ndefault_args:\n  start_date: '2024-12-31'\n  owner: data-team\n```\n\n---\n\n## Custom & Provider Operators\n\nReference any operator by its **full Python import path**. dag-factory passes all other task keys as kwargs to that operator.\n\n```yaml\ntasks:\n  - task_id: begin\n    operator: airflow.providers.standard.operators.empty.EmptyOperator\n  - task_id: make_bread\n    operator: customized.operators.breakfast_operators.MakeBreadOperator\n    bread_type: 'Sourdough'\n```\n\nThe operator's package must be installed and importable. For Airflow 3, prefer `airflow.providers.standard.operators.*` over the legacy `airflow.operators.*` paths — the `dagfactory convert` CLI rewrites these automatically.\n\n### KubernetesPodOperator\n\nSpecify the operator path and pass kwargs directly. As of v1.0, dag-factory no longer does legacy type casting — use `__type__` for nested k8s objects.\n\n```yaml\ntasks:\n  - task_id: hello-world-pod\n    operator: airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator\n    image: \"python:3.12-slim\"\n    cmds: [\"python\", \"-c\"]\n    arguments: [\"print('hi')\"]\n    name: example-pod\n    namespace: default\n    container_resources:\n      __type__: kubernetes.client.models.V1ResourceRequirements\n      limits: {cpu: \"1\", memory: \"1024Mi\"}\n      requests: {cpu: \"0.5\", memory: \"512Mi\"}\n```\n\n---\n\n## Dynamic Task Mapping\n\nUse `expand` and `partial` keys on a task to map dynamically. dag-factory has two distinct ways to reference an upstream task's output:\n\n- **`task_id.output`** — XCom-style reference, used inside `expand` `op_args` \u002F `op_kwargs` (and the equivalent kwargs of other operators).\n- **`+task_id`** — bare value reference, used when the value sits directly under `expand` (e.g. `expand: {number: +numbers_list}`) or as a TaskFlow decorator argument.\n\nDon't mix them: `+request` won't resolve inside `op_args`, and `request.output` won't resolve as a bare `expand` value.\n\n```yaml\ndynamic_task_map:\n  default_args:\n    start_date: 2025-01-01\n  schedule: \"0 3 * * *\"\n  tasks:\n    - task_id: request\n      operator: airflow.providers.standard.operators.python.PythonOperator\n      python_callable_name: make_list\n      python_callable_file: $CONFIG_ROOT_DIR\u002Fexpand_tasks.py\n    - task_id: process\n      operator: airflow.providers.standard.operators.python.PythonOperator\n      python_callable_name: consume_value\n      python_callable_file: $CONFIG_ROOT_DIR\u002Fexpand_tasks.py\n      partial:\n        op_kwargs:\n          fixed_param: \"test\"\n      expand:\n        op_args: request.output    # XCom-style — used inside op_args \u002F op_kwargs\n      dependencies: [request]\n```\n\nBare-value form (TaskFlow `decorator` tasks, or any non-`op_args` mapping):\n\n```yaml\ntasks:\n  - task_id: numbers_list\n    decorator: airflow.sdk.definitions.decorators.task\n    python_callable: sample.build_numbers_list\n  - task_id: double_number\n    decorator: airflow.sdk.definitions.decorators.task\n    python_callable: sample.double\n    expand:\n      number: +numbers_list   # + resolves to upstream task `numbers_list`'s XComArg\n```\n\nFor named map indices (Airflow 2.9+), set `map_index_template: \"{{ task.custom_mapping_key }}\"` and have the callable assign `context[\"custom_mapping_key\"]`.\n\n**Tested patterns**: simple mapping, task-generated mapping, repeated mapping, `partial`, multiple-parameter mapping, `map_index_template`.\n**Unsupported \u002F untested**: mapping over task groups, zipping, transforming expanding data.\n\n---\n\n## Datasets\n\nUse `inlets` \u002F `outlets` on tasks to declare dataset producers, and a list of dataset URIs as `schedule` to consume them.\n\n```yaml\nproducer_dag:\n  default_args:\n    start_date: '2024-01-01'\n  schedule: \"0 5 * * *\"\n  catchup: false\n  tasks:\n    - task_id: task_1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 1\"\n      outlets: ['s3:\u002F\u002Fbucket_example\u002Fraw\u002Fdataset1.json']\n\nconsumer_dag:\n  default_args:\n    start_date: '2024-01-01'\n  schedule: ['s3:\u002F\u002Fbucket_example\u002Fraw\u002Fdataset1.json']\n  catchup: false\n  tasks:\n    - task_id: task_1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 'consumer'\"\n```\n\n### Conditional Dataset Scheduling (Airflow 2.9+ \u002F dag-factory 0.22+)\n\nNesting the logical operators `__and__` \u002F `__or__` under `datasets` key.\n\n```yaml\nschedule:\n  datasets:\n    __or__:\n      - __and__:\n          - s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_1\n          - s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_2\n      - s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_3\n```\n\n---\n\n## Callbacks\n\nThree styles, all valid at the DAG, TaskGroup, or Task level (or under `default_args`):\n\n### 1. String pointing to a callable\n\n```yaml\n- task_id: task_1\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_1\"\n  on_failure_callback: include.custom_callbacks.output_standard_message\n```\n\nWith kwargs:\n\n```yaml\n- task_id: task_2\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_2\"\n  on_success_callback:\n    callback: include.custom_callbacks.output_custom_message\n    param1: \"Task status\"\n    param2: \"Successful!\"\n```\n\n### 2. File path + function name (no kwargs)\n\n```yaml\n- task_id: task_3\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_3\"\n  on_retry_callback_name: output_standard_message\n  on_retry_callback_file: \u002Fusr\u002Flocal\u002Fairflow\u002Finclude\u002Fcustom_callbacks.py\n```\n\n### 3. Provider callbacks\n\n```yaml\n- task_id: task_4\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_4\"\n  on_failure_callback:\n    callback: airflow.providers.slack.notifications.slack.send_slack_notification\n    slack_conn_id: slack_conn_id\n    text: \":red_circle: Task Failed.\"\n    channel: \"#channel\"\n```\n\nThe provider package must be installed.\n\n---\n\n## Custom Python Objects (`__type__`)\n\nFor anything that isn't a simple scalar — `datetime`, `timedelta`, `Asset`, timetables, k8s objects — use the generalized object syntax:\n\n```yaml\nstart_date:\n  __type__: datetime.datetime\n  year: 2025\n  month: 1\n  day: 1\n\nexecution_timeout:\n  __type__: datetime.timedelta\n  hours: 1\n\nschedule:\n  __type__: airflow.timetables.trigger.CronTriggerTimetable\n  cron: \"0 1 * * 3\"\n  timezone: UTC\n```\n\n- `__type__` is the **full import path** to the class\n- `__args__` is a list of positional arguments\n- Other keys become keyword arguments\n- For lists of typed objects, use `__type__: builtins.list` with an `items:` key\n\n### Reserved Keys\n\nDon't use these YAML keys for your own data — dag-factory reserves them: `__type__`, `__args__`, `__join__`, `__and__`, `__or__`. The key `items` is also reserved when used inside a `__type__: builtins.list` block — don't add a custom field named `items` to a typed list construction.\n\n---\n\n## Validation Commands\n\nAfter installing, the `dagfactory` CLI is on PATH:\n\n| Command | When to Use |\n|---------|-------------|\n| `dagfactory --version` | Confirm install \u002F version |\n| `dagfactory lint \u003Cpath>` | Validate YAML syntax for a file or directory |\n| `dagfactory lint \u003Cpath> --verbose` | Show a per-file table of results |\n| `dagfactory convert \u003Cpath>` | Show diffs to migrate Airflow 2 → 3 import paths |\n| `dagfactory convert \u003Cpath> --override` | Apply the conversions in place |\n\n### Validation Workflow\n\n```bash\n# 1. Lint YAML\ndagfactory lint dags\u002F\n\n# 2. Have Airflow parse to catch operator\u002Fimport errors\n#    (Astro CLI users)\nastro dev parse\n```\n\n`dagfactory lint` only checks YAML syntax — operator import errors and missing kwargs surface at Airflow parse time.\n\n---\n\n## Troubleshooting\n\n### \"Operator not found\" \u002F `ModuleNotFoundError`\n\n**Cause**: Provider package not installed, or wrong import path.\n\n**Fix**: Install the provider (`pip install apache-airflow-providers-...`) and verify the path. For Airflow 3, run `dagfactory convert` to update legacy `airflow.operators.*` paths to `airflow.providers.standard.operators.*`.\n\n### YAML parses but the DAG doesn't appear in Airflow\n\n**Cause**: Loader file missing or `globals_dict=globals()` not passed.\n\n**Fix**: Ensure a Python file in `dags\u002F` calls `load_yaml_dags(globals_dict=globals(), ...)`. Check `astro dev parse` (or `airflow dags list-import-errors`) for parse errors.\n\n### \"Argument is not JSON-serializable\" \u002F wrong kwarg type\n\n**Cause**: A scalar string is being passed where a Python object is expected (e.g. `start_date: \"2025-01-01\"` for a field that needs `datetime`).\n\n**Fix**: Use `__type__: datetime.datetime` (or `datetime.timedelta` etc.) per **Custom Python Objects**.\n\n### Conditional dataset schedule ignored\n\n**Cause**: Airflow \u003C2.9, dag-factory \u003C0.22, or using legacy `!and`\u002F`!or` keys.\n\n**Fix**: Upgrade and rename to `__and__` \u002F `__or__`.\n\n### Multiple `defaults.yml` not merging as expected\n\n**Cause**: `defaults_config_path` not pointing at a parent directory of the DAG YAML.\n\n**Fix**: Set `defaults_config_path` to the highest ancestor folder you want included; dag-factory walks the tree from DAG file → ancestor and merges in that order, with files closer to the DAG winning.\n\n---\n\n## Verification Checklist\n\nBefore finishing, verify with the user:\n\n- [ ] `dagfactory lint dags\u002F` passes\n- [ ] Loader file exists in `dags\u002F` and calls `load_yaml_dags(globals_dict=globals(), ...)`\n- [ ] Required Airflow providers are in `requirements.txt`\n- [ ] DAG appears in Airflow UI without import errors\n\n---\n\n## Related Skills\n\n- **authoring-dags** — Writing Airflow DAGs in pure Python with `af` CLI validation. Use when YAML can't express what you need.\n- **testing-dags**: For testing DAGs, debugging failures, and the test -> fix -> retest loop\n- **debugging-dags**: For troubleshooting failed DAGs\n\n## Reference\n\n- GitHub: https:\u002F\u002Fgithub.com\u002Fastronomer\u002Fdag-factory\n- Docs: https:\u002F\u002Fastronomer.github.io\u002Fdag-factory\u002Flatest\u002F\n- PyPI: https:\u002F\u002Fpypi.org\u002Fproject\u002Fdag-factory\u002F\n- Migration Guide: https:\u002F\u002Fastronomer.github.io\u002Fdag-factory\u002Flatest\u002Fmigration_guide\u002F\n",{"data":55,"body":56},{"name":4,"description":6},{"type":57,"children":58},"root",[59,67,80,156,163,168,239,243,249,498,501,506,513,526,538,566,572,585,728,739,745,769,772,777,819,1398,1404,1710,1722,1728,1747,1750,1755,1767,1839,1853,1864,1869,2219,2230,2291,2392,2395,2400,2412,2529,2557,2563,2575,2937,2940,2945,2965,3034,3069,3391,3411,3568,3588,3620,3623,3628,3654,4018,4024,4051,4147,4150,4155,4167,4173,4258,4263,4408,4414,4514,4520,4680,4685,4688,4699,4726,4939,4996,5002,5061,5064,5069,5081,5188,5194,5267,5278,5281,5286,5298,5308,5346,5352,5368,5408,5414,5437,5467,5473,5498,5519,5532,5547,5563,5566,5572,5577,5645,5648,5654,5694,5700,5745],{"type":60,"tag":61,"props":62,"children":63},"element","h1",{"id":4},[64],{"type":65,"value":66},"text","DAG Factory",{"type":60,"tag":68,"props":69,"children":70},"p",{},[71,73,78],{"type":65,"value":72},"You are helping a user build Apache Airflow DAGs declaratively with ",{"type":60,"tag":74,"props":75,"children":76},"strong",{},[77],{"type":65,"value":4},{"type":65,"value":79},", a library that turns YAML configuration files into Airflow DAGs. Execute steps in order and prefer the simplest configuration that meets the user's needs.",{"type":60,"tag":81,"props":82,"children":83},"blockquote",{},[84],{"type":60,"tag":68,"props":85,"children":86},{},[87,92,94,100,102,107,108,116,121,122,128,133,135,140,142,147,149,154],{"type":60,"tag":74,"props":88,"children":89},{},[90],{"type":65,"value":91},"Package",{"type":65,"value":93},": ",{"type":60,"tag":95,"props":96,"children":98},"code",{"className":97},[],[99],{"type":65,"value":4},{"type":65,"value":101}," on PyPI\n",{"type":60,"tag":74,"props":103,"children":104},{},[105],{"type":65,"value":106},"Repo",{"type":65,"value":93},{"type":60,"tag":109,"props":110,"children":114},"a",{"href":111,"rel":112},"https:\u002F\u002Fgithub.com\u002Fastronomer\u002Fdag-factory",[113],"nofollow",[115],{"type":65,"value":111},{"type":60,"tag":74,"props":117,"children":118},{},[119],{"type":65,"value":120},"Docs",{"type":65,"value":93},{"type":60,"tag":109,"props":123,"children":126},{"href":124,"rel":125},"https:\u002F\u002Fastronomer.github.io\u002Fdag-factory\u002Flatest\u002F",[113],[127],{"type":65,"value":124},{"type":60,"tag":74,"props":129,"children":130},{},[131],{"type":65,"value":132},"Targets",{"type":65,"value":134},": dag-factory ",{"type":60,"tag":74,"props":136,"children":137},{},[138],{"type":65,"value":139},"v1.0+",{"type":65,"value":141}," only. For pre-1.0 projects, see ",{"type":60,"tag":109,"props":143,"children":145},{"href":144},"reference\u002Fmigration.md",[146],{"type":65,"value":144},{"type":65,"value":148}," before applying any guidance from this skill.\n",{"type":60,"tag":74,"props":150,"children":151},{},[152],{"type":65,"value":153},"Requires",{"type":65,"value":155},": Python 3.10+, Airflow 2.4+ (Airflow 3 supported)",{"type":60,"tag":157,"props":158,"children":160},"h2",{"id":159},"before-starting",[161],{"type":65,"value":162},"Before Starting",{"type":60,"tag":68,"props":164,"children":165},{},[166],{"type":65,"value":167},"Confirm with the user:",{"type":60,"tag":169,"props":170,"children":171},"ol",{},[172,183,193,215],{"type":60,"tag":173,"props":174,"children":175},"li",{},[176,181],{"type":60,"tag":74,"props":177,"children":178},{},[179],{"type":65,"value":180},"Airflow version",{"type":65,"value":182}," ≥2.4",{"type":60,"tag":173,"props":184,"children":185},{},[186,191],{"type":60,"tag":74,"props":187,"children":188},{},[189],{"type":65,"value":190},"Python version",{"type":65,"value":192}," ≥3.10",{"type":60,"tag":173,"props":194,"children":195},{},[196,201,203,207,209,213],{"type":60,"tag":74,"props":197,"children":198},{},[199],{"type":65,"value":200},"dag-factory version",{"type":65,"value":202},": this skill targets ",{"type":60,"tag":74,"props":204,"children":205},{},[206],{"type":65,"value":139},{"type":65,"value":208},". If the project is on \u003C1.0, follow ",{"type":60,"tag":109,"props":210,"children":211},{"href":144},[212],{"type":65,"value":144},{"type":65,"value":214}," to upgrade before continuing.",{"type":60,"tag":173,"props":216,"children":217},{},[218,223,225,230,232,237],{"type":60,"tag":74,"props":219,"children":220},{},[221],{"type":65,"value":222},"Use case",{"type":65,"value":224},": dag-factory is for declarative, low-code DAG authoring. If the user needs reusable, validated Pythonic templates with Pydantic, suggest ",{"type":60,"tag":74,"props":226,"children":227},{},[228],{"type":65,"value":229},"blueprint",{"type":65,"value":231}," instead. If they need full Python flexibility, suggest the ",{"type":60,"tag":74,"props":233,"children":234},{},[235],{"type":65,"value":236},"authoring-dags",{"type":65,"value":238}," skill.",{"type":60,"tag":240,"props":241,"children":242},"hr",{},[],{"type":60,"tag":157,"props":244,"children":246},{"id":245},"determine-what-the-user-needs",[247],{"type":65,"value":248},"Determine What the User Needs",{"type":60,"tag":250,"props":251,"children":252},"table",{},[253,272],{"type":60,"tag":254,"props":255,"children":256},"thead",{},[257],{"type":60,"tag":258,"props":259,"children":260},"tr",{},[261,267],{"type":60,"tag":262,"props":263,"children":264},"th",{},[265],{"type":65,"value":266},"User Request",{"type":60,"tag":262,"props":268,"children":269},{},[270],{"type":65,"value":271},"Action",{"type":60,"tag":273,"props":274,"children":275},"tbody",{},[276,295,312,329,346,363,380,397,422,439,464,481],{"type":60,"tag":258,"props":277,"children":278},{},[279,285],{"type":60,"tag":280,"props":281,"children":282},"td",{},[283],{"type":65,"value":284},"\"Create a YAML DAG\" \u002F \"Convert this Python DAG to YAML\"",{"type":60,"tag":280,"props":286,"children":287},{},[288,290],{"type":65,"value":289},"Go to ",{"type":60,"tag":74,"props":291,"children":292},{},[293],{"type":65,"value":294},"Defining a DAG in YAML",{"type":60,"tag":258,"props":296,"children":297},{},[298,303],{"type":60,"tag":280,"props":299,"children":300},{},[301],{"type":65,"value":302},"\"Set up dag-factory in my project\"",{"type":60,"tag":280,"props":304,"children":305},{},[306,307],{"type":65,"value":289},{"type":60,"tag":74,"props":308,"children":309},{},[310],{"type":65,"value":311},"Project Setup",{"type":60,"tag":258,"props":313,"children":314},{},[315,320],{"type":60,"tag":280,"props":316,"children":317},{},[318],{"type":65,"value":319},"\"Share defaults across DAGs\" \u002F \"Set start_date once\"",{"type":60,"tag":280,"props":321,"children":322},{},[323,324],{"type":65,"value":289},{"type":60,"tag":74,"props":325,"children":326},{},[327],{"type":65,"value":328},"Defaults",{"type":60,"tag":258,"props":330,"children":331},{},[332,337],{"type":60,"tag":280,"props":333,"children":334},{},[335],{"type":65,"value":336},"\"Use a custom operator\" \u002F \"Use KPO \u002F Slack \u002F Snowflake\"",{"type":60,"tag":280,"props":338,"children":339},{},[340,341],{"type":65,"value":289},{"type":60,"tag":74,"props":342,"children":343},{},[344],{"type":65,"value":345},"Custom & Provider Operators",{"type":60,"tag":258,"props":347,"children":348},{},[349,354],{"type":60,"tag":280,"props":350,"children":351},{},[352],{"type":65,"value":353},"\"Dynamic \u002F mapped tasks\" \u002F \"expand \u002F partial\"",{"type":60,"tag":280,"props":355,"children":356},{},[357,358],{"type":65,"value":289},{"type":60,"tag":74,"props":359,"children":360},{},[361],{"type":65,"value":362},"Dynamic Task Mapping",{"type":60,"tag":258,"props":364,"children":365},{},[366,371],{"type":60,"tag":280,"props":367,"children":368},{},[369],{"type":65,"value":370},"\"Schedule on dataset\" \u002F \"Outlets and inlets\"",{"type":60,"tag":280,"props":372,"children":373},{},[374,375],{"type":65,"value":289},{"type":60,"tag":74,"props":376,"children":377},{},[378],{"type":65,"value":379},"Datasets",{"type":60,"tag":258,"props":381,"children":382},{},[383,388],{"type":60,"tag":280,"props":384,"children":385},{},[386],{"type":65,"value":387},"\"Add a callback\" \u002F \"Slack on failure\"",{"type":60,"tag":280,"props":389,"children":390},{},[391,392],{"type":65,"value":289},{"type":60,"tag":74,"props":393,"children":394},{},[395],{"type":65,"value":396},"Callbacks",{"type":60,"tag":258,"props":398,"children":399},{},[400,405],{"type":60,"tag":280,"props":401,"children":402},{},[403],{"type":65,"value":404},"\"Use a timetable\" \u002F \"datetime in YAML\" \u002F \"timedelta in YAML\"",{"type":60,"tag":280,"props":406,"children":407},{},[408,409],{"type":65,"value":289},{"type":60,"tag":74,"props":410,"children":411},{},[412,414,420],{"type":65,"value":413},"Custom Python Objects (",{"type":60,"tag":95,"props":415,"children":417},{"className":416},[],[418],{"type":65,"value":419},"__type__",{"type":65,"value":421},")",{"type":60,"tag":258,"props":423,"children":424},{},[425,430],{"type":60,"tag":280,"props":426,"children":427},{},[428],{"type":65,"value":429},"\"Lint my YAML\" \u002F \"Validate\"",{"type":60,"tag":280,"props":431,"children":432},{},[433,434],{"type":65,"value":289},{"type":60,"tag":74,"props":435,"children":436},{},[437],{"type":65,"value":438},"Validation Commands",{"type":60,"tag":258,"props":440,"children":441},{},[442,447],{"type":60,"tag":280,"props":443,"children":444},{},[445],{"type":65,"value":446},"\"Convert Airflow 2 YAML to Airflow 3\"",{"type":60,"tag":280,"props":448,"children":449},{},[450,451,455,457,463],{"type":65,"value":289},{"type":60,"tag":74,"props":452,"children":453},{},[454],{"type":65,"value":438},{"type":65,"value":456}," (",{"type":60,"tag":95,"props":458,"children":460},{"className":459},[],[461],{"type":65,"value":462},"dagfactory convert",{"type":65,"value":421},{"type":60,"tag":258,"props":465,"children":466},{},[467,472],{"type":60,"tag":280,"props":468,"children":469},{},[470],{"type":65,"value":471},"\"Migrate from dag-factory \u003C1.0\"",{"type":60,"tag":280,"props":473,"children":474},{},[475,477],{"type":65,"value":476},"See ",{"type":60,"tag":109,"props":478,"children":479},{"href":144},[480],{"type":65,"value":144},{"type":60,"tag":258,"props":482,"children":483},{},[484,489],{"type":60,"tag":280,"props":485,"children":486},{},[487],{"type":65,"value":488},"dag-factory errors \u002F troubleshooting",{"type":60,"tag":280,"props":490,"children":491},{},[492,493],{"type":65,"value":289},{"type":60,"tag":74,"props":494,"children":495},{},[496],{"type":65,"value":497},"Troubleshooting",{"type":60,"tag":240,"props":499,"children":500},{},[],{"type":60,"tag":157,"props":502,"children":504},{"id":503},"project-setup",[505],{"type":65,"value":311},{"type":60,"tag":507,"props":508,"children":510},"h3",{"id":509},"_1-install-the-package",[511],{"type":65,"value":512},"1. Install the Package",{"type":60,"tag":68,"props":514,"children":515},{},[516,518,524],{"type":65,"value":517},"Add to ",{"type":60,"tag":95,"props":519,"children":521},{"className":520},[],[522],{"type":65,"value":523},"requirements.txt",{"type":65,"value":525},":",{"type":60,"tag":527,"props":528,"children":532},"pre",{"className":529,"code":531,"language":65},[530],"language-text","dag-factory>=1.0.0\n",[533],{"type":60,"tag":95,"props":534,"children":536},{"__ignoreMap":535},"",[537],{"type":65,"value":531},{"type":60,"tag":68,"props":539,"children":540},{},[541,543,548,550,556,558,564],{"type":65,"value":542},"dag-factory ",{"type":60,"tag":74,"props":544,"children":545},{},[546],{"type":65,"value":547},"does not",{"type":65,"value":549}," install Airflow providers automatically. Install any provider packages your YAML references (e.g., ",{"type":60,"tag":95,"props":551,"children":553},{"className":552},[],[554],{"type":65,"value":555},"apache-airflow-providers-slack",{"type":65,"value":557},", ",{"type":60,"tag":95,"props":559,"children":561},{"className":560},[],[562],{"type":65,"value":563},"apache-airflow-providers-cncf-kubernetes",{"type":65,"value":565},").",{"type":60,"tag":507,"props":567,"children":569},{"id":568},"_2-create-the-loader",[570],{"type":65,"value":571},"2. Create the Loader",{"type":60,"tag":68,"props":573,"children":574},{},[575,577,583],{"type":65,"value":576},"Create ",{"type":60,"tag":95,"props":578,"children":580},{"className":579},[],[581],{"type":65,"value":582},"dags\u002Fload_dags.py",{"type":65,"value":584}," so Airflow's DAG processor will pick it up:",{"type":60,"tag":527,"props":586,"children":590},{"className":587,"code":588,"language":589,"meta":535,"style":535},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import os\nfrom pathlib import Path\n\nfrom dagfactory import load_yaml_dags\n\nCONFIG_ROOT_DIR = Path(os.getenv(\"CONFIG_ROOT_DIR\", \"\u002Fusr\u002Flocal\u002Fairflow\u002Fdags\u002F\"))\n\n# Option A: load every *.yml \u002F *.yaml under a folder\nload_yaml_dags(globals_dict=globals(), dags_folder=str(CONFIG_ROOT_DIR))\n\n# Option B: load a single file\n# load_yaml_dags(globals_dict=globals(), config_filepath=str(CONFIG_ROOT_DIR \u002F \"my_dag.yml\"))\n\n# Option C: load from an in-Python dict\n# load_yaml_dags(globals_dict=globals(), config_dict={...})\n","python",[591],{"type":60,"tag":95,"props":592,"children":593},{"__ignoreMap":535},[594,605,614,624,633,641,650,658,667,676,684,693,702,710,719],{"type":60,"tag":595,"props":596,"children":599},"span",{"class":597,"line":598},"line",1,[600],{"type":60,"tag":595,"props":601,"children":602},{},[603],{"type":65,"value":604},"import os\n",{"type":60,"tag":595,"props":606,"children":608},{"class":597,"line":607},2,[609],{"type":60,"tag":595,"props":610,"children":611},{},[612],{"type":65,"value":613},"from pathlib import Path\n",{"type":60,"tag":595,"props":615,"children":617},{"class":597,"line":616},3,[618],{"type":60,"tag":595,"props":619,"children":621},{"emptyLinePlaceholder":620},true,[622],{"type":65,"value":623},"\n",{"type":60,"tag":595,"props":625,"children":627},{"class":597,"line":626},4,[628],{"type":60,"tag":595,"props":629,"children":630},{},[631],{"type":65,"value":632},"from dagfactory import load_yaml_dags\n",{"type":60,"tag":595,"props":634,"children":636},{"class":597,"line":635},5,[637],{"type":60,"tag":595,"props":638,"children":639},{"emptyLinePlaceholder":620},[640],{"type":65,"value":623},{"type":60,"tag":595,"props":642,"children":644},{"class":597,"line":643},6,[645],{"type":60,"tag":595,"props":646,"children":647},{},[648],{"type":65,"value":649},"CONFIG_ROOT_DIR = Path(os.getenv(\"CONFIG_ROOT_DIR\", \"\u002Fusr\u002Flocal\u002Fairflow\u002Fdags\u002F\"))\n",{"type":60,"tag":595,"props":651,"children":653},{"class":597,"line":652},7,[654],{"type":60,"tag":595,"props":655,"children":656},{"emptyLinePlaceholder":620},[657],{"type":65,"value":623},{"type":60,"tag":595,"props":659,"children":661},{"class":597,"line":660},8,[662],{"type":60,"tag":595,"props":663,"children":664},{},[665],{"type":65,"value":666},"# Option A: load every *.yml \u002F *.yaml under a folder\n",{"type":60,"tag":595,"props":668,"children":670},{"class":597,"line":669},9,[671],{"type":60,"tag":595,"props":672,"children":673},{},[674],{"type":65,"value":675},"load_yaml_dags(globals_dict=globals(), dags_folder=str(CONFIG_ROOT_DIR))\n",{"type":60,"tag":595,"props":677,"children":679},{"class":597,"line":678},10,[680],{"type":60,"tag":595,"props":681,"children":682},{"emptyLinePlaceholder":620},[683],{"type":65,"value":623},{"type":60,"tag":595,"props":685,"children":687},{"class":597,"line":686},11,[688],{"type":60,"tag":595,"props":689,"children":690},{},[691],{"type":65,"value":692},"# Option B: load a single file\n",{"type":60,"tag":595,"props":694,"children":696},{"class":597,"line":695},12,[697],{"type":60,"tag":595,"props":698,"children":699},{},[700],{"type":65,"value":701},"# load_yaml_dags(globals_dict=globals(), config_filepath=str(CONFIG_ROOT_DIR \u002F \"my_dag.yml\"))\n",{"type":60,"tag":595,"props":703,"children":705},{"class":597,"line":704},13,[706],{"type":60,"tag":595,"props":707,"children":708},{"emptyLinePlaceholder":620},[709],{"type":65,"value":623},{"type":60,"tag":595,"props":711,"children":713},{"class":597,"line":712},14,[714],{"type":60,"tag":595,"props":715,"children":716},{},[717],{"type":65,"value":718},"# Option C: load from an in-Python dict\n",{"type":60,"tag":595,"props":720,"children":722},{"class":597,"line":721},15,[723],{"type":60,"tag":595,"props":724,"children":725},{},[726],{"type":65,"value":727},"# load_yaml_dags(globals_dict=globals(), config_dict={...})\n",{"type":60,"tag":68,"props":729,"children":730},{},[731,737],{"type":60,"tag":95,"props":732,"children":734},{"className":733},[],[735],{"type":65,"value":736},"globals_dict=globals()",{"type":65,"value":738}," is required so generated DAG objects are registered into the module namespace where Airflow can discover them.",{"type":60,"tag":507,"props":740,"children":742},{"id":741},"_3-verify-installation",[743],{"type":65,"value":744},"3. Verify Installation",{"type":60,"tag":527,"props":746,"children":750},{"className":747,"code":748,"language":749,"meta":535,"style":535},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dagfactory --version\n","bash",[751],{"type":60,"tag":95,"props":752,"children":753},{"__ignoreMap":535},[754],{"type":60,"tag":595,"props":755,"children":756},{"class":597,"line":598},[757,763],{"type":60,"tag":595,"props":758,"children":760},{"style":759},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[761],{"type":65,"value":762},"dagfactory",{"type":60,"tag":595,"props":764,"children":766},{"style":765},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[767],{"type":65,"value":768}," --version\n",{"type":60,"tag":240,"props":770,"children":771},{},[],{"type":60,"tag":157,"props":773,"children":775},{"id":774},"defining-a-dag-in-yaml",[776],{"type":65,"value":294},{"type":60,"tag":68,"props":778,"children":779},{},[780,782,788,790,796,798,817],{"type":65,"value":781},"Each top-level YAML key (other than ",{"type":60,"tag":95,"props":783,"children":785},{"className":784},[],[786],{"type":65,"value":787},"default",{"type":65,"value":789},") defines a DAG. The key becomes the ",{"type":60,"tag":95,"props":791,"children":793},{"className":792},[],[794],{"type":65,"value":795},"dag_id",{"type":65,"value":797},". ",{"type":60,"tag":74,"props":799,"children":800},{},[801,803,809,811],{"type":65,"value":802},"Use the list format for ",{"type":60,"tag":95,"props":804,"children":806},{"className":805},[],[807],{"type":65,"value":808},"tasks",{"type":65,"value":810}," and ",{"type":60,"tag":95,"props":812,"children":814},{"className":813},[],[815],{"type":65,"value":816},"task_groups",{"type":65,"value":818}," — it is the recommended format since v1.0.0.",{"type":60,"tag":527,"props":820,"children":823},{"className":821,"code":822,"language":21,"meta":535,"style":535},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# dags\u002Fexample_dag_factory.yml\ndefault:\n  default_args:\n    start_date: 2024-11-11\n\nbasic_example_dag:\n  default_args:\n    owner: \"custom_owner\"\n  description: \"this is an example dag\"\n  schedule: \"0 3 * * *\"\n  catchup: false\n  task_groups:\n    - group_name: \"example_task_group\"\n      tooltip: \"this is an example task group\"\n      dependencies: [task_1]\n  tasks:\n    - task_id: \"task_1\"\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 1\"\n    - task_id: \"task_2\"\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 2\"\n      dependencies: [task_1]\n    - task_id: \"task_3\"\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 3\"\n      dependencies: [task_1]\n      task_group_name: \"example_task_group\"\n",[824],{"type":60,"tag":95,"props":825,"children":826},{"__ignoreMap":535},[827,836,850,862,880,887,899,910,937,962,987,1005,1017,1047,1072,1099,1112,1141,1159,1185,1214,1230,1255,1279,1308,1324,1349,1373],{"type":60,"tag":595,"props":828,"children":829},{"class":597,"line":598},[830],{"type":60,"tag":595,"props":831,"children":833},{"style":832},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[834],{"type":65,"value":835},"# dags\u002Fexample_dag_factory.yml\n",{"type":60,"tag":595,"props":837,"children":838},{"class":597,"line":607},[839,844],{"type":60,"tag":595,"props":840,"children":842},{"style":841},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[843],{"type":65,"value":787},{"type":60,"tag":595,"props":845,"children":847},{"style":846},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[848],{"type":65,"value":849},":\n",{"type":60,"tag":595,"props":851,"children":852},{"class":597,"line":616},[853,858],{"type":60,"tag":595,"props":854,"children":855},{"style":841},[856],{"type":65,"value":857},"  default_args",{"type":60,"tag":595,"props":859,"children":860},{"style":846},[861],{"type":65,"value":849},{"type":60,"tag":595,"props":863,"children":864},{"class":597,"line":626},[865,870,874],{"type":60,"tag":595,"props":866,"children":867},{"style":841},[868],{"type":65,"value":869},"    start_date",{"type":60,"tag":595,"props":871,"children":872},{"style":846},[873],{"type":65,"value":525},{"type":60,"tag":595,"props":875,"children":877},{"style":876},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[878],{"type":65,"value":879}," 2024-11-11\n",{"type":60,"tag":595,"props":881,"children":882},{"class":597,"line":635},[883],{"type":60,"tag":595,"props":884,"children":885},{"emptyLinePlaceholder":620},[886],{"type":65,"value":623},{"type":60,"tag":595,"props":888,"children":889},{"class":597,"line":643},[890,895],{"type":60,"tag":595,"props":891,"children":892},{"style":841},[893],{"type":65,"value":894},"basic_example_dag",{"type":60,"tag":595,"props":896,"children":897},{"style":846},[898],{"type":65,"value":849},{"type":60,"tag":595,"props":900,"children":901},{"class":597,"line":652},[902,906],{"type":60,"tag":595,"props":903,"children":904},{"style":841},[905],{"type":65,"value":857},{"type":60,"tag":595,"props":907,"children":908},{"style":846},[909],{"type":65,"value":849},{"type":60,"tag":595,"props":911,"children":912},{"class":597,"line":660},[913,918,922,927,932],{"type":60,"tag":595,"props":914,"children":915},{"style":841},[916],{"type":65,"value":917},"    owner",{"type":60,"tag":595,"props":919,"children":920},{"style":846},[921],{"type":65,"value":525},{"type":60,"tag":595,"props":923,"children":924},{"style":846},[925],{"type":65,"value":926}," \"",{"type":60,"tag":595,"props":928,"children":929},{"style":765},[930],{"type":65,"value":931},"custom_owner",{"type":60,"tag":595,"props":933,"children":934},{"style":846},[935],{"type":65,"value":936},"\"\n",{"type":60,"tag":595,"props":938,"children":939},{"class":597,"line":669},[940,945,949,953,958],{"type":60,"tag":595,"props":941,"children":942},{"style":841},[943],{"type":65,"value":944},"  description",{"type":60,"tag":595,"props":946,"children":947},{"style":846},[948],{"type":65,"value":525},{"type":60,"tag":595,"props":950,"children":951},{"style":846},[952],{"type":65,"value":926},{"type":60,"tag":595,"props":954,"children":955},{"style":765},[956],{"type":65,"value":957},"this is an example dag",{"type":60,"tag":595,"props":959,"children":960},{"style":846},[961],{"type":65,"value":936},{"type":60,"tag":595,"props":963,"children":964},{"class":597,"line":678},[965,970,974,978,983],{"type":60,"tag":595,"props":966,"children":967},{"style":841},[968],{"type":65,"value":969},"  schedule",{"type":60,"tag":595,"props":971,"children":972},{"style":846},[973],{"type":65,"value":525},{"type":60,"tag":595,"props":975,"children":976},{"style":846},[977],{"type":65,"value":926},{"type":60,"tag":595,"props":979,"children":980},{"style":765},[981],{"type":65,"value":982},"0 3 * * *",{"type":60,"tag":595,"props":984,"children":985},{"style":846},[986],{"type":65,"value":936},{"type":60,"tag":595,"props":988,"children":989},{"class":597,"line":686},[990,995,999],{"type":60,"tag":595,"props":991,"children":992},{"style":841},[993],{"type":65,"value":994},"  catchup",{"type":60,"tag":595,"props":996,"children":997},{"style":846},[998],{"type":65,"value":525},{"type":60,"tag":595,"props":1000,"children":1002},{"style":1001},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[1003],{"type":65,"value":1004}," false\n",{"type":60,"tag":595,"props":1006,"children":1007},{"class":597,"line":695},[1008,1013],{"type":60,"tag":595,"props":1009,"children":1010},{"style":841},[1011],{"type":65,"value":1012},"  task_groups",{"type":60,"tag":595,"props":1014,"children":1015},{"style":846},[1016],{"type":65,"value":849},{"type":60,"tag":595,"props":1018,"children":1019},{"class":597,"line":704},[1020,1025,1030,1034,1038,1043],{"type":60,"tag":595,"props":1021,"children":1022},{"style":846},[1023],{"type":65,"value":1024},"    -",{"type":60,"tag":595,"props":1026,"children":1027},{"style":841},[1028],{"type":65,"value":1029}," group_name",{"type":60,"tag":595,"props":1031,"children":1032},{"style":846},[1033],{"type":65,"value":525},{"type":60,"tag":595,"props":1035,"children":1036},{"style":846},[1037],{"type":65,"value":926},{"type":60,"tag":595,"props":1039,"children":1040},{"style":765},[1041],{"type":65,"value":1042},"example_task_group",{"type":60,"tag":595,"props":1044,"children":1045},{"style":846},[1046],{"type":65,"value":936},{"type":60,"tag":595,"props":1048,"children":1049},{"class":597,"line":712},[1050,1055,1059,1063,1068],{"type":60,"tag":595,"props":1051,"children":1052},{"style":841},[1053],{"type":65,"value":1054},"      tooltip",{"type":60,"tag":595,"props":1056,"children":1057},{"style":846},[1058],{"type":65,"value":525},{"type":60,"tag":595,"props":1060,"children":1061},{"style":846},[1062],{"type":65,"value":926},{"type":60,"tag":595,"props":1064,"children":1065},{"style":765},[1066],{"type":65,"value":1067},"this is an example task group",{"type":60,"tag":595,"props":1069,"children":1070},{"style":846},[1071],{"type":65,"value":936},{"type":60,"tag":595,"props":1073,"children":1074},{"class":597,"line":721},[1075,1080,1084,1089,1094],{"type":60,"tag":595,"props":1076,"children":1077},{"style":841},[1078],{"type":65,"value":1079},"      dependencies",{"type":60,"tag":595,"props":1081,"children":1082},{"style":846},[1083],{"type":65,"value":525},{"type":60,"tag":595,"props":1085,"children":1086},{"style":846},[1087],{"type":65,"value":1088}," [",{"type":60,"tag":595,"props":1090,"children":1091},{"style":765},[1092],{"type":65,"value":1093},"task_1",{"type":60,"tag":595,"props":1095,"children":1096},{"style":846},[1097],{"type":65,"value":1098},"]\n",{"type":60,"tag":595,"props":1100,"children":1102},{"class":597,"line":1101},16,[1103,1108],{"type":60,"tag":595,"props":1104,"children":1105},{"style":841},[1106],{"type":65,"value":1107},"  tasks",{"type":60,"tag":595,"props":1109,"children":1110},{"style":846},[1111],{"type":65,"value":849},{"type":60,"tag":595,"props":1113,"children":1115},{"class":597,"line":1114},17,[1116,1120,1125,1129,1133,1137],{"type":60,"tag":595,"props":1117,"children":1118},{"style":846},[1119],{"type":65,"value":1024},{"type":60,"tag":595,"props":1121,"children":1122},{"style":841},[1123],{"type":65,"value":1124}," task_id",{"type":60,"tag":595,"props":1126,"children":1127},{"style":846},[1128],{"type":65,"value":525},{"type":60,"tag":595,"props":1130,"children":1131},{"style":846},[1132],{"type":65,"value":926},{"type":60,"tag":595,"props":1134,"children":1135},{"style":765},[1136],{"type":65,"value":1093},{"type":60,"tag":595,"props":1138,"children":1139},{"style":846},[1140],{"type":65,"value":936},{"type":60,"tag":595,"props":1142,"children":1144},{"class":597,"line":1143},18,[1145,1150,1154],{"type":60,"tag":595,"props":1146,"children":1147},{"style":841},[1148],{"type":65,"value":1149},"      operator",{"type":60,"tag":595,"props":1151,"children":1152},{"style":846},[1153],{"type":65,"value":525},{"type":60,"tag":595,"props":1155,"children":1156},{"style":765},[1157],{"type":65,"value":1158}," airflow.operators.bash.BashOperator\n",{"type":60,"tag":595,"props":1160,"children":1162},{"class":597,"line":1161},19,[1163,1168,1172,1176,1181],{"type":60,"tag":595,"props":1164,"children":1165},{"style":841},[1166],{"type":65,"value":1167},"      bash_command",{"type":60,"tag":595,"props":1169,"children":1170},{"style":846},[1171],{"type":65,"value":525},{"type":60,"tag":595,"props":1173,"children":1174},{"style":846},[1175],{"type":65,"value":926},{"type":60,"tag":595,"props":1177,"children":1178},{"style":765},[1179],{"type":65,"value":1180},"echo 1",{"type":60,"tag":595,"props":1182,"children":1183},{"style":846},[1184],{"type":65,"value":936},{"type":60,"tag":595,"props":1186,"children":1188},{"class":597,"line":1187},20,[1189,1193,1197,1201,1205,1210],{"type":60,"tag":595,"props":1190,"children":1191},{"style":846},[1192],{"type":65,"value":1024},{"type":60,"tag":595,"props":1194,"children":1195},{"style":841},[1196],{"type":65,"value":1124},{"type":60,"tag":595,"props":1198,"children":1199},{"style":846},[1200],{"type":65,"value":525},{"type":60,"tag":595,"props":1202,"children":1203},{"style":846},[1204],{"type":65,"value":926},{"type":60,"tag":595,"props":1206,"children":1207},{"style":765},[1208],{"type":65,"value":1209},"task_2",{"type":60,"tag":595,"props":1211,"children":1212},{"style":846},[1213],{"type":65,"value":936},{"type":60,"tag":595,"props":1215,"children":1217},{"class":597,"line":1216},21,[1218,1222,1226],{"type":60,"tag":595,"props":1219,"children":1220},{"style":841},[1221],{"type":65,"value":1149},{"type":60,"tag":595,"props":1223,"children":1224},{"style":846},[1225],{"type":65,"value":525},{"type":60,"tag":595,"props":1227,"children":1228},{"style":765},[1229],{"type":65,"value":1158},{"type":60,"tag":595,"props":1231,"children":1233},{"class":597,"line":1232},22,[1234,1238,1242,1246,1251],{"type":60,"tag":595,"props":1235,"children":1236},{"style":841},[1237],{"type":65,"value":1167},{"type":60,"tag":595,"props":1239,"children":1240},{"style":846},[1241],{"type":65,"value":525},{"type":60,"tag":595,"props":1243,"children":1244},{"style":846},[1245],{"type":65,"value":926},{"type":60,"tag":595,"props":1247,"children":1248},{"style":765},[1249],{"type":65,"value":1250},"echo 2",{"type":60,"tag":595,"props":1252,"children":1253},{"style":846},[1254],{"type":65,"value":936},{"type":60,"tag":595,"props":1256,"children":1258},{"class":597,"line":1257},23,[1259,1263,1267,1271,1275],{"type":60,"tag":595,"props":1260,"children":1261},{"style":841},[1262],{"type":65,"value":1079},{"type":60,"tag":595,"props":1264,"children":1265},{"style":846},[1266],{"type":65,"value":525},{"type":60,"tag":595,"props":1268,"children":1269},{"style":846},[1270],{"type":65,"value":1088},{"type":60,"tag":595,"props":1272,"children":1273},{"style":765},[1274],{"type":65,"value":1093},{"type":60,"tag":595,"props":1276,"children":1277},{"style":846},[1278],{"type":65,"value":1098},{"type":60,"tag":595,"props":1280,"children":1282},{"class":597,"line":1281},24,[1283,1287,1291,1295,1299,1304],{"type":60,"tag":595,"props":1284,"children":1285},{"style":846},[1286],{"type":65,"value":1024},{"type":60,"tag":595,"props":1288,"children":1289},{"style":841},[1290],{"type":65,"value":1124},{"type":60,"tag":595,"props":1292,"children":1293},{"style":846},[1294],{"type":65,"value":525},{"type":60,"tag":595,"props":1296,"children":1297},{"style":846},[1298],{"type":65,"value":926},{"type":60,"tag":595,"props":1300,"children":1301},{"style":765},[1302],{"type":65,"value":1303},"task_3",{"type":60,"tag":595,"props":1305,"children":1306},{"style":846},[1307],{"type":65,"value":936},{"type":60,"tag":595,"props":1309,"children":1311},{"class":597,"line":1310},25,[1312,1316,1320],{"type":60,"tag":595,"props":1313,"children":1314},{"style":841},[1315],{"type":65,"value":1149},{"type":60,"tag":595,"props":1317,"children":1318},{"style":846},[1319],{"type":65,"value":525},{"type":60,"tag":595,"props":1321,"children":1322},{"style":765},[1323],{"type":65,"value":1158},{"type":60,"tag":595,"props":1325,"children":1327},{"class":597,"line":1326},26,[1328,1332,1336,1340,1345],{"type":60,"tag":595,"props":1329,"children":1330},{"style":841},[1331],{"type":65,"value":1167},{"type":60,"tag":595,"props":1333,"children":1334},{"style":846},[1335],{"type":65,"value":525},{"type":60,"tag":595,"props":1337,"children":1338},{"style":846},[1339],{"type":65,"value":926},{"type":60,"tag":595,"props":1341,"children":1342},{"style":765},[1343],{"type":65,"value":1344},"echo 3",{"type":60,"tag":595,"props":1346,"children":1347},{"style":846},[1348],{"type":65,"value":936},{"type":60,"tag":595,"props":1350,"children":1352},{"class":597,"line":1351},27,[1353,1357,1361,1365,1369],{"type":60,"tag":595,"props":1354,"children":1355},{"style":841},[1356],{"type":65,"value":1079},{"type":60,"tag":595,"props":1358,"children":1359},{"style":846},[1360],{"type":65,"value":525},{"type":60,"tag":595,"props":1362,"children":1363},{"style":846},[1364],{"type":65,"value":1088},{"type":60,"tag":595,"props":1366,"children":1367},{"style":765},[1368],{"type":65,"value":1093},{"type":60,"tag":595,"props":1370,"children":1371},{"style":846},[1372],{"type":65,"value":1098},{"type":60,"tag":595,"props":1374,"children":1376},{"class":597,"line":1375},28,[1377,1382,1386,1390,1394],{"type":60,"tag":595,"props":1378,"children":1379},{"style":841},[1380],{"type":65,"value":1381},"      task_group_name",{"type":60,"tag":595,"props":1383,"children":1384},{"style":846},[1385],{"type":65,"value":525},{"type":60,"tag":595,"props":1387,"children":1388},{"style":846},[1389],{"type":65,"value":926},{"type":60,"tag":595,"props":1391,"children":1392},{"style":765},[1393],{"type":65,"value":1042},{"type":60,"tag":595,"props":1395,"children":1396},{"style":846},[1397],{"type":65,"value":936},{"type":60,"tag":507,"props":1399,"children":1401},{"id":1400},"key-fields",[1402],{"type":65,"value":1403},"Key Fields",{"type":60,"tag":250,"props":1405,"children":1406},{},[1407,1428],{"type":60,"tag":254,"props":1408,"children":1409},{},[1410],{"type":60,"tag":258,"props":1411,"children":1412},{},[1413,1418,1423],{"type":60,"tag":262,"props":1414,"children":1415},{},[1416],{"type":65,"value":1417},"Field",{"type":60,"tag":262,"props":1419,"children":1420},{},[1421],{"type":65,"value":1422},"Where",{"type":60,"tag":262,"props":1424,"children":1425},{},[1426],{"type":65,"value":1427},"Purpose",{"type":60,"tag":273,"props":1429,"children":1430},{},[1431,1452,1488,1525,1561,1594,1627,1664,1689],{"type":60,"tag":258,"props":1432,"children":1433},{},[1434,1442,1447],{"type":60,"tag":280,"props":1435,"children":1436},{},[1437],{"type":60,"tag":95,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":65,"value":787},{"type":60,"tag":280,"props":1443,"children":1444},{},[1445],{"type":65,"value":1446},"top-level",{"type":60,"tag":280,"props":1448,"children":1449},{},[1450],{"type":65,"value":1451},"Shared DAG-level args applied to every DAG in this file",{"type":60,"tag":258,"props":1453,"children":1454},{},[1455,1464,1476],{"type":60,"tag":280,"props":1456,"children":1457},{},[1458],{"type":60,"tag":95,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":65,"value":1463},"default_args",{"type":60,"tag":280,"props":1465,"children":1466},{},[1467,1469,1474],{"type":65,"value":1468},"DAG or ",{"type":60,"tag":95,"props":1470,"children":1472},{"className":1471},[],[1473],{"type":65,"value":787},{"type":65,"value":1475}," block",{"type":60,"tag":280,"props":1477,"children":1478},{},[1479,1481,1486],{"type":65,"value":1480},"Standard Airflow ",{"type":60,"tag":95,"props":1482,"children":1484},{"className":1483},[],[1485],{"type":65,"value":1463},{"type":65,"value":1487}," (owner, retries, start_date, ...)",{"type":60,"tag":258,"props":1489,"children":1490},{},[1491,1500,1505],{"type":60,"tag":280,"props":1492,"children":1493},{},[1494],{"type":60,"tag":95,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":65,"value":1499},"schedule",{"type":60,"tag":280,"props":1501,"children":1502},{},[1503],{"type":65,"value":1504},"DAG",{"type":60,"tag":280,"props":1506,"children":1507},{},[1508,1510,1516,1518,1523],{"type":65,"value":1509},"Cron expression, preset (",{"type":60,"tag":95,"props":1511,"children":1513},{"className":1512},[],[1514],{"type":65,"value":1515},"@daily",{"type":65,"value":1517},"), Dataset list, or ",{"type":60,"tag":95,"props":1519,"children":1521},{"className":1520},[],[1522],{"type":65,"value":419},{"type":65,"value":1524}," timetable",{"type":60,"tag":258,"props":1526,"children":1527},{},[1528,1552,1556],{"type":60,"tag":280,"props":1529,"children":1530},{},[1531,1537,1539,1545,1546],{"type":60,"tag":95,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":65,"value":1536},"catchup",{"type":65,"value":1538}," \u002F ",{"type":60,"tag":95,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":65,"value":1544},"description",{"type":65,"value":1538},{"type":60,"tag":95,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":65,"value":1551},"tags",{"type":60,"tag":280,"props":1553,"children":1554},{},[1555],{"type":65,"value":1504},{"type":60,"tag":280,"props":1557,"children":1558},{},[1559],{"type":65,"value":1560},"Standard Airflow DAG kwargs",{"type":60,"tag":258,"props":1562,"children":1563},{},[1564,1572,1576],{"type":60,"tag":280,"props":1565,"children":1566},{},[1567],{"type":60,"tag":95,"props":1568,"children":1570},{"className":1569},[],[1571],{"type":65,"value":808},{"type":60,"tag":280,"props":1573,"children":1574},{},[1575],{"type":65,"value":1504},{"type":60,"tag":280,"props":1577,"children":1578},{},[1579,1581,1587,1588],{"type":65,"value":1580},"List of task dicts; each requires ",{"type":60,"tag":95,"props":1582,"children":1584},{"className":1583},[],[1585],{"type":65,"value":1586},"task_id",{"type":65,"value":810},{"type":60,"tag":95,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":65,"value":1593},"operator",{"type":60,"tag":258,"props":1595,"children":1596},{},[1597,1605,1610],{"type":60,"tag":280,"props":1598,"children":1599},{},[1600],{"type":60,"tag":95,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":65,"value":1593},{"type":60,"tag":280,"props":1606,"children":1607},{},[1608],{"type":65,"value":1609},"task",{"type":60,"tag":280,"props":1611,"children":1612},{},[1613,1618,1620,1626],{"type":60,"tag":74,"props":1614,"children":1615},{},[1616],{"type":65,"value":1617},"Full import path",{"type":65,"value":1619}," to operator class (e.g. ",{"type":60,"tag":95,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":65,"value":1625},"airflow.operators.bash.BashOperator",{"type":65,"value":421},{"type":60,"tag":258,"props":1628,"children":1629},{},[1630,1639,1644],{"type":60,"tag":280,"props":1631,"children":1632},{},[1633],{"type":60,"tag":95,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":65,"value":1638},"dependencies",{"type":60,"tag":280,"props":1640,"children":1641},{},[1642],{"type":65,"value":1643},"task \u002F task_group",{"type":60,"tag":280,"props":1645,"children":1646},{},[1647,1649,1654,1656,1662],{"type":65,"value":1648},"List of upstream ",{"type":60,"tag":95,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":65,"value":1586},{"type":65,"value":1655},"s or ",{"type":60,"tag":95,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":65,"value":1661},"group_name",{"type":65,"value":1663},"s",{"type":60,"tag":258,"props":1665,"children":1666},{},[1667,1675,1679],{"type":60,"tag":280,"props":1668,"children":1669},{},[1670],{"type":60,"tag":95,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":65,"value":816},{"type":60,"tag":280,"props":1676,"children":1677},{},[1678],{"type":65,"value":1504},{"type":60,"tag":280,"props":1680,"children":1681},{},[1682,1684],{"type":65,"value":1683},"List of group dicts; each requires ",{"type":60,"tag":95,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":65,"value":1661},{"type":60,"tag":258,"props":1690,"children":1691},{},[1692,1701,1705],{"type":60,"tag":280,"props":1693,"children":1694},{},[1695],{"type":60,"tag":95,"props":1696,"children":1698},{"className":1697},[],[1699],{"type":65,"value":1700},"task_group_name",{"type":60,"tag":280,"props":1702,"children":1703},{},[1704],{"type":65,"value":1609},{"type":60,"tag":280,"props":1706,"children":1707},{},[1708],{"type":65,"value":1709},"Assigns a task to a task group",{"type":60,"tag":68,"props":1711,"children":1712},{},[1713,1715,1720],{"type":65,"value":1714},"Tasks do ",{"type":60,"tag":74,"props":1716,"children":1717},{},[1718],{"type":65,"value":1719},"not",{"type":65,"value":1721}," need to be ordered by dependency in the YAML — dag-factory resolves the DAG topology.",{"type":60,"tag":507,"props":1723,"children":1725},{"id":1724},"dictionary-format-legacy",[1726],{"type":65,"value":1727},"Dictionary Format (Legacy)",{"type":60,"tag":68,"props":1729,"children":1730},{},[1731,1733,1738,1740,1745],{"type":65,"value":1732},"Pre-1.0 dictionary format (where ",{"type":60,"tag":95,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":65,"value":808},{"type":65,"value":1739}," is a dict keyed by ",{"type":60,"tag":95,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":65,"value":1586},{"type":65,"value":1746},") still works for backward compatibility, but prefer the list format for new code.",{"type":60,"tag":240,"props":1748,"children":1749},{},[],{"type":60,"tag":157,"props":1751,"children":1753},{"id":1752},"defaults",[1754],{"type":65,"value":328},{"type":60,"tag":68,"props":1756,"children":1757},{},[1758,1760,1765],{"type":65,"value":1759},"There are four ways to set defaults, in ",{"type":60,"tag":74,"props":1761,"children":1762},{},[1763],{"type":65,"value":1764},"precedence order",{"type":65,"value":1766}," (highest first):",{"type":60,"tag":169,"props":1768,"children":1769},{},[1770,1780,1793,1810],{"type":60,"tag":173,"props":1771,"children":1772},{},[1773,1778],{"type":60,"tag":95,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":65,"value":1463},{"type":65,"value":1779}," \u002F DAG-level keys inside an individual DAG",{"type":60,"tag":173,"props":1781,"children":1782},{},[1783,1785,1791],{"type":65,"value":1784},"The top-level ",{"type":60,"tag":95,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":65,"value":1790},"default:",{"type":65,"value":1792}," block in the same YAML file",{"type":60,"tag":173,"props":1794,"children":1795},{},[1796,1802,1804],{"type":60,"tag":95,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":65,"value":1801},"defaults_config_dict=",{"type":65,"value":1803}," argument to ",{"type":60,"tag":95,"props":1805,"children":1807},{"className":1806},[],[1808],{"type":65,"value":1809},"load_yaml_dags",{"type":60,"tag":173,"props":1811,"children":1812},{},[1813,1815,1821,1823,1829,1831,1837],{"type":65,"value":1814},"A ",{"type":60,"tag":95,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":65,"value":1820},"defaults.yml",{"type":65,"value":1822}," (or ",{"type":60,"tag":95,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":65,"value":1828},"defaults.yaml",{"type":65,"value":1830},") file via ",{"type":60,"tag":95,"props":1832,"children":1834},{"className":1833},[],[1835],{"type":65,"value":1836},"defaults_config_path=",{"type":65,"value":1838}," (or auto-detected next to the DAG YAML)",{"type":60,"tag":81,"props":1840,"children":1841},{},[1842],{"type":60,"tag":68,"props":1843,"children":1844},{},[1845,1847,1851],{"type":65,"value":1846},"Note: loader argument names and several other field names changed in v1.0.0. See ",{"type":60,"tag":109,"props":1848,"children":1849},{"href":144},[1850],{"type":65,"value":144},{"type":65,"value":1852}," if you're working on an older project.",{"type":60,"tag":507,"props":1854,"children":1856},{"id":1855},"default-block-in-the-same-file",[1857,1862],{"type":60,"tag":95,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":65,"value":787},{"type":65,"value":1863}," Block in the Same File",{"type":60,"tag":68,"props":1865,"children":1866},{},[1867],{"type":65,"value":1868},"Powerful for templating multiple DAGs from one file:",{"type":60,"tag":527,"props":1870,"children":1872},{"className":821,"code":1871,"language":21,"meta":535,"style":535},"default:\n  default_args:\n    owner: \"data-team\"\n    start_date: 2025-01-01\n    retries: 2\n  catchup: false\n  schedule: \"@daily\"\n\ndag_one:\n  description: \"first DAG\"\n  tasks:\n    - task_id: t1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo one\"\n\ndag_two:\n  description: \"second DAG\"\n  tasks:\n    - task_id: t1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo two\"\n",[1873],{"type":60,"tag":95,"props":1874,"children":1875},{"__ignoreMap":535},[1876,1887,1898,1922,1938,1956,1971,1994,2001,2013,2037,2048,2068,2083,2107,2114,2126,2150,2161,2180,2195],{"type":60,"tag":595,"props":1877,"children":1878},{"class":597,"line":598},[1879,1883],{"type":60,"tag":595,"props":1880,"children":1881},{"style":841},[1882],{"type":65,"value":787},{"type":60,"tag":595,"props":1884,"children":1885},{"style":846},[1886],{"type":65,"value":849},{"type":60,"tag":595,"props":1888,"children":1889},{"class":597,"line":607},[1890,1894],{"type":60,"tag":595,"props":1891,"children":1892},{"style":841},[1893],{"type":65,"value":857},{"type":60,"tag":595,"props":1895,"children":1896},{"style":846},[1897],{"type":65,"value":849},{"type":60,"tag":595,"props":1899,"children":1900},{"class":597,"line":616},[1901,1905,1909,1913,1918],{"type":60,"tag":595,"props":1902,"children":1903},{"style":841},[1904],{"type":65,"value":917},{"type":60,"tag":595,"props":1906,"children":1907},{"style":846},[1908],{"type":65,"value":525},{"type":60,"tag":595,"props":1910,"children":1911},{"style":846},[1912],{"type":65,"value":926},{"type":60,"tag":595,"props":1914,"children":1915},{"style":765},[1916],{"type":65,"value":1917},"data-team",{"type":60,"tag":595,"props":1919,"children":1920},{"style":846},[1921],{"type":65,"value":936},{"type":60,"tag":595,"props":1923,"children":1924},{"class":597,"line":626},[1925,1929,1933],{"type":60,"tag":595,"props":1926,"children":1927},{"style":841},[1928],{"type":65,"value":869},{"type":60,"tag":595,"props":1930,"children":1931},{"style":846},[1932],{"type":65,"value":525},{"type":60,"tag":595,"props":1934,"children":1935},{"style":876},[1936],{"type":65,"value":1937}," 2025-01-01\n",{"type":60,"tag":595,"props":1939,"children":1940},{"class":597,"line":635},[1941,1946,1950],{"type":60,"tag":595,"props":1942,"children":1943},{"style":841},[1944],{"type":65,"value":1945},"    retries",{"type":60,"tag":595,"props":1947,"children":1948},{"style":846},[1949],{"type":65,"value":525},{"type":60,"tag":595,"props":1951,"children":1953},{"style":1952},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1954],{"type":65,"value":1955}," 2\n",{"type":60,"tag":595,"props":1957,"children":1958},{"class":597,"line":643},[1959,1963,1967],{"type":60,"tag":595,"props":1960,"children":1961},{"style":841},[1962],{"type":65,"value":994},{"type":60,"tag":595,"props":1964,"children":1965},{"style":846},[1966],{"type":65,"value":525},{"type":60,"tag":595,"props":1968,"children":1969},{"style":1001},[1970],{"type":65,"value":1004},{"type":60,"tag":595,"props":1972,"children":1973},{"class":597,"line":652},[1974,1978,1982,1986,1990],{"type":60,"tag":595,"props":1975,"children":1976},{"style":841},[1977],{"type":65,"value":969},{"type":60,"tag":595,"props":1979,"children":1980},{"style":846},[1981],{"type":65,"value":525},{"type":60,"tag":595,"props":1983,"children":1984},{"style":846},[1985],{"type":65,"value":926},{"type":60,"tag":595,"props":1987,"children":1988},{"style":765},[1989],{"type":65,"value":1515},{"type":60,"tag":595,"props":1991,"children":1992},{"style":846},[1993],{"type":65,"value":936},{"type":60,"tag":595,"props":1995,"children":1996},{"class":597,"line":660},[1997],{"type":60,"tag":595,"props":1998,"children":1999},{"emptyLinePlaceholder":620},[2000],{"type":65,"value":623},{"type":60,"tag":595,"props":2002,"children":2003},{"class":597,"line":669},[2004,2009],{"type":60,"tag":595,"props":2005,"children":2006},{"style":841},[2007],{"type":65,"value":2008},"dag_one",{"type":60,"tag":595,"props":2010,"children":2011},{"style":846},[2012],{"type":65,"value":849},{"type":60,"tag":595,"props":2014,"children":2015},{"class":597,"line":678},[2016,2020,2024,2028,2033],{"type":60,"tag":595,"props":2017,"children":2018},{"style":841},[2019],{"type":65,"value":944},{"type":60,"tag":595,"props":2021,"children":2022},{"style":846},[2023],{"type":65,"value":525},{"type":60,"tag":595,"props":2025,"children":2026},{"style":846},[2027],{"type":65,"value":926},{"type":60,"tag":595,"props":2029,"children":2030},{"style":765},[2031],{"type":65,"value":2032},"first DAG",{"type":60,"tag":595,"props":2034,"children":2035},{"style":846},[2036],{"type":65,"value":936},{"type":60,"tag":595,"props":2038,"children":2039},{"class":597,"line":686},[2040,2044],{"type":60,"tag":595,"props":2041,"children":2042},{"style":841},[2043],{"type":65,"value":1107},{"type":60,"tag":595,"props":2045,"children":2046},{"style":846},[2047],{"type":65,"value":849},{"type":60,"tag":595,"props":2049,"children":2050},{"class":597,"line":695},[2051,2055,2059,2063],{"type":60,"tag":595,"props":2052,"children":2053},{"style":846},[2054],{"type":65,"value":1024},{"type":60,"tag":595,"props":2056,"children":2057},{"style":841},[2058],{"type":65,"value":1124},{"type":60,"tag":595,"props":2060,"children":2061},{"style":846},[2062],{"type":65,"value":525},{"type":60,"tag":595,"props":2064,"children":2065},{"style":765},[2066],{"type":65,"value":2067}," t1\n",{"type":60,"tag":595,"props":2069,"children":2070},{"class":597,"line":704},[2071,2075,2079],{"type":60,"tag":595,"props":2072,"children":2073},{"style":841},[2074],{"type":65,"value":1149},{"type":60,"tag":595,"props":2076,"children":2077},{"style":846},[2078],{"type":65,"value":525},{"type":60,"tag":595,"props":2080,"children":2081},{"style":765},[2082],{"type":65,"value":1158},{"type":60,"tag":595,"props":2084,"children":2085},{"class":597,"line":712},[2086,2090,2094,2098,2103],{"type":60,"tag":595,"props":2087,"children":2088},{"style":841},[2089],{"type":65,"value":1167},{"type":60,"tag":595,"props":2091,"children":2092},{"style":846},[2093],{"type":65,"value":525},{"type":60,"tag":595,"props":2095,"children":2096},{"style":846},[2097],{"type":65,"value":926},{"type":60,"tag":595,"props":2099,"children":2100},{"style":765},[2101],{"type":65,"value":2102},"echo one",{"type":60,"tag":595,"props":2104,"children":2105},{"style":846},[2106],{"type":65,"value":936},{"type":60,"tag":595,"props":2108,"children":2109},{"class":597,"line":721},[2110],{"type":60,"tag":595,"props":2111,"children":2112},{"emptyLinePlaceholder":620},[2113],{"type":65,"value":623},{"type":60,"tag":595,"props":2115,"children":2116},{"class":597,"line":1101},[2117,2122],{"type":60,"tag":595,"props":2118,"children":2119},{"style":841},[2120],{"type":65,"value":2121},"dag_two",{"type":60,"tag":595,"props":2123,"children":2124},{"style":846},[2125],{"type":65,"value":849},{"type":60,"tag":595,"props":2127,"children":2128},{"class":597,"line":1114},[2129,2133,2137,2141,2146],{"type":60,"tag":595,"props":2130,"children":2131},{"style":841},[2132],{"type":65,"value":944},{"type":60,"tag":595,"props":2134,"children":2135},{"style":846},[2136],{"type":65,"value":525},{"type":60,"tag":595,"props":2138,"children":2139},{"style":846},[2140],{"type":65,"value":926},{"type":60,"tag":595,"props":2142,"children":2143},{"style":765},[2144],{"type":65,"value":2145},"second DAG",{"type":60,"tag":595,"props":2147,"children":2148},{"style":846},[2149],{"type":65,"value":936},{"type":60,"tag":595,"props":2151,"children":2152},{"class":597,"line":1143},[2153,2157],{"type":60,"tag":595,"props":2154,"children":2155},{"style":841},[2156],{"type":65,"value":1107},{"type":60,"tag":595,"props":2158,"children":2159},{"style":846},[2160],{"type":65,"value":849},{"type":60,"tag":595,"props":2162,"children":2163},{"class":597,"line":1161},[2164,2168,2172,2176],{"type":60,"tag":595,"props":2165,"children":2166},{"style":846},[2167],{"type":65,"value":1024},{"type":60,"tag":595,"props":2169,"children":2170},{"style":841},[2171],{"type":65,"value":1124},{"type":60,"tag":595,"props":2173,"children":2174},{"style":846},[2175],{"type":65,"value":525},{"type":60,"tag":595,"props":2177,"children":2178},{"style":765},[2179],{"type":65,"value":2067},{"type":60,"tag":595,"props":2181,"children":2182},{"class":597,"line":1187},[2183,2187,2191],{"type":60,"tag":595,"props":2184,"children":2185},{"style":841},[2186],{"type":65,"value":1149},{"type":60,"tag":595,"props":2188,"children":2189},{"style":846},[2190],{"type":65,"value":525},{"type":60,"tag":595,"props":2192,"children":2193},{"style":765},[2194],{"type":65,"value":1158},{"type":60,"tag":595,"props":2196,"children":2197},{"class":597,"line":1216},[2198,2202,2206,2210,2215],{"type":60,"tag":595,"props":2199,"children":2200},{"style":841},[2201],{"type":65,"value":1167},{"type":60,"tag":595,"props":2203,"children":2204},{"style":846},[2205],{"type":65,"value":525},{"type":60,"tag":595,"props":2207,"children":2208},{"style":846},[2209],{"type":65,"value":926},{"type":60,"tag":595,"props":2211,"children":2212},{"style":765},[2213],{"type":65,"value":2214},"echo two",{"type":60,"tag":595,"props":2216,"children":2217},{"style":846},[2218],{"type":65,"value":936},{"type":60,"tag":507,"props":2220,"children":2222},{"id":2221},"defaultsyml-file",[2223,2228],{"type":60,"tag":95,"props":2224,"children":2226},{"className":2225},[],[2227],{"type":65,"value":1820},{"type":65,"value":2229}," File",{"type":60,"tag":68,"props":2231,"children":2232},{},[2233,2235,2240,2242,2248,2250,2255,2257,2262,2264,2269,2270,2275,2277,2282,2284,2289],{"type":65,"value":2234},"Place a ",{"type":60,"tag":95,"props":2236,"children":2238},{"className":2237},[],[2239],{"type":65,"value":1820},{"type":65,"value":2241}," next to the DAG YAML, or point ",{"type":60,"tag":95,"props":2243,"children":2245},{"className":2244},[],[2246],{"type":65,"value":2247},"defaults_config_path",{"type":65,"value":2249}," at a parent directory. dag-factory ",{"type":60,"tag":74,"props":2251,"children":2252},{},[2253],{"type":65,"value":2254},"merges",{"type":65,"value":2256}," all ",{"type":60,"tag":95,"props":2258,"children":2260},{"className":2259},[],[2261],{"type":65,"value":1820},{"type":65,"value":2263}," files walking up the directory tree, with the file closest to the DAG YAML winning. DAG-level args (e.g. ",{"type":60,"tag":95,"props":2265,"children":2267},{"className":2266},[],[2268],{"type":65,"value":1499},{"type":65,"value":557},{"type":60,"tag":95,"props":2271,"children":2273},{"className":2272},[],[2274],{"type":65,"value":1536},{"type":65,"value":2276},") go at the root of ",{"type":60,"tag":95,"props":2278,"children":2280},{"className":2279},[],[2281],{"type":65,"value":1820},{"type":65,"value":2283},"; per-task defaults go under ",{"type":60,"tag":95,"props":2285,"children":2287},{"className":2286},[],[2288],{"type":65,"value":1463},{"type":65,"value":2290},".",{"type":60,"tag":527,"props":2292,"children":2294},{"className":821,"code":2293,"language":21,"meta":535,"style":535},"# defaults.yml\nschedule: 0 1 * * *\ncatchup: false\ndefault_args:\n  start_date: '2024-12-31'\n  owner: data-team\n",[2295],{"type":60,"tag":95,"props":2296,"children":2297},{"__ignoreMap":535},[2298,2306,2322,2337,2348,2375],{"type":60,"tag":595,"props":2299,"children":2300},{"class":597,"line":598},[2301],{"type":60,"tag":595,"props":2302,"children":2303},{"style":832},[2304],{"type":65,"value":2305},"# defaults.yml\n",{"type":60,"tag":595,"props":2307,"children":2308},{"class":597,"line":607},[2309,2313,2317],{"type":60,"tag":595,"props":2310,"children":2311},{"style":841},[2312],{"type":65,"value":1499},{"type":60,"tag":595,"props":2314,"children":2315},{"style":846},[2316],{"type":65,"value":525},{"type":60,"tag":595,"props":2318,"children":2319},{"style":765},[2320],{"type":65,"value":2321}," 0 1 * * *\n",{"type":60,"tag":595,"props":2323,"children":2324},{"class":597,"line":616},[2325,2329,2333],{"type":60,"tag":595,"props":2326,"children":2327},{"style":841},[2328],{"type":65,"value":1536},{"type":60,"tag":595,"props":2330,"children":2331},{"style":846},[2332],{"type":65,"value":525},{"type":60,"tag":595,"props":2334,"children":2335},{"style":1001},[2336],{"type":65,"value":1004},{"type":60,"tag":595,"props":2338,"children":2339},{"class":597,"line":626},[2340,2344],{"type":60,"tag":595,"props":2341,"children":2342},{"style":841},[2343],{"type":65,"value":1463},{"type":60,"tag":595,"props":2345,"children":2346},{"style":846},[2347],{"type":65,"value":849},{"type":60,"tag":595,"props":2349,"children":2350},{"class":597,"line":635},[2351,2356,2360,2365,2370],{"type":60,"tag":595,"props":2352,"children":2353},{"style":841},[2354],{"type":65,"value":2355},"  start_date",{"type":60,"tag":595,"props":2357,"children":2358},{"style":846},[2359],{"type":65,"value":525},{"type":60,"tag":595,"props":2361,"children":2362},{"style":846},[2363],{"type":65,"value":2364}," '",{"type":60,"tag":595,"props":2366,"children":2367},{"style":765},[2368],{"type":65,"value":2369},"2024-12-31",{"type":60,"tag":595,"props":2371,"children":2372},{"style":846},[2373],{"type":65,"value":2374},"'\n",{"type":60,"tag":595,"props":2376,"children":2377},{"class":597,"line":643},[2378,2383,2387],{"type":60,"tag":595,"props":2379,"children":2380},{"style":841},[2381],{"type":65,"value":2382},"  owner",{"type":60,"tag":595,"props":2384,"children":2385},{"style":846},[2386],{"type":65,"value":525},{"type":60,"tag":595,"props":2388,"children":2389},{"style":765},[2390],{"type":65,"value":2391}," data-team\n",{"type":60,"tag":240,"props":2393,"children":2394},{},[],{"type":60,"tag":157,"props":2396,"children":2398},{"id":2397},"custom-provider-operators",[2399],{"type":65,"value":345},{"type":60,"tag":68,"props":2401,"children":2402},{},[2403,2405,2410],{"type":65,"value":2404},"Reference any operator by its ",{"type":60,"tag":74,"props":2406,"children":2407},{},[2408],{"type":65,"value":2409},"full Python import path",{"type":65,"value":2411},". dag-factory passes all other task keys as kwargs to that operator.",{"type":60,"tag":527,"props":2413,"children":2415},{"className":821,"code":2414,"language":21,"meta":535,"style":535},"tasks:\n  - task_id: begin\n    operator: airflow.providers.standard.operators.empty.EmptyOperator\n  - task_id: make_bread\n    operator: customized.operators.breakfast_operators.MakeBreadOperator\n    bread_type: 'Sourdough'\n",[2416],{"type":60,"tag":95,"props":2417,"children":2418},{"__ignoreMap":535},[2419,2430,2451,2468,2488,2504],{"type":60,"tag":595,"props":2420,"children":2421},{"class":597,"line":598},[2422,2426],{"type":60,"tag":595,"props":2423,"children":2424},{"style":841},[2425],{"type":65,"value":808},{"type":60,"tag":595,"props":2427,"children":2428},{"style":846},[2429],{"type":65,"value":849},{"type":60,"tag":595,"props":2431,"children":2432},{"class":597,"line":607},[2433,2438,2442,2446],{"type":60,"tag":595,"props":2434,"children":2435},{"style":846},[2436],{"type":65,"value":2437},"  -",{"type":60,"tag":595,"props":2439,"children":2440},{"style":841},[2441],{"type":65,"value":1124},{"type":60,"tag":595,"props":2443,"children":2444},{"style":846},[2445],{"type":65,"value":525},{"type":60,"tag":595,"props":2447,"children":2448},{"style":765},[2449],{"type":65,"value":2450}," begin\n",{"type":60,"tag":595,"props":2452,"children":2453},{"class":597,"line":616},[2454,2459,2463],{"type":60,"tag":595,"props":2455,"children":2456},{"style":841},[2457],{"type":65,"value":2458},"    operator",{"type":60,"tag":595,"props":2460,"children":2461},{"style":846},[2462],{"type":65,"value":525},{"type":60,"tag":595,"props":2464,"children":2465},{"style":765},[2466],{"type":65,"value":2467}," airflow.providers.standard.operators.empty.EmptyOperator\n",{"type":60,"tag":595,"props":2469,"children":2470},{"class":597,"line":626},[2471,2475,2479,2483],{"type":60,"tag":595,"props":2472,"children":2473},{"style":846},[2474],{"type":65,"value":2437},{"type":60,"tag":595,"props":2476,"children":2477},{"style":841},[2478],{"type":65,"value":1124},{"type":60,"tag":595,"props":2480,"children":2481},{"style":846},[2482],{"type":65,"value":525},{"type":60,"tag":595,"props":2484,"children":2485},{"style":765},[2486],{"type":65,"value":2487}," make_bread\n",{"type":60,"tag":595,"props":2489,"children":2490},{"class":597,"line":635},[2491,2495,2499],{"type":60,"tag":595,"props":2492,"children":2493},{"style":841},[2494],{"type":65,"value":2458},{"type":60,"tag":595,"props":2496,"children":2497},{"style":846},[2498],{"type":65,"value":525},{"type":60,"tag":595,"props":2500,"children":2501},{"style":765},[2502],{"type":65,"value":2503}," customized.operators.breakfast_operators.MakeBreadOperator\n",{"type":60,"tag":595,"props":2505,"children":2506},{"class":597,"line":643},[2507,2512,2516,2520,2525],{"type":60,"tag":595,"props":2508,"children":2509},{"style":841},[2510],{"type":65,"value":2511},"    bread_type",{"type":60,"tag":595,"props":2513,"children":2514},{"style":846},[2515],{"type":65,"value":525},{"type":60,"tag":595,"props":2517,"children":2518},{"style":846},[2519],{"type":65,"value":2364},{"type":60,"tag":595,"props":2521,"children":2522},{"style":765},[2523],{"type":65,"value":2524},"Sourdough",{"type":60,"tag":595,"props":2526,"children":2527},{"style":846},[2528],{"type":65,"value":2374},{"type":60,"tag":68,"props":2530,"children":2531},{},[2532,2534,2540,2542,2548,2550,2555],{"type":65,"value":2533},"The operator's package must be installed and importable. For Airflow 3, prefer ",{"type":60,"tag":95,"props":2535,"children":2537},{"className":2536},[],[2538],{"type":65,"value":2539},"airflow.providers.standard.operators.*",{"type":65,"value":2541}," over the legacy ",{"type":60,"tag":95,"props":2543,"children":2545},{"className":2544},[],[2546],{"type":65,"value":2547},"airflow.operators.*",{"type":65,"value":2549}," paths — the ",{"type":60,"tag":95,"props":2551,"children":2553},{"className":2552},[],[2554],{"type":65,"value":462},{"type":65,"value":2556}," CLI rewrites these automatically.",{"type":60,"tag":507,"props":2558,"children":2560},{"id":2559},"kubernetespodoperator",[2561],{"type":65,"value":2562},"KubernetesPodOperator",{"type":60,"tag":68,"props":2564,"children":2565},{},[2566,2568,2573],{"type":65,"value":2567},"Specify the operator path and pass kwargs directly. As of v1.0, dag-factory no longer does legacy type casting — use ",{"type":60,"tag":95,"props":2569,"children":2571},{"className":2570},[],[2572],{"type":65,"value":419},{"type":65,"value":2574}," for nested k8s objects.",{"type":60,"tag":527,"props":2576,"children":2578},{"className":821,"code":2577,"language":21,"meta":535,"style":535},"tasks:\n  - task_id: hello-world-pod\n    operator: airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator\n    image: \"python:3.12-slim\"\n    cmds: [\"python\", \"-c\"]\n    arguments: [\"print('hi')\"]\n    name: example-pod\n    namespace: default\n    container_resources:\n      __type__: kubernetes.client.models.V1ResourceRequirements\n      limits: {cpu: \"1\", memory: \"1024Mi\"}\n      requests: {cpu: \"0.5\", memory: \"512Mi\"}\n",[2579],{"type":60,"tag":95,"props":2580,"children":2581},{"__ignoreMap":535},[2582,2593,2613,2629,2654,2705,2738,2755,2772,2784,2801,2871],{"type":60,"tag":595,"props":2583,"children":2584},{"class":597,"line":598},[2585,2589],{"type":60,"tag":595,"props":2586,"children":2587},{"style":841},[2588],{"type":65,"value":808},{"type":60,"tag":595,"props":2590,"children":2591},{"style":846},[2592],{"type":65,"value":849},{"type":60,"tag":595,"props":2594,"children":2595},{"class":597,"line":607},[2596,2600,2604,2608],{"type":60,"tag":595,"props":2597,"children":2598},{"style":846},[2599],{"type":65,"value":2437},{"type":60,"tag":595,"props":2601,"children":2602},{"style":841},[2603],{"type":65,"value":1124},{"type":60,"tag":595,"props":2605,"children":2606},{"style":846},[2607],{"type":65,"value":525},{"type":60,"tag":595,"props":2609,"children":2610},{"style":765},[2611],{"type":65,"value":2612}," hello-world-pod\n",{"type":60,"tag":595,"props":2614,"children":2615},{"class":597,"line":616},[2616,2620,2624],{"type":60,"tag":595,"props":2617,"children":2618},{"style":841},[2619],{"type":65,"value":2458},{"type":60,"tag":595,"props":2621,"children":2622},{"style":846},[2623],{"type":65,"value":525},{"type":60,"tag":595,"props":2625,"children":2626},{"style":765},[2627],{"type":65,"value":2628}," airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator\n",{"type":60,"tag":595,"props":2630,"children":2631},{"class":597,"line":626},[2632,2637,2641,2645,2650],{"type":60,"tag":595,"props":2633,"children":2634},{"style":841},[2635],{"type":65,"value":2636},"    image",{"type":60,"tag":595,"props":2638,"children":2639},{"style":846},[2640],{"type":65,"value":525},{"type":60,"tag":595,"props":2642,"children":2643},{"style":846},[2644],{"type":65,"value":926},{"type":60,"tag":595,"props":2646,"children":2647},{"style":765},[2648],{"type":65,"value":2649},"python:3.12-slim",{"type":60,"tag":595,"props":2651,"children":2652},{"style":846},[2653],{"type":65,"value":936},{"type":60,"tag":595,"props":2655,"children":2656},{"class":597,"line":635},[2657,2662,2666,2670,2675,2679,2683,2688,2692,2697,2701],{"type":60,"tag":595,"props":2658,"children":2659},{"style":841},[2660],{"type":65,"value":2661},"    cmds",{"type":60,"tag":595,"props":2663,"children":2664},{"style":846},[2665],{"type":65,"value":525},{"type":60,"tag":595,"props":2667,"children":2668},{"style":846},[2669],{"type":65,"value":1088},{"type":60,"tag":595,"props":2671,"children":2672},{"style":846},[2673],{"type":65,"value":2674},"\"",{"type":60,"tag":595,"props":2676,"children":2677},{"style":765},[2678],{"type":65,"value":589},{"type":60,"tag":595,"props":2680,"children":2681},{"style":846},[2682],{"type":65,"value":2674},{"type":60,"tag":595,"props":2684,"children":2685},{"style":846},[2686],{"type":65,"value":2687},",",{"type":60,"tag":595,"props":2689,"children":2690},{"style":846},[2691],{"type":65,"value":926},{"type":60,"tag":595,"props":2693,"children":2694},{"style":765},[2695],{"type":65,"value":2696},"-c",{"type":60,"tag":595,"props":2698,"children":2699},{"style":846},[2700],{"type":65,"value":2674},{"type":60,"tag":595,"props":2702,"children":2703},{"style":846},[2704],{"type":65,"value":1098},{"type":60,"tag":595,"props":2706,"children":2707},{"class":597,"line":643},[2708,2713,2717,2721,2725,2730,2734],{"type":60,"tag":595,"props":2709,"children":2710},{"style":841},[2711],{"type":65,"value":2712},"    arguments",{"type":60,"tag":595,"props":2714,"children":2715},{"style":846},[2716],{"type":65,"value":525},{"type":60,"tag":595,"props":2718,"children":2719},{"style":846},[2720],{"type":65,"value":1088},{"type":60,"tag":595,"props":2722,"children":2723},{"style":846},[2724],{"type":65,"value":2674},{"type":60,"tag":595,"props":2726,"children":2727},{"style":765},[2728],{"type":65,"value":2729},"print('hi')",{"type":60,"tag":595,"props":2731,"children":2732},{"style":846},[2733],{"type":65,"value":2674},{"type":60,"tag":595,"props":2735,"children":2736},{"style":846},[2737],{"type":65,"value":1098},{"type":60,"tag":595,"props":2739,"children":2740},{"class":597,"line":652},[2741,2746,2750],{"type":60,"tag":595,"props":2742,"children":2743},{"style":841},[2744],{"type":65,"value":2745},"    name",{"type":60,"tag":595,"props":2747,"children":2748},{"style":846},[2749],{"type":65,"value":525},{"type":60,"tag":595,"props":2751,"children":2752},{"style":765},[2753],{"type":65,"value":2754}," example-pod\n",{"type":60,"tag":595,"props":2756,"children":2757},{"class":597,"line":660},[2758,2763,2767],{"type":60,"tag":595,"props":2759,"children":2760},{"style":841},[2761],{"type":65,"value":2762},"    namespace",{"type":60,"tag":595,"props":2764,"children":2765},{"style":846},[2766],{"type":65,"value":525},{"type":60,"tag":595,"props":2768,"children":2769},{"style":765},[2770],{"type":65,"value":2771}," default\n",{"type":60,"tag":595,"props":2773,"children":2774},{"class":597,"line":669},[2775,2780],{"type":60,"tag":595,"props":2776,"children":2777},{"style":841},[2778],{"type":65,"value":2779},"    container_resources",{"type":60,"tag":595,"props":2781,"children":2782},{"style":846},[2783],{"type":65,"value":849},{"type":60,"tag":595,"props":2785,"children":2786},{"class":597,"line":678},[2787,2792,2796],{"type":60,"tag":595,"props":2788,"children":2789},{"style":841},[2790],{"type":65,"value":2791},"      __type__",{"type":60,"tag":595,"props":2793,"children":2794},{"style":846},[2795],{"type":65,"value":525},{"type":60,"tag":595,"props":2797,"children":2798},{"style":765},[2799],{"type":65,"value":2800}," kubernetes.client.models.V1ResourceRequirements\n",{"type":60,"tag":595,"props":2802,"children":2803},{"class":597,"line":686},[2804,2809,2813,2818,2823,2827,2831,2836,2840,2844,2849,2853,2857,2862,2866],{"type":60,"tag":595,"props":2805,"children":2806},{"style":841},[2807],{"type":65,"value":2808},"      limits",{"type":60,"tag":595,"props":2810,"children":2811},{"style":846},[2812],{"type":65,"value":525},{"type":60,"tag":595,"props":2814,"children":2815},{"style":846},[2816],{"type":65,"value":2817}," {",{"type":60,"tag":595,"props":2819,"children":2820},{"style":841},[2821],{"type":65,"value":2822},"cpu",{"type":60,"tag":595,"props":2824,"children":2825},{"style":846},[2826],{"type":65,"value":525},{"type":60,"tag":595,"props":2828,"children":2829},{"style":846},[2830],{"type":65,"value":926},{"type":60,"tag":595,"props":2832,"children":2833},{"style":765},[2834],{"type":65,"value":2835},"1",{"type":60,"tag":595,"props":2837,"children":2838},{"style":846},[2839],{"type":65,"value":2674},{"type":60,"tag":595,"props":2841,"children":2842},{"style":846},[2843],{"type":65,"value":2687},{"type":60,"tag":595,"props":2845,"children":2846},{"style":841},[2847],{"type":65,"value":2848}," memory",{"type":60,"tag":595,"props":2850,"children":2851},{"style":846},[2852],{"type":65,"value":525},{"type":60,"tag":595,"props":2854,"children":2855},{"style":846},[2856],{"type":65,"value":926},{"type":60,"tag":595,"props":2858,"children":2859},{"style":765},[2860],{"type":65,"value":2861},"1024Mi",{"type":60,"tag":595,"props":2863,"children":2864},{"style":846},[2865],{"type":65,"value":2674},{"type":60,"tag":595,"props":2867,"children":2868},{"style":846},[2869],{"type":65,"value":2870},"}\n",{"type":60,"tag":595,"props":2872,"children":2873},{"class":597,"line":695},[2874,2879,2883,2887,2891,2895,2899,2904,2908,2912,2916,2920,2924,2929,2933],{"type":60,"tag":595,"props":2875,"children":2876},{"style":841},[2877],{"type":65,"value":2878},"      requests",{"type":60,"tag":595,"props":2880,"children":2881},{"style":846},[2882],{"type":65,"value":525},{"type":60,"tag":595,"props":2884,"children":2885},{"style":846},[2886],{"type":65,"value":2817},{"type":60,"tag":595,"props":2888,"children":2889},{"style":841},[2890],{"type":65,"value":2822},{"type":60,"tag":595,"props":2892,"children":2893},{"style":846},[2894],{"type":65,"value":525},{"type":60,"tag":595,"props":2896,"children":2897},{"style":846},[2898],{"type":65,"value":926},{"type":60,"tag":595,"props":2900,"children":2901},{"style":765},[2902],{"type":65,"value":2903},"0.5",{"type":60,"tag":595,"props":2905,"children":2906},{"style":846},[2907],{"type":65,"value":2674},{"type":60,"tag":595,"props":2909,"children":2910},{"style":846},[2911],{"type":65,"value":2687},{"type":60,"tag":595,"props":2913,"children":2914},{"style":841},[2915],{"type":65,"value":2848},{"type":60,"tag":595,"props":2917,"children":2918},{"style":846},[2919],{"type":65,"value":525},{"type":60,"tag":595,"props":2921,"children":2922},{"style":846},[2923],{"type":65,"value":926},{"type":60,"tag":595,"props":2925,"children":2926},{"style":765},[2927],{"type":65,"value":2928},"512Mi",{"type":60,"tag":595,"props":2930,"children":2931},{"style":846},[2932],{"type":65,"value":2674},{"type":60,"tag":595,"props":2934,"children":2935},{"style":846},[2936],{"type":65,"value":2870},{"type":60,"tag":240,"props":2938,"children":2939},{},[],{"type":60,"tag":157,"props":2941,"children":2943},{"id":2942},"dynamic-task-mapping",[2944],{"type":65,"value":362},{"type":60,"tag":68,"props":2946,"children":2947},{},[2948,2950,2956,2957,2963],{"type":65,"value":2949},"Use ",{"type":60,"tag":95,"props":2951,"children":2953},{"className":2952},[],[2954],{"type":65,"value":2955},"expand",{"type":65,"value":810},{"type":60,"tag":95,"props":2958,"children":2960},{"className":2959},[],[2961],{"type":65,"value":2962},"partial",{"type":65,"value":2964}," keys on a task to map dynamically. dag-factory has two distinct ways to reference an upstream task's output:",{"type":60,"tag":2966,"props":2967,"children":2968},"ul",{},[2969,3005],{"type":60,"tag":173,"props":2970,"children":2971},{},[2972,2981,2983,2988,2990,2996,2997,3003],{"type":60,"tag":74,"props":2973,"children":2974},{},[2975],{"type":60,"tag":95,"props":2976,"children":2978},{"className":2977},[],[2979],{"type":65,"value":2980},"task_id.output",{"type":65,"value":2982}," — XCom-style reference, used inside ",{"type":60,"tag":95,"props":2984,"children":2986},{"className":2985},[],[2987],{"type":65,"value":2955},{"type":65,"value":2989}," ",{"type":60,"tag":95,"props":2991,"children":2993},{"className":2992},[],[2994],{"type":65,"value":2995},"op_args",{"type":65,"value":1538},{"type":60,"tag":95,"props":2998,"children":3000},{"className":2999},[],[3001],{"type":65,"value":3002},"op_kwargs",{"type":65,"value":3004}," (and the equivalent kwargs of other operators).",{"type":60,"tag":173,"props":3006,"children":3007},{},[3008,3017,3019,3024,3026,3032],{"type":60,"tag":74,"props":3009,"children":3010},{},[3011],{"type":60,"tag":95,"props":3012,"children":3014},{"className":3013},[],[3015],{"type":65,"value":3016},"+task_id",{"type":65,"value":3018}," — bare value reference, used when the value sits directly under ",{"type":60,"tag":95,"props":3020,"children":3022},{"className":3021},[],[3023],{"type":65,"value":2955},{"type":65,"value":3025}," (e.g. ",{"type":60,"tag":95,"props":3027,"children":3029},{"className":3028},[],[3030],{"type":65,"value":3031},"expand: {number: +numbers_list}",{"type":65,"value":3033},") or as a TaskFlow decorator argument.",{"type":60,"tag":68,"props":3035,"children":3036},{},[3037,3039,3045,3047,3052,3054,3060,3062,3067],{"type":65,"value":3038},"Don't mix them: ",{"type":60,"tag":95,"props":3040,"children":3042},{"className":3041},[],[3043],{"type":65,"value":3044},"+request",{"type":65,"value":3046}," won't resolve inside ",{"type":60,"tag":95,"props":3048,"children":3050},{"className":3049},[],[3051],{"type":65,"value":2995},{"type":65,"value":3053},", and ",{"type":60,"tag":95,"props":3055,"children":3057},{"className":3056},[],[3058],{"type":65,"value":3059},"request.output",{"type":65,"value":3061}," won't resolve as a bare ",{"type":60,"tag":95,"props":3063,"children":3065},{"className":3064},[],[3066],{"type":65,"value":2955},{"type":65,"value":3068}," value.",{"type":60,"tag":527,"props":3070,"children":3072},{"className":821,"code":3071,"language":21,"meta":535,"style":535},"dynamic_task_map:\n  default_args:\n    start_date: 2025-01-01\n  schedule: \"0 3 * * *\"\n  tasks:\n    - task_id: request\n      operator: airflow.providers.standard.operators.python.PythonOperator\n      python_callable_name: make_list\n      python_callable_file: $CONFIG_ROOT_DIR\u002Fexpand_tasks.py\n    - task_id: process\n      operator: airflow.providers.standard.operators.python.PythonOperator\n      python_callable_name: consume_value\n      python_callable_file: $CONFIG_ROOT_DIR\u002Fexpand_tasks.py\n      partial:\n        op_kwargs:\n          fixed_param: \"test\"\n      expand:\n        op_args: request.output    # XCom-style — used inside op_args \u002F op_kwargs\n      dependencies: [request]\n",[3073],{"type":60,"tag":95,"props":3074,"children":3075},{"__ignoreMap":535},[3076,3088,3099,3114,3137,3148,3168,3184,3201,3218,3238,3253,3269,3284,3296,3308,3333,3345,3367],{"type":60,"tag":595,"props":3077,"children":3078},{"class":597,"line":598},[3079,3084],{"type":60,"tag":595,"props":3080,"children":3081},{"style":841},[3082],{"type":65,"value":3083},"dynamic_task_map",{"type":60,"tag":595,"props":3085,"children":3086},{"style":846},[3087],{"type":65,"value":849},{"type":60,"tag":595,"props":3089,"children":3090},{"class":597,"line":607},[3091,3095],{"type":60,"tag":595,"props":3092,"children":3093},{"style":841},[3094],{"type":65,"value":857},{"type":60,"tag":595,"props":3096,"children":3097},{"style":846},[3098],{"type":65,"value":849},{"type":60,"tag":595,"props":3100,"children":3101},{"class":597,"line":616},[3102,3106,3110],{"type":60,"tag":595,"props":3103,"children":3104},{"style":841},[3105],{"type":65,"value":869},{"type":60,"tag":595,"props":3107,"children":3108},{"style":846},[3109],{"type":65,"value":525},{"type":60,"tag":595,"props":3111,"children":3112},{"style":876},[3113],{"type":65,"value":1937},{"type":60,"tag":595,"props":3115,"children":3116},{"class":597,"line":626},[3117,3121,3125,3129,3133],{"type":60,"tag":595,"props":3118,"children":3119},{"style":841},[3120],{"type":65,"value":969},{"type":60,"tag":595,"props":3122,"children":3123},{"style":846},[3124],{"type":65,"value":525},{"type":60,"tag":595,"props":3126,"children":3127},{"style":846},[3128],{"type":65,"value":926},{"type":60,"tag":595,"props":3130,"children":3131},{"style":765},[3132],{"type":65,"value":982},{"type":60,"tag":595,"props":3134,"children":3135},{"style":846},[3136],{"type":65,"value":936},{"type":60,"tag":595,"props":3138,"children":3139},{"class":597,"line":635},[3140,3144],{"type":60,"tag":595,"props":3141,"children":3142},{"style":841},[3143],{"type":65,"value":1107},{"type":60,"tag":595,"props":3145,"children":3146},{"style":846},[3147],{"type":65,"value":849},{"type":60,"tag":595,"props":3149,"children":3150},{"class":597,"line":643},[3151,3155,3159,3163],{"type":60,"tag":595,"props":3152,"children":3153},{"style":846},[3154],{"type":65,"value":1024},{"type":60,"tag":595,"props":3156,"children":3157},{"style":841},[3158],{"type":65,"value":1124},{"type":60,"tag":595,"props":3160,"children":3161},{"style":846},[3162],{"type":65,"value":525},{"type":60,"tag":595,"props":3164,"children":3165},{"style":765},[3166],{"type":65,"value":3167}," request\n",{"type":60,"tag":595,"props":3169,"children":3170},{"class":597,"line":652},[3171,3175,3179],{"type":60,"tag":595,"props":3172,"children":3173},{"style":841},[3174],{"type":65,"value":1149},{"type":60,"tag":595,"props":3176,"children":3177},{"style":846},[3178],{"type":65,"value":525},{"type":60,"tag":595,"props":3180,"children":3181},{"style":765},[3182],{"type":65,"value":3183}," airflow.providers.standard.operators.python.PythonOperator\n",{"type":60,"tag":595,"props":3185,"children":3186},{"class":597,"line":660},[3187,3192,3196],{"type":60,"tag":595,"props":3188,"children":3189},{"style":841},[3190],{"type":65,"value":3191},"      python_callable_name",{"type":60,"tag":595,"props":3193,"children":3194},{"style":846},[3195],{"type":65,"value":525},{"type":60,"tag":595,"props":3197,"children":3198},{"style":765},[3199],{"type":65,"value":3200}," make_list\n",{"type":60,"tag":595,"props":3202,"children":3203},{"class":597,"line":669},[3204,3209,3213],{"type":60,"tag":595,"props":3205,"children":3206},{"style":841},[3207],{"type":65,"value":3208},"      python_callable_file",{"type":60,"tag":595,"props":3210,"children":3211},{"style":846},[3212],{"type":65,"value":525},{"type":60,"tag":595,"props":3214,"children":3215},{"style":765},[3216],{"type":65,"value":3217}," $CONFIG_ROOT_DIR\u002Fexpand_tasks.py\n",{"type":60,"tag":595,"props":3219,"children":3220},{"class":597,"line":678},[3221,3225,3229,3233],{"type":60,"tag":595,"props":3222,"children":3223},{"style":846},[3224],{"type":65,"value":1024},{"type":60,"tag":595,"props":3226,"children":3227},{"style":841},[3228],{"type":65,"value":1124},{"type":60,"tag":595,"props":3230,"children":3231},{"style":846},[3232],{"type":65,"value":525},{"type":60,"tag":595,"props":3234,"children":3235},{"style":765},[3236],{"type":65,"value":3237}," process\n",{"type":60,"tag":595,"props":3239,"children":3240},{"class":597,"line":686},[3241,3245,3249],{"type":60,"tag":595,"props":3242,"children":3243},{"style":841},[3244],{"type":65,"value":1149},{"type":60,"tag":595,"props":3246,"children":3247},{"style":846},[3248],{"type":65,"value":525},{"type":60,"tag":595,"props":3250,"children":3251},{"style":765},[3252],{"type":65,"value":3183},{"type":60,"tag":595,"props":3254,"children":3255},{"class":597,"line":695},[3256,3260,3264],{"type":60,"tag":595,"props":3257,"children":3258},{"style":841},[3259],{"type":65,"value":3191},{"type":60,"tag":595,"props":3261,"children":3262},{"style":846},[3263],{"type":65,"value":525},{"type":60,"tag":595,"props":3265,"children":3266},{"style":765},[3267],{"type":65,"value":3268}," consume_value\n",{"type":60,"tag":595,"props":3270,"children":3271},{"class":597,"line":704},[3272,3276,3280],{"type":60,"tag":595,"props":3273,"children":3274},{"style":841},[3275],{"type":65,"value":3208},{"type":60,"tag":595,"props":3277,"children":3278},{"style":846},[3279],{"type":65,"value":525},{"type":60,"tag":595,"props":3281,"children":3282},{"style":765},[3283],{"type":65,"value":3217},{"type":60,"tag":595,"props":3285,"children":3286},{"class":597,"line":712},[3287,3292],{"type":60,"tag":595,"props":3288,"children":3289},{"style":841},[3290],{"type":65,"value":3291},"      partial",{"type":60,"tag":595,"props":3293,"children":3294},{"style":846},[3295],{"type":65,"value":849},{"type":60,"tag":595,"props":3297,"children":3298},{"class":597,"line":721},[3299,3304],{"type":60,"tag":595,"props":3300,"children":3301},{"style":841},[3302],{"type":65,"value":3303},"        op_kwargs",{"type":60,"tag":595,"props":3305,"children":3306},{"style":846},[3307],{"type":65,"value":849},{"type":60,"tag":595,"props":3309,"children":3310},{"class":597,"line":1101},[3311,3316,3320,3324,3329],{"type":60,"tag":595,"props":3312,"children":3313},{"style":841},[3314],{"type":65,"value":3315},"          fixed_param",{"type":60,"tag":595,"props":3317,"children":3318},{"style":846},[3319],{"type":65,"value":525},{"type":60,"tag":595,"props":3321,"children":3322},{"style":846},[3323],{"type":65,"value":926},{"type":60,"tag":595,"props":3325,"children":3326},{"style":765},[3327],{"type":65,"value":3328},"test",{"type":60,"tag":595,"props":3330,"children":3331},{"style":846},[3332],{"type":65,"value":936},{"type":60,"tag":595,"props":3334,"children":3335},{"class":597,"line":1114},[3336,3341],{"type":60,"tag":595,"props":3337,"children":3338},{"style":841},[3339],{"type":65,"value":3340},"      expand",{"type":60,"tag":595,"props":3342,"children":3343},{"style":846},[3344],{"type":65,"value":849},{"type":60,"tag":595,"props":3346,"children":3347},{"class":597,"line":1143},[3348,3353,3357,3362],{"type":60,"tag":595,"props":3349,"children":3350},{"style":841},[3351],{"type":65,"value":3352},"        op_args",{"type":60,"tag":595,"props":3354,"children":3355},{"style":846},[3356],{"type":65,"value":525},{"type":60,"tag":595,"props":3358,"children":3359},{"style":765},[3360],{"type":65,"value":3361}," request.output",{"type":60,"tag":595,"props":3363,"children":3364},{"style":832},[3365],{"type":65,"value":3366},"    # XCom-style — used inside op_args \u002F op_kwargs\n",{"type":60,"tag":595,"props":3368,"children":3369},{"class":597,"line":1161},[3370,3374,3378,3382,3387],{"type":60,"tag":595,"props":3371,"children":3372},{"style":841},[3373],{"type":65,"value":1079},{"type":60,"tag":595,"props":3375,"children":3376},{"style":846},[3377],{"type":65,"value":525},{"type":60,"tag":595,"props":3379,"children":3380},{"style":846},[3381],{"type":65,"value":1088},{"type":60,"tag":595,"props":3383,"children":3384},{"style":765},[3385],{"type":65,"value":3386},"request",{"type":60,"tag":595,"props":3388,"children":3389},{"style":846},[3390],{"type":65,"value":1098},{"type":60,"tag":68,"props":3392,"children":3393},{},[3394,3396,3402,3404,3409],{"type":65,"value":3395},"Bare-value form (TaskFlow ",{"type":60,"tag":95,"props":3397,"children":3399},{"className":3398},[],[3400],{"type":65,"value":3401},"decorator",{"type":65,"value":3403}," tasks, or any non-",{"type":60,"tag":95,"props":3405,"children":3407},{"className":3406},[],[3408],{"type":65,"value":2995},{"type":65,"value":3410}," mapping):",{"type":60,"tag":527,"props":3412,"children":3414},{"className":821,"code":3413,"language":21,"meta":535,"style":535},"tasks:\n  - task_id: numbers_list\n    decorator: airflow.sdk.definitions.decorators.task\n    python_callable: sample.build_numbers_list\n  - task_id: double_number\n    decorator: airflow.sdk.definitions.decorators.task\n    python_callable: sample.double\n    expand:\n      number: +numbers_list   # + resolves to upstream task `numbers_list`'s XComArg\n",[3415],{"type":60,"tag":95,"props":3416,"children":3417},{"__ignoreMap":535},[3418,3429,3449,3466,3483,3503,3518,3534,3546],{"type":60,"tag":595,"props":3419,"children":3420},{"class":597,"line":598},[3421,3425],{"type":60,"tag":595,"props":3422,"children":3423},{"style":841},[3424],{"type":65,"value":808},{"type":60,"tag":595,"props":3426,"children":3427},{"style":846},[3428],{"type":65,"value":849},{"type":60,"tag":595,"props":3430,"children":3431},{"class":597,"line":607},[3432,3436,3440,3444],{"type":60,"tag":595,"props":3433,"children":3434},{"style":846},[3435],{"type":65,"value":2437},{"type":60,"tag":595,"props":3437,"children":3438},{"style":841},[3439],{"type":65,"value":1124},{"type":60,"tag":595,"props":3441,"children":3442},{"style":846},[3443],{"type":65,"value":525},{"type":60,"tag":595,"props":3445,"children":3446},{"style":765},[3447],{"type":65,"value":3448}," numbers_list\n",{"type":60,"tag":595,"props":3450,"children":3451},{"class":597,"line":616},[3452,3457,3461],{"type":60,"tag":595,"props":3453,"children":3454},{"style":841},[3455],{"type":65,"value":3456},"    decorator",{"type":60,"tag":595,"props":3458,"children":3459},{"style":846},[3460],{"type":65,"value":525},{"type":60,"tag":595,"props":3462,"children":3463},{"style":765},[3464],{"type":65,"value":3465}," airflow.sdk.definitions.decorators.task\n",{"type":60,"tag":595,"props":3467,"children":3468},{"class":597,"line":626},[3469,3474,3478],{"type":60,"tag":595,"props":3470,"children":3471},{"style":841},[3472],{"type":65,"value":3473},"    python_callable",{"type":60,"tag":595,"props":3475,"children":3476},{"style":846},[3477],{"type":65,"value":525},{"type":60,"tag":595,"props":3479,"children":3480},{"style":765},[3481],{"type":65,"value":3482}," sample.build_numbers_list\n",{"type":60,"tag":595,"props":3484,"children":3485},{"class":597,"line":635},[3486,3490,3494,3498],{"type":60,"tag":595,"props":3487,"children":3488},{"style":846},[3489],{"type":65,"value":2437},{"type":60,"tag":595,"props":3491,"children":3492},{"style":841},[3493],{"type":65,"value":1124},{"type":60,"tag":595,"props":3495,"children":3496},{"style":846},[3497],{"type":65,"value":525},{"type":60,"tag":595,"props":3499,"children":3500},{"style":765},[3501],{"type":65,"value":3502}," double_number\n",{"type":60,"tag":595,"props":3504,"children":3505},{"class":597,"line":643},[3506,3510,3514],{"type":60,"tag":595,"props":3507,"children":3508},{"style":841},[3509],{"type":65,"value":3456},{"type":60,"tag":595,"props":3511,"children":3512},{"style":846},[3513],{"type":65,"value":525},{"type":60,"tag":595,"props":3515,"children":3516},{"style":765},[3517],{"type":65,"value":3465},{"type":60,"tag":595,"props":3519,"children":3520},{"class":597,"line":652},[3521,3525,3529],{"type":60,"tag":595,"props":3522,"children":3523},{"style":841},[3524],{"type":65,"value":3473},{"type":60,"tag":595,"props":3526,"children":3527},{"style":846},[3528],{"type":65,"value":525},{"type":60,"tag":595,"props":3530,"children":3531},{"style":765},[3532],{"type":65,"value":3533}," sample.double\n",{"type":60,"tag":595,"props":3535,"children":3536},{"class":597,"line":660},[3537,3542],{"type":60,"tag":595,"props":3538,"children":3539},{"style":841},[3540],{"type":65,"value":3541},"    expand",{"type":60,"tag":595,"props":3543,"children":3544},{"style":846},[3545],{"type":65,"value":849},{"type":60,"tag":595,"props":3547,"children":3548},{"class":597,"line":669},[3549,3554,3558,3563],{"type":60,"tag":595,"props":3550,"children":3551},{"style":841},[3552],{"type":65,"value":3553},"      number",{"type":60,"tag":595,"props":3555,"children":3556},{"style":846},[3557],{"type":65,"value":525},{"type":60,"tag":595,"props":3559,"children":3560},{"style":765},[3561],{"type":65,"value":3562}," +numbers_list",{"type":60,"tag":595,"props":3564,"children":3565},{"style":832},[3566],{"type":65,"value":3567},"   # + resolves to upstream task `numbers_list`'s XComArg\n",{"type":60,"tag":68,"props":3569,"children":3570},{},[3571,3573,3579,3581,3587],{"type":65,"value":3572},"For named map indices (Airflow 2.9+), set ",{"type":60,"tag":95,"props":3574,"children":3576},{"className":3575},[],[3577],{"type":65,"value":3578},"map_index_template: \"{{ task.custom_mapping_key }}\"",{"type":65,"value":3580}," and have the callable assign ",{"type":60,"tag":95,"props":3582,"children":3584},{"className":3583},[],[3585],{"type":65,"value":3586},"context[\"custom_mapping_key\"]",{"type":65,"value":2290},{"type":60,"tag":68,"props":3589,"children":3590},{},[3591,3596,3598,3603,3605,3611,3613,3618],{"type":60,"tag":74,"props":3592,"children":3593},{},[3594],{"type":65,"value":3595},"Tested patterns",{"type":65,"value":3597},": simple mapping, task-generated mapping, repeated mapping, ",{"type":60,"tag":95,"props":3599,"children":3601},{"className":3600},[],[3602],{"type":65,"value":2962},{"type":65,"value":3604},", multiple-parameter mapping, ",{"type":60,"tag":95,"props":3606,"children":3608},{"className":3607},[],[3609],{"type":65,"value":3610},"map_index_template",{"type":65,"value":3612},".\n",{"type":60,"tag":74,"props":3614,"children":3615},{},[3616],{"type":65,"value":3617},"Unsupported \u002F untested",{"type":65,"value":3619},": mapping over task groups, zipping, transforming expanding data.",{"type":60,"tag":240,"props":3621,"children":3622},{},[],{"type":60,"tag":157,"props":3624,"children":3626},{"id":3625},"datasets",[3627],{"type":65,"value":379},{"type":60,"tag":68,"props":3629,"children":3630},{},[3631,3632,3638,3639,3645,3647,3652],{"type":65,"value":2949},{"type":60,"tag":95,"props":3633,"children":3635},{"className":3634},[],[3636],{"type":65,"value":3637},"inlets",{"type":65,"value":1538},{"type":60,"tag":95,"props":3640,"children":3642},{"className":3641},[],[3643],{"type":65,"value":3644},"outlets",{"type":65,"value":3646}," on tasks to declare dataset producers, and a list of dataset URIs as ",{"type":60,"tag":95,"props":3648,"children":3650},{"className":3649},[],[3651],{"type":65,"value":1499},{"type":65,"value":3653}," to consume them.",{"type":60,"tag":527,"props":3655,"children":3657},{"className":821,"code":3656,"language":21,"meta":535,"style":535},"producer_dag:\n  default_args:\n    start_date: '2024-01-01'\n  schedule: \"0 5 * * *\"\n  catchup: false\n  tasks:\n    - task_id: task_1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 1\"\n      outlets: ['s3:\u002F\u002Fbucket_example\u002Fraw\u002Fdataset1.json']\n\nconsumer_dag:\n  default_args:\n    start_date: '2024-01-01'\n  schedule: ['s3:\u002F\u002Fbucket_example\u002Fraw\u002Fdataset1.json']\n  catchup: false\n  tasks:\n    - task_id: task_1\n      operator: airflow.operators.bash.BashOperator\n      bash_command: \"echo 'consumer'\"\n",[3658],{"type":60,"tag":95,"props":3659,"children":3660},{"__ignoreMap":535},[3661,3673,3684,3708,3732,3747,3758,3778,3793,3816,3850,3857,3869,3880,3903,3934,3949,3960,3979,3994],{"type":60,"tag":595,"props":3662,"children":3663},{"class":597,"line":598},[3664,3669],{"type":60,"tag":595,"props":3665,"children":3666},{"style":841},[3667],{"type":65,"value":3668},"producer_dag",{"type":60,"tag":595,"props":3670,"children":3671},{"style":846},[3672],{"type":65,"value":849},{"type":60,"tag":595,"props":3674,"children":3675},{"class":597,"line":607},[3676,3680],{"type":60,"tag":595,"props":3677,"children":3678},{"style":841},[3679],{"type":65,"value":857},{"type":60,"tag":595,"props":3681,"children":3682},{"style":846},[3683],{"type":65,"value":849},{"type":60,"tag":595,"props":3685,"children":3686},{"class":597,"line":616},[3687,3691,3695,3699,3704],{"type":60,"tag":595,"props":3688,"children":3689},{"style":841},[3690],{"type":65,"value":869},{"type":60,"tag":595,"props":3692,"children":3693},{"style":846},[3694],{"type":65,"value":525},{"type":60,"tag":595,"props":3696,"children":3697},{"style":846},[3698],{"type":65,"value":2364},{"type":60,"tag":595,"props":3700,"children":3701},{"style":765},[3702],{"type":65,"value":3703},"2024-01-01",{"type":60,"tag":595,"props":3705,"children":3706},{"style":846},[3707],{"type":65,"value":2374},{"type":60,"tag":595,"props":3709,"children":3710},{"class":597,"line":626},[3711,3715,3719,3723,3728],{"type":60,"tag":595,"props":3712,"children":3713},{"style":841},[3714],{"type":65,"value":969},{"type":60,"tag":595,"props":3716,"children":3717},{"style":846},[3718],{"type":65,"value":525},{"type":60,"tag":595,"props":3720,"children":3721},{"style":846},[3722],{"type":65,"value":926},{"type":60,"tag":595,"props":3724,"children":3725},{"style":765},[3726],{"type":65,"value":3727},"0 5 * * *",{"type":60,"tag":595,"props":3729,"children":3730},{"style":846},[3731],{"type":65,"value":936},{"type":60,"tag":595,"props":3733,"children":3734},{"class":597,"line":635},[3735,3739,3743],{"type":60,"tag":595,"props":3736,"children":3737},{"style":841},[3738],{"type":65,"value":994},{"type":60,"tag":595,"props":3740,"children":3741},{"style":846},[3742],{"type":65,"value":525},{"type":60,"tag":595,"props":3744,"children":3745},{"style":1001},[3746],{"type":65,"value":1004},{"type":60,"tag":595,"props":3748,"children":3749},{"class":597,"line":643},[3750,3754],{"type":60,"tag":595,"props":3751,"children":3752},{"style":841},[3753],{"type":65,"value":1107},{"type":60,"tag":595,"props":3755,"children":3756},{"style":846},[3757],{"type":65,"value":849},{"type":60,"tag":595,"props":3759,"children":3760},{"class":597,"line":652},[3761,3765,3769,3773],{"type":60,"tag":595,"props":3762,"children":3763},{"style":846},[3764],{"type":65,"value":1024},{"type":60,"tag":595,"props":3766,"children":3767},{"style":841},[3768],{"type":65,"value":1124},{"type":60,"tag":595,"props":3770,"children":3771},{"style":846},[3772],{"type":65,"value":525},{"type":60,"tag":595,"props":3774,"children":3775},{"style":765},[3776],{"type":65,"value":3777}," task_1\n",{"type":60,"tag":595,"props":3779,"children":3780},{"class":597,"line":660},[3781,3785,3789],{"type":60,"tag":595,"props":3782,"children":3783},{"style":841},[3784],{"type":65,"value":1149},{"type":60,"tag":595,"props":3786,"children":3787},{"style":846},[3788],{"type":65,"value":525},{"type":60,"tag":595,"props":3790,"children":3791},{"style":765},[3792],{"type":65,"value":1158},{"type":60,"tag":595,"props":3794,"children":3795},{"class":597,"line":669},[3796,3800,3804,3808,3812],{"type":60,"tag":595,"props":3797,"children":3798},{"style":841},[3799],{"type":65,"value":1167},{"type":60,"tag":595,"props":3801,"children":3802},{"style":846},[3803],{"type":65,"value":525},{"type":60,"tag":595,"props":3805,"children":3806},{"style":846},[3807],{"type":65,"value":926},{"type":60,"tag":595,"props":3809,"children":3810},{"style":765},[3811],{"type":65,"value":1180},{"type":60,"tag":595,"props":3813,"children":3814},{"style":846},[3815],{"type":65,"value":936},{"type":60,"tag":595,"props":3817,"children":3818},{"class":597,"line":678},[3819,3824,3828,3832,3837,3842,3846],{"type":60,"tag":595,"props":3820,"children":3821},{"style":841},[3822],{"type":65,"value":3823},"      outlets",{"type":60,"tag":595,"props":3825,"children":3826},{"style":846},[3827],{"type":65,"value":525},{"type":60,"tag":595,"props":3829,"children":3830},{"style":846},[3831],{"type":65,"value":1088},{"type":60,"tag":595,"props":3833,"children":3834},{"style":846},[3835],{"type":65,"value":3836},"'",{"type":60,"tag":595,"props":3838,"children":3839},{"style":765},[3840],{"type":65,"value":3841},"s3:\u002F\u002Fbucket_example\u002Fraw\u002Fdataset1.json",{"type":60,"tag":595,"props":3843,"children":3844},{"style":846},[3845],{"type":65,"value":3836},{"type":60,"tag":595,"props":3847,"children":3848},{"style":846},[3849],{"type":65,"value":1098},{"type":60,"tag":595,"props":3851,"children":3852},{"class":597,"line":686},[3853],{"type":60,"tag":595,"props":3854,"children":3855},{"emptyLinePlaceholder":620},[3856],{"type":65,"value":623},{"type":60,"tag":595,"props":3858,"children":3859},{"class":597,"line":695},[3860,3865],{"type":60,"tag":595,"props":3861,"children":3862},{"style":841},[3863],{"type":65,"value":3864},"consumer_dag",{"type":60,"tag":595,"props":3866,"children":3867},{"style":846},[3868],{"type":65,"value":849},{"type":60,"tag":595,"props":3870,"children":3871},{"class":597,"line":704},[3872,3876],{"type":60,"tag":595,"props":3873,"children":3874},{"style":841},[3875],{"type":65,"value":857},{"type":60,"tag":595,"props":3877,"children":3878},{"style":846},[3879],{"type":65,"value":849},{"type":60,"tag":595,"props":3881,"children":3882},{"class":597,"line":712},[3883,3887,3891,3895,3899],{"type":60,"tag":595,"props":3884,"children":3885},{"style":841},[3886],{"type":65,"value":869},{"type":60,"tag":595,"props":3888,"children":3889},{"style":846},[3890],{"type":65,"value":525},{"type":60,"tag":595,"props":3892,"children":3893},{"style":846},[3894],{"type":65,"value":2364},{"type":60,"tag":595,"props":3896,"children":3897},{"style":765},[3898],{"type":65,"value":3703},{"type":60,"tag":595,"props":3900,"children":3901},{"style":846},[3902],{"type":65,"value":2374},{"type":60,"tag":595,"props":3904,"children":3905},{"class":597,"line":721},[3906,3910,3914,3918,3922,3926,3930],{"type":60,"tag":595,"props":3907,"children":3908},{"style":841},[3909],{"type":65,"value":969},{"type":60,"tag":595,"props":3911,"children":3912},{"style":846},[3913],{"type":65,"value":525},{"type":60,"tag":595,"props":3915,"children":3916},{"style":846},[3917],{"type":65,"value":1088},{"type":60,"tag":595,"props":3919,"children":3920},{"style":846},[3921],{"type":65,"value":3836},{"type":60,"tag":595,"props":3923,"children":3924},{"style":765},[3925],{"type":65,"value":3841},{"type":60,"tag":595,"props":3927,"children":3928},{"style":846},[3929],{"type":65,"value":3836},{"type":60,"tag":595,"props":3931,"children":3932},{"style":846},[3933],{"type":65,"value":1098},{"type":60,"tag":595,"props":3935,"children":3936},{"class":597,"line":1101},[3937,3941,3945],{"type":60,"tag":595,"props":3938,"children":3939},{"style":841},[3940],{"type":65,"value":994},{"type":60,"tag":595,"props":3942,"children":3943},{"style":846},[3944],{"type":65,"value":525},{"type":60,"tag":595,"props":3946,"children":3947},{"style":1001},[3948],{"type":65,"value":1004},{"type":60,"tag":595,"props":3950,"children":3951},{"class":597,"line":1114},[3952,3956],{"type":60,"tag":595,"props":3953,"children":3954},{"style":841},[3955],{"type":65,"value":1107},{"type":60,"tag":595,"props":3957,"children":3958},{"style":846},[3959],{"type":65,"value":849},{"type":60,"tag":595,"props":3961,"children":3962},{"class":597,"line":1143},[3963,3967,3971,3975],{"type":60,"tag":595,"props":3964,"children":3965},{"style":846},[3966],{"type":65,"value":1024},{"type":60,"tag":595,"props":3968,"children":3969},{"style":841},[3970],{"type":65,"value":1124},{"type":60,"tag":595,"props":3972,"children":3973},{"style":846},[3974],{"type":65,"value":525},{"type":60,"tag":595,"props":3976,"children":3977},{"style":765},[3978],{"type":65,"value":3777},{"type":60,"tag":595,"props":3980,"children":3981},{"class":597,"line":1161},[3982,3986,3990],{"type":60,"tag":595,"props":3983,"children":3984},{"style":841},[3985],{"type":65,"value":1149},{"type":60,"tag":595,"props":3987,"children":3988},{"style":846},[3989],{"type":65,"value":525},{"type":60,"tag":595,"props":3991,"children":3992},{"style":765},[3993],{"type":65,"value":1158},{"type":60,"tag":595,"props":3995,"children":3996},{"class":597,"line":1187},[3997,4001,4005,4009,4014],{"type":60,"tag":595,"props":3998,"children":3999},{"style":841},[4000],{"type":65,"value":1167},{"type":60,"tag":595,"props":4002,"children":4003},{"style":846},[4004],{"type":65,"value":525},{"type":60,"tag":595,"props":4006,"children":4007},{"style":846},[4008],{"type":65,"value":926},{"type":60,"tag":595,"props":4010,"children":4011},{"style":765},[4012],{"type":65,"value":4013},"echo 'consumer'",{"type":60,"tag":595,"props":4015,"children":4016},{"style":846},[4017],{"type":65,"value":936},{"type":60,"tag":507,"props":4019,"children":4021},{"id":4020},"conditional-dataset-scheduling-airflow-29-dag-factory-022",[4022],{"type":65,"value":4023},"Conditional Dataset Scheduling (Airflow 2.9+ \u002F dag-factory 0.22+)",{"type":60,"tag":68,"props":4025,"children":4026},{},[4027,4029,4035,4036,4042,4044,4049],{"type":65,"value":4028},"Nesting the logical operators ",{"type":60,"tag":95,"props":4030,"children":4032},{"className":4031},[],[4033],{"type":65,"value":4034},"__and__",{"type":65,"value":1538},{"type":60,"tag":95,"props":4037,"children":4039},{"className":4038},[],[4040],{"type":65,"value":4041},"__or__",{"type":65,"value":4043}," under ",{"type":60,"tag":95,"props":4045,"children":4047},{"className":4046},[],[4048],{"type":65,"value":3625},{"type":65,"value":4050}," key.",{"type":60,"tag":527,"props":4052,"children":4054},{"className":821,"code":4053,"language":21,"meta":535,"style":535},"schedule:\n  datasets:\n    __or__:\n      - __and__:\n          - s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_1\n          - s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_2\n      - s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_3\n",[4055],{"type":60,"tag":95,"props":4056,"children":4057},{"__ignoreMap":535},[4058,4069,4081,4093,4110,4123,4135],{"type":60,"tag":595,"props":4059,"children":4060},{"class":597,"line":598},[4061,4065],{"type":60,"tag":595,"props":4062,"children":4063},{"style":841},[4064],{"type":65,"value":1499},{"type":60,"tag":595,"props":4066,"children":4067},{"style":846},[4068],{"type":65,"value":849},{"type":60,"tag":595,"props":4070,"children":4071},{"class":597,"line":607},[4072,4077],{"type":60,"tag":595,"props":4073,"children":4074},{"style":841},[4075],{"type":65,"value":4076},"  datasets",{"type":60,"tag":595,"props":4078,"children":4079},{"style":846},[4080],{"type":65,"value":849},{"type":60,"tag":595,"props":4082,"children":4083},{"class":597,"line":616},[4084,4089],{"type":60,"tag":595,"props":4085,"children":4086},{"style":841},[4087],{"type":65,"value":4088},"    __or__",{"type":60,"tag":595,"props":4090,"children":4091},{"style":846},[4092],{"type":65,"value":849},{"type":60,"tag":595,"props":4094,"children":4095},{"class":597,"line":626},[4096,4101,4106],{"type":60,"tag":595,"props":4097,"children":4098},{"style":846},[4099],{"type":65,"value":4100},"      -",{"type":60,"tag":595,"props":4102,"children":4103},{"style":841},[4104],{"type":65,"value":4105}," __and__",{"type":60,"tag":595,"props":4107,"children":4108},{"style":846},[4109],{"type":65,"value":849},{"type":60,"tag":595,"props":4111,"children":4112},{"class":597,"line":635},[4113,4118],{"type":60,"tag":595,"props":4114,"children":4115},{"style":846},[4116],{"type":65,"value":4117},"          -",{"type":60,"tag":595,"props":4119,"children":4120},{"style":765},[4121],{"type":65,"value":4122}," s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_1\n",{"type":60,"tag":595,"props":4124,"children":4125},{"class":597,"line":643},[4126,4130],{"type":60,"tag":595,"props":4127,"children":4128},{"style":846},[4129],{"type":65,"value":4117},{"type":60,"tag":595,"props":4131,"children":4132},{"style":765},[4133],{"type":65,"value":4134}," s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_2\n",{"type":60,"tag":595,"props":4136,"children":4137},{"class":597,"line":652},[4138,4142],{"type":60,"tag":595,"props":4139,"children":4140},{"style":846},[4141],{"type":65,"value":4100},{"type":60,"tag":595,"props":4143,"children":4144},{"style":765},[4145],{"type":65,"value":4146}," s3:\u002F\u002Fbucket-cjmm\u002Fraw\u002Fdataset_custom_3\n",{"type":60,"tag":240,"props":4148,"children":4149},{},[],{"type":60,"tag":157,"props":4151,"children":4153},{"id":4152},"callbacks",[4154],{"type":65,"value":396},{"type":60,"tag":68,"props":4156,"children":4157},{},[4158,4160,4165],{"type":65,"value":4159},"Three styles, all valid at the DAG, TaskGroup, or Task level (or under ",{"type":60,"tag":95,"props":4161,"children":4163},{"className":4162},[],[4164],{"type":65,"value":1463},{"type":65,"value":4166},"):",{"type":60,"tag":507,"props":4168,"children":4170},{"id":4169},"_1-string-pointing-to-a-callable",[4171],{"type":65,"value":4172},"1. String pointing to a callable",{"type":60,"tag":527,"props":4174,"children":4176},{"className":821,"code":4175,"language":21,"meta":535,"style":535},"- task_id: task_1\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_1\"\n  on_failure_callback: include.custom_callbacks.output_standard_message\n",[4177],{"type":60,"tag":95,"props":4178,"children":4179},{"__ignoreMap":535},[4180,4200,4216,4241],{"type":60,"tag":595,"props":4181,"children":4182},{"class":597,"line":598},[4183,4188,4192,4196],{"type":60,"tag":595,"props":4184,"children":4185},{"style":846},[4186],{"type":65,"value":4187},"-",{"type":60,"tag":595,"props":4189,"children":4190},{"style":841},[4191],{"type":65,"value":1124},{"type":60,"tag":595,"props":4193,"children":4194},{"style":846},[4195],{"type":65,"value":525},{"type":60,"tag":595,"props":4197,"children":4198},{"style":765},[4199],{"type":65,"value":3777},{"type":60,"tag":595,"props":4201,"children":4202},{"class":597,"line":607},[4203,4208,4212],{"type":60,"tag":595,"props":4204,"children":4205},{"style":841},[4206],{"type":65,"value":4207},"  operator",{"type":60,"tag":595,"props":4209,"children":4210},{"style":846},[4211],{"type":65,"value":525},{"type":60,"tag":595,"props":4213,"children":4214},{"style":765},[4215],{"type":65,"value":1158},{"type":60,"tag":595,"props":4217,"children":4218},{"class":597,"line":616},[4219,4224,4228,4232,4237],{"type":60,"tag":595,"props":4220,"children":4221},{"style":841},[4222],{"type":65,"value":4223},"  bash_command",{"type":60,"tag":595,"props":4225,"children":4226},{"style":846},[4227],{"type":65,"value":525},{"type":60,"tag":595,"props":4229,"children":4230},{"style":846},[4231],{"type":65,"value":926},{"type":60,"tag":595,"props":4233,"children":4234},{"style":765},[4235],{"type":65,"value":4236},"echo task_1",{"type":60,"tag":595,"props":4238,"children":4239},{"style":846},[4240],{"type":65,"value":936},{"type":60,"tag":595,"props":4242,"children":4243},{"class":597,"line":626},[4244,4249,4253],{"type":60,"tag":595,"props":4245,"children":4246},{"style":841},[4247],{"type":65,"value":4248},"  on_failure_callback",{"type":60,"tag":595,"props":4250,"children":4251},{"style":846},[4252],{"type":65,"value":525},{"type":60,"tag":595,"props":4254,"children":4255},{"style":765},[4256],{"type":65,"value":4257}," include.custom_callbacks.output_standard_message\n",{"type":60,"tag":68,"props":4259,"children":4260},{},[4261],{"type":65,"value":4262},"With kwargs:",{"type":60,"tag":527,"props":4264,"children":4266},{"className":821,"code":4265,"language":21,"meta":535,"style":535},"- task_id: task_2\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_2\"\n  on_success_callback:\n    callback: include.custom_callbacks.output_custom_message\n    param1: \"Task status\"\n    param2: \"Successful!\"\n",[4267],{"type":60,"tag":95,"props":4268,"children":4269},{"__ignoreMap":535},[4270,4290,4305,4329,4341,4358,4383],{"type":60,"tag":595,"props":4271,"children":4272},{"class":597,"line":598},[4273,4277,4281,4285],{"type":60,"tag":595,"props":4274,"children":4275},{"style":846},[4276],{"type":65,"value":4187},{"type":60,"tag":595,"props":4278,"children":4279},{"style":841},[4280],{"type":65,"value":1124},{"type":60,"tag":595,"props":4282,"children":4283},{"style":846},[4284],{"type":65,"value":525},{"type":60,"tag":595,"props":4286,"children":4287},{"style":765},[4288],{"type":65,"value":4289}," task_2\n",{"type":60,"tag":595,"props":4291,"children":4292},{"class":597,"line":607},[4293,4297,4301],{"type":60,"tag":595,"props":4294,"children":4295},{"style":841},[4296],{"type":65,"value":4207},{"type":60,"tag":595,"props":4298,"children":4299},{"style":846},[4300],{"type":65,"value":525},{"type":60,"tag":595,"props":4302,"children":4303},{"style":765},[4304],{"type":65,"value":1158},{"type":60,"tag":595,"props":4306,"children":4307},{"class":597,"line":616},[4308,4312,4316,4320,4325],{"type":60,"tag":595,"props":4309,"children":4310},{"style":841},[4311],{"type":65,"value":4223},{"type":60,"tag":595,"props":4313,"children":4314},{"style":846},[4315],{"type":65,"value":525},{"type":60,"tag":595,"props":4317,"children":4318},{"style":846},[4319],{"type":65,"value":926},{"type":60,"tag":595,"props":4321,"children":4322},{"style":765},[4323],{"type":65,"value":4324},"echo task_2",{"type":60,"tag":595,"props":4326,"children":4327},{"style":846},[4328],{"type":65,"value":936},{"type":60,"tag":595,"props":4330,"children":4331},{"class":597,"line":626},[4332,4337],{"type":60,"tag":595,"props":4333,"children":4334},{"style":841},[4335],{"type":65,"value":4336},"  on_success_callback",{"type":60,"tag":595,"props":4338,"children":4339},{"style":846},[4340],{"type":65,"value":849},{"type":60,"tag":595,"props":4342,"children":4343},{"class":597,"line":635},[4344,4349,4353],{"type":60,"tag":595,"props":4345,"children":4346},{"style":841},[4347],{"type":65,"value":4348},"    callback",{"type":60,"tag":595,"props":4350,"children":4351},{"style":846},[4352],{"type":65,"value":525},{"type":60,"tag":595,"props":4354,"children":4355},{"style":765},[4356],{"type":65,"value":4357}," include.custom_callbacks.output_custom_message\n",{"type":60,"tag":595,"props":4359,"children":4360},{"class":597,"line":643},[4361,4366,4370,4374,4379],{"type":60,"tag":595,"props":4362,"children":4363},{"style":841},[4364],{"type":65,"value":4365},"    param1",{"type":60,"tag":595,"props":4367,"children":4368},{"style":846},[4369],{"type":65,"value":525},{"type":60,"tag":595,"props":4371,"children":4372},{"style":846},[4373],{"type":65,"value":926},{"type":60,"tag":595,"props":4375,"children":4376},{"style":765},[4377],{"type":65,"value":4378},"Task status",{"type":60,"tag":595,"props":4380,"children":4381},{"style":846},[4382],{"type":65,"value":936},{"type":60,"tag":595,"props":4384,"children":4385},{"class":597,"line":652},[4386,4391,4395,4399,4404],{"type":60,"tag":595,"props":4387,"children":4388},{"style":841},[4389],{"type":65,"value":4390},"    param2",{"type":60,"tag":595,"props":4392,"children":4393},{"style":846},[4394],{"type":65,"value":525},{"type":60,"tag":595,"props":4396,"children":4397},{"style":846},[4398],{"type":65,"value":926},{"type":60,"tag":595,"props":4400,"children":4401},{"style":765},[4402],{"type":65,"value":4403},"Successful!",{"type":60,"tag":595,"props":4405,"children":4406},{"style":846},[4407],{"type":65,"value":936},{"type":60,"tag":507,"props":4409,"children":4411},{"id":4410},"_2-file-path-function-name-no-kwargs",[4412],{"type":65,"value":4413},"2. File path + function name (no kwargs)",{"type":60,"tag":527,"props":4415,"children":4417},{"className":821,"code":4416,"language":21,"meta":535,"style":535},"- task_id: task_3\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_3\"\n  on_retry_callback_name: output_standard_message\n  on_retry_callback_file: \u002Fusr\u002Flocal\u002Fairflow\u002Finclude\u002Fcustom_callbacks.py\n",[4418],{"type":60,"tag":95,"props":4419,"children":4420},{"__ignoreMap":535},[4421,4441,4456,4480,4497],{"type":60,"tag":595,"props":4422,"children":4423},{"class":597,"line":598},[4424,4428,4432,4436],{"type":60,"tag":595,"props":4425,"children":4426},{"style":846},[4427],{"type":65,"value":4187},{"type":60,"tag":595,"props":4429,"children":4430},{"style":841},[4431],{"type":65,"value":1124},{"type":60,"tag":595,"props":4433,"children":4434},{"style":846},[4435],{"type":65,"value":525},{"type":60,"tag":595,"props":4437,"children":4438},{"style":765},[4439],{"type":65,"value":4440}," task_3\n",{"type":60,"tag":595,"props":4442,"children":4443},{"class":597,"line":607},[4444,4448,4452],{"type":60,"tag":595,"props":4445,"children":4446},{"style":841},[4447],{"type":65,"value":4207},{"type":60,"tag":595,"props":4449,"children":4450},{"style":846},[4451],{"type":65,"value":525},{"type":60,"tag":595,"props":4453,"children":4454},{"style":765},[4455],{"type":65,"value":1158},{"type":60,"tag":595,"props":4457,"children":4458},{"class":597,"line":616},[4459,4463,4467,4471,4476],{"type":60,"tag":595,"props":4460,"children":4461},{"style":841},[4462],{"type":65,"value":4223},{"type":60,"tag":595,"props":4464,"children":4465},{"style":846},[4466],{"type":65,"value":525},{"type":60,"tag":595,"props":4468,"children":4469},{"style":846},[4470],{"type":65,"value":926},{"type":60,"tag":595,"props":4472,"children":4473},{"style":765},[4474],{"type":65,"value":4475},"echo task_3",{"type":60,"tag":595,"props":4477,"children":4478},{"style":846},[4479],{"type":65,"value":936},{"type":60,"tag":595,"props":4481,"children":4482},{"class":597,"line":626},[4483,4488,4492],{"type":60,"tag":595,"props":4484,"children":4485},{"style":841},[4486],{"type":65,"value":4487},"  on_retry_callback_name",{"type":60,"tag":595,"props":4489,"children":4490},{"style":846},[4491],{"type":65,"value":525},{"type":60,"tag":595,"props":4493,"children":4494},{"style":765},[4495],{"type":65,"value":4496}," output_standard_message\n",{"type":60,"tag":595,"props":4498,"children":4499},{"class":597,"line":635},[4500,4505,4509],{"type":60,"tag":595,"props":4501,"children":4502},{"style":841},[4503],{"type":65,"value":4504},"  on_retry_callback_file",{"type":60,"tag":595,"props":4506,"children":4507},{"style":846},[4508],{"type":65,"value":525},{"type":60,"tag":595,"props":4510,"children":4511},{"style":765},[4512],{"type":65,"value":4513}," \u002Fusr\u002Flocal\u002Fairflow\u002Finclude\u002Fcustom_callbacks.py\n",{"type":60,"tag":507,"props":4515,"children":4517},{"id":4516},"_3-provider-callbacks",[4518],{"type":65,"value":4519},"3. Provider callbacks",{"type":60,"tag":527,"props":4521,"children":4523},{"className":821,"code":4522,"language":21,"meta":535,"style":535},"- task_id: task_4\n  operator: airflow.operators.bash.BashOperator\n  bash_command: \"echo task_4\"\n  on_failure_callback:\n    callback: airflow.providers.slack.notifications.slack.send_slack_notification\n    slack_conn_id: slack_conn_id\n    text: \":red_circle: Task Failed.\"\n    channel: \"#channel\"\n",[4524],{"type":60,"tag":95,"props":4525,"children":4526},{"__ignoreMap":535},[4527,4547,4562,4586,4597,4613,4630,4655],{"type":60,"tag":595,"props":4528,"children":4529},{"class":597,"line":598},[4530,4534,4538,4542],{"type":60,"tag":595,"props":4531,"children":4532},{"style":846},[4533],{"type":65,"value":4187},{"type":60,"tag":595,"props":4535,"children":4536},{"style":841},[4537],{"type":65,"value":1124},{"type":60,"tag":595,"props":4539,"children":4540},{"style":846},[4541],{"type":65,"value":525},{"type":60,"tag":595,"props":4543,"children":4544},{"style":765},[4545],{"type":65,"value":4546}," task_4\n",{"type":60,"tag":595,"props":4548,"children":4549},{"class":597,"line":607},[4550,4554,4558],{"type":60,"tag":595,"props":4551,"children":4552},{"style":841},[4553],{"type":65,"value":4207},{"type":60,"tag":595,"props":4555,"children":4556},{"style":846},[4557],{"type":65,"value":525},{"type":60,"tag":595,"props":4559,"children":4560},{"style":765},[4561],{"type":65,"value":1158},{"type":60,"tag":595,"props":4563,"children":4564},{"class":597,"line":616},[4565,4569,4573,4577,4582],{"type":60,"tag":595,"props":4566,"children":4567},{"style":841},[4568],{"type":65,"value":4223},{"type":60,"tag":595,"props":4570,"children":4571},{"style":846},[4572],{"type":65,"value":525},{"type":60,"tag":595,"props":4574,"children":4575},{"style":846},[4576],{"type":65,"value":926},{"type":60,"tag":595,"props":4578,"children":4579},{"style":765},[4580],{"type":65,"value":4581},"echo task_4",{"type":60,"tag":595,"props":4583,"children":4584},{"style":846},[4585],{"type":65,"value":936},{"type":60,"tag":595,"props":4587,"children":4588},{"class":597,"line":626},[4589,4593],{"type":60,"tag":595,"props":4590,"children":4591},{"style":841},[4592],{"type":65,"value":4248},{"type":60,"tag":595,"props":4594,"children":4595},{"style":846},[4596],{"type":65,"value":849},{"type":60,"tag":595,"props":4598,"children":4599},{"class":597,"line":635},[4600,4604,4608],{"type":60,"tag":595,"props":4601,"children":4602},{"style":841},[4603],{"type":65,"value":4348},{"type":60,"tag":595,"props":4605,"children":4606},{"style":846},[4607],{"type":65,"value":525},{"type":60,"tag":595,"props":4609,"children":4610},{"style":765},[4611],{"type":65,"value":4612}," airflow.providers.slack.notifications.slack.send_slack_notification\n",{"type":60,"tag":595,"props":4614,"children":4615},{"class":597,"line":643},[4616,4621,4625],{"type":60,"tag":595,"props":4617,"children":4618},{"style":841},[4619],{"type":65,"value":4620},"    slack_conn_id",{"type":60,"tag":595,"props":4622,"children":4623},{"style":846},[4624],{"type":65,"value":525},{"type":60,"tag":595,"props":4626,"children":4627},{"style":765},[4628],{"type":65,"value":4629}," slack_conn_id\n",{"type":60,"tag":595,"props":4631,"children":4632},{"class":597,"line":652},[4633,4638,4642,4646,4651],{"type":60,"tag":595,"props":4634,"children":4635},{"style":841},[4636],{"type":65,"value":4637},"    text",{"type":60,"tag":595,"props":4639,"children":4640},{"style":846},[4641],{"type":65,"value":525},{"type":60,"tag":595,"props":4643,"children":4644},{"style":846},[4645],{"type":65,"value":926},{"type":60,"tag":595,"props":4647,"children":4648},{"style":765},[4649],{"type":65,"value":4650},":red_circle: Task Failed.",{"type":60,"tag":595,"props":4652,"children":4653},{"style":846},[4654],{"type":65,"value":936},{"type":60,"tag":595,"props":4656,"children":4657},{"class":597,"line":660},[4658,4663,4667,4671,4676],{"type":60,"tag":595,"props":4659,"children":4660},{"style":841},[4661],{"type":65,"value":4662},"    channel",{"type":60,"tag":595,"props":4664,"children":4665},{"style":846},[4666],{"type":65,"value":525},{"type":60,"tag":595,"props":4668,"children":4669},{"style":846},[4670],{"type":65,"value":926},{"type":60,"tag":595,"props":4672,"children":4673},{"style":765},[4674],{"type":65,"value":4675},"#channel",{"type":60,"tag":595,"props":4677,"children":4678},{"style":846},[4679],{"type":65,"value":936},{"type":60,"tag":68,"props":4681,"children":4682},{},[4683],{"type":65,"value":4684},"The provider package must be installed.",{"type":60,"tag":240,"props":4686,"children":4687},{},[],{"type":60,"tag":157,"props":4689,"children":4691},{"id":4690},"custom-python-objects-__type__",[4692,4693,4698],{"type":65,"value":413},{"type":60,"tag":95,"props":4694,"children":4696},{"className":4695},[],[4697],{"type":65,"value":419},{"type":65,"value":421},{"type":60,"tag":68,"props":4700,"children":4701},{},[4702,4704,4710,4711,4717,4718,4724],{"type":65,"value":4703},"For anything that isn't a simple scalar — ",{"type":60,"tag":95,"props":4705,"children":4707},{"className":4706},[],[4708],{"type":65,"value":4709},"datetime",{"type":65,"value":557},{"type":60,"tag":95,"props":4712,"children":4714},{"className":4713},[],[4715],{"type":65,"value":4716},"timedelta",{"type":65,"value":557},{"type":60,"tag":95,"props":4719,"children":4721},{"className":4720},[],[4722],{"type":65,"value":4723},"Asset",{"type":65,"value":4725},", timetables, k8s objects — use the generalized object syntax:",{"type":60,"tag":527,"props":4727,"children":4729},{"className":821,"code":4728,"language":21,"meta":535,"style":535},"start_date:\n  __type__: datetime.datetime\n  year: 2025\n  month: 1\n  day: 1\n\nexecution_timeout:\n  __type__: datetime.timedelta\n  hours: 1\n\nschedule:\n  __type__: airflow.timetables.trigger.CronTriggerTimetable\n  cron: \"0 1 * * 3\"\n  timezone: UTC\n",[4730],{"type":60,"tag":95,"props":4731,"children":4732},{"__ignoreMap":535},[4733,4745,4762,4779,4796,4812,4819,4831,4847,4863,4870,4881,4897,4922],{"type":60,"tag":595,"props":4734,"children":4735},{"class":597,"line":598},[4736,4741],{"type":60,"tag":595,"props":4737,"children":4738},{"style":841},[4739],{"type":65,"value":4740},"start_date",{"type":60,"tag":595,"props":4742,"children":4743},{"style":846},[4744],{"type":65,"value":849},{"type":60,"tag":595,"props":4746,"children":4747},{"class":597,"line":607},[4748,4753,4757],{"type":60,"tag":595,"props":4749,"children":4750},{"style":841},[4751],{"type":65,"value":4752},"  __type__",{"type":60,"tag":595,"props":4754,"children":4755},{"style":846},[4756],{"type":65,"value":525},{"type":60,"tag":595,"props":4758,"children":4759},{"style":765},[4760],{"type":65,"value":4761}," datetime.datetime\n",{"type":60,"tag":595,"props":4763,"children":4764},{"class":597,"line":616},[4765,4770,4774],{"type":60,"tag":595,"props":4766,"children":4767},{"style":841},[4768],{"type":65,"value":4769},"  year",{"type":60,"tag":595,"props":4771,"children":4772},{"style":846},[4773],{"type":65,"value":525},{"type":60,"tag":595,"props":4775,"children":4776},{"style":1952},[4777],{"type":65,"value":4778}," 2025\n",{"type":60,"tag":595,"props":4780,"children":4781},{"class":597,"line":626},[4782,4787,4791],{"type":60,"tag":595,"props":4783,"children":4784},{"style":841},[4785],{"type":65,"value":4786},"  month",{"type":60,"tag":595,"props":4788,"children":4789},{"style":846},[4790],{"type":65,"value":525},{"type":60,"tag":595,"props":4792,"children":4793},{"style":1952},[4794],{"type":65,"value":4795}," 1\n",{"type":60,"tag":595,"props":4797,"children":4798},{"class":597,"line":635},[4799,4804,4808],{"type":60,"tag":595,"props":4800,"children":4801},{"style":841},[4802],{"type":65,"value":4803},"  day",{"type":60,"tag":595,"props":4805,"children":4806},{"style":846},[4807],{"type":65,"value":525},{"type":60,"tag":595,"props":4809,"children":4810},{"style":1952},[4811],{"type":65,"value":4795},{"type":60,"tag":595,"props":4813,"children":4814},{"class":597,"line":643},[4815],{"type":60,"tag":595,"props":4816,"children":4817},{"emptyLinePlaceholder":620},[4818],{"type":65,"value":623},{"type":60,"tag":595,"props":4820,"children":4821},{"class":597,"line":652},[4822,4827],{"type":60,"tag":595,"props":4823,"children":4824},{"style":841},[4825],{"type":65,"value":4826},"execution_timeout",{"type":60,"tag":595,"props":4828,"children":4829},{"style":846},[4830],{"type":65,"value":849},{"type":60,"tag":595,"props":4832,"children":4833},{"class":597,"line":660},[4834,4838,4842],{"type":60,"tag":595,"props":4835,"children":4836},{"style":841},[4837],{"type":65,"value":4752},{"type":60,"tag":595,"props":4839,"children":4840},{"style":846},[4841],{"type":65,"value":525},{"type":60,"tag":595,"props":4843,"children":4844},{"style":765},[4845],{"type":65,"value":4846}," datetime.timedelta\n",{"type":60,"tag":595,"props":4848,"children":4849},{"class":597,"line":669},[4850,4855,4859],{"type":60,"tag":595,"props":4851,"children":4852},{"style":841},[4853],{"type":65,"value":4854},"  hours",{"type":60,"tag":595,"props":4856,"children":4857},{"style":846},[4858],{"type":65,"value":525},{"type":60,"tag":595,"props":4860,"children":4861},{"style":1952},[4862],{"type":65,"value":4795},{"type":60,"tag":595,"props":4864,"children":4865},{"class":597,"line":678},[4866],{"type":60,"tag":595,"props":4867,"children":4868},{"emptyLinePlaceholder":620},[4869],{"type":65,"value":623},{"type":60,"tag":595,"props":4871,"children":4872},{"class":597,"line":686},[4873,4877],{"type":60,"tag":595,"props":4874,"children":4875},{"style":841},[4876],{"type":65,"value":1499},{"type":60,"tag":595,"props":4878,"children":4879},{"style":846},[4880],{"type":65,"value":849},{"type":60,"tag":595,"props":4882,"children":4883},{"class":597,"line":695},[4884,4888,4892],{"type":60,"tag":595,"props":4885,"children":4886},{"style":841},[4887],{"type":65,"value":4752},{"type":60,"tag":595,"props":4889,"children":4890},{"style":846},[4891],{"type":65,"value":525},{"type":60,"tag":595,"props":4893,"children":4894},{"style":765},[4895],{"type":65,"value":4896}," airflow.timetables.trigger.CronTriggerTimetable\n",{"type":60,"tag":595,"props":4898,"children":4899},{"class":597,"line":704},[4900,4905,4909,4913,4918],{"type":60,"tag":595,"props":4901,"children":4902},{"style":841},[4903],{"type":65,"value":4904},"  cron",{"type":60,"tag":595,"props":4906,"children":4907},{"style":846},[4908],{"type":65,"value":525},{"type":60,"tag":595,"props":4910,"children":4911},{"style":846},[4912],{"type":65,"value":926},{"type":60,"tag":595,"props":4914,"children":4915},{"style":765},[4916],{"type":65,"value":4917},"0 1 * * 3",{"type":60,"tag":595,"props":4919,"children":4920},{"style":846},[4921],{"type":65,"value":936},{"type":60,"tag":595,"props":4923,"children":4924},{"class":597,"line":712},[4925,4930,4934],{"type":60,"tag":595,"props":4926,"children":4927},{"style":841},[4928],{"type":65,"value":4929},"  timezone",{"type":60,"tag":595,"props":4931,"children":4932},{"style":846},[4933],{"type":65,"value":525},{"type":60,"tag":595,"props":4935,"children":4936},{"style":765},[4937],{"type":65,"value":4938}," UTC\n",{"type":60,"tag":2966,"props":4940,"children":4941},{},[4942,4959,4970,4975],{"type":60,"tag":173,"props":4943,"children":4944},{},[4945,4950,4952,4957],{"type":60,"tag":95,"props":4946,"children":4948},{"className":4947},[],[4949],{"type":65,"value":419},{"type":65,"value":4951}," is the ",{"type":60,"tag":74,"props":4953,"children":4954},{},[4955],{"type":65,"value":4956},"full import path",{"type":65,"value":4958}," to the class",{"type":60,"tag":173,"props":4960,"children":4961},{},[4962,4968],{"type":60,"tag":95,"props":4963,"children":4965},{"className":4964},[],[4966],{"type":65,"value":4967},"__args__",{"type":65,"value":4969}," is a list of positional arguments",{"type":60,"tag":173,"props":4971,"children":4972},{},[4973],{"type":65,"value":4974},"Other keys become keyword arguments",{"type":60,"tag":173,"props":4976,"children":4977},{},[4978,4980,4986,4988,4994],{"type":65,"value":4979},"For lists of typed objects, use ",{"type":60,"tag":95,"props":4981,"children":4983},{"className":4982},[],[4984],{"type":65,"value":4985},"__type__: builtins.list",{"type":65,"value":4987}," with an ",{"type":60,"tag":95,"props":4989,"children":4991},{"className":4990},[],[4992],{"type":65,"value":4993},"items:",{"type":65,"value":4995}," key",{"type":60,"tag":507,"props":4997,"children":4999},{"id":4998},"reserved-keys",[5000],{"type":65,"value":5001},"Reserved Keys",{"type":60,"tag":68,"props":5003,"children":5004},{},[5005,5007,5012,5013,5018,5019,5025,5026,5031,5032,5037,5039,5045,5047,5052,5054,5059],{"type":65,"value":5006},"Don't use these YAML keys for your own data — dag-factory reserves them: ",{"type":60,"tag":95,"props":5008,"children":5010},{"className":5009},[],[5011],{"type":65,"value":419},{"type":65,"value":557},{"type":60,"tag":95,"props":5014,"children":5016},{"className":5015},[],[5017],{"type":65,"value":4967},{"type":65,"value":557},{"type":60,"tag":95,"props":5020,"children":5022},{"className":5021},[],[5023],{"type":65,"value":5024},"__join__",{"type":65,"value":557},{"type":60,"tag":95,"props":5027,"children":5029},{"className":5028},[],[5030],{"type":65,"value":4034},{"type":65,"value":557},{"type":60,"tag":95,"props":5033,"children":5035},{"className":5034},[],[5036],{"type":65,"value":4041},{"type":65,"value":5038},". The key ",{"type":60,"tag":95,"props":5040,"children":5042},{"className":5041},[],[5043],{"type":65,"value":5044},"items",{"type":65,"value":5046}," is also reserved when used inside a ",{"type":60,"tag":95,"props":5048,"children":5050},{"className":5049},[],[5051],{"type":65,"value":4985},{"type":65,"value":5053}," block — don't add a custom field named ",{"type":60,"tag":95,"props":5055,"children":5057},{"className":5056},[],[5058],{"type":65,"value":5044},{"type":65,"value":5060}," to a typed list construction.",{"type":60,"tag":240,"props":5062,"children":5063},{},[],{"type":60,"tag":157,"props":5065,"children":5067},{"id":5066},"validation-commands",[5068],{"type":65,"value":438},{"type":60,"tag":68,"props":5070,"children":5071},{},[5072,5074,5079],{"type":65,"value":5073},"After installing, the ",{"type":60,"tag":95,"props":5075,"children":5077},{"className":5076},[],[5078],{"type":65,"value":762},{"type":65,"value":5080}," CLI is on PATH:",{"type":60,"tag":250,"props":5082,"children":5083},{},[5084,5100],{"type":60,"tag":254,"props":5085,"children":5086},{},[5087],{"type":60,"tag":258,"props":5088,"children":5089},{},[5090,5095],{"type":60,"tag":262,"props":5091,"children":5092},{},[5093],{"type":65,"value":5094},"Command",{"type":60,"tag":262,"props":5096,"children":5097},{},[5098],{"type":65,"value":5099},"When to Use",{"type":60,"tag":273,"props":5101,"children":5102},{},[5103,5120,5137,5154,5171],{"type":60,"tag":258,"props":5104,"children":5105},{},[5106,5115],{"type":60,"tag":280,"props":5107,"children":5108},{},[5109],{"type":60,"tag":95,"props":5110,"children":5112},{"className":5111},[],[5113],{"type":65,"value":5114},"dagfactory --version",{"type":60,"tag":280,"props":5116,"children":5117},{},[5118],{"type":65,"value":5119},"Confirm install \u002F version",{"type":60,"tag":258,"props":5121,"children":5122},{},[5123,5132],{"type":60,"tag":280,"props":5124,"children":5125},{},[5126],{"type":60,"tag":95,"props":5127,"children":5129},{"className":5128},[],[5130],{"type":65,"value":5131},"dagfactory lint \u003Cpath>",{"type":60,"tag":280,"props":5133,"children":5134},{},[5135],{"type":65,"value":5136},"Validate YAML syntax for a file or directory",{"type":60,"tag":258,"props":5138,"children":5139},{},[5140,5149],{"type":60,"tag":280,"props":5141,"children":5142},{},[5143],{"type":60,"tag":95,"props":5144,"children":5146},{"className":5145},[],[5147],{"type":65,"value":5148},"dagfactory lint \u003Cpath> --verbose",{"type":60,"tag":280,"props":5150,"children":5151},{},[5152],{"type":65,"value":5153},"Show a per-file table of results",{"type":60,"tag":258,"props":5155,"children":5156},{},[5157,5166],{"type":60,"tag":280,"props":5158,"children":5159},{},[5160],{"type":60,"tag":95,"props":5161,"children":5163},{"className":5162},[],[5164],{"type":65,"value":5165},"dagfactory convert \u003Cpath>",{"type":60,"tag":280,"props":5167,"children":5168},{},[5169],{"type":65,"value":5170},"Show diffs to migrate Airflow 2 → 3 import paths",{"type":60,"tag":258,"props":5172,"children":5173},{},[5174,5183],{"type":60,"tag":280,"props":5175,"children":5176},{},[5177],{"type":60,"tag":95,"props":5178,"children":5180},{"className":5179},[],[5181],{"type":65,"value":5182},"dagfactory convert \u003Cpath> --override",{"type":60,"tag":280,"props":5184,"children":5185},{},[5186],{"type":65,"value":5187},"Apply the conversions in place",{"type":60,"tag":507,"props":5189,"children":5191},{"id":5190},"validation-workflow",[5192],{"type":65,"value":5193},"Validation Workflow",{"type":60,"tag":527,"props":5195,"children":5197},{"className":747,"code":5196,"language":749,"meta":535,"style":535},"# 1. Lint YAML\ndagfactory lint dags\u002F\n\n# 2. Have Airflow parse to catch operator\u002Fimport errors\n#    (Astro CLI users)\nastro dev parse\n",[5198],{"type":60,"tag":95,"props":5199,"children":5200},{"__ignoreMap":535},[5201,5209,5226,5233,5241,5249],{"type":60,"tag":595,"props":5202,"children":5203},{"class":597,"line":598},[5204],{"type":60,"tag":595,"props":5205,"children":5206},{"style":832},[5207],{"type":65,"value":5208},"# 1. Lint YAML\n",{"type":60,"tag":595,"props":5210,"children":5211},{"class":597,"line":607},[5212,5216,5221],{"type":60,"tag":595,"props":5213,"children":5214},{"style":759},[5215],{"type":65,"value":762},{"type":60,"tag":595,"props":5217,"children":5218},{"style":765},[5219],{"type":65,"value":5220}," lint",{"type":60,"tag":595,"props":5222,"children":5223},{"style":765},[5224],{"type":65,"value":5225}," dags\u002F\n",{"type":60,"tag":595,"props":5227,"children":5228},{"class":597,"line":616},[5229],{"type":60,"tag":595,"props":5230,"children":5231},{"emptyLinePlaceholder":620},[5232],{"type":65,"value":623},{"type":60,"tag":595,"props":5234,"children":5235},{"class":597,"line":626},[5236],{"type":60,"tag":595,"props":5237,"children":5238},{"style":832},[5239],{"type":65,"value":5240},"# 2. Have Airflow parse to catch operator\u002Fimport errors\n",{"type":60,"tag":595,"props":5242,"children":5243},{"class":597,"line":635},[5244],{"type":60,"tag":595,"props":5245,"children":5246},{"style":832},[5247],{"type":65,"value":5248},"#    (Astro CLI users)\n",{"type":60,"tag":595,"props":5250,"children":5251},{"class":597,"line":643},[5252,5257,5262],{"type":60,"tag":595,"props":5253,"children":5254},{"style":759},[5255],{"type":65,"value":5256},"astro",{"type":60,"tag":595,"props":5258,"children":5259},{"style":765},[5260],{"type":65,"value":5261}," dev",{"type":60,"tag":595,"props":5263,"children":5264},{"style":765},[5265],{"type":65,"value":5266}," parse\n",{"type":60,"tag":68,"props":5268,"children":5269},{},[5270,5276],{"type":60,"tag":95,"props":5271,"children":5273},{"className":5272},[],[5274],{"type":65,"value":5275},"dagfactory lint",{"type":65,"value":5277}," only checks YAML syntax — operator import errors and missing kwargs surface at Airflow parse time.",{"type":60,"tag":240,"props":5279,"children":5280},{},[],{"type":60,"tag":157,"props":5282,"children":5284},{"id":5283},"troubleshooting",[5285],{"type":65,"value":497},{"type":60,"tag":507,"props":5287,"children":5289},{"id":5288},"operator-not-found-modulenotfounderror",[5290,5292],{"type":65,"value":5291},"\"Operator not found\" \u002F ",{"type":60,"tag":95,"props":5293,"children":5295},{"className":5294},[],[5296],{"type":65,"value":5297},"ModuleNotFoundError",{"type":60,"tag":68,"props":5299,"children":5300},{},[5301,5306],{"type":60,"tag":74,"props":5302,"children":5303},{},[5304],{"type":65,"value":5305},"Cause",{"type":65,"value":5307},": Provider package not installed, or wrong import path.",{"type":60,"tag":68,"props":5309,"children":5310},{},[5311,5316,5318,5324,5326,5331,5333,5338,5340,5345],{"type":60,"tag":74,"props":5312,"children":5313},{},[5314],{"type":65,"value":5315},"Fix",{"type":65,"value":5317},": Install the provider (",{"type":60,"tag":95,"props":5319,"children":5321},{"className":5320},[],[5322],{"type":65,"value":5323},"pip install apache-airflow-providers-...",{"type":65,"value":5325},") and verify the path. For Airflow 3, run ",{"type":60,"tag":95,"props":5327,"children":5329},{"className":5328},[],[5330],{"type":65,"value":462},{"type":65,"value":5332}," to update legacy ",{"type":60,"tag":95,"props":5334,"children":5336},{"className":5335},[],[5337],{"type":65,"value":2547},{"type":65,"value":5339}," paths to ",{"type":60,"tag":95,"props":5341,"children":5343},{"className":5342},[],[5344],{"type":65,"value":2539},{"type":65,"value":2290},{"type":60,"tag":507,"props":5347,"children":5349},{"id":5348},"yaml-parses-but-the-dag-doesnt-appear-in-airflow",[5350],{"type":65,"value":5351},"YAML parses but the DAG doesn't appear in Airflow",{"type":60,"tag":68,"props":5353,"children":5354},{},[5355,5359,5361,5366],{"type":60,"tag":74,"props":5356,"children":5357},{},[5358],{"type":65,"value":5305},{"type":65,"value":5360},": Loader file missing or ",{"type":60,"tag":95,"props":5362,"children":5364},{"className":5363},[],[5365],{"type":65,"value":736},{"type":65,"value":5367}," not passed.",{"type":60,"tag":68,"props":5369,"children":5370},{},[5371,5375,5377,5383,5385,5391,5393,5399,5400,5406],{"type":60,"tag":74,"props":5372,"children":5373},{},[5374],{"type":65,"value":5315},{"type":65,"value":5376},": Ensure a Python file in ",{"type":60,"tag":95,"props":5378,"children":5380},{"className":5379},[],[5381],{"type":65,"value":5382},"dags\u002F",{"type":65,"value":5384}," calls ",{"type":60,"tag":95,"props":5386,"children":5388},{"className":5387},[],[5389],{"type":65,"value":5390},"load_yaml_dags(globals_dict=globals(), ...)",{"type":65,"value":5392},". Check ",{"type":60,"tag":95,"props":5394,"children":5396},{"className":5395},[],[5397],{"type":65,"value":5398},"astro dev parse",{"type":65,"value":1822},{"type":60,"tag":95,"props":5401,"children":5403},{"className":5402},[],[5404],{"type":65,"value":5405},"airflow dags list-import-errors",{"type":65,"value":5407},") for parse errors.",{"type":60,"tag":507,"props":5409,"children":5411},{"id":5410},"argument-is-not-json-serializable-wrong-kwarg-type",[5412],{"type":65,"value":5413},"\"Argument is not JSON-serializable\" \u002F wrong kwarg type",{"type":60,"tag":68,"props":5415,"children":5416},{},[5417,5421,5423,5429,5431,5436],{"type":60,"tag":74,"props":5418,"children":5419},{},[5420],{"type":65,"value":5305},{"type":65,"value":5422},": A scalar string is being passed where a Python object is expected (e.g. ",{"type":60,"tag":95,"props":5424,"children":5426},{"className":5425},[],[5427],{"type":65,"value":5428},"start_date: \"2025-01-01\"",{"type":65,"value":5430}," for a field that needs ",{"type":60,"tag":95,"props":5432,"children":5434},{"className":5433},[],[5435],{"type":65,"value":4709},{"type":65,"value":565},{"type":60,"tag":68,"props":5438,"children":5439},{},[5440,5444,5446,5452,5453,5459,5461,5466],{"type":60,"tag":74,"props":5441,"children":5442},{},[5443],{"type":65,"value":5315},{"type":65,"value":5445},": Use ",{"type":60,"tag":95,"props":5447,"children":5449},{"className":5448},[],[5450],{"type":65,"value":5451},"__type__: datetime.datetime",{"type":65,"value":1822},{"type":60,"tag":95,"props":5454,"children":5456},{"className":5455},[],[5457],{"type":65,"value":5458},"datetime.timedelta",{"type":65,"value":5460}," etc.) per ",{"type":60,"tag":74,"props":5462,"children":5463},{},[5464],{"type":65,"value":5465},"Custom Python Objects",{"type":65,"value":2290},{"type":60,"tag":507,"props":5468,"children":5470},{"id":5469},"conditional-dataset-schedule-ignored",[5471],{"type":65,"value":5472},"Conditional dataset schedule ignored",{"type":60,"tag":68,"props":5474,"children":5475},{},[5476,5480,5482,5488,5490,5496],{"type":60,"tag":74,"props":5477,"children":5478},{},[5479],{"type":65,"value":5305},{"type":65,"value":5481},": Airflow \u003C2.9, dag-factory \u003C0.22, or using legacy ",{"type":60,"tag":95,"props":5483,"children":5485},{"className":5484},[],[5486],{"type":65,"value":5487},"!and",{"type":65,"value":5489},"\u002F",{"type":60,"tag":95,"props":5491,"children":5493},{"className":5492},[],[5494],{"type":65,"value":5495},"!or",{"type":65,"value":5497}," keys.",{"type":60,"tag":68,"props":5499,"children":5500},{},[5501,5505,5507,5512,5513,5518],{"type":60,"tag":74,"props":5502,"children":5503},{},[5504],{"type":65,"value":5315},{"type":65,"value":5506},": Upgrade and rename to ",{"type":60,"tag":95,"props":5508,"children":5510},{"className":5509},[],[5511],{"type":65,"value":4034},{"type":65,"value":1538},{"type":60,"tag":95,"props":5514,"children":5516},{"className":5515},[],[5517],{"type":65,"value":4041},{"type":65,"value":2290},{"type":60,"tag":507,"props":5520,"children":5522},{"id":5521},"multiple-defaultsyml-not-merging-as-expected",[5523,5525,5530],{"type":65,"value":5524},"Multiple ",{"type":60,"tag":95,"props":5526,"children":5528},{"className":5527},[],[5529],{"type":65,"value":1820},{"type":65,"value":5531}," not merging as expected",{"type":60,"tag":68,"props":5533,"children":5534},{},[5535,5539,5540,5545],{"type":60,"tag":74,"props":5536,"children":5537},{},[5538],{"type":65,"value":5305},{"type":65,"value":93},{"type":60,"tag":95,"props":5541,"children":5543},{"className":5542},[],[5544],{"type":65,"value":2247},{"type":65,"value":5546}," not pointing at a parent directory of the DAG YAML.",{"type":60,"tag":68,"props":5548,"children":5549},{},[5550,5554,5556,5561],{"type":60,"tag":74,"props":5551,"children":5552},{},[5553],{"type":65,"value":5315},{"type":65,"value":5555},": Set ",{"type":60,"tag":95,"props":5557,"children":5559},{"className":5558},[],[5560],{"type":65,"value":2247},{"type":65,"value":5562}," to the highest ancestor folder you want included; dag-factory walks the tree from DAG file → ancestor and merges in that order, with files closer to the DAG winning.",{"type":60,"tag":240,"props":5564,"children":5565},{},[],{"type":60,"tag":157,"props":5567,"children":5569},{"id":5568},"verification-checklist",[5570],{"type":65,"value":5571},"Verification Checklist",{"type":60,"tag":68,"props":5573,"children":5574},{},[5575],{"type":65,"value":5576},"Before finishing, verify with the user:",{"type":60,"tag":2966,"props":5578,"children":5581},{"className":5579},[5580],"contains-task-list",[5582,5601,5622,5636],{"type":60,"tag":173,"props":5583,"children":5586},{"className":5584},[5585],"task-list-item",[5587,5592,5593,5599],{"type":60,"tag":5588,"props":5589,"children":5591},"input",{"disabled":620,"type":5590},"checkbox",[],{"type":65,"value":2989},{"type":60,"tag":95,"props":5594,"children":5596},{"className":5595},[],[5597],{"type":65,"value":5598},"dagfactory lint dags\u002F",{"type":65,"value":5600}," passes",{"type":60,"tag":173,"props":5602,"children":5604},{"className":5603},[5585],[5605,5608,5610,5615,5617],{"type":60,"tag":5588,"props":5606,"children":5607},{"disabled":620,"type":5590},[],{"type":65,"value":5609}," Loader file exists in ",{"type":60,"tag":95,"props":5611,"children":5613},{"className":5612},[],[5614],{"type":65,"value":5382},{"type":65,"value":5616}," and calls ",{"type":60,"tag":95,"props":5618,"children":5620},{"className":5619},[],[5621],{"type":65,"value":5390},{"type":60,"tag":173,"props":5623,"children":5625},{"className":5624},[5585],[5626,5629,5631],{"type":60,"tag":5588,"props":5627,"children":5628},{"disabled":620,"type":5590},[],{"type":65,"value":5630}," Required Airflow providers are in ",{"type":60,"tag":95,"props":5632,"children":5634},{"className":5633},[],[5635],{"type":65,"value":523},{"type":60,"tag":173,"props":5637,"children":5639},{"className":5638},[5585],[5640,5643],{"type":60,"tag":5588,"props":5641,"children":5642},{"disabled":620,"type":5590},[],{"type":65,"value":5644}," DAG appears in Airflow UI without import errors",{"type":60,"tag":240,"props":5646,"children":5647},{},[],{"type":60,"tag":157,"props":5649,"children":5651},{"id":5650},"related-skills",[5652],{"type":65,"value":5653},"Related Skills",{"type":60,"tag":2966,"props":5655,"children":5656},{},[5657,5674,5684],{"type":60,"tag":173,"props":5658,"children":5659},{},[5660,5664,5666,5672],{"type":60,"tag":74,"props":5661,"children":5662},{},[5663],{"type":65,"value":236},{"type":65,"value":5665}," — Writing Airflow DAGs in pure Python with ",{"type":60,"tag":95,"props":5667,"children":5669},{"className":5668},[],[5670],{"type":65,"value":5671},"af",{"type":65,"value":5673}," CLI validation. Use when YAML can't express what you need.",{"type":60,"tag":173,"props":5675,"children":5676},{},[5677,5682],{"type":60,"tag":74,"props":5678,"children":5679},{},[5680],{"type":65,"value":5681},"testing-dags",{"type":65,"value":5683},": For testing DAGs, debugging failures, and the test -> fix -> retest loop",{"type":60,"tag":173,"props":5685,"children":5686},{},[5687,5692],{"type":60,"tag":74,"props":5688,"children":5689},{},[5690],{"type":65,"value":5691},"debugging-dags",{"type":65,"value":5693},": For troubleshooting failed DAGs",{"type":60,"tag":157,"props":5695,"children":5697},{"id":5696},"reference",[5698],{"type":65,"value":5699},"Reference",{"type":60,"tag":2966,"props":5701,"children":5702},{},[5703,5713,5723,5734],{"type":60,"tag":173,"props":5704,"children":5705},{},[5706,5708],{"type":65,"value":5707},"GitHub: ",{"type":60,"tag":109,"props":5709,"children":5711},{"href":111,"rel":5710},[113],[5712],{"type":65,"value":111},{"type":60,"tag":173,"props":5714,"children":5715},{},[5716,5718],{"type":65,"value":5717},"Docs: ",{"type":60,"tag":109,"props":5719,"children":5721},{"href":124,"rel":5720},[113],[5722],{"type":65,"value":124},{"type":60,"tag":173,"props":5724,"children":5725},{},[5726,5728],{"type":65,"value":5727},"PyPI: ",{"type":60,"tag":109,"props":5729,"children":5732},{"href":5730,"rel":5731},"https:\u002F\u002Fpypi.org\u002Fproject\u002Fdag-factory\u002F",[113],[5733],{"type":65,"value":5730},{"type":60,"tag":173,"props":5735,"children":5736},{},[5737,5739],{"type":65,"value":5738},"Migration Guide: ",{"type":60,"tag":109,"props":5740,"children":5743},{"href":5741,"rel":5742},"https:\u002F\u002Fastronomer.github.io\u002Fdag-factory\u002Flatest\u002Fmigration_guide\u002F",[113],[5744],{"type":65,"value":5741},{"type":60,"tag":5746,"props":5747,"children":5748},"style",{},[5749],{"type":65,"value":5750},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":5752,"total":5850},[5753,5767,5779,5795,5808,5825,5838],{"slug":14,"name":14,"fn":5754,"description":5755,"org":5756,"tags":5757,"stars":25,"repoUrl":26,"updatedAt":5766},"manage and troubleshoot Airflow via CLI","Queries, manages, and troubleshoots Apache Airflow using the `af` CLI. Use when working with anything related to Airflow - a DAG, a DAG run, a task log, an import or parse error, a broken DAG, or any Airflow operation. Covers listing and triggering DAGs, retrying runs, reading task logs, diagnosing failures, debugging import and parse errors, checking connections, variables and pools, exploring the REST API, and monitoring health (for example \"trigger a pipeline\", \"retry a run\", \"list connections\", \"check Airflow health\", \"why did my DAG fail\"). This is the entrypoint that routes to sibling skills for authoring, testing, deploying, and migrating Airflow 2 to 3. Not for warehouse\u002FSQL analytics on Airflow metadata tables (use analyzing-data); for deep root-cause reports use debugging-dags or airflow-investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5758,5759,5762,5763],{"name":13,"slug":14,"type":15},{"name":5760,"slug":5761,"type":15},"CLI","cli",{"name":23,"slug":24,"type":15},{"name":5764,"slug":5765,"type":15},"Debugging","debugging","2026-04-06T18:01:43.992997",{"slug":5768,"name":5768,"fn":5769,"description":5770,"org":5771,"tags":5772,"stars":25,"repoUrl":26,"updatedAt":5778},"airflow-hitl","add human-in-the-loop steps to Airflow DAGs","Builds human-in-the-loop (HITL) Airflow workflows - approval gates, form input, and human-driven branching. Use when a DAG needs a human in the loop - an approval or reject step, sign-off before a task runs, a decision or approval UI, branching on a human choice, or collecting form input mid-run; also on mentions of ApprovalOperator, HITLOperator, HITLBranchOperator, HITLEntryOperator, or HITLTrigger. Requires Airflow 3.1+. Not for AI\u002FLLM task calls (see migrating-ai-sdk-to-common-ai).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5773,5774,5777],{"name":13,"slug":14,"type":15},{"name":5775,"slug":5776,"type":15},"Approvals","approvals",{"name":23,"slug":24,"type":15},"2026-04-06T18:01:46.758548",{"slug":5780,"name":5780,"fn":5781,"description":5782,"org":5783,"tags":5784,"stars":25,"repoUrl":26,"updatedAt":5794},"airflow-plugins","build Airflow UI plugins","Builds Airflow 3.1+ plugins that embed FastAPI apps, custom UI pages, React components, middleware, macros, and operator links directly into the Airflow UI. Use when building anything custom inside Airflow 3.1+ that involves Python and a browser-facing interface - creating an Airflow plugin, adding a custom UI page or nav entry, building FastAPI-backed endpoints inside Airflow, serving static assets from a plugin, embedding a React app, adding middleware to the API server, creating custom operator extra links, or calling the Airflow REST API from inside a plugin; also when AirflowPlugin, fastapi_apps, external_views, react_apps, or plugin registration come up.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5785,5786,5789,5791],{"name":13,"slug":14,"type":15},{"name":5787,"slug":5788,"type":15},"Plugin Development","plugin-development",{"name":5790,"slug":589,"type":15},"Python",{"name":5792,"slug":5793,"type":15},"UI Components","ui-components","2026-04-06T18:01:56.827891",{"slug":5796,"name":5796,"fn":5797,"description":5798,"org":5799,"tags":5800,"stars":25,"repoUrl":26,"updatedAt":5807},"airflow-state-store","persist Airflow task and asset state","Persists task and asset state across retries and DAG runs using Airflow 3.3's AIP-103 key\u002Fvalue stores (`task_state_store`, `asset_state_store`) and the crash-safe `ResumableJobMixin`. Use when the user asks about task state store, checkpointing in tasks, persisting state across retries, job IDs surviving worker crashes, watermarks, asset metadata, resumable tasks, crash-safe operators, or \"what's new in Airflow 3.3\". Also use proactively when reading a DAG that uses Variables or XCom for intra-task coordination state — flag the anti-pattern and recommend task_state_store or asset_state_store instead. Requires Airflow 3.3+.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5801,5802,5803,5804],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":5805,"slug":5806,"type":15},"Operations","operations","2026-07-07T06:43:11.160671",{"slug":5809,"name":5809,"fn":5810,"description":5811,"org":5812,"tags":5813,"stars":25,"repoUrl":26,"updatedAt":5824},"analyzing-data","query data warehouses for business questions","Queries the data warehouse with SQL and answers business questions about data. Use when answering anything that needs warehouse data - counts, metrics, trends, aggregations, joins across tables, data lookups, or ad-hoc SQL analysis (for example \"who uses X\", \"how many Y\", \"show me Z\", \"find customers\", \"what is the count\").",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5814,5817,5820,5821],{"name":5815,"slug":5816,"type":15},"Analytics","analytics",{"name":5818,"slug":5819,"type":15},"Data Analysis","data-analysis",{"name":17,"slug":18,"type":15},{"name":5822,"slug":5823,"type":15},"SQL","sql","2026-04-06T18:01:49.599775",{"slug":5826,"name":5826,"fn":5827,"description":5828,"org":5829,"tags":5830,"stars":25,"repoUrl":26,"updatedAt":5837},"annotating-task-lineage","annotate Airflow tasks with data lineage","Annotate Airflow tasks with data lineage using inlets and outlets. Use when the user wants to add lineage metadata to tasks, specify input\u002Foutput datasets, or enable lineage tracking for operators without built-in OpenLineage extraction.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5831,5832,5833,5834],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":5835,"slug":5836,"type":15},"Observability","observability","2026-04-06T18:02:03.487365",{"slug":236,"name":236,"fn":5839,"description":5840,"org":5841,"tags":5842,"stars":25,"repoUrl":26,"updatedAt":5849},"author Airflow DAGs","Workflow and best practices for writing Apache Airflow DAGs. Use when creating a new DAG, write pipeline code, handling questions about DAG patterns and conventions or extending an existing DAG with a follow-up\u002Fdownstream task. ANY request shaped like 'add a DAG named X', 'write a pipeline', 'add a task that runs after Y', or 'extend the DAG'. For testing and debugging DAGs, see the testing-dags skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5843,5844,5845,5848],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":5846,"slug":5847,"type":15},"ETL","etl",{"name":5790,"slug":589,"type":15},"2026-04-06T18:01:52.679888",34,{"items":5852,"total":5850},[5853,5860,5866,5873,5880,5887,5894,5901,5916,5930,5940,5952],{"slug":14,"name":14,"fn":5754,"description":5755,"org":5854,"tags":5855,"stars":25,"repoUrl":26,"updatedAt":5766},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5856,5857,5858,5859],{"name":13,"slug":14,"type":15},{"name":5760,"slug":5761,"type":15},{"name":23,"slug":24,"type":15},{"name":5764,"slug":5765,"type":15},{"slug":5768,"name":5768,"fn":5769,"description":5770,"org":5861,"tags":5862,"stars":25,"repoUrl":26,"updatedAt":5778},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5863,5864,5865],{"name":13,"slug":14,"type":15},{"name":5775,"slug":5776,"type":15},{"name":23,"slug":24,"type":15},{"slug":5780,"name":5780,"fn":5781,"description":5782,"org":5867,"tags":5868,"stars":25,"repoUrl":26,"updatedAt":5794},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5869,5870,5871,5872],{"name":13,"slug":14,"type":15},{"name":5787,"slug":5788,"type":15},{"name":5790,"slug":589,"type":15},{"name":5792,"slug":5793,"type":15},{"slug":5796,"name":5796,"fn":5797,"description":5798,"org":5874,"tags":5875,"stars":25,"repoUrl":26,"updatedAt":5807},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5876,5877,5878,5879],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":5805,"slug":5806,"type":15},{"slug":5809,"name":5809,"fn":5810,"description":5811,"org":5881,"tags":5882,"stars":25,"repoUrl":26,"updatedAt":5824},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5883,5884,5885,5886],{"name":5815,"slug":5816,"type":15},{"name":5818,"slug":5819,"type":15},{"name":17,"slug":18,"type":15},{"name":5822,"slug":5823,"type":15},{"slug":5826,"name":5826,"fn":5827,"description":5828,"org":5888,"tags":5889,"stars":25,"repoUrl":26,"updatedAt":5837},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5890,5891,5892,5893],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":5835,"slug":5836,"type":15},{"slug":236,"name":236,"fn":5839,"description":5840,"org":5895,"tags":5896,"stars":25,"repoUrl":26,"updatedAt":5849},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5897,5898,5899,5900],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":5846,"slug":5847,"type":15},{"name":5790,"slug":589,"type":15},{"slug":5902,"name":5902,"fn":5903,"description":5904,"org":5905,"tags":5906,"stars":25,"repoUrl":26,"updatedAt":5915},"authoring-go-sdk-tasks","implement Airflow tasks in Go","Writes Airflow task logic in Go using the Airflow Go SDK. Use when the user wants to implement Airflow tasks in Go, asks about `BundleProvider`\u002F`RegisterDags`, the `bundlev1` Registry\u002FDag interfaces, registering Go tasks (`AddTask`\u002F`AddTaskWithName`), dependency injection by parameter type (`context.Context`, `sdk.TIRunContext`, `*slog.Logger`, `sdk.Client`), or reading connections\u002Fvariables\u002FXComs from Go. This skill covers the Go-specific native API; the shared Python-stub pattern and conceptual model live in authoring-language-sdk-tasks. For building\u002Fpacking\u002Fshipping the bundle see deploying-go-sdk-bundles; for coordinator config see configuring-airflow-language-sdks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5907,5908,5911,5912],{"name":13,"slug":14,"type":15},{"name":5909,"slug":5910,"type":15},"API Development","api-development",{"name":23,"slug":24,"type":15},{"name":5913,"slug":5914,"type":15},"Go","go","2026-07-11T05:39:13.552213",{"slug":5917,"name":5917,"fn":5918,"description":5919,"org":5920,"tags":5921,"stars":25,"repoUrl":26,"updatedAt":5929},"authoring-java-sdk-tasks","implement Airflow tasks in Java","Writes Airflow task logic in Java, Kotlin, or any JVM language using the Airflow Java SDK. Use when the user wants to implement Airflow tasks in Java\u002FJVM, asks about `@Builder.Dag`\u002F`@Builder.Task`\u002F`@Builder.XCom`, the `Task`\u002F`BundleBuilder` interfaces, reading connections\u002Fvariables\u002FXComs from Java, the JSON-to-Java type mapping, or logging from Java tasks. This skill covers the Java-specific native API; the shared Python-stub pattern and conceptual model live in authoring-language-sdk-tasks. For building\u002Fshipping the bundle see deploying-java-sdk-bundles; for coordinator config see configuring-airflow-language-sdks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5922,5923,5926],{"name":23,"slug":24,"type":15},{"name":5924,"slug":5925,"type":15},"Engineering","engineering",{"name":5927,"slug":5928,"type":15},"Java","java","2026-07-18T05:48:13.374003",{"slug":5931,"name":5931,"fn":5932,"description":5933,"org":5934,"tags":5935,"stars":25,"repoUrl":26,"updatedAt":5939},"authoring-language-sdk-tasks","implement non-Python Airflow tasks","The language-neutral foundation for Airflow language SDKs — implement task logic in a non-Python language while the DAG stays in Python. Use when the user wants to run an Airflow task in another language (Java, Kotlin, Go, or other JVM\u002Fnative languages), asks how the Python `@task.stub` pairs with native task code, how task\u002FDAG IDs must match across the two sides, how data passes via XCom as JSON, or which language SDKs exist. This skill owns the shared Python-stub pattern and conceptual model; for a specific language's native API, build, and runtime, use that language's skill (e.g. authoring-java-sdk-tasks, authoring-go-sdk-tasks).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5936,5937,5938],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":5924,"slug":5925,"type":15},"2026-07-18T05:11:54.496539",{"slug":229,"name":229,"fn":5941,"description":5942,"org":5943,"tags":5944,"stars":25,"repoUrl":26,"updatedAt":5951},"build reusable Airflow task group templates","Define reusable Airflow task group templates with Pydantic validation and compose DAGs from YAML. Use when creating blueprint templates, composing DAGs from YAML, validating configurations, or enabling no-code DAG authoring for non-engineers.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5945,5946,5947,5948],{"name":13,"slug":14,"type":15},{"name":23,"slug":24,"type":15},{"name":5846,"slug":5847,"type":15},{"name":5949,"slug":5950,"type":15},"Templates","templates","2026-04-06T18:01:45.361425",{"slug":5953,"name":5953,"fn":5954,"description":5955,"org":5956,"tags":5957,"stars":25,"repoUrl":26,"updatedAt":5964},"checking-freshness","check data freshness in warehouses","Quick data freshness check. Use when the user asks if data is up to date, when a table was last updated, if data is stale, or needs to verify data currency before using it.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5958,5959,5960,5963],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":5961,"slug":5962,"type":15},"Data Quality","data-quality",{"name":5846,"slug":5847,"type":15},"2026-04-06T18:02:02.138565"]