EU AI ACT · ARTICLE 12 EVIDENCE PACK · WORKED EXAMPLE · v2 · 2026-08-25

Article 12 Evidence Pack (worked example)

A tamper-evident, cryptographically self-verifying technical artifact for EU AI Act Article 12 record-keeping and Annex IV section 2(d) documentation. This is a sample of the deliverable a Sprint Audit Review produces. It is suitable for forwarding to internal compliance leads, notified-body assessors, and accredited audit firms.

Commission a real Sprint Pricing
WORKED EXAMPLE · OUR OWN EVALUATION, NOT A CLIENT ENGAGEMENT · EVERY HASH BELOW IS REAL AND CHECKABLE
Producer
Falsify OÜ (worked example)
System under test
Credit-scoring classifier: scikit-learn logistic regression, L2 penalty, C=1.0, trained on the UCI Statlog (German Credit) data
Annex III category
Point 5(b), creditworthiness assessment of natural persons
Evaluation claim
Impact ratio for sex (female selection rate ÷ male selection rate) on a stratified 30% held-out split, seed 42, ≥ 0.80
PRML version
v0.1 (working draft, public review)
Commit date (pre-run)
2026-08-25 08:22:37 UTC
Manifest SHA-256
132437f156e81d7c16822847a3c101b146b2a846828f0ddeb933efcf464667f5
Result
Observed 0.8579 — PASS against the committed 0.80
Authored by
Cüneyt Öztürk, founder of Falsify OÜ and editor of PRML
Issued through
Falsify OÜ — reg. 17574308, Tallinn, Estonia
What this document is, and is not. This is a technical evidence artifact. It is not a legal opinion, not a notified-body certification, and not an accredited audit report. Auditors, notified bodies, and compliance teams may use it as input to their own assessment. The cryptographic manifest hash in section 2 is self-verifying: any party may re-hash the manifest and check it against the published commit, using one of the four byte-equivalent reference implementations. Spec section 8.1 enumerates what PRML does not cover.

1. What this document is

This is a complete Article 12 record for one evaluation claim. It contains the four things such a record needs: a pre-registered manifest that fixes the claim, a cryptographic commit of that manifest made before the run, the result of the run, and a procedure any third party can follow to check that the manifest and the commit match. The delivered pack is a self-contained PDF; this page is that pack rendered for reading. Either way the assessor does not need to take our word for anything in section 3.

This is our own worked example, not a client engagement. We have run it on public data so that every number below is reproducible by a reader who has never spoken to us. The claim under test is a fairness claim about a credit-scoring model, chosen because creditworthiness is an Annex III high-risk use and because the four-fifths benchmark is the threshold convention an assurance reader already recognises.

The claim: a logistic-regression credit model trained on the UCI Statlog (German Credit) data selects female applicants for the favourable outcome at a rate of at least 80 percent of the male rate, on a held-out test split.

The outcome was not known when the manifest was sealed. The manifest was committed to the public registry at 08:22:37Z on 25 August 2026; the evaluation was run afterwards. That ordering is the whole point of the artifact, and it is the part a reader can check independently rather than trust.

2. The pre-registered manifest and its commit

The manifest below is the document that was fixed before the evaluation ran, in PRML v0.1 schema. The SHA-256 is computed over its canonicalised bytes (see the specification for the canonical form rules). It is reproduced here in full so that section 3 can be carried out from this page alone.

version: prml/0.1
claim_id: 01997a2c-0000-7000-8000-000000000001
created_at: '2026-08-25T08:22:01Z'
metric: impact_ratio
metric_args:
  protected_attribute: sex
  protected_group: female
  reference_group: male
  group_definition: 'attribute 9 (personal status and sex): A92 is female; A91, A93, A94 are male'
  favourable_outcome: predicted class 1 (good credit)
  split: stratified 70/30 train/test at the manifest seed
  features: all 20 attributes; categorical one-hot encoded; numeric standardised
  model_config: scikit-learn LogisticRegression, L2 penalty, C=1.0, max_iter=2000
  definition: female selection rate divided by male selection rate on the held-out test split
comparator: '>='
threshold: 0.8
dataset:
  id: uci-statlog-german-credit
  hash: b21f3d81db8071257d5ff1deaeba1fd4303b62712e6fcc9715c7a86202cb5871
  uri: https://archive.ics.uci.edu/dataset/144/statlog+german+credit+data
seed: 42
producer:
  id: worked-example.falsify
model:
  id: sklearn-logistic-regression-l2-C1.0
