Data Contracts

Producer-signed schema + SLA — moves the responsibility for breakage to the producing team.

0/2 done

Overview

Data Contracts

Producer-signed schema + SLA — moves the responsibility for breakage to the producing team.

Why it matters

A contract turns 'oops, we changed the column' from a P2 incident on the consumer team to a blocked CI check on the producer team.

Going deeper

A practical data contract YAML looks like:

dataset: prod.analytics.fct_orders
owner: team-checkout@company
version: 2.3.0
sla:
  freshness: 1h
  availability: 99.9%
schema:
  - { name: order_id,   type: string,    nullable: false, pk: true }
  - { name: amount_cents, type: int64,   nullable: false }
  - { name: placed_at,  type: timestamp, nullable: false }
checks:
  - amount_cents > 0
  - order_id is unique
breaking_changes_require: [migration_window, downstream_signoff]

The crucial line is the last one: breaking changes require explicit downstream sign-off. That single rule is what flips incident ownership from the consumer back to the producer, where it belongs.

Analogy

A data contract is the OpenAPI spec for a dataset.

Backend services stopped quietly renaming fields in REST responses years ago — because OpenAPI / Protobuf made the contract explicit, machine-checked, and breakable-builds. Data pipelines, by contrast, mostly still rename columns at 3 a.m. and break a dozen downstream models at 9 a.m.

A data contract closes that gap: the producer team publishes a versioned schema + freshness SLA + ownership block; CI fails their build when they violate it. The consumer is no longer playing defense.

Make it stick

Use the prompts below to anchor data contracts to something you actually own.

  • Which of your team's datasets has the most downstream consumers? It is your highest-ROI candidate for a v1 contract.
  • Last time a producer broke a consumer in your org, who paid the cost in hours — and who *should* have, under a contract regime?
  • What's the minimum CI check you could ship next sprint to enforce 'no column drop without sign-off'?

Reading in progress · 0 of 2 activities done