05 Conformance

A claim you can check

“CGP conformant” means green on contextgraph-conformance for your declared capability set. That is a checkable claim, not a self-attestation.

Provider checks

The suite runs 14 checks against a provider. A check that does not apply to what the provider declared is skipped, and the report lists every skip. A skip never fails a run.

Table 4. Provider checks in contextgraph-conformance.
CheckProves
handshakeCompletes the handshake with non-empty identity and capabilities.
consent-scopeDeclared egress scopes are well-formed and consistent with data_flow.egress.
frame-validityEvery frame has score ∈ [0,1], a non-empty title and citation label, well-formed timestamps and digests, and file ranges in the line grammar.
verify-honestyA provider that advertises verify answers valid for digests it served and stale for mutated ones.
budget-honestyCanonical token_cost, sum ≤ max_tokens, count ≤ max_frames.
as-of-temporalAt an as_of pin, every returned frame’s validity window contains the pin.
kinds-filterA kind-filtered query returns only that kind.
anchor-relevanceA graph provider’s frames anchor on a uri or a relation target.
provenance-fixture-consistencyEach file provenance digest matches the bytes it names.
shutdown-cleanTears down on shutdown without error.
malformed-input-toleranceMalformed input gets bad_request or is ignored, and the provider keeps running. Stdio only.
embedding-fingerprintA query embedding that contradicts the declared dimension gets bad_request. Stdio only.
correlationA provider that declares correlation echoes each request id. Stdio only.
attestationEvery provenance attestation the provider serves verifies against a key from its handshake. Stdio only.

Host and composition suites

The host has binding rules too. contextgraph-inspect host runs 9 host checks against the reference host: it rejects a wrong-family version, drops an over-budget or frame-flooding provider, gates egress on consent, requires a scope receipt, re-hashes file provenance, quotes frame content, isolates a crashed provider, and audits composition.

A host with its own composition layer can run the 4 composition checks against it through run_composition_conformance. They check that the admitted frames fit the shared budget, that every offered frame is either admitted or reported dropped, that a quarantined provider contributes nothing, and that the same frame set composes in the same order on every run.

RED suite

A suite that only ever passes proves nothing about its ability to catch a broken provider. The bundled reference provider, contextgraph-example-docs, ships 31 --misbehave modes. Each breaks exactly one guarantee: lying about costs, flooding past max_frames, dropping correlation ids, rubber-stamping verification, declaring a false egress scope, or forging a signature. CI runs every mode and requires a check to fail on it. A skipped check does not count as a catch. The mode list comes from the binary’s own --help, so a new misbehaviour without a check that catches it turns CI red.

Probing a provider

contextgraph-inspect is an interactive prober, analogous to MCP’s inspector. It prints negotiated capabilities, optionally fires a test query, runs the full suite, and exits non-zero when the provider is not conformant, so CI can gate on it. It ships in the contextgraph-conformance crate.

contextgraph-inspectshell
cargo install contextgraph-conformance
contextgraph-inspect stdio -- ./your-provider
contextgraph-inspect stdio --json -- ./your-provider
contextgraph-inspect stdio --query "goal text" -- ./your-provider
contextgraph-inspect http https://my-provider.example.com/contextgraph
contextgraph-inspect host

From a checkout of the protocol repository, point the same Rust oracle at a provider written in any language:

Validate an external providershell
cargo build --workspace --bins
./.github/scripts/conformance-external.sh -- node sdk/typescript/dist/examples/example-docs.js

Golden fixtures

Cross-language byte-exactness rests on golden fixtures: seven JSON files plus a manifest, published for fixture profile 1.1.0 under contextgraph-conformance/fixtures/contextgraph-1.0/. They cover a fully populated and a minimal ContextFrame, compact and reference frames, a minimal ContextQuery, missing and blank citation labels, strict unknown-field negatives, and RFC 8785 (JCS) normalization vectors.

Each frame and query digest case carries four artifacts: the source object, the digest-profile-normalized object, the exact JCS UTF-8 text, and the SHA-256 of those canonical bytes. The manifest pins the protocol version and the profile version, records the generation command, and carries a digest for every other file, so a fixture cannot drift unnoticed.

Honest gaps, declared. The spec lists what the suite still cannot check. A stdio provider that declares egress: false can open a socket anyway, and nothing on the pipe shows it (C3). The HTTP transport rules C4, C7, and C8 have no test against a live TLS peer yet. A suite that quietly left these out would be the self-attestation the project rejects.