Provenance

Guide: two-sided verification (agreements)

Most authorization is one-sided: one human authorizes one action. Agreements, escrow handoffs, and consents need both parties bound to one artifact — "party A and party B each verifiably consented to exactly this content, at these moments," with the guarantee that neither side's copy differs by a byte.

Scope. Provenance produces cryptographic execution proof: evidence of intent and attribution that complements your agreement workflow. Your e-signature or contract tool handles document storage, rendering and envelope routing, and your counsel decides how the evidence is used.

How it works

  1. Create an agreement over the content hash (the content itself never leaves you):

    const { agreementId, signingLinks } = await prov.agreements.create({
      contentHash,                 // sha-256 of your canonicalized document
      contentDescription: "Services agreement",
      parties: [{ label: "Provider", email }, { label: "Client", email }],
      mode: "parallel",            // or "sequential" — B activates after A signs
    });
    
  2. Each party opens their signing link (a scoped bearer for that party only). The page shows the description and the content hash, with a "verify your copy" widget — the signer hashes their copy locally and confirms it matches.

  3. Sign = a WebAuthn biometric assertion over (agreement_id ‖ content_hash ‖ party_id), server-verified against the signer's device. Because the signature binds all three, a swapped party or a byte-different copy can never complete the original agreement. Both signed → completed; either declines → declined; expiry → expired.

Proof

On completion, a completion receipt (an ES256 JWS over the agreement record and each party's signing evidence, with per-signer hardware tier) verifies offline against the JWKS, including on the public verify page. The content is referenced by hash only, never included.

const { token, verifyUrl } = await prov.agreements.receipt(agreementId);

Notes