qodiqa

Consent is checked before AI runs. A signed receipt that anyone can verify.

Verify, enforce, execute, record, prove.
What is qodiqa — one page (PDF)

What it does

Every request is checked before it runs.

A request carries a signed permission. The gateway checks it, records the decision, and returns a receipt.

  1. PermissionVerifyA signed, short-lived permission

    A signed permission

    The caller presents a consent artifact signed with Ed25519. The gateway checks the signature, the time window and the key.

    Why it mattersNobody can claim consent that was never signed.
    Signed artifactQODIQA::ARTIFACT::V1
    keyId
    w12-vectors:key_v1
    requestId
    6f1b2c3d…3c4d
    requestHash
    aaaaaaaaaa…aaaa
    lifetime
    60 s at most, used once
    signature
    T385NcLFNrvU…Aw==
    Ed25519 signature60 s

    Values come from the public test vectors.

  2. BindingVerifyTied to this exact request

    Tied to this exact request

    The artifact carries a SHA-256 fingerprint of the request. The gateway recomputes it, and refuses any change.

    Why it mattersA permission cannot be reused for a different request.
    Request fingerprintSHA-256
    request
    POST /ai/chat
    prompt
    Summarize this customer's order history for the support agent.
    recomputed54fc9fa62307fa0ca2f1e9572c169bd5b640ec295a86f52838db827a8a8b76cf
    MATCH
    in the artifact54fc9fa62307fa0ca2f1e9572c169bd5b640ec295a86f52838db827a8a8b76cf

    Computed from the prompt shown, with the same code the browser runs.

  3. DecisionEnforce · ExecutePolicy decides before any provider call

    EXECUTE or BLOCK

    Policy turns the checks into one outcome. Only on EXECUTE is the provider called. A BLOCK stops before it.

    Why it mattersA refused request costs nothing and reaches no model.
    Everything passes
    • Consent covers this callerREQUIRE_CONSENT
    • Address is allowedBLOCK_IP
    • Rate limit not exceededRATE_LIMIT
    • Inside the time windowTIME_WINDOW
    EXECUTEThe provider is called.
    Consent was revoked
    • Consent covers this callerREQUIRE_CONSENT
    • Address is allowedBLOCK_IP
    • Rate limit not exceededRATE_LIMIT
    • Inside the time windowTIME_WINDOW
    BLOCKThe provider is never called.

    Values come from the public test vectors.

  4. RecordRecordWritten first, linked, tamper-evident

    Written down, and linked

    An INTENT entry is written before the provider call. Every entry hashes the one before it and joins a Merkle log.

    Why it mattersChanging history breaks every link after it.
    Hash-chained entriesQODIQA::AUDIT::V1
    INTENT51d0797023…188eprev GENESIS
    DECISIONa2fca3abb8…8766prev 51d07…188e
    Merkle leafa2fca3abb8…8766RFC 6962
    Signed root…2 leaves

    From the public test vectors.

  5. ReceiptProveA signed receipt anyone can verify

    A receipt anyone can check

    The decision comes back with a signed receipt. A verifier checks it offline, with a key you trust.

    Why it mattersYou do not have to trust us, only the math.
    Signed receiptV2-RECEIPT-001
    decision
    ALLOW
    requestId
    6f1c0a52…5a6b
    entryHash
    aaaaaaaaaa…aaaa
    keyId
    tr-test:key_v1
    signature
    xFZIz2IR85o8…CQ==
    Independent verifier
    • Canonical form
    • SHA-256 digest
    • Ed25519 signature
    VALID

    From the public test vectors.

Works with the infrastructure you already run