Rulebook

ADCR, the open Rulebook for AI decision records

ADCR, the AI Decision Check Record, says what the record of an AI decision must contain and prove under EU law, and how a third party checks that record without seeing the content that was decided on or the people involved.

Version 0.1.0, in development: any rule may still change at a minor version. ComplyEdge edits it and is its first implementation.

1. Who it is written for

2. Seven conformance classes

A producer, an export or a verifier claims one or more classes. Each class is a named set of rules.

Class What it proves
RecordEvery required field is there, and no content is
LawEach decision is bound to a checked legal provision: its ELI address, the digest of the rule set, the rule's approval
ChainRecords are numbered and linked as they are written
AnchorThe chain head is dated by an eIDAS-qualified timestamp
OversightWhat a person did with the system's proposal, linked to it
RightsDecision mode, legal basis, notice, contest and the inputs an explanation needs
ExportThe export verifies offline and names its own gaps

3. How to cite it

4. Check an export yourself

The reference verifier needs Python 3 and OpenSSL 1.1 or later, and nothing else: no account, no key, no network. From the unzipped download, with the timestamp trust anchors you trust and the producer's profile:

python3 -I conformance/adcr_verify.py export.json --trust-anchors anchors.pem --profile profile.json

python3 -I conformance/run_vectors.py

It checks every class. For class Anchor it parses each RFC 3161 token and checks its signature with OpenSSL against the trust anchors you pin; an export that carries tokens is refused without them. Given the profile, it also checks the export against it. It passes all 117 published test vectors in 9 suites, and their tokens are real ones from a test timestamp authority.

The text is licensed under the Community Specification License 1.0; the schemas, the vectors and the verifier under Apache-2.0.

5. Status and how it changes

A version is marked stable only when an implementation written by people other than the editor has passed the vectors for classes Record, Law and Chain. Until then it stays in development.

A change names the rule it changes, the clause of law or the audit criterion it rests on, and the vector it adds. Once a second implementation exists, the editor has no veto beyond any other contributor's. The working group, the decision process and the route towards a formal standard are in the governance document.

6. ComplyEdge, the first implementation

ComplyEdge writes its audit records in the ADCR form, and Annex C of the Rulebook maps each of its fields and reports what the reference verifier found on exports from its real write path. It meets Record, Law, Chain and Export only when the caller sends the decision context, Oversight for reviews made in its dashboard under the same conditions, Anchor only with the test timestamp authority, and Rights (including contest, notice, incident and opt-out) when those events are written through the audit API. Classification and standalone fallback events are written on Enterprise. Legal holds are written on Enterprise and listed in the producer profile. Its profile claims no class.

The rule set it runs

ADCR does not say which rules to apply; a record names the rule set that decided by its content digest. The rule set ComplyEdge runs is separate and open: one Rego rule per legal provision, with an ID that usually names the provision (rego-art5-1c-001 applies Regulation (EU) 2024/1689, Article 5(1)(c)); each rule's citation is the authority, because two IDs are kept from earlier versions. Each record carries bundle_id and bundle_digest, the version and digest of the rules that decided.

The rule set it runs today has 136 rules, 136 of them approved by a named reviewer, most through agent-delegated review, which each rule's approval line states. A rule that is not approved still decides, so its provision should not be read as checked. Every rule and its approval is published under the rule set's digest.

7. What it is not

Read it and run the vectors

A version becomes stable when someone other than us implements it. Download the pack, run the suite, file an issue on the public repo if a vector fails.