Systima Comply

March 14, 2026 ยท View on GitHub

EU AI Act compliance scanning for CI/CD pipelines.

Systima Comply analyses your codebase for AI framework usage, validates your risk classification against the EU AI Act, checks obligation compliance, and reports findings directly in pull requests. Think of it as Snyk for AI regulation.

Systima Comply is an engineering tool, not legal advice. It does not replace professional regulatory assessment.

Features

  • AI framework detection: 37+ frameworks across Python and TypeScript/JavaScript (OpenAI, Anthropic, LangChain, scikit-learn, face_recognition, and more)
  • Risk classification validation: Validates declared risk levels against detected frameworks; flags mismatches (e.g. biometric processing in a "limited-risk" system)
  • Obligation compliance checking: Per-article checks for Articles 5, 9, 10, 11, 12, 13, 14, 27, and 50
  • Call-chain analysis: Traces AI API call return values through your code to detect regulated decision patterns
  • Annex III domain detection: Identifies when AI output flows into employment, credit, insurance, education, law enforcement, or other regulated domains
  • PR comments: Well-formatted GitHub PR comments with obligation tables, findings, and remediation links
  • Multiple output formats: GitHub PR comment, JSON, SARIF (for GitHub Code Scanning), Markdown
  • Baseline diffing: Track compliance posture over time; see what changed in each PR
  • Zero external dependencies: No API calls, no telemetry, no data exfiltration. Runs entirely locally.
  • Deterministic: Same codebase + same config = identical results every time. No LLM calls, no probabilistic analysis.

Quick Start

CLI

# Scan your codebase
npx @systima/comply scan

# Initialise a configuration file
npx @systima/comply init

# Generate a compliance report
npx @systima/comply report --out COMPLIANCE_REPORT.md

GitHub Action

# .github/workflows/comply.yml
name: EU AI Act Compliance
on:
  pull_request:
    types: [opened, synchronize, reopened]
permissions:
  contents: read
  pull-requests: write
  security-events: write
jobs:
  compliance:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: systima-ai/comply@v1
        with:
          fail-on: warning
          output-format: all
      - uses: github/codeql-action/upload-sarif@v3
        if: always()
        with:
          sarif_file: comply-results.sarif

Configuration

Create a .systima.yml file in your repository root. Run npx @systima/comply init to generate one interactively, or create it manually:

version: "1"

organisation:
  name: "Acme Corp"
  eu_presence: true
  operator_role: provider     # provider | deployer | both

