LitmusAI — free, deterministic CLI screener for Article 5 of the EU AI Act (Regulation (EU) 2024/1689).
Project description
LitmusAI
Free, deterministic Article 5 screener for the EU AI Act.
LitmusAI 1.0.0 ships with the AiExponent reference ruleset (UNREVIEWED — internal panel authored, no external lawyer review). Apache 2.0, AS IS.
The package's CLI surface, JSON/SARIF schema, and BYO-ruleset contract are stable for production integration. The reference ruleset has been authored and reviewed by an internal AiExponent panel (six engineering + governance roles) but has not been reviewed by a qualified EU AI Act practising lawyer. Every screening report carries this disclosure prominently. Customers who require lawyer-reviewed output can supply their own signed ruleset via the BYO mechanism — see
docs/ruleset-authoring.md.A full external legal review will land in a
ruleset-2024-1689-v1.1release withlegal_status: REVIEWED. Tracked under Legal review status below.
Screen your AI system against the eight prohibited-practice categories of Article 5 of the EU AI Act (Regulation (EU) 2024/1689). Get a per-category Red / Amber / Clear verdict with regulatory citations, confidence levels, and remediation guidance — in under 60 seconds, without a sales call, without a paywall, and without uploading data to any server.
Built by AI Exponent LLC. Apache 2.0. Runs entirely offline after pip install.
Quick Start
pip install litmus-screener # the brand is "LitmusAI"; the PyPI distribution is "litmus-screener"
# Quick screen from a text description
litmus screen --describe "a chatbot for mental health support for teenagers"
# Or from a structured YAML file
litmus init # creates system.yaml template
litmus screen system.yaml # full screening with all 8 categories
litmus export report.json --format pdf
How It Works
graph LR
A["system.yaml<br/>or --describe"] --> B["Parse +<br/>Validate"]
B --> C["Rule Engine<br/>(22 rules)"]
C --> D{"Per-category<br/>verdict"}
D -->|RED| E["Prohibition<br/>likely"]
D -->|AMBER| F["Legal review<br/>required"]
D -->|CLEAR| G["No indicators<br/>found"]
style A fill:#FCFCFA,color:#0F1419,stroke:#E4E2DC
style B fill:#FCFCFA,color:#0F1419,stroke:#E4E2DC
style C fill:#0D5463,color:#FCFCFA,stroke:#0D5463
style D fill:#F5F4EF,color:#0F1419,stroke:#E4E2DC
style E fill:#9D2929,color:#FCFCFA,stroke:#9D2929
style F fill:#B8791C,color:#FCFCFA,stroke:#B8791C
style G fill:#0B7A4B,color:#FCFCFA,stroke:#0B7A4B
What LitmusAI Does
- Screens AI systems against all 8 categories of Article 5(1)(a)-(h)
- Produces deterministic verdicts: same input = same output, always
- Generates audit-ready reports (JSON, SARIF, Markdown)
- Runs in CI/CD as a pre-merge gate (GitHub Action included)
- Works fully offline — zero network calls, zero telemetry
- Supports Bring-Your-Own-Ruleset — plug in your lawyer's signed interpretation
Article 5 Categories Covered
| Category | Prohibition | Verdict logic |
|---|---|---|
| 5.1.a | Harmful manipulation | RED if subliminal + behaviour change |
| 5.1.b | Exploitation of vulnerabilities | RED if targeting minors/vulnerable + behaviour predictions |
| 5.1.c | Social scoring | RED if individual scores + behaviour history |
| 5.1.d | Criminal risk prediction | RED if profiling-based criminal risk output |
| 5.1.e | Untargeted facial scraping | RED if facial images + scraped data |
| 5.1.f | Emotion inference (work/education) | RED in workplace/education; AMBER in healthcare |
| 5.1.g | Biometric categorisation | RED if biometric + sensitive attribute classification |
| 5.1.h | Real-time remote biometric ID | RED if biometric + public space + real-time |
CI/CD Integration
# .github/workflows/article5.yml
- uses: aiexponenthq/litmusai/.github/actions/litmusai-screen@v1
with:
path: system.yaml
fail-on: amber
Commands
| Command | Description |
|---|---|
litmus init |
Create starter system.yaml |
litmus screen |
Screen a system (YAML or --describe) |
litmus verify |
Check report hash integrity |
litmus portfolio |
Batch screen a directory |
litmus export |
Export to JSON, Markdown, or SARIF |
litmus debug |
Show rule-firing trace |
litmus use-ruleset |
Set a custom BYO ruleset |
litmus verify-ruleset |
Validate a ruleset file |
litmus ruleset-info |
Show active ruleset provenance |
Documentation
Important Disclaimers
Legal review status
UNREVIEWED REFERENCE RULESET
The default LitmusAI ruleset (
ruleset-2024-1689-v1.0) is a good-faith engineering interpretation of Article 5, authored by AiExponent's internal compliance panel. It has not been reviewed or signed by a qualified EU AI Act lawyer and is not legal advice.A full external legal review will land in a future
ruleset-2024-1689-v1.1release withlegal_status: REVIEWEDand a SIGNED provenance header. The package version (litmusai 1.0.0) reflects API stability — the legal-review status rides on the ruleset version + the explicitruleset_legal_status: UNREVIEWEDline printed bylitmus version.If your organisation needs a lawyer-signed ruleset today, see docs/ruleset-authoring.md for the BYO-ruleset path. A complete dummy-signed example ships in
tests/fixtures/rulesets/acme-corp-signed-v1.0.json.Every screening is a screening, not a certification. Not legal advice. Not a notified body.
Privacy
LitmusAI makes zero network calls during screening. No telemetry, no usage metrics, no crash reports. Your system descriptions never leave your machine. Enforced in CI via pytest-socket --disable-socket.
License
Apache 2.0 — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file litmus_screener-1.0.0.tar.gz.
File metadata
- Download URL: litmus_screener-1.0.0.tar.gz
- Upload date:
- Size: 59.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c026e0104262bc744a74387ee7a8326297db199f1711ae10310c847ebcd5dd51
|
|
| MD5 |
7ee9a91d8c3f450f58344c4fe0035e79
|
|
| BLAKE2b-256 |
f4c5357e01d7201b02516c5c3fd3bb0cb81d5e74f8615eb0dca4894e243f133e
|
Provenance
The following attestation bundles were made for litmus_screener-1.0.0.tar.gz:
Publisher:
release.yml on aiexponenthq/litmusai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
litmus_screener-1.0.0.tar.gz -
Subject digest:
c026e0104262bc744a74387ee7a8326297db199f1711ae10310c847ebcd5dd51 - Sigstore transparency entry: 1429085232
- Sigstore integration time:
-
Permalink:
aiexponenthq/litmusai@64fc8062ca15d24407ef7ce1273abc7349136988 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/aiexponenthq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@64fc8062ca15d24407ef7ce1273abc7349136988 -
Trigger Event:
push
-
Statement type:
File details
Details for the file litmus_screener-1.0.0-py3-none-any.whl.
File metadata
- Download URL: litmus_screener-1.0.0-py3-none-any.whl
- Upload date:
- Size: 42.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b86c25db0738f639d785b3f259fcb480b46ecd5192051a792e7b01c50cac7715
|
|
| MD5 |
ab3cea61f2531b618eac66ff3b8fa0ff
|
|
| BLAKE2b-256 |
774d22967da10303c4c6127465837d72a092fa68327edb6b678b82577005ee17
|
Provenance
The following attestation bundles were made for litmus_screener-1.0.0-py3-none-any.whl:
Publisher:
release.yml on aiexponenthq/litmusai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
litmus_screener-1.0.0-py3-none-any.whl -
Subject digest:
b86c25db0738f639d785b3f259fcb480b46ecd5192051a792e7b01c50cac7715 - Sigstore transparency entry: 1429085233
- Sigstore integration time:
-
Permalink:
aiexponenthq/litmusai@64fc8062ca15d24407ef7ce1273abc7349136988 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/aiexponenthq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@64fc8062ca15d24407ef7ce1273abc7349136988 -
Trigger Event:
push
-
Statement type: