Skip to main content
LitmusAI: EU AI Act Article 5 Prohibited Practice Screener

LitmusAI

Free, deterministic Article 5 screener for the EU AI Act.

PyPI CI License: Apache 2.0 Python 3.11+ EU AI Act Article 5 Zero telemetry Ruleset legal status: UNREVIEWED


LitmusAI 1.1.0 ships with the AiExponent reference ruleset ruleset-2024-1689-v1.1 (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.

The legal-review status is not tied to a version number. litmus --version prints ruleset_legal_status: REVIEWED when the active ruleset carries a signature block, and UNREVIEWED when it does not. LitmusAI checks that the block is well formed; it does not verify the signature cryptographically or check who the signer is, so that line records what the ruleset author declared, not proof of a qualified legal review. Tracked under Legal review status below.


The Problem

On February 2, 2025, Article 5 of the EU AI Act (Regulation (EU) 2024/1689) entered into active legal enforcement across all 27 EU member states.

Placing a prohibited AI practice on the market or putting it into service is strictly illegal and carries statutory administrative fines of up to €35,000,000 or 7% of total worldwide annual turnover.

Most engineering and product teams do not have an in-house EU AI Act counsel to review every model prompt, feature iteration, or system deployment. LitmusAI answers one critical question in your terminal or CI pipeline before you deploy:

"Is this AI practice prohibited under Article 5?"

Screen your system against all ten statutory categories of Article 5(1): the original eight, points (a) to (h), and the two inserted by Regulation (EU) 2026/1744, points (ba) and (bb), which apply from 2 December 2026. Receive a per-category Red / Amber / Clear verdict with exact legal citations, confidence levels, and concrete remediation advice, in under 60 seconds, completely offline, and without uploading sensitive system descriptions to any third-party 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"
# 1. Quick screen from a plain-text prompt
litmus screen --describe "a chatbot for mental health support for teenagers"

# 2. Or initialize a structured declaration for your system
litmus init                                         # creates system.yaml starter template
litmus screen system.yaml --output report.json      # full ten-category evaluation

# 3. Export audit-ready reports for legal or security teams
litmus export report.json -o report.sarif --format sarif

LitmusAI CLI Terminal Execution Preview: Article 5 Prohibited Practice Screening


Why LitmusAI

Evaluation Method Cost Turnaround Deterministic / Repeatable? Offline / Zero-Telemetry?
Big 4 Consulting €50K–€150K 4–8 Weeks ❌ No (Advisory opinion) ❌ No (NDAs & data sharing)
Enterprise GRC Platforms $40K–$120K/yr Weeks ⚠️ Partial ❌ No (Transfers system specs to cloud)
Internal Spreadsheets "Free" Days ❌ No (Human error) ⚠️ Manual
LitmusAI Free (Apache 2.0) < 60 seconds ✅ Yes (Deterministic hash) ✅ Yes (100% offline, zero network)

System Architecture

LitmusAI operates as a deterministic, offline static-analysis pipeline:

graph TB
    subgraph Inputs ["1. Input Specifications"]
        INP1["Prompt Description<br/><code>litmus screen --describe '...'</code>"]
        INP2["Declarative YAML<br/><code>system.yaml</code>"]
        INP3["CI/CD Gate<br/><code>GitHub Actions / Pre-commit</code>"]
    end

    subgraph Core ["2. Deterministic Screening Engine"]
        AST["Safe AST Evaluator<br/><em>(Constrained expressions, zero eval, zero Python execution)</em>"]
        RULE["Article 5 Reference Ruleset<br/><em>(28 rules covering 5.1.a to 5.1.h, 5.1.ba and 5.1.bb)</em>"]
        BYO["Bring-Your-Own Ruleset<br/><em>(Optional lawyer-signed JSON via litmus use-ruleset)</em>"]
    end

    subgraph Integrity ["3. Verification & Scoring"]
        CONF["Confidence Scorer<br/><em>(Conservative: Amber preferred on ambiguity)</em>"]
        HASH["RFC 8785 Canonical Digest<br/><em>(SHA-256 tamper-evident input hash)</em>"]
    end

    subgraph Outputs ["4. Audit-Ready Artifacts"]
        OUT1["Rich Terminal UI<br/><em>(Color-coded Red / Amber / Clear table)</em>"]
        OUT2["SARIF 2.1.0 Report<br/><em>(GitHub Security tab & GitLab SAST)</em>"]
        OUT3["JSON / Markdown / PDF<br/><em>(Reports for legal and security review)</em>"]
    end

    INP1 & INP2 & INP3 --> AST
    RULE & BYO --> AST
    AST --> CONF
    CONF --> HASH
    HASH --> OUT1 & OUT2 & OUT3

    style Inputs fill:#F5F4EF,stroke:#E4E2DC,color:#0F1419
    style Core fill:#E6F4F1,stroke:#0D5463,color:#0D5463
    style Integrity fill:#FAF0E6,stroke:#B68A2E,color:#0F1419
    style Outputs fill:#F5F4EF,stroke:#E4E2DC,color:#0F1419

What LitmusAI Does

  • Article 5 Full Coverage: Screens against all ten prohibited practices under Article 5(1), points (a) to (h) plus (ba) and (bb) from Regulation (EU) 2026/1744. A report run before 2 December 2026 says that the two new points apply from that date.
  • Deterministic by Design: Same input + same ruleset = identical output, guaranteed across platforms.
  • Zero Network Calls (NFR-8): 100% offline execution. No telemetry, no telemetry pings, no crash reports. Your architecture and prompts never leave your local machine (enforced in CI via pytest-socket).
  • Cryptographic Tamper-Evidence: Generates a canonical RFC 8785 SHA-256 digest on every report. Verify report integrity anytime via litmus verify <report>.
  • Bring-Your-Own-Ruleset (BYO): Legal counsel can author, sign, and distribute custom rulesets. Once activated (litmus use-ruleset), reports show (SIGNED by: Counsel) rather than UNREVIEWED in the provenance line.
  • Multi-Format Export: Native support for rich console output, machine-readable JSON, Markdown documentation, and SARIF 2.1.0 (with optional PDF via WeasyPrint).

Article 5 Categories Covered

Category Prohibition Statutory Citation Verdict Logic
5.1.a Harmful manipulation & cognitive distortion Art. 5(1)(a) RED if subliminal techniques + behavioral distortion + physical/psychological harm.
5.1.b Exploitation of vulnerable groups (age/disability) Art. 5(1)(b) RED if targeting minors/vulnerable cohorts + behavioral distortion + harm.
5.1.ba Non-consensual intimate material of identifiable persons (applies from 2 December 2026) Art. 5(1)(ba), 5(1a), 5(1b), as inserted by Regulation (EU) 2026/1744 RED if generating such material is the intended purpose without demonstrable consent, or is a foreseeable and reproducible outcome with no adequate, documented safeguards; AMBER if realistic media of identifiable people is generated and safeguards or consent are undocumented. Edits that do not increase exposure (Art. 5(1b)) never reach RED.
5.1.bb Child sexual abuse material (applies from 2 December 2026) Art. 5(1)(bb), 5(1a), as inserted by Regulation (EU) 2026/1744; Directive 2011/93/EU Art. 2(c) and (e) RED if such material is a foreseeable and reproducible outcome and nothing reliably prevents it; AMBER for any realistic-media generator without documented prevention, and for law-enforcement use where a "without right" defence may apply. No consent carve-out.
5.1.c Social scoring by public or private actors Art. 5(1)(c) RED if scoring from social behaviour data, from scraped internet data, or if the score leads to detrimental treatment in an unrelated context; AMBER for any other individual scoring, including credit scoring from repayment history (high-risk under Annex III, not prohibited).
5.1.d Predictive criminal risk profiling Art. 5(1)(d) RED if profiling-based risk assessment solely on personal traits (without human corroboration).
5.1.e Untargeted facial image scraping Art. 5(1)(e) RED if scraping facial images from the internet or CCTV to build facial recognition databases.
5.1.f Emotion inference in workplace or education Art. 5(1)(f) RED in employment or educational institutions; AMBER if medical/safety exemptions apply.
5.1.g Biometric categorisation of sensitive traits Art. 5(1)(g) RED if categorising natural persons based on race, political opinions, religion, or sexual orientation.
5.1.h Real-time remote biometric identification Art. 5(1)(h) RED if real-time biometric ID in publicly accessible spaces (subject to narrow judicial exceptions).

Interactive Artifact Previews

📄 View Starter system.yaml Template
schema_version: "1.0"
system_id: "customer-support-bot-v1"
name: "Customer Support Assistant"
version: "1.0.0"
description: "AI-driven customer assistant answering technical questions and routing tickets."

lifecycle:
  status: "pre-deployment"
  target_deployment: "2026-10-01"

capabilities:
  emotion_recognition: false
  biometric_identification: false
  subliminal_techniques: false
  social_scoring: false

target_users:
  general_public: true
  minors: false
  vulnerable_groups: false

deployment:
  workplace: false
  education: false
  public_spaces: false
🔍 View Audit-Ready SARIF 2.1.0 Output
{
  "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json",
  "version": "2.1.0",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "LitmusAI",
          "version": "1.1.0",
          "informationUri": "https://aiexponent.com/products/litmusai",
          "rules": [
            {
              "id": "litmusai/5.1.b",
              "name": "Vulnerability Exploitation",
              "shortDescription": {
                "text": "Article 5(1)(b) Exploitation of age, disability, or specific social vulnerability"
              },
              "helpUri": "https://aiexponent.com/eu-ai-act/article-5"
            }
          ]
        }
      },
      "results": [
        {
          "ruleId": "litmusai/5.1.b",
          "level": "warning",
          "message": {
            "text": "Conversational agent targets minors experiencing psychological distress without clinician escalation safeguards."
          }
        }
      ]
    }
  ]
}

