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 deciding whether a request needs an analiz task before implementation - the conditions that require the architect's analysis versus going straight to implementation
日本語の概要は準備中です。原文の説明を表示しています。