Skip to main content

Concepts · 1 of 5

Contracts and guarantees

A contract is the shared meaning of an interaction (types, access, lifecycle, limits and failures), and a connector binds that meaning to one provider.

contracts/README.md, contracts/service/v1alpha1/semantics.md, contracts/service/compatibility.md, ess/system.yaml

Contracts and guarantees

A contract describes the shared meaning of an interaction: its types, access requirements, lifecycle, limits and failure behaviour. A connector binds those guarantees to its provider. Shared contracts live in the repository's contracts/ directory and never name a provider; native profiles (Kubernetes selectors, LogQL, PostgreSQL's text representation) live with their connector.

Follow an interaction​

Discover, select access, invoke, interpret.

  1. Discover. The caller reads the service's descriptor: each operation's id, input and output schema, the contract family and native profile it implements, and the descriptor's revision. Discovery reports observations; an endpoint the Kubernetes connector discovers is information, not a connection.
  2. Select access. A connection binds a selected target and a credential. Selecting it is a deliberate act of the host or the operator, never a side effect of discovery.
  3. Invoke. The request names the operation and the descriptor revision it was built against. Admission decides whether this request may proceed: the caller's credential, the revision and the input schema, and for a write its approval, all before anything is dispatched.
  4. Interpret. The operation and its data profile define the result, including incomplete pages, truncation and provenance, or a typed refusal, or an explicitly unknown outcome.

The service contract states the describe and invoke wire exactly, with its limits; Getting started shows each step against a running service.

What a refusal promises​

A refusal is a code with a fixed meaning, not provider prose. invalid_input and unauthorized mean nothing was dispatched. unavailable means a dependency did not answer. A write whose answer was lost after dispatch is neither success nor refusal: it is outcome_unknown, carries the attempt the host recorded, and is never sent again (governed invocation). Unknown or unavailable evidence never becomes a positive answer.

Versions are independent​

Three things carry versions, and none implies another:

VersionExampleOwner
Contract familydatasource.records/v1alpha1, datasource.feed/v1alpha1contracts/
Service wire bindingPOST /v1/invoke, POST /v1alpha2/invokethe compatibility contract
Implementation specification and native profilekubernetes-list, gitlab-merge-requests/1the connector's implementation under adapters/

A broader implementation specification never implies that its runtime supports every operation it describes. Each page in the contract reference states its own support status.

Typed and textual halves​

Each contract has a textual semantics document and a typed model. The models are written in ESS (GitHub) under ess/ for shared contracts and adapters/<owner>/spec/ess/ for native ones; the reference renders them as the ESS model pages. Structural validation establishes that the model is consistent. Behaviour, storage and cross-record predicates remain obligations each implementation discharges and its tests hold.

Families at a glance​

FamilyWhat it coversRuns today
Service and executiondescribe and invoke, the governed v1alpha2 binding, mutations and idempotency, execution audit, delegated approval, the local clockdescribe and invoke; the first v1alpha2 invoke binding with audit and attempts
Authentication and accessconnections, profiles, acquisition, custody, capabilities, readiness evidencein part, through the local CLI's saved connections; the full contracts are specified
Data readsrecords, logs, series, web search, feedsrecords, web search (Tavily), feeds (GitLab), logs (Loki)
Discovery and compositionresource discovery, mediated routes, compositionendpoint and host discovery (Kubernetes)
Sessions and mediabidirectional sessions, negotiated mediaspecified only

The status page holds each runtime claim to a named test.