managed-airflow-dag-authoring — Claude Code skill
Guides Apache Airflow DAG authoring and validation for Managed Service for Apache Airflow. Use it when creating or extending a DAG.
npx skills add google/skills --skill managed-airflow-dag-authoring -a claude-codeWhat managed-airflow-dag-authoring does
This skill guides DAG work for Managed Service for Apache Airflow, formerly called Cloud Composer. It starts with environment context: Airflow version, installed packages, access to the target environment, and local tooling. The guidance covers compatibility between Airflow 2 and Airflow 3.
It recommends idempotent tasks, keeping database queries and external API calls out of top-level DAG code, setting catchup=False, and using Airflow Variables and Connections instead of hardcoded credentials. Validation can use ruff or pylint, composer-dev, Airflow CLI, and gcloud. With GCP access, the DAG can be uploaded to GCS and checked for import or runtime parsing errors in Cloud Logging.
Install it when an agent is writing a DAG for MSAA or Cloud Composer. It is the wrong fit for Python code unrelated to Airflow DAGs.
What it helps with
- author a DAG for Managed Service for Apache Airflow
- check a DAG against Airflow 2 or Airflow 3 constraints
- catch import errors before deployment
- upload a DAG to GCS and verify it in GCP
- keep parsing-time code out of the DAG file
Example prompts for the agent
- Create an Apache Airflow DAG for Managed Service for Apache Airflow and account for the environment's Airflow version.
- Run `ruff` on `path/to/dag.py`, then check import errors with `composer-dev`.
- Upload the DAG to GCS and verify it with `gcloud composer environments run`.
How to install managed-airflow-dag-authoring
1Skills CLI (Vercel)
npx skills add google/skills --skill managed-airflow-dag-authoring -a claude-code2Manually: put the files in place
~/.claude/skills/managed-airflow-dag-authoring/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/managed-airflow-dag-authoring/
1Skills CLI (Vercel)
npx skills add google/skills --skill managed-airflow-dag-authoring -a codex2Manually: put the files in place
.agents/skills/managed-airflow-dag-authoring/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/managed-airflow-dag-authoring/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install google/skills managed-airflow-dag-authoring2Manually: put the files in place
.github/skills/managed-airflow-dag-authoring/SKILL.md1Skills CLI (Vercel)
npx skills add google/skills --skill managed-airflow-dag-authoring -a gemini-cli2Platform CLI
gemini skills install https://github.com/google/skills --path skills/cloud/managed-airflow-dag-authoringManually: put the files in place
.devin/skills/managed-airflow-dag-authoring/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set172
The whole set →Similar
Questions about managed-airflow-dag-authoring
How do I install managed-airflow-dag-authoring in Claude Code?
Run npx skills add google/skills --skill managed-airflow-dag-authoring -a claude-code. The skill file is placed at ~/.claude/skills/managed-airflow-dag-authoring/SKILL.md.
What does managed-airflow-dag-authoring do?
It guides the creation and validation of Apache Airflow DAGs for Managed Service for Apache Airflow. It covers environment discovery, Airflow version compatibility, and local or remote checks.
What should I check before deploying a DAG?
Check the target Airflow version and installed packages first. Then run static checks, inspect import errors, and verify the DAG in GCP when authorized access is available.
Source text
SKILL.md · Apache-2.0
---
name: managed-airflow-dag-authoring
description: >-
Provides guidance for authoring Apache Airflow DAGs in Managed Service for
Apache Airflow (MSAA; formerly Cloud Composer). Covers environment context
discovery, Airflow 2 vs 3 compatibility, authoring best practices, and local/remote
validation processes. Use when creating or extending an Airflow DAG. Don't
use when authoring Python code unrelated to Airflow DAGs.
metadata:
version: "1.0.1"
category: BigDataAndAnalytics
---
# GCP Managed Airflow DAG Authoring Guide
This skill guides you through authoring and validating Apache Airflow DAGs for
Managed Service for Apache Airflow (MSAA; formerly Cloud Composer) environments.
--------------------------------------------------------------------------------
## Attribution
**MUST READ**: Before executing any `gcloud`, REST API, or MCP command, you
MUST read [Usage Attribution](references/attribution.md). For commands executed
directly in the terminal (never in generated scripts, Terraform, or user code),
prefix `gcloud` with
`CLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:managed-airflow-dag-authoring)"`
and append `agent-skills/1.0 (skill:managed-airflow-dag-authoring)` to `User-Agent` headers.
## Phase 1: Context Discovery
Before writing any DAG code, you MUST understand the constraints (e.g. version
of Airflow) and capabilities of your target environment if user is willing to
provide them.
### 1.1 Identify Target Environment & Access
Determine if you have direct access to the target Managed Airflow environment,
local development environment or if you are working offline (only changing local
files without validation).
* **If environment access is available:** Use `gcloud` to inspect the
environment (see Section 1.3).
* **If offline:** Rely on user provided details.
### 1.2 Identify Development Environment
Determine if a local development environment is available.
* Check if `composer-dev` CLI is installed.
* Check if a local Python environment with `airflow` is available.
### 1.3 Inspect Target Environment (if available and requested)
Run the following commands to discover version constraints:
1. **Get Airflow/Image Version:**
```bash
gcloud composer environments describe {env_name} \
--location {region} \
--format="value(config.softwareConfig.imageVersion)"
```
2. **Get Installed Packages (Versions):**
```bash
gcloud composer environments describe {env_name} \
--location {region} \
--format="value(config.softwareConfig.pypiPackages)"
```
3. **Get DAGs GCS Bucket:**
```bash
gcloud composer environments describe {env_name} \
--location {region} \
--format="value(config.dagGcsPrefix)"
```
--------------------------------------------------------------------------------
## Phase 2: DAG Authoring Best Practices
### 2.1 General Airflow Best Practices
* **Idempotency:** Every task SHOULD be idempotent. Running it multiple times
with the same inputs (e.g., execution date) SHOULD produce the same result
and not duplicate data.
* **No Top-Level Code Execution:** Do NOT execute database queries, external
API calls, or heavy computations at the top level of the DAG file (outside
of tasks/operators). This code runs every few seconds during DAG parsing and
will degrade performance.
* **Explicit Catchup:** Always set `catchup=False` in the DAG definition
unless historical backfilling is explicitly required.
* **Use Airflow Variables/Connections:** Never hardcode credentials or
environment-specific configs. Use `Variable.get()` (with
`deserialize_json=True` if applicable) and `BaseHook.get_connection()`.
Access variables via Jinja templates (e.g., `{{ var.value.my_var }}`) to
avoid database calls during DAG parsing.
### 2.2 Airflow 2 vs Airflow 3 Compatibility
Use managed-airflow-migrations skill to navigate adjusting the code to
specific target Airflow version.
--------------------------------------------------------------------------------
## Phase 3: Validation Process
You MUST validate DAGs before concluding your task.
### 3.1 Local Validation (Offline/Pre-deployment)
#### 3.1.1 Static Analysis & Linting
Use `ruff` or `pylint` if available.
```bash
ruff check path/to/dag.py
```
* If targeting Airflow 3, check with Airflow 3 rules if rulesets are
available.
#### 3.1.2 Local Dev Environment (`composer-dev`)
If the user has `composer-dev` configured:
1. Copy the DAG to the local directory with DAGs:
```bash
cp path/to/dag.py $(composer-dev describe {local_env} --format="value(dags_directory)")
```
2. Verify parsing:
```bash
composer-dev run-airflow-cmd {local_env} dags list-import-errors
```
### 3.2: Target Environment Validation
Only perform these steps if you have GCP access and are authorized to deploy to
a target environment.
### 3.2.1 Deploy to GCS
Upload the DAG to the target environment's GCS bucket:
```bash
gcloud storage cp path/to/dag.py gs://{target_bucket}/dags/
```
### 3.2.2 Verify via Airflow CLI
Wait 1-2 minutes for the scheduler to parse the file, then run:
1. **Check for Import Errors:**
```bash
gcloud composer environments run {env_name} \
--location {region} \
dags list-import-errors
```
*Pass Criteria:* Output should be "No data found" or empty.
2. **Verify DAG is Listed:**
```bash
gcloud composer environments run {env_name} \
--location {region} \
dags list | grep {dag_id}
```
### 3.2.3 Monitor Cloud Logging
Check for runtime parsing errors in Cloud Logging:
```query
resource.type="cloud_composer_environment"
resource.labels.environment_name="{env_name}"
log_id("airflow-scheduler")
severity>=ERROR
textPayload:"{dag_file_name}"
```
--------------------------------------------------------------------------------
## Definition of Done
* DAG code adheres to Airflow version constraints of the target environment.
* DAG code follows best practices (no top-level execution, idempotent if
possible).
* DAG parses locally without import errors.
* (If environment is available) DAG is deployed to the target environment and
verified to have no import errors.
© google · Apache-2.0 · google/skills