notes: Worked example produced by Falsify OU; not a client engagement. 0.80 is the EEOC four-fifths benchmark, a rule of thumb applied by bias-audit practice and not a legal standard; no statute fixes it. It is used because it is the convention an assurance reader recognises. The outcome was not known to the author when this manifest was sealed.
Canonical bytes1344
Manifest SHA-256132437f156e81d7c16822847a3c101b146b2a846828f0ddeb933efcf464667f5
Registry recordregistry.falsify.dev/132437f156e81d7c…
Committed at2026-08-25T08:22:37.275Z
Independent timestampRFC 3161, timestamp.sigstore.dev, 2026-08-25T08:22:37Z
Transparency logRekor v2, log2025-1.rekor.sigstore.dev, index 80289086
Dataset SHA-256b21f3d81db8071257d5ff1deaeba1fd4303b62712e6fcc9715c7a86202cb5871

The timestamp matters more than the signature. Our signature says only that we saw the hash; the RFC 3161 token is issued by a third party whose clock we do not control, and the Rekor entry is append-only and mirrored, so its later absence would itself be evidence.

The result

Test split300 applicants (96 female, 204 male)
Selection rate, female0.6771
Selection rate, male0.7892
Impact ratio observed0.8579
Threshold committed>= 0.80
VerdictPASS

A reader should note what this verdict does and does not carry. It says the model met a bar that was fixed before the test. It does not say 0.80 was the right bar: the four-fifths rule is an EEOC rule of thumb applied by bias-audit practice, it is not a legal standard, and no statute fixes it. Choosing the bar remains a judgement, and this artifact only makes that judgement visible and dated.

3. Verification: how an auditor re-derives the hash

The verification is mechanical and takes about a minute. It needs the manifest text (section 2), one of the four byte-equivalent reference implementations, and openssl. It does not need us.

=== VERIFICATION TRANSCRIPT — 2026-08-25T08:25:58Z ===

$ python3 falsify_prml.py verify manifest.yaml
OK  hash verified  sha256:132437f156e81d7c16822847a3c101b146b2a846828f0ddeb933efcf464667f5
(no --observed value given; predicate not evaluated)

$ shasum -a 256 german.data
b21f3d81db8071257d5ff1deaeba1fd4303b62712e6fcc9715c7a86202cb5871  german.data

$ curl -s https://registry.falsify.dev/132437f156e81d7c16822847a3c101b146b2a846828f0ddeb933efcf464667f5.yaml | shasum -a 256
afaceab9e03038c5213dfcc76751004d7806a242101f62612c96883e6c46a3fe  -
  (local manifest.yaml: afaceab9e03038c5213dfcc76751004d7806a242101f62612c96883e6c46a3fe)

$ openssl ts -verify -digest 132437f156e81d7c16822847a3c101b146b2a846828f0ddeb933efcf464667f5 -in receipt.tsr -CAfile chain.pem
Verification: OK

$ openssl ts -verify -digest <one character changed> -in receipt.tsr -CAfile chain.pem
Verification: FAILED
  (negative control: the check discriminates)

$ python3 run_eval.py
  impact_ratio=0.857919
  selection_female=0.677083
  selection_male=0.789216
  n_test=300
  n_female=96
  n_male=204
  verdict=PASS

The negative control is part of the procedure. Changing one character of the digest makes the timestamp check fail. Without that line the passing check proves nothing, because a check that cannot fail is not a check.

One practical trap. macOS ships LibreSSL, not OpenSSL, and LibreSSL cannot validate the ESS signing-certificate attribute that the Sigstore TSA uses. It reports Verification: FAILED on a token that is perfectly valid. Use a real OpenSSL build (brew install openssl, then the binary under /opt/homebrew/opt/openssl/bin). We record this because we hit it ourselves while producing this pack.

Files

4. Mapping to EU AI Act Article 12 and Annex IV section 2

The table below states what this evidence pack covers and what it does not, against the operative text of Article 12 of Regulation (EU) 2024/1689 and Annex IV section 2.

ReferenceRequirement (summary)CoverageNotes
Article 12(1)Automatic recording of events over system lifetimePARTIALPRML records each evaluation event as an immutable commit. It does not record runtime inference events; those need a separate Article 12(1) log pipeline.
Article 12(2)(a)Identification of situations causing riskNONEOut of PRML scope. Covered by the provider's risk management system under Article 9.
Article 12(2)(b)Facilitation of post-market monitoring (Article 72)PARTIALPRML manifests are queryable by claim_id and producer.id, supporting longitudinal performance monitoring.
Article 12(2)(c)Monitoring of operation, especially Article 26(5)PARTIALEvaluation-time monitoring. Runtime monitoring is out of scope.
Annex IV §2(d)Evaluation methods, performance metrics, validation procedures, accuracy/robustness metrics with statistical significanceFULLDirect fit. The manifest names the metric, comparator, threshold, dataset, seed, and model identifier; the commit makes retroactive modification mechanically detectable.
Annex IV §2(b)Design specifications, key design choices, methodologiesPARTIALNotes field captures the eval methodology declaration. Full design rationale belongs elsewhere in the technical documentation file.
Annex IV §2(h)Cybersecurity measuresNONEComposes with Sigstore / in-toto / SLSA for code-supply-chain integrity. Out of PRML scope.
Article 15(1)Accuracy, robustness, cybersecurity throughout lifecyclePARTIALPRML provides the accuracy-claim attestation layer. Robustness testing and cybersecurity belong to other primitives.
Article 15(3)Levels of accuracy declared in instructions for usePARTIALDeclared accuracy is mechanically traceable to a hashed manifest, so the declaration can be checked against the eval that produced it.
Article 18(1)Retention of automatically generated logs (10 years)PARTIALPro and Enterprise registry tiers are designed for ten-year retention (content-addressed, fully exportable). Retention ultimately requires stored bytes: export and archive the pack. Developer-tier manifests rely on the producer’s own durable storage.

