Crinkl turns verified commerce evidence into portable, privately usable proof through four concepts.
- Spend Attestation — an issuer's signed statement that spend was verified under a named policy.
- Spend Attestation Token — its identity-minimized portable representation.
- Verification Policy — the content-addressed rules defining what "verified" means.
- Spend Predicate — a reusable rule that evaluates one or more Spend Attestations without changing them.
A Campaign binds an exact rule in a signed Campaign Epoch. A successful private evaluation produces a purpose-scoped Proof of Match; Campaign Outcomes may then create a Reward Obligation under the Epoch's committed economic and admission policy.
See the full object inventory for every artifact.
From a clean checkout, use the repository-shipped verifier and vector:
node scripts/verify_conformance.mjs \
--require-kind token.spendAttestation.portableV1.fromSpendStreamThis proves consistency among the repository fixture's native V1 canonical bytes, token hash, Ed25519 signature, and declared public key without private infrastructure or network access. It does not prove issuer authorization, currentness, purchase acceptance, or release-tag authenticity, and it does not verify or activate a W3C credential profile.
Crinkl proves that commerce evidence advanced through a defined proof lifecycle:
- Evidence is submitted.
- Evidence is normalized into a Spend Event.
- The Spend Event receives a verification state.
- A hard-verified Spend Event may produce a Spend Attestation.
- The Spend Attestation may be packaged as a Spend Attestation Token.
- Selected proof validators may admit attestations to the shared record by finalizing statements over committed attestation sets.
- External systems may verify the attestation.
- A signed CampaignEpoch may commit audience, conversion, assignment, economic-admission, reward, timing, reuse, and dispute policy references.
- A purpose-scoped ProofOfMatch may prove that one or more Spend Tokens satisfy the Epoch's audience or conversion rule.
- A Campaign runtime composes accepted proofs with optional assignment, exposure, and economic admission into a CampaignOutcome.
- An eligible admitted Outcome may deterministically create a RewardObligation, later resolved by a SettlementRecord.
Crinkl Core does not define checkout, payment authorization, card processing, merchant order management, ad delivery, identity graph construction, behavioral targeting, loyalty program ownership, brand campaign strategy, or agent purchasing.
Crinkl may support those systems downstream by providing verified spend proof.
The spec follows this dependency order:
Evidence before claims.
Claims before attestations.
Attestations before predicates and Campaign proofs.
Campaign rules before Campaign proofs.
Accepted proofs before Campaign outcomes.
Eligible admitted outcomes before reward obligations.
Reward obligations before settlement records.
Protocol facts before agents, reports, and markets.
Core protocol validity does not depend on campaigns, rewards, Solana, ZK, MCP, REST, agents, ads, brand budgets, or promotion logic.
The target inventory contains fifteen protocol-level artifact families across
Core, Portability, and Applications. Campaign vNext entries are adopted
engineering objects mirrored here as additive SPECIFIED_NOT_IMPLEMENTED
public candidates outside every released manifest. Their adopted source is
crinkl-protocol@bdac6d3f9f32a312544b3adadbb379f98607198f.
The exact
PROOF_OF_MATCH_VERIFICATION procedure profile
is selected by its version and content reference, not by the procedure-family
name alone.
Anything not listed is prose, a role, state, deterministic procedure, or
off-protocol function unless an optional profile gives it a separate schema.
VerificationPolicy, IssuerRegistrySnapshot, AttestationStatus, and
SpendPredicate remain untagged candidate schemas (object-model board steps
OM4/OM4r). None of this adds fields to SpendAttestation,
SpendAttestationToken, or SpendAttestationCredential.
| Object | Layer | Purpose |
|---|---|---|
SpendStreamEvent |
Record | The serialized append-only atom. |
SpendAttestation |
Record | Issuer's signed statement about the stream head, under a named policy. |
VerificationPolicy |
Trust | Content-addressed rules defining what "verified" means. (untagged candidate, OM4r) |
IssuerRegistrySnapshot |
Trust | Immutable authority set at a point in time, including retired keys and validity windows. (untagged candidate, OM4r) |
AttestationStatus |
Trust | Revocation and supersession. (untagged candidate, OM4r) |
SpendAttestationToken |
Portability | Native identity-minimized form. |
SpendAttestationCredential |
Portability | W3C VC 2.0 serialization. |
SpendPredicate |
Rule | Reusable rule over one or more Spend Attestations. (untagged candidate, OM4r) |
CampaignEpoch |
Campaign | Immutable signed Campaign rules and economic terms; reduced-spine V2 candidate. |
ProofOfMatch |
Proof | Purpose-scoped ZK statement over authenticated commerce facts; target V1 candidate. |
SolanaProofEvidence |
Proof acceptance | Finalized Solana ACCEPT of one exact proof subject under Procedure Profile V3; unreleased engineering candidate. ValidatorCertificate is the historical acceptance candidate. |
AssignmentRecord |
Experiment | Optional portable deterministic arm assignment when an independent consumer/dispute boundary requires it; target V1 candidate. |
CampaignOutcome |
Campaign | Narrow composition of accepted matches, optional assignment/exposure/admission, and deterministic reward decision; V2 candidate binding Solana evidence. |
RewardObligation |
Economics | Recipient-scoped liability created by an eligible admitted Outcome; target V1 candidate. |
SettlementRecord |
Economics | Evidence that an Obligation was paid, reversed, expired, disputed, cancelled, or otherwise resolved; target V1 candidate. |
These fifteen are the target protocol-level families. Exposure and economic
admission remain application/ledger state unless a named cross-system profile
proves a need for a portable artifact; CampaignReport is derived output.
Discarded Campaign drafts have no aliases or adapters in the living
specification. Exact source and implementation evidence is recorded in the
Campaign evidence inventory.
Internal Crinkl processing may use wallet-scoped or session-scoped references for replay, routing, abuse controls, and reward handling.
Portable spend proofs must not require user identity, raw receipt access, private wallet lookup, app-user lookup, or cross-context behavioral profiles. The protocol is identity-minimized and identity-excluded from portable proofs by default; it does not claim full anonymity.
Portable verification depends on canonical bytes, RFC 8785 serialization, SHA-256 hashes, Ed25519 signatures, issuer authority, supported versions, and included proof material.
A portable Spend Attestation Token must exclude raw receipt images and must not require user identity. Deep audit may use event fragments or audit bundles, but those are not required for baseline portable verification.
Downstream layers consume spend proof; they do not define it.
| Layer | Documents |
|---|---|
| Campaign architecture and V1 schemas | protocol/applications/campaigns/ |
| Spend Predicate rules and ProofOfMatch | protocol/applications/conditions/ |
| Reward and settlement | protocol/applications/economics/; canonical Campaign liability and resolution are defined by the Campaign architecture |
| ZK, merchant authority, agent, REST/MCP, Solana, and offer delivery | protocol/extensions/ including merchant-authority.md and zk-external-verifier-integration-guide.md |
| Conformance | conformance/ |
| ZK beta release checklist | governance/zk-beta-release-checklist.md |
| ZK beta audit package | governance/zk-beta-audit-package.md |
| Governance | governance/, including the required protocol/business/onchain boundary for spec and requirements changes |
| Directory | Role |
|---|---|
protocol/purpose/ |
Purpose, non-goals, and threat model. |
protocol/core/ |
Evidence, Spend Events, verification states, canonicalization, signatures, privacy boundaries. |
protocol/core/ |
Ingestion, normalization, soft/hard verification, correction, attestation issuance. |
protocol/portability/ |
Spend Attestation Tokens, verifier requirements, identity exclusion, replay/auditability. |
protocol/applications/campaigns/ |
Canonical Campaign architecture, authority boundaries, lifecycle, and first V1 schemas. |
protocol/applications/conditions/ |
Spend Predicates, evaluation, and ProofOfMatch. |
protocol/applications/economics/ |
GMV, distribution, and general settlement-binding profiles; Campaign liability and resolution live under the Campaign architecture. |
protocol/extensions/ |
Optional ZK, merchant authority, agent query, transport, Solana, offer-delivery, and registry profiles. |
conformance/ |
Vectors, verifier test suite, compatibility notes. |
governance/ |
Versioning, change process, authority hierarchy, and shared glossary. |
schemas/experimental/ |
Candidate non-core extension schemas; not required for Core Spend Attestation validity. |
v1.0.0-rc.7 is the latest released public package. Current public repository
source candidate: v1.0.0-rc.8 (RELEASE_CANDIDATE_NOT_PUBLISHED),
conformance suite 5; it is unreviewed, unpublished, not publishable, and does
not inherit rc.5 review. The candidate corrects
the rc.7 reward-linkage and Spend-supersession publication defect without
changing the rc.1/rc.2 wire support set, any Spend Token schema, or runtime,
validator, authority, and production state. Its machine-readable candidate
manifest is versions/release.json, and its source
controls are in
versions/v1.0.0-rc.8/finalization.json.
The immutable rc.7 release remains available at tag v1.0.0-rc.7 with its
historical controls in
versions/v1.0.0-rc.7/finalization.json.
The following preserved
rc.5 transition text applies only to public-spec commit
81237937833ab32e5ce92d3b5ceed72854baecef / tree
9121bdfbfc428f73557e993f1bd6e295ba733a12:
v1.0.0-rc.5 historical exact reviewed source candidate — not published.
Its historical transition controls are in
versions/v1.0.0-rc.5/finalization.json
and versions/v1.0.0-rc.5/snapshot.md.
This is an unpublished SemVer prerelease candidate, not a stable v1.0.0
release. The immutable released v1.0.0-rc.4 tag remains available for
historical verification.
P4.4 and P9 remain blockers. This is rc.5 plan text for that exact reviewed
candidate.
It does not classify any later tree; any later tree remains unassigned unless a
new exact candidate identity and independent review record it.
Each document's frontmatter status states that document's maturity separately
and does not change the repository release status. A successor release identity
is selected only by a separately reviewed candidate identity.
python3 scripts/check_drift.py
node scripts/verify_conformance.mjs
python3 conformance/profiles/campaign-direct-buyer-reward-v1/scripts/check_campaign_direct_reward_profile_vectors.py
node conformance/profiles/spend-token-v2-holder-binding/scripts/check_holder_binding_vectors.mjsVerify the rc.7 candidate transition locally:
python3 scripts/check_successor_release_finalization.py --mode candidatePDF export:
./scripts/export_protocol_pdf.shThe governed record for this lifecycle refactor is in
governance/refactor-record.md.