Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
日本語の概要は準備中です。原文の説明を表示しています。
Use when adding or changing a scheduled data or ML pipeline — Dagster assets, Prefect flows, Airflow DAGs or a cron'd entrypoint — idempotent partitioned stages, retries, backfills, quality gates, and testing the pipeline without the scheduler
インストールする前に、エージェントに与えられる指示の中身を確認できます。
A pipeline runs unattended, gets retried, gets backfilled for last March, and runs twice when someone clicks the button twice. Each stage therefore has to produce the same result for the same inputs no matter how often it runs, and fail loudly when its input is wrong.
Core principle: business logic lives in plain, tested functions; the orchestrator layer is a thin wrapper that wires partitions, resources and retries around them.
| You find | It is |
|---|---|
@dg.asset, Definitions(...), dagster.yaml, workspace.yaml | Dagster (asset-based) |
@flow, @task from prefect, prefect.yaml | Prefect |
dags/ folder, @dag / DAG(...), from airflow | Airflow (Airflow 3 imports authoring APIs from airflow.sdk) |
dvc.yaml stages | DVC pipeline (experiment-tracking-and-reproducibility) |
| a cron entry or a CI schedule calling a CLI | plain entrypoint |
Never add a second orchestrator (rule stack-choice). A plain CLI entrypoint called by the existing scheduler is often the right size.
# src/churn/features.py — pure, tested with fixtures
def build_daily_features(orders: pd.DataFrame, day: date) -> pd.DataFrame: ...
# src/churn/orchestration/assets.py — wiring only
import dagster as dg
daily = dg.DailyPartitionsDefinition(start_date="2025-01-01")
@dg.asset(partitions_def=daily)
def daily_features(context: dg.AssetExecutionContext, warehouse: WarehouseResource) -> None:
day = date.fromisoformat(context.partition_key)
features = build_daily_features(warehouse.orders_for(day), day)
warehouse.overwrite_partition("features.daily", day, features)
The asset never computes anything itself; build_daily_features has unit tests that know nothing about Dagster.
| ❌ | ✅ |
|---|---|
INSERT INTO features SELECT ... on every run | delete-then-insert the partition in one transaction, MERGE on the key, or INSERT OVERWRITE the partition |
df.to_parquet("out/features.parquet", append...) | write out/day=2026-10-01/part.parquet to a temp path, then rename |
window_end = datetime.now() | window from the partition key or the run's data interval |
| file names with a timestamp of when it ran | paths keyed by what the data is for (partition, model version) |
Test it: run the stage twice on the fixture; the output is identical and the row count does not double.
@task(retries=3, retry_delay_seconds=30) in Prefect, a RetryPolicy in Dagster, retries= in Airflow. A validation failure is not transient — retrying it three times just delays the alert.@dg.asset_check, dbt tests after dbt build. Downstream stages do not run on a failed gate.before_deploy / after_deploy, with how long it takes and how to stop it (rule deploy-runbook-fields).def test_daily_features_overwrites_its_partition(tmp_warehouse) -> None:
for _ in range(2):
result = dg.materialize(
[daily_features],
partition_key="2026-10-01",
resources={"warehouse": tmp_warehouse},
)
assert result.success
assert tmp_warehouse.row_count("features.daily", day=date(2026, 10, 1)) == 3
dg.materialize([...], partition_key=..., resources=...) with a local resource (DuckDB file in tmp_path, an in-memory fake).prefect_test_harness().dag.test() for one run; keep task bodies as calls into your package.Credentials come from the orchestrator's resources, connections or environment — never in code, never in DAG parameters. A new variable the deployed pipeline reads is declared with declare_env_vars. In Airflow, never render user-supplied parameters into Jinja-templated SQL or shell commands; pass them as bound parameters.
A changed pipeline runs side by side (shadow output to a separate table or path) before it replaces the old output, when the task's risk warrants it; the cut-over and the rollback (point consumers back, re-run the old version for affected partitions) go in after_deploy and rollback_plan.
now() inside a stage, so a backfill computes today's window for last year's partition.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
日本語の概要は準備中です。原文の説明を表示しています。
Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping
日本語の概要は準備中です。原文の説明を表示しています。
Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal
日本語の概要は準備中です。原文の説明を表示しています。
Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task
日本語の概要は準備中です。原文の説明を表示しています。
How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.
日本語の概要は準備中です。原文の説明を表示しています。
Use when deciding whether a request needs an analiz task before implementation - the conditions that require the architect's analysis versus going straight to implementation
日本語の概要は準備中です。原文の説明を表示しています。