EU AI ACT · ARTICLE 9(8) EVIDENCE PACK · WORKED EXAMPLE · v2 · 2026-08-25

Evaluation Evidence Pack (worked example)

A tamper-evident, independently verifiable record of one evaluation’s acceptance criteria, for the testing requirements of EU AI Act Article 9(8) and the testing documentation in Annex IV point 2(g). It is a worked example of the evidence an Acceptance Evidence Pack delivers. It is suitable for forwarding to internal compliance leads, notified-body assessors, and accredited audit firms.

A complete acceptance record, with the plan both sides approved, the signed acceptance report, the agreed change conditions and our verification statement, all sealed and verifiable offline, is on its own page: a completed acceptance record. This page shows the criteria part in depth. In an engagement, deliverables are signed with a qualified electronic signature and carry a qualified electronic time stamp (eIDAS Art. 25(2) and 41(2)); this worked example is not.

Request an Evidence Pack Pricing
WORKED EXAMPLE · OUR OWN EVALUATION, NOT A CLIENT ENGAGEMENT · EVERY HASH BELOW IS REAL AND CHECKABLE
Producer
Falsify OÜ (worked example)
Issued through
Falsify OÜ, reg. 17574308, Tallinn, Estonia
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
PRML version
v0.1 (working draft, public review)
Evaluation claim
Impact ratio for sex (female selection rate ÷ male selection rate) on a stratified 30% held-out split, seed 42, ≥ 0.80
Commit anchored
2026-08-25 08:22:37 UTC
Result
Observed 0.8579, PASS against the committed 0.80
Manifest SHA-256
132437f156e81d7c16822847a3c101b146b2a846828f0ddeb933efcf464667f5
Authored by
Cüneyt Öztürk, founder of Falsify OÜ and editor of PRML
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 evidence record for one evaluation claim. It contains the four things such a record needs: a manifest that fixes the acceptance criteria, a timestamped commitment showing the manifest existed no later than the anchored time, 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.

What a reader can check, and what they have to take from us. The manifest was committed to the public registry at 08:22:37Z on 25 August 2026. A reader can check independently that this manifest existed no later than that time and has not changed since. That we ran the evaluation afterwards is our statement as the producer; the record does not prove it. The transcript in section 3, dated 08:25:58Z, includes the evaluation run; that second date is ours, not independently anchored. The two dates together are what an assessor weighs.

2. The pre-registered manifest and its commit

The manifest below is the document committed at 08:22:37Z on 25 August 2026, 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 whose exact wording was committed and independently dated; the order relative to the test rests on that date together with the dated result, not on the verdict alone. 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

--- environment note ---
The openssl lines above were run with OpenSSL 3.x.

On macOS, /usr/bin/openssl is LibreSSL, not OpenSSL. It verifies this receipt
fine, but it cannot verify RFC 3161 tokens that use ESSCertIDv2 (SHA-256) in the
signing-certificate attribute — it reports "ess signing certificate
error" and prints Verification: FAILED. That is the tool refusing to read the
token, not a bad token. Qualified EU timestamp authorities emit exactly that
shape, so if you ever check a qualified token, use OpenSSL 3.x.

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.

If the criteria cannot be public. Since 3 September 2026 the registry also accepts sealed commits: the manifest is validated, hashed, signed and anchored, but its text is withheld. The receipt proves that bytes with this hash existed at the recorded time; a party shown the manifest privately verifies it against the hash exactly as in this pack. POST /<hash>/reveal publishes the text later and is accepted only if the bytes re-derive the hash. The bar stays private; the ordering stays public.

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. Where this evidence sits in the AI Act compliance file

The pack shows that the acceptance criteria existed no later than the anchored time and have not changed since. It does not show that the criteria were appropriate, that the test ran after that time, or that the result is correct. The table follows from that boundary. Quotations are from Regulation (EU) 2024/1689 (OJ L, 12.7.2024); none of the provisions cited was amended by Regulation (EU) 2026/1744, except Article 43(3), quoted below in its amended form.

ReferenceWhat the text asksWhat this pack suppliesFit
Article 9(8)“Testing shall be carried out against prior defined metrics and probabilistic thresholds that are appropriate to the intended purpose of the high-risk AI system.”The metric and threshold as a fixed record, with an independent time they existed by. Whether they are appropriate, and when the test ran, stay with the provider.PARTIAL (direct on “prior defined”)
Annex IV, point 2(g)Validation and testing procedures; “metrics used to measure accuracy, robustness and compliance with other relevant requirements”; “test logs and all test reports dated and signed by the responsible persons”The metric, threshold and test-data identity (hash), the result, and an anchor time the test report can cite. The dated, signed report stays the provider’s document; our timestamp is not its signature.PARTIAL
Annex IV, point 2(f) and point 6Pre-determined changes; “relevant changes made by the provider to the system through its lifecycle”A history of changes to the criteria, not to the system.PARTIAL
Article 11(1)Technical documentation “drawn up before that system is placed on the market or put into service and … kept up-to date”One dated input to that documentation.PARTIAL
Article 17(1)(d)“examination, test and validation procedures to be carried out before, during and after the development”A record the procedure can produce before each test campaign. Not the procedure, not the quality management system.PARTIAL
Annex IV, point 4“the appropriateness of the performance metrics for the specific AI system”Nothing. Whether a threshold is the right one is a judgement for the provider and its reviewers.NONE
Article 12“automatic recording of events (logs) over the lifetime of the system”Nothing. Runtime event logs are a different object from an acceptance-criteria record.NONE
Article 72Post-market monitoring systemNothing. We do not collect or analyse field performance data.NONE
Article 43(2) and (3)For Annex III points 2 to 8, conformity assessment “based on internal control … which does not provide for the involvement of a notified body”; systems also covered by Section A of Annex I follow that legislation’s procedureInput to whoever assesses. This pack is not an assessment.NONE

The fit column is deliberately strict: it reports what the pack mechanically provides, not what the provider’s wider compliance programme covers. The risk management system as a whole (Article 9), data governance (Article 10), human oversight (Article 14) and accuracy, robustness and cybersecurity measures (Article 15) are outside it. The Act asks for testing against “prior defined” criteria but does not say how “prior” is to be shown; it requires no timestamp, hash or third party. The pack is stronger evidence of a fact the Act already asks for, not an additional obligation.

5. ISO/IEC 42001:2023 Annex A

ControlTitleFitNotes
A.6.2.4AI system verification and validationPARTIALA fixed, dated record of the acceptance criteria used in verification and validation. The measures and their execution stay with the organisation.
A.6.2.7AI system technical documentationPARTIALOne component of the technical documentation.
A.6.2.6AI system operation and monitoringNONEOperation and field monitoring are out of scope.
A.6.2.8AI system recording of event logsNONERuntime logs; the same split as AI Act Article 12.

Control titles are as listed in public summaries of Annex A; check the numbering against your licensed copy of the standard. This mapping is our reading of the texts, not legal advice, and was prepared with AI assistance and reviewed by Falsify OÜ.

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 issues Acceptance Evidence Packs. Contact: [email protected]. Invoicing is in EUR by SEPA bank transfer, 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. This is our own worked example on public data (UCI Statlog German Credit), not a client engagement. The manifest hash and registry record are real and can be checked against registry.falsify.dev. A real Evidence Pack substitutes the client’s system, data and criteria, and publishes the manifest under the client’s producer.id (or as a sealed commit, if the criteria must stay confidential).

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