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 data crosses a boundary into your code (file, API, warehouse table, upload, model input or output), when a join or cleaning step can change row counts, or when adding pandera, Great Expectations, Pydantic or dbt checks
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Code that trusts its input computes wrong numbers quietly. A contract states what the data must look like at a boundary and stops the pipeline, with a readable message, when it does not. EDA finds the facts (eda-and-data-profiling); contracts keep them true.
Core principle: validate at every boundary, fail loudly with the column and the bad values, and never catch a validation error just to keep going.
| Dimension | Question | Typical check |
|---|---|---|
| Completeness | Are required values present? | not-null on keys and required fields |
| Uniqueness | Is the grain what we think? | unique on the (composite) key |
| Validity | Are values in range and in the allowed set? | ge/le, isin, regex, dtype |
| Consistency | Do columns agree with each other? | shipped_at not null when status == "shipped" |
| Referential integrity | Do foreign keys point at something? | relationship test, anti-join count |
| Timeliness | Is the data fresh and the period complete? | max timestamp within N hours |
| Volume | Is the batch plausibly sized? | row count within a range of recent batches |
Check the columns your logic depends on, not every column — a contract nobody can maintain gets disabled.
| Boundary | Tool (if the repo has none yet) |
|---|---|
| DataFrames inside Python code and tests | pandera (import pandera.pandas as pa; pandera.polars for Polars) |
| Pipeline checkpoints with stored results and docs | Great Expectations (GX Core 1.x) — only if the repo already runs it |
| Single records: API payloads, configs, messages | Pydantic 2 models |
| Warehouse tables built by dbt | dbt data tests and model contracts (sql-analytics-and-dbt) |
Never add a second validation library beside the one the repository uses (rule stack-choice).
import pandas as pd
import pandera.pandas as pa
from pandera.typing import DataFrame, Series
class Orders(pa.DataFrameModel):
order_id: Series[str] = pa.Field(unique=True)
customer_id: Series[str]
amount: Series[float] = pa.Field(ge=0)
status: Series[str] = pa.Field(isin=["placed", "shipped", "refunded"])
shipped_at: Series[pd.Timestamp] = pa.Field(nullable=True)
class Config:
strict = True
coerce = True
@pa.dataframe_check
def shipped_orders_have_a_date(cls, df: pd.DataFrame) -> pd.Series:
return ~((df["status"] == "shipped") & df["shipped_at"].isna())
@pa.check_types(lazy=True)
def clean_orders(raw: DataFrame[Orders]) -> DataFrame[Orders]:
...
lazy=True collects every failure instead of stopping at the first; the SchemaErrors.failure_cases frame names column, check and value.strict = True rejects unexpected columns — a renamed upstream column fails here instead of turning into all-NaN later.coerce = True is a decision: it converts "12" to 12.0, but a value that cannot be coerced still fails. Turn it off where a wrong type means a broken upstream.str (Arrow-backed when PyArrow is installed); keep pandera and pandas versions pinned together and run the schema tests after either moves.def test_orders_schema_rejects_negative_amount() -> None:
bad = valid_orders().assign(amount=[-1.0, 5.0])
with pytest.raises(pa.errors.SchemaErrors) as err:
Orders.validate(bad, lazy=True)
assert set(err.value.failure_cases["column"]) == {"amount"}
One failing-fixture test per rule you add: a rule that never failed a test may not be checking anything.
# ❌ silently duplicates orders when a customer has two rows
df = orders.merge(customers, on="customer_id", how="left")
# ✅ fails immediately if customers is not unique on the key
df = orders.merge(customers, on="customer_id", how="left", validate="many_to_one")
assert len(df) == len(orders)
In SQL, compare COUNT(*) with COUNT(DISTINCT key) before and after the join, or put a unique test on the dimension's key (analytics-result-qa).
import great_expectations as gx
context = gx.get_context(mode="ephemeral")
batch = (
context.data_sources.add_pandas("in_memory")
.add_dataframe_asset("orders")
.add_batch_definition_whole_dataframe("all")
.get_batch(batch_parameters={"dataframe": df})
)
suite = gx.ExpectationSuite(name="orders")
suite.add_expectation(gx.expectations.ExpectColumnValuesToNotBeNull(column="order_id"))
suite.add_expectation(gx.expectations.ExpectColumnValuesToBeBetween(column="amount", min_value=0))
assert batch.validate(suite).success
GX 1.x removed the 0.x CLI (great_expectations init) and DataContext.run_checkpoint patterns; production runs use a ValidationDefinition inside a Checkpoint. Follow the version the repository pins.
class ScoreRequest(BaseModel):
model_config = ConfigDict(extra="forbid")
customer_id: str = Field(min_length=1)
tenure_days: int = Field(ge=0, le=36_500)
plan: Literal["free", "pro", "team"]
Use it for request bodies, job parameters and configuration (pydantic-settings) — not row-by-row over a large frame, which is slow; validate frames with a frame schema.
try: validate(df) except SchemaError: log.warning(...) — the pipeline continues on bad data.validate= on a dimension you assumed unique.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
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 the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.