Reading order

Four steps to read before the first line of code.

Seven canonical objects carry the protocol: the receipt that records what was checked under which policy, the entry that commits to it, the trust registry of keys allowed to sign, and four summaries. The evidence bundle the issuer keeps is specified apart from them. Every object is closed: a field its schema does not define is rejected, so there is nothing to implement beyond what the specification names.

In order

Scope comes first, verification levels last.

  1. 01

    Scope and its limits

    Loquitur records how a figure's evidence was checked, not whether the figure is right. What else falls outside its scope is on the disclosure and review page.

  2. 02

    Objects and what stays private

    Of the 7 canonical objects, only the registry entry leaves the issuer. The bundle, defined in the specification, stays behind. The protocol overview shows what an entry may carry.

  3. 03

    Current state of each component

    Each component carries one release label (candidate, private preview or future) and a stated condition for changing it. The implementation status page lists both.

  4. 04

    Verification levels

    The protocol defines what each level proves. L0 to L3 need no network; L4 and L5 cannot be checked offline, because each asks about something that happened elsewhere.

The receipt

What a verification receipt must carry.

The receipt is the record of one check: the policy applied and its version, the outcome, the coded reasons behind it, and the digest of the file manifest the check ran over. Required means required. An object missing any of these is rejected, and a verifier that accepted it would be checking something the protocol does not define.

Identity

  • object_type
  • schema_version
  • bundle_id

what this object is, and which version of its schema it was written against

Subject

  • asset_type

the kind of asset the checked figure belongs to

The check

  • verification_mode
  • verified_at

how far the verification went, and when it ran

Policy

  • policy_id
  • policy_version

which rules were applied, at which version — so the same check can be run again

Outcome

  • status
  • reason_codes
  • reason_code_vocabulary_version

the result, the coded reasons behind it, and the version of the code catalog they belong to

Commitment

  • manifest_sha256

the digest of the manifest listing every file the check ran over

12 of verification_receipt’s 20 fields are required. The schema is closed: any field it does not define is rejected.

The public entry

What crosses into the registry entry.

The entry is the only object that leaves the issuer. Read it for what is absent: no document, no figure, no evidence of any kind. What crosses: identifiers, three hashes, the policy and its version, the verdict with its reasons, and the key that signed. A reviewer holding the bundle can put the two side by side. Anyone holding only the entry learns that a check happened, under which policy and with what outcome. They learn nothing about what was checked, nor which of two entries for one subject replaced the other.

Identity

  • object_type
  • schema_version
  • registry_entry_id
  • receipt_id

what this object is, and the receipt it was written for

Signer

  • issuer_id
  • issuer_key_id

who signed, and with which of their keys — the pair an authorization check is made against

Subject

  • asset_type
  • workflow
  • subject_ref_hash

the asset type and workflow this entry is for, and a reference to the subject that does not name it

Commitments

  • manifest_hash
  • receipt_hash

two digests, not the manifest or the receipt behind them: all the entry says about the evidence

Policy

  • policy_id
  • policy_version
  • reason_code_catalog_version

the rules applied and the catalog its reason codes are drawn from, both versioned

Outcome

  • verdict
  • reason_codes

the verdict and the coded reasons for it, so a dispute can attack one reason rather than the result

Disclosure

  • issued_at
  • privacy_classification
  • disclosure_profile

when it was issued, and how much of the evidence its holder may pass on

19 of registry_entry’s 23 fields are required. The schema is closed: any field it does not define is rejected.

Closed lists

Where a value has to come from.

Some fields take no free text: they draw from a list the schema fixes, and a value outside it fails validation. Two of those lists set the protocol's scope: it covers the asset types and workflows below and no others. Adding to either means a new version of the protocol, not just a longer list.

The closed value lists the schemas define, the object each belongs to, and every value each one accepts.
FieldOnAccepts
asset_typeregistry_entry
  • property
  • fund_nav
workflowregistry_entry
  • property_pre_listing
  • property_review
  • fund_nav_initial
  • fund_nav_update
statusverification_receipt
  • pass
  • warning
  • review
  • fail
verdictregistry_entry
  • PASS
  • WARN
  • REVIEW
  • FAIL
disclosure_profileregistry_entry
  • minimal_public
  • issuer_controlled_bundle
  • partner_authorized_bundle
privacy_classificationregistry_entry
  • public_commitment

Key scope

What one issuer key is allowed to sign.

A key in the trust registry is not authorized for everything an issuer does. The registry names the asset types and workflows each key may sign for, and L3 checks against them. A property entry signed with a key authorized for fund NAVs can come with an intact bundle, matching hashes and a genuine signature, and still fail: on authority, not integrity. That is why L3 is a level of its own. A reviewer would respond to a missing authority differently than to a hash that does not match.

Implementing

The names are here; the field-level contracts are not.

The names give an implementer the shape: which objects exist, what each must carry, which values a field accepts. Types, descriptions and worked examples are in the schemas and the specification, and neither is published yet. Tell us which object you would implement first, and what you would need from it.