← Back to Trust Center

EU AI Act Self-Scan Report

Guardia AI (this product), scanned by its own repository scanner. Scanner: Guardia AI repository scanner and code analyzer — the same two engines shipped in our GitHub Action (v1.4.0) and GitLab component. The analyzer applies ten article-level rules across Python, JavaScript and TypeScript..

Generated: 27 July 2026 · Reviewed by a human

Result at a glance

limited riskClassifier confidence: 68% · Compliance gaps found: 1

AI usage detected; none of it biometric, safety-critical, or in an Annex III high-risk area. Our own analyzer currently reports one open transparency finding against us, on the streaming chat endpoint. It is published here rather than resolved quietly, because a compliance tool that hides its own findings is worth nothing.

What the scan covered

Full Guardia AI monorepo, scanned continuously rather than once: the GitHub Action runs on every push to the frontend and backend branches. This report is a snapshot of the 27 July runs — 246 frontend files and 65 backend files, with tests, examples and documentation excluded from findings.

AI detected in our own codebase

openai (npm SDK)

LLM API

The OpenAI-compatible SDK pointed at Groq (api.groq.com). Powers two assistive features: the compliance chat assistant (Llama 3.1 8B) and documentation drafting (Llama 3.3 70B). Both produce advisory text that a human reviews and edits; neither makes decisions.

EU AI Act note: Deployer of a general-purpose model via API. Article 50 transparency applies to the chat assistant: it is clearly labelled as AI.

Found in: frontend/package.json, frontend/app/api/ai/chat/route.ts, frontend/app/api/ai/generate/route.ts

scikit-learn

ML Framework

Used together with fairlearn to COMPUTE statistical fairness metrics (demographic parity, equalized odds) on model outputs customers upload for bias reports. No model is trained or deployed; it is measurement, not inference.

EU AI Act note: Not an AI system making outputs about persons; it is the measurement tooling for our bias reports.

Found in: backend/requirements.txt

GROQ_API_KEY (configuration)

Credential env key

The deployment credential for the Groq-hosted LLM features above.

EU AI Act note: Consistent with the declared LLM usage — no undeclared AI providers configured.

Found in: frontend/.env.local.example, frontend/netlify.toml

What is deliberately NOT AI

The parts of Guardia that produce your compliance results are deterministic — same input, same output.

Repository scanner (core product)

Deterministic pattern matching against published signature lists (AI libraries, model names, endpoints, credential keys). No ML model involved; identical output on identical input.

Risk classification engine

Rule-based mapping to EU AI Act articles (Article 5, Annex III) with cited sources. No ML model involved.

FRIA, Annex IV, ISO 42001 modules

Structured templates and rule-based applicability checks. LLM assistance is optional, labelled, and editable.

Open against us right now

What our own analyzer reports about this product, unresolved. We publish it because a compliance tool that hides its own findings is worth nothing.

GA-ART50-001app/api/ai/chat/route.ts:166high severity · medium confidence

The endpoint POST reaches a model via openai.chat.completions.create (an SDK call, in the handler itself). No disclosure was found in this file. One appears in app/widget/page.tsx, app/dashboard/assistant/page.tsx, app/dashboard/transparency/page.tsx and 7 other files — confirm it is shown to the people using this endpoint.

Article 50(1): providers shall ensure that AI systems intended to interact directly with natural persons are designed and developed in such a way that the natural persons concerned are informed that they are interacting with an AI system, unless this is obvious from the point of view of a natural person who is reasonably well-informed, observant and circumspect.

No automatic fix is offered. This endpoint streams its response. There is no JSON object to add a field to, so where the disclosure belongs depends on how the interface renders the stream. The analyzer offers no patch rather than guessing — a wrong patch is worse than none.

open, tracked, not accepted

Remediation log — what the scan found and what we did

2026-07-27 — found by This self-scan (code analysis layer), running in CI on every push

GA-ART50-001 — the documentation-drafting endpoint (app/api/ai/generate/route.ts) returned model output with no indication it was AI-generated.

Applied the analyzer's own suggested patch: the response body now carries an ai_disclosure field. Verified by re-scan the same day — the finding no longer appears.

2026-07-27 — found by This self-scan, on the backend branch

Three Article 5 rules (facial scraping, biometric categorisation, live remote biometric identification) reported our own rule file, because it lists the words those rules search for. Their first firing on real code was a false positive on our own source.

Keyword rules now read a masked view of each file: comments, docstrings and strings assigned to a name are excluded, while a string passed to a call still counts. Four regression tests added. Shipped as v1.4.0 the same day.

2026-07-05 — found by This self-scan (config-detection layer)

Stale OPENAI_API_KEY references in render.yaml, netlify.toml, .env.local.example and the /status health check, left over from before our switch to Groq-hosted models.

Removed the stale references and fixed the health check to test the credential actually in use (GROQ_API_KEY). Fixed the same day.

Methodology

  • The scan runs with the same two engines we ship to customers, vendored identically into the GitHub Action and the GitLab component. No source code leaves the runner: the analyzer parses files locally and never calls a model.
  • Findings state what the code does and quote the obligation separately. None of them asserts a violation — whether an obligation applies depends on a system's purpose and deployment context, which a scan cannot determine. Two tests enforce this and must not be relaxed.
  • Both detection layers distinguish a signature definition from real usage. The library detector has done so since our June false-positive fixes; the article-level rules did not, and reported our own rule file on 27 July until this was corrected.
  • Each scan writes a hash-chained evidence record. The 27 July backend run is 094356adf8bb.
  • Anyone with repository access can reproduce this report by running the scanner against the repo root.

What this report does not establish

  • No lawyer has reviewed these rules. Every one records reviewed_by: null, and each finding says so where it appears. A legal review is the next step and is not yet complete.
  • Three Article 5 rules have never fired correctly on real code. They are verified by synthetic tests only, and their single real-world firing to date was the false positive described above. We do not present them as proven.
  • This is a self-assessment. It is evidence of what our tooling reports about us, not a certification, and not a legal opinion.

This is a self-assessment generated with Guardia AI's own tooling and reviewed by a human. It is a snapshot of the scans run on 27 July 2026, not a live feed. It is not a certification, an audit, or legal advice.