Consent is checked before AI runs. A signed receipt that anyone can verify.
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.
- 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.- keyId
- w12-vectors:key_v1
- requestId
- 6f1b2c3d…3c4d
- requestHash
- aaaaaaaaaa…aaaa
- lifetime
- 60 s at most, used once
- signature
- T385NcLFNrvU…Aw==
Ed25519 signature60 sValues come from the public test vectors.
- 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
- POST /ai/chat
- prompt
- Summarize this customer's order history for the support agent.
recomputed54fc9fa62307fa0ca2f1e9572c169bd5b640ec295a86f52838db827a8a8b76cfMATCHin the artifact54fc9fa62307fa0ca2f1e9572c169bd5b640ec295a86f52838db827a8a8b76cfComputed from the prompt shown, with the same code the browser runs.
- 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 caller
REQUIRE_CONSENT - Address is allowed
BLOCK_IP - Rate limit not exceeded
RATE_LIMIT - Inside the time window
TIME_WINDOW
EXECUTEThe provider is called.Consent was revoked- Consent covers this caller
REQUIRE_CONSENT - Address is allowed
BLOCK_IP - Rate limit not exceeded
RATE_LIMIT - Inside the time window
TIME_WINDOW
BLOCKThe provider is never called.Values come from the public test vectors.
- Consent covers this caller
- 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.INTENT51d0797023…188eprev GENESISDECISIONa2fca3abb8…8766prev 51d07…188eMerkle leafa2fca3abb8…8766RFC 6962Signed root…2 leavesFrom the public test vectors.
- 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.- decision
- ALLOW
- requestId
- 6f1c0a52…5a6b
- entryHash
- aaaaaaaaaa…aaaa
- keyId
- tr-test:key_v1
- signature
- xFZIz2IR85o8…CQ==
- Canonical form
- SHA-256 digest
- Ed25519 signature
From the public test vectors.
Open source and specification
Public, so you can check it yourself.
The standard, the gateway and the verifier are open. You can verify evidence without our code.
qodiqa-gatewayThe self-hosted enforcement gateway.
View on GitHubqodiqa-verifyOffline verifier and protocol, with test vectors.
View on GitHubqodiqa-anchorsWitnesses and anchors for audit checkpoints.
View on GitHubqodiqaThe specification, in 32 documents.
View on GitHubWho it is for
Start where you are.
Developers
Run the gateway sandbox, send a signed request, read the decision.
- A local sandbox you start with Docker
- A documented HTTP API
- SDKs in four languages
Security and compliance teams
See what the evidence proves, and where its limits are.
- A threat model and stated limitations
- Receipts you can verify offline
- A tamper-evident audit chain
Researchers and standards bodies
Read the standard and re-check the evidence yourself.
- 32 specification documents
- Test vectors for independent verifiers
- Guidance on how to cite
Partners and investors
Propose a pilot, or ask for materials.
- A public roadmap
- Open licences on code and specification
- A direct line to the team
Works with the infrastructure you already run
