<!-- markdown mirror of https://mintid.net/en/sdk/conformance — generated at build time -->

> &quot;Every SDK behaves identically&quot; as a CI gate: the cross-language conformance suite, semver promises, and the release pins every artifact carries.

index — 12 documents

1.  [overviewsdk/00](/en/sdk)
2.  [getting startedsdk/01](/en/sdk/getting-started)
3.  [python sdksdk/02](/en/sdk/python)
4.  [service modesdk/03](/en/sdk/service-mode)
5.  [typescript clientsdk/04](/en/sdk/typescript-client)
6.  [mcp serversdk/mcp](/en/sdk/mcp-server)
7.  [conformancesdk/05](/en/sdk/conformance)
    *   [the conformance suite](#suite)
    *   [version numbers](#versioning)
    *   [release pins](#release-pins)
    *   [decision equivalence](#equivalence)
8.  [reason codessdk/06](/en/sdk/reason-codes)
9.  [adr-0001 · kyc trust modeladr/0001](/en/sdk/adr-0001-kyc-trust-model)
10.  [adr-0002 · packagingadr/0002](/en/sdk/adr-0002-packaging)
11.  [adr-0003 · multi-languageadr/0003](/en/sdk/adr-0003-multilanguage)
12.  [bip-0001 · contract freezebip/0001](/en/sdk/bip-0001-verifier-service-contract)

SDK docs · sdk/05

# Conformance & versioning

"Every SDK behaves identically" as a CI gate: the cross-language conformance suite, semver promises, and the release pins every artifact carries.

## The cross-language conformance suite

"Every SDK behaves identically" is not a promise here — it is a CI gate. A committed set of JSON vectors derived deterministically from the reference implementation: for each case, a canonical challenge, a holder envelope, a declarative description of the proven on-chain state ("world"), and the frozen expected decision. Coverage is total by construction and CI-asserted:

*   one accepted case (plus policy-nuance positives),
*   at least one rejection for **each of the nine acceptance conditions**,
*   every producible reason code in the vocabulary.

Every SDK must pass the suite before release:

*   the **Python SDK** replays every vector through the library _and_ through the service HTTP surface;
*   the **TypeScript client** replays every vector through real HTTP against the reference service in doubles mode;
*   the committed vectors are **byte-compared against regeneration** on every CI run — the suite cannot drift from the reference implementation silently.

A release declares the suite version it passed (also readable at runtime via `build_info().conformance_suite_version`).

## Version numbers and what they promise

Everything follows semver with one shared rule: **decision semantics are major**.

Artifact

Major means

Minor means

`mintid-verifier-sdk` (Python)

public surface or accepted-behavior change

additive surface

OpenAPI contract `verifier-service.v1`

decision semantics or reason-vocabulary change

additive wire surface

Conformance suite

a case's expected decision, or doubles-convention change

new cases

`@mintid/verifier-client`

tracks the contract major

—

## Release pins (what an artifact tells you about itself)

Every SDK artifact records, programmatically readable:

*   **`engine_pin`** — the exact proof engine compiled into the wheel. While the anonymous-credential core is pre-launch, the pin carries a `+stub` pre-release marker and the engine refuses every proof (fail closed): a non-verifying build can never masquerade as a verifying one. The marker disappears only when the audited engine lands.
*   **`state_vectors_*`** — the chain store-layout vectors this build was release-gated against; a mismatch with the target chain blocks the release outright.
*   Engine pin bumps are reviewed release changes — never automatic, not overridable by dependency resolution, not substitutable through any supported install path.

jsonsdk/05 · verbatim

```
{
  "sdk_version": "…",
  "engine_pin": "proof-core …",
  "state_vectors_version": "…",
  "state_vectors_sha256": "…",
  "spec_revision": "SPEC-1 v…",
  "conformance_suite_version": "…"
}
```

## What this buys you as an integrator

You can treat any two artifacts declaring the same contract major and the same suite version as **decision-equivalent**: same inputs, same accept/reject, same reason code, in any language. That equivalence is re-proven by CI on every change, which is the entire point.

[previous← mcp server](/en/sdk/mcp-server)[nextreason codes →](/en/sdk/reason-codes)

---
Source: https://mintid.net/en/sdk/conformance · Conformance &amp; versioning — MintID verifier SDK docs
