# Contracts have a kind, and the producer owns the contract

Authored contracts carry a `kind`: `product` or `source`. This extends the one-universal-schema decision ([0007](./0007-contracts-use-one-schema-with-layer-profiles.md)) with a kind discriminator rather than a separate schema. A `product` is a layered data product (raw, staging, curated, service) and keeps the layer profiles. A `source` describes an upstream/source artifact the platform consumes — for example the Parquet objects an extract job writes to S3 — and has no layer; its profile requires a `source` block and forbids `layer`. Absent `kind` means `product`, so existing contracts stay valid.

The stage that *produces* an asset owns and generates its contract. The TiDB Cloud extract stage produces the S3 snapshot objects, so it owns their `source` contract. The load stage materializes the Cloud Lake raw tables, so it owns the raw-snapshot `product` contract and references the source contract as its declared upstream; staging and curated products are owned by the transform layer that produces them ([ADR 0016](./0016-load-materializes-only-the-raw-layer.md)). An extract job must not author contracts for assets a downstream stage produces. This keeps ownership aligned with the producing engine and fits the collate model in [0009](./0009-contract-engine-collates-contracts-and-asset-metadata.md): fragments and generated contracts live beside the asset definition that produces them.

The one exception is an externally-managed bucket with no producing stage: the platform produces no objects, so the `source` contract is *provided* — inferred and committed as a consumed input rather than owned ([ADR 0018](./0018-externally-managed-sources-load-incrementally-with-inferred-drift-gated-contracts.md)).
