Skip to content

Certification

This repository defines the normative model a certification claim is built from. It does not issue certification, does not operate a service, and does not place anything on chain. Execution and receipt generation belong to the runner (Repository 2). What lives here is the meaning: exactly what a claim refers to, and what would make one false.

A claim needs to be fully determined

A statement that a contract "is SEP-41 compliant" is not verifiable, because it does not say which profile, at which revision, against which vector corpus, at which moment. Two people can assert it in good faith, reach different conclusions, and both be right — because they checked different things.

For a claim to be checkable it must pin every input that could change its outcome:

Component Pins
Profile identifier and version The requirements that were applied
Vector digest The exact corpus those requirements were exercised with
Contract identifier and network Which deployment the claim is about
Contract WASM hash Which bytecode, so an upgrade cannot silently inherit a claim
Runner version The implementation that produced the verdict
Execution result The verdict itself
Report digest The evidence the verdict came from
Timestamp When it was established

Every one of these is necessary. Drop the profile version and the claim survives a behavioural requirement being added. Drop the vector digest and it survives the corpus being weakened. Drop the WASM hash and a contract can be upgraded to different bytecode at the same address while the claim continues to be cited. Drop the runner version and a result produced by a buggy implementation is indistinguishable from a correct one. The model is deliberately unforgiving about this, because a claim missing a field is not a weaker claim — it is a different, unstated claim.

The report

A conformance run produces a report conforming to schema/report.schema.json. It records the runner identity, the target (contract, network, WASM hash, metadata), the profile identity and digest, the vector count and digest, the execution configuration, the per-vector results with their individual assertion outcomes, a per-category summary, the final status, and the exit code.

The report is the evidence. A receipt asserts a verdict; the report is what that verdict was derived from, and a receipt that cannot be checked against a report proves nothing.

The six statuses

The status field is one of six values, and the distinction between them is the model's most consequential rule.

Status Meaning
CONFORMANT Every required vector passed
PARTIALLY_CONFORMANT Some required vectors passed, some failed
NON_CONFORMANT A required behavioural requirement was violated
INCONCLUSIVE The suite could not reach a decision
EXECUTION_ERROR The environment failed; the contract is not to blame
PROFILE_ERROR The requirements were unusable

Only the first three describe the contract. EXECUTION_ERROR means the network was unreachable, the contract could not be resolved, or the fixture could not be initialized. PROFILE_ERROR means the profile itself was malformed and was therefore never applied. Both must be reported as what they are: a runner that reported an unreachable node as non-conformance would be actively harmful in a CI gate, blaming a contract for a network outage and blocking a release for the wrong reason.

INCONCLUSIVE is the honest status for a suite that was partially executable — some vectors ran, others could not be evaluated, and the missing ones could contain a failure. Reporting partial execution as conformance would be the single most damaging thing this system could do.

What a receipt should carry

Repository 2 owns the receipt format. The normative requirement this repository places on it is that a receipt carry the fields above explicitly, or a digest over a document that does. Where a receipt is signed, the signature covers the digest over the canonical encoding, and the encoding itself is deterministic — a receipt whose bytes depend on serialization order cannot be independently reproduced, and an unreproducible receipt cannot be verified by anyone who did not generate it.

What a claim means, and what it does not

A conformance claim states exactly one thing:

This contract, at this identity on this network, behaved as this profile version required for this vector corpus, as evaluated by this runner version, at this time.

It does not state that the contract is correct in any other respect, that it is free of vulnerabilities, that its economics are sound, or that it will continue to behave this way. Conformance is a statement about defined requirements, and it is bounded by the corpus that was run.

This is made explicit rather than left to inference because the failure mode — a conformance certificate read as an audit — is the one most likely to harm users. See security.md.

Provenance

A profile has an author. A vector corpus has a revision. A report has a runner. All three are recorded, because a claim is only as trustworthy as the requirements it was measured against, and requirements authored by an interested party deserve exactly the scrutiny that fact invites. The provenance block in a profile records whether its requirements were derived from an upstream specification, from an upstream implementation, from ecosystem convention, or from a composite — and requires the interpretation notes wherever the upstream text was ambiguous and a reading had to be chosen.