CI/CD Integration & Exit Codes

Add LitmusAI to your GitHub Actions workflow as an automated pre-merge compliance gate:

# .github/workflows/article5.yml
name: EU AI Act Article 5 Screening
on: [pull_request, push]

jobs:
  article5-gate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: aiexponent/litmusai/.github/actions/litmusai-screen@v1
        with:
          path: system.yaml
          fail-on: amber       # fail CI if overall verdict is RED or AMBER
          output-format: sarif

Exit Code Contract

LitmusAI implements deterministic UNIX exit codes for scripting and CI gates:

Exit Code Meaning CI Behavior
0 CLEAR / BELOW THRESHOLD System passed screening without blocking prohibitions.
1 THRESHOLD EXCEEDED System triggered a prohibited practice or flagged an unreviewed Amber state.
2 SCHEMA / INPUT ERROR Malformed system.yaml, missing required attributes, or syntax error.
3 TAMPER DETECTED Hash verification failed (litmus verify), indicating report tampering.

CLI Command Reference

Command Description
litmus screen [path|--describe] Primary screening command (supports file or inline prompt).
litmus init Scaffold a starter system.yaml template in the current directory.
litmus export <report> -o <file> --format <fmt> Convert reports to json, markdown, sarif, or pdf.
litmus verify <report> Validate cryptographic SHA-256 integrity against the original inputs.
litmus portfolio <directory> Batch-screen an entire portfolio of system.yaml definitions.
litmus debug <report> Print step-by-step rule firing trace and variable evaluation states.
litmus use-ruleset <path> Install and activate a custom or lawyer-signed ruleset.
litmus verify-ruleset <path> Validate structural integrity and digital signature of a ruleset file.
litmus ruleset-info Display metadata, version, and legal review provenance of the active ruleset.
litmus diff-ruleset <old> <new> Structural diff between two ruleset versions with breaking-change alerts.
litmus --version Display multi-line package version, ruleset version, and legal review status.