systems:
  - id: loan-assessor
    name: "Loan Assessment Engine"
    description: "ML model scoring loan applications for creditworthiness"
    scope:
      paths:
        - src/lending/**
      exclude:
        - src/lending/tests/**
    classification:
      risk_level: high
      annex_iii_category: "5b"   # Creditworthiness assessment
      rationale: "Automated credit scoring affecting natural persons"
    regulations:
      - eu_ai_act
      - gdpr
    documentation:
      risk_management: docs/lending/risk-management.md
      data_governance: docs/lending/data-governance.md
      technical_docs: docs/lending/technical-documentation.md
      transparency: docs/lending/transparency-notice.md
      human_oversight: docs/lending/human-oversight-protocol.md

  - id: support-chatbot
    name: "Customer Support Chatbot"
    scope:
      paths: [src/chatbot/**]
    classification:
      risk_level: limited
      rationale: "AI chatbot interacting with users; transparency obligations"
    documentation:
      transparency: docs/chatbot/ai-disclosure.md

Configuration Reference

FieldTypeRequiredDescription
version"1"YesConfig schema version
organisation.namestringYesOrganisation name
organisation.eu_presencebooleanYesWhether the organisation serves EU users
organisation.operator_roleprovider / deployer / bothYesRole under the EU AI Act
systems[].idstringYesUnique system identifier
systems[].namestringYesHuman-readable system name
systems[].scope.pathsstring[]YesGlob patterns for source code paths
systems[].scope.excludestring[]NoGlob patterns to exclude
systems[].classification.risk_levelunacceptable / high / limited / minimalYesEU AI Act risk tier
systems[].classification.annex_iii_categorystringNoAnnex III subcategory (e.g. 5b)
systems[].documentation.*stringNoPaths to compliance documentation

CLI Commands

CommandDescription
comply scanScan codebase for EU AI Act compliance
comply initInteractively create a .systima.yml configuration
comply baselineSave current scan as baseline for future comparisons
comply diffCompare current scan against a saved baseline
comply reportGenerate a compliance report for legal/compliance teams

comply scan Options

OptionDefaultDescription
--path.Path to scan
--config.systima.ymlPath to config file
--outputtextOutput format: json, sarif, markdown, text
--outstdoutWrite output to file
--fail-oncriticalExit with code 1 on: none, warning, fail, critical
--baseline.systima-baseline.jsonBaseline file for diff comparison

GitHub Action

Inputs

InputDefaultDescription
config-path.systima.ymlPath to configuration file
scan-modedifffull (entire repo) or diff (changed files only)
fail-oncriticalFail the check on: none, warning, fail, critical
output-formatcommentcomment, json, sarif, or all
baseline-path.systima-baseline.jsonPath to baseline file

Outputs

OutputDescription
compliance-scoreFraction of obligations met (0.0-1.0)
risk-levelHighest risk level across all systems
findings-countTotal number of findings
classification-changedWhether any classification changed

What It Checks

Prohibited Practices (Article 5)

Detects biometric processing frameworks (face_recognition, deepface, insightface) that may indicate prohibited uses: untargeted facial recognition scraping, biometric categorisation for protected attributes, or workplace/education emotion recognition.

Obligation Compliance (Articles 9-15)

For high-risk systems, checks documentation existence and completeness for:

ArticleObligationWhat Comply Checks
Art. 9Risk managementDocument exists; contains risk identification, estimation, evaluation, mitigation sections
Art. 10Data governanceDocument exists; references data sources and bias evaluation
Art. 11Technical documentationDocument exists; covers Annex IV categories
Art. 12LoggingStructured logging or @systima/aiact-audit-log detected
Art. 13TransparencyTransparency documentation present; model cards; limitation disclosures
Art. 14Human oversightOversight documentation; review/approval mechanisms in code
Art. 27FRIAFundamental Rights Impact Assessment for deployers of high-risk systems
Art. 50Transparency (all tiers)AI interaction disclosure in user-facing code

Classification Validation

  • Flags biometric frameworks in systems declared as limited or minimal risk
  • Detects undeclared AI systems outside any configured scope
  • Suggests Annex III categories based on domain analysis of code paths

Call-Chain Analysis

Traces AI API call return values through assignments, destructuring, and property access chains to detect:

  • Conditional branching on AI output (automated decision-making)
  • Database persistence of AI classifications (scoring of natural persons)
  • UI rendering without AI disclosure (Article 50 gap)
  • Downstream API calls with AI output (integration into regulated decision chain)

Programmatic API

import { scan, formatGitHubPRComment, formatJsonReport } from '@systima/comply'

const result = await scan({
  path: '/path/to/repo',
  scanMode: 'full',
  outputFormat: 'json',
  failOn: 'critical',
  verbose: false,
})

// Access scan results programmatically
console.log(result.summary.overallComplianceScore)
console.log(result.summary.findingsBySeverity)

// Format as GitHub PR comment
const comment = formatGitHubPRComment(result)

// Format as JSON report
const json = formatJsonReport(result)

Detected Frameworks

Comply detects 37+ AI/ML frameworks across Python and TypeScript/JavaScript:

CategoryFrameworks
LLM ProvidersOpenAI, Anthropic, Google Generative AI, Cohere, Mistral AI, Together AI, Groq, Replicate, AWS Bedrock, Azure OpenAI
ML FrameworksTensorFlow, PyTorch, JAX, scikit-learn, XGBoost, LightGBM, CatBoost
Agent FrameworksLangChain, LlamaIndex, AutoGen, CrewAI, Semantic Kernel, Haystack, DSPy, Mastra
Computer Visionface_recognition, DeepFace, InsightFace, OpenCV DNN, MediaPipe
NLP/EmbeddingsHugging Face Transformers, Sentence Transformers, spaCy, NLTK, Flair
AI InfrastructureVercel AI SDK, MLflow, Weights & Biases, Hugging Face Hub

Ecosystem Integration

Comply works alongside Systima's other open-source EU AI Act compliance tools:

  • @systima/aiact-audit-log: Article 12 compliant structured, tamper-evident audit logging. Comply detects whether it is installed and configured.

Contributing

Contributions are welcome. Please open an issue first to discuss what you would like to change.

Development

git clone https://github.com/systima-ai/comply.git
cd comply
pnpm install
pnpm build
pnpm test

Project Structure

packages/
  core/           # @systima/comply npm package + CLI
    src/
      scanner/    # File walker, import/dependency/config scanners
      classifier/ # Risk classification validation, domain detection
      tracer/     # Call-chain analysis, sink detection
      obligations/# Obligation check functions per EU AI Act article
      reporters/  # Output formatters (PR comment, JSON, SARIF, Markdown, badge)
      diff/       # Baseline comparison engine
      config/     # .systima.yml schema and loader
      knowledge/  # Framework patterns, Annex III, obligation mappings
  action/         # GitHub Action wrapper
knowledge/        # Regulatory knowledge base (JSON)
  eu-ai-act/      # Articles, Annex III, obligations, deadlines
  frameworks/     # AI framework detection patterns
examples/         # Reference .systima.yml configurations

Licence

Apache 2.0. See LICENSE.


Built by Systima, an agentic AI consultancy for regulated industries.