The "FULL / PARTIAL / NONE" column is deliberately strict: it reports what the evidence pack mechanically provides, not what the provider's broader compliance program covers. Most rows that read PARTIAL or NONE here will read FULL elsewhere in the provider's technical documentation file under Annex IV.

5. Mapping to ISO/IEC 42001 controls

For providers under, or pursuing, an ISO/IEC 42001:2023 (AI Management System) management system, the mapping below shows where this evidence pack contributes. References are to the published 42001 control text.

ControlTitleCoverageNotes
A.6.2.4Documented information for AI systemPARTIALManifest is one piece of documented information per evaluation claim.
A.6.2.6System impact assessmentNONEOut of scope.
A.7.4Data quality for AI systemsPARTIALDataset hash and URI in manifest support dataset-identity attestation.
A.8Information for interested parties (record-keeping family)PARTIAL / FULL on eval recordsThe cryptographic-commit pattern is a strong fit for record-keeping that must survive disputes about retroactive edit.
A.8.2System log informationPARTIALEval logs covered; runtime inference logs out of scope.
A.9.3Performance evaluation of AI systemFULL on the bound claimDirect fit. The manifest pre-registers the performance evaluation; the result is bound to the hash before the run.

This mapping uses control numbering from the 42001:2023 published text. For a provider running parallel certifications under 42001 and the AI Act, the column "Annex IV §2(d) coverage" in section 4 above and the column "A.9.3 coverage" here will overlap heavily; both describe the same evaluation event from different normative perspectives.

6. Limitations and out-of-scope items

This section is taken from spec section 8.1, restated here for the assessor's convenience. The spec is the controlling document.

7. For auditors and notified-body assessors

Suggested workflow for an assessor receiving this document as part of an Annex IV technical documentation file:

  1. Extract the manifest from section 2 and save it to a local file.
  2. Install any one of the four reference implementations (one-line install). Validate the manifest against the PRML JSON Schema (canonical schema is in SchemaStore, indexed since 2026-05-11).
  3. Re-canonicalise and re-hash. Compare against the SHA-256 string in section 2 and against the registry record.
  4. If you have independent access to the dataset and model artefacts, hash them and compare against the dataset.hash and model.hash fields. This catches identity-substitution attacks but not within-run tampering.
  5. Cross-check the registry timestamp against the provider's claim of "pre-registered before the run." Any future-dated commits relative to result reporting are an audit red flag.
  6. For high-risk systems, request a second independent reviewer to re-execute the eval against the provider's dataset and model copies. The manifest gives that reviewer everything they need to reproduce the run byte-for-byte modulo hardware non-determinism (which the seed and notes fields partly mitigate).

An assessor who completes steps 1-3 has a tamper-evident attestation of the claim that does not depend on trusting the provider. Steps 4-6 raise the assurance level further.

8. About this artifact

Authored by Cüneyt Öztürk, founder of Falsify OÜ and editor of the PRML specification. The reference implementations, conformance vectors, and JSON Schema are jointly maintained by the same author at github.com/studio-11-co/falsify under the Community Specification License 1.0 (spec) and MIT (code).

Issued through Falsify OÜ (reg. 17574308, Tallinn, Estonia), the entity that produces Sprint engagements. Contact: [email protected]. Invoicing is in EUR by bank transfer (SEPA or SWIFT), structured by engagement tier.

Disclaimer. This document is a technical evidence artifact. It is not a legal opinion, not a notified-body certification, and not an accredited audit report. The author is not a notified body and has no accreditation under Regulation (EU) 2024/1689 to issue conformity assessments. Auditors, notified bodies, and compliance teams may use this document as input to their own assessment, and are encouraged to verify all cryptographic claims independently using the open reference implementations.

Disclosure in this pack. The provider name, system description, Annex III category, dataset hash, model hash, and manifest SHA-256 in this document are placeholders chosen to illustrate the format. They do not correspond to any real evaluation claim. A real Evidence Pack delivered as part of a Sprint Audit Review (/sprint/) substitutes the provider's actual values and publishes the manifest to the public registry under the provider's producer.id.

This worked example was published 2026-08-25 at falsify.dev/evidence-pack-sample/. CC BY 4.0.