Documentation


Important Disclaimers

UNREVIEWED REFERENCE RULESET

The default LitmusAI ruleset (ruleset-2024-1689-v1.1) is a good-faith engineering interpretation of Article 5, as amended by Regulation (EU) 2026/1744, 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. The panel's review records ship with the package under litmusai/_data/ruleset/.

The package version (litmusai 1.1.0) reflects API and CLI stability. The legal-review status rides on the ruleset itself: litmus --version prints ruleset_legal_status: REVIEWED when the active ruleset carries a signature block and UNREVIEWED when it does not. That check is structural. LitmusAI does not verify the signature cryptographically and cannot vouch for the signer's qualifications, so the line reports what the ruleset's author declared; whether the review behind it was qualified is for you to confirm with the signer. No version number of the reference ruleset implies an external review.

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 & Zero-Network Guarantee

LitmusAI makes zero network calls during screening. No telemetry, no usage analytics, no error reporting. Your prompts, proprietary architecture, and system declarations never leave your local machine.

Enforced in automated CI via pytest-socket --disable-socket (NFR-8).


License

Apache 2.0; see LICENSE.


Part of the AiExponent open-source AI governance toolchain:
litmusai (Art. 5) · license-compliance-checker (Art. 53) · rag-benchmarking (Art. 15) · riskforge (Art. 9) · agentic-document-analyser (Art. 9 / Annex IV)


aiexponent.com · hello@aiexponent.com · Built in the open · Apache 2.0

Metadata

Release files for litmus-screener 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for litmus-screener 1.1.0
File Size Uploaded Provenance Actions
litmus_screener-1.1.0.tar.gz 85.3 kB With provenance Details for litmus_screener-1.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for litmus-screener 1.1.0
File Interpreter ABI Platform Actions
litmus_screener-1.1.0-py3-none-any.whl Python 3 none any Details for litmus_screener-1.1.0-py3-none-any.whl

Total release size: 145.2 kB

Release files / litmus_screener-1.1.0.tar.gz

Download URL litmus_screener-1.1.0.tar.gz
Size 85.3 kB
Tags Source
SHA-256 checksum
How to use checksums
c658eea40e8bd78d30897ed573fccc8c54a1c5b08833e092b9133aa8a50c9210
BLAKE2b-256 checksum
How to use checksums
67a5dca7df3b5d12a5728db76f1af1a80e0e19bf7352b97526a023d80274da67
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Release files / litmus_screener-1.1.0-py3-none-any.whl

Download URL litmus_screener-1.1.0-py3-none-any.whl
Size 59.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cc573214984da8d3ae6bf054ef8eec80a733ddc397751b3a277d3cc22380bc98
BLAKE2b-256 checksum
How to use checksums
58899bb18df92470565a02de6a7c58ae4d92db9ee15a65cabc1775c7f5233f27
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Security for litmus-screener 1.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for litmus_screener-1.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page