An auditor, a certifier or a buyer's reviewer should not have to take a vendor's word for anything. This post lists three checks anyone can run from public artifacts, with no account and no API key, and what each one should print. We ran all three again on 16 October 2026.

1. The rules decide with a rule ID and the law

Install TrustLint, the offline checker built on the same rule set, and give it a request for a prohibited practice:

pip install trustlint
trustlint check --verbose --text "implement a social credit score for all citizens"

Expect: a non-zero exit code, the line [CRITICAL] EU_AI_ACT_ART5_SOCIAL_SCORING_001, and a citation to Regulation (EU) 2024/1689, Article 5(1)(c). The point is what comes back: a rule ID and the article it applies, not a score. What each rule means, and the law behind it, is set out in the open rule set.

2. The published GPAI scores re-derive offline

From a checkout of the public repository at github.com/ComplyEdge/complyedge:

pip install pyyaml jsonschema
python scripts/benchmark/benchmark_runner.py \
  --providers providers/ \
  --schema scripts/benchmark/provider_schema.yaml \
  --output /tmp/out.json

Expect: Scored 12 providers, Average compliance: 53.1%, Best: google, Worst: xai. These are the numbers in the GPAI benchmark post, computed from the provider evidence files committed in providers/, with no network call. Every score there is still marked needs_review.

3. An edited audit export fails verification

The repository ships a sample audit export and the verifier that checks it. From the same checkout:

python3 - <<'PY'
import sys, json
sys.path.insert(0, "services/api")
import audit_export

e = json.load(open("examples/audit/sample-audit-export.json"))
print("verify:", audit_export.verify_audit_export_chain(e))   # True

e["events"][10]["allowed"] ^= True
print("tampered:", audit_export.verify_audit_export_chain(e)) # False
PY

Expect: verify: True, then tampered: False. Flipping one field in one record breaks the chain. The sample holds 23 events in the format used before the write-time chain, so it carries only the export-time sha256-v1 chain. A current export, on any plan, also carries the chain each record joined as it was written. From services/api in the same checkout, python -m audit_export verify export.json checks it on your own machine. On an untouched Free or Developer export it prints verdict: unverified with no_anchor: every record and link checked out, but the hourly qualified timestamps over the chain travel only in an Enterprise export. Any edit, deletion or reordering turns the verdict to failed and names each affected record on its own line. Tamper-evident means detectable, not impossible.

What these checks do not cover

The reviewer's side of all of this, in one place: for auditors and certifiers.