Skip to content

Control Codes Reference

Every failed control in a compliance-artifact.json carries a failed_controls list. Each entry is a control code — a stable, machine-readable identifier that maps to a specific EU AI Act obligation or pipeline evaluator check.

This page defines every code the tool can emit, what triggers it, and how to clear it.


Risk-rule codes

These codes come from the static rule engine that runs on every opencomplai check, with or without an eval sample set. They evaluate the system manifest, not model outputs.


EU_AIA_ART6_HIGH_RISK

Field Value
Full name High-Risk System Classification
Regulatory reference EU AI Act, Article 6 and Annex III
Exit code 1 (CONTROL_FAIL)
Source packages/core/src/opencomplai_core/rules.pyAnnexIIIClassifierRule

What triggers it

The system's intended_purpose (from the manifest) matches one or more of the eight Annex III high-risk categories:

Category Example keywords
Biometric biometric identification, facial recognition, remote biometric
Critical infrastructure critical infrastructure, electricity grid, railway
Education education, student assessment, exam proctoring, admissions
Employment recruitment, hiring, worker management, performance evaluation
Essential services credit scoring, creditworthiness, insurance pricing, health services
Law enforcement crime prediction, predictive policing, criminal justice, polygraph
Migration & border migration, asylum, border control, visa assessment
Justice & democracy judicial, court decision, election, legal outcome prediction

What it means

This is a structural finding, not a defect in model outputs. The system falls inside EU AI Act Annex III and therefore must meet all Chapter III obligations before it can be deployed: conformity assessment, technical documentation, human oversight, logging, transparency, and post-market monitoring.

Failing this rule does not mean the system is unsafe — it means the regulatory bar is higher and must be demonstrably cleared.

How to remediate

  1. Confirm the classification is accurate. If the system is genuinely Annex III, this control will always fail — that is the correct and expected result.
  2. Populate the Annex IV fields in your manifest (training_data_description, model_architecture, monitoring_approach, incident_response_procedure).
  3. Run opencomplai docs generate to produce the technical dossier that evidences Chapter III compliance.
  4. Once the full conformity dossier is accepted by your compliance team, use the --scan-mode ci flag in CI to treat this code as informational rather than blocking (exit code 0 in degraded-complete mode).

EU_AIA_ART5_UNACCEPTABLE

Field Value
Full name Prohibited AI Practice Detection
Regulatory reference EU AI Act, Article 5
Exit code 3 (POLICY_BLOCK)
Source packages/core/src/opencomplai_core/rules.pyUnacceptableRiskRule

What triggers it

The intended_purpose contains a signal for a prohibited practice: subliminal manipulation, exploiting vulnerabilities, social scoring, social credit, real-time remote biometric surveillance, or real-time biometric public space.

How to remediate

If the classification is accurate, the system cannot be deployed under EU AI Act. If it is a false positive, revise the intended_purpose wording so it no longer matches a prohibited signal, then re-run opencomplai check.


EU_AIA_ART6_PROFILING

Field Value
Full name Profiling Detection — Force High-Risk
Regulatory reference EU AI Act, Article 6(3), Recital 34
Exit code 1 (CONTROL_FAIL)
Source packages/core/src/opencomplai_core/rules.pyProfilingDetectionRule

What triggers it

The intended_purpose contains a profiling signal (profiling, profile natural persons, behavioural profiling, personality profiling, automated profiling), or the assessment answers include "profiling_detected": true.

How to remediate

Same path as EU_AIA_ART6_HIGH_RISK — meet Chapter III obligations and generate the Annex IV dossier. The profiling-specific concern is Article 6(3): document whether the system makes solely automated decisions that significantly affect individuals and confirm human oversight measures are in place.


EU_AIA_ART25_MODIFICATION_TRAP

Field Value
Full name Substantial Modification Trap
Regulatory reference EU AI Act, Article 25, Article 3(23), Recital 66
Exit code 4 (TRAP_DETECTED)
Source packages/core/src/opencomplai_core/rules.pySubstantialModificationRule

What triggers it

The assessment answers include "substantial_modification": true, signalling that the system has been changed in a way that alters its intended purpose, risk level, or performance characteristics.

How to remediate

A new conformity assessment is required before re-deployment. Contact your compliance team. Do not clear this flag by removing the answer — it must be cleared by completing the assessment and updating the manifest with the new conformity evidence.


Pipeline evaluator codes

These codes come from the eval engine (opencomplai check --sample-set or opencomplai eval). They evaluate actual model outputs against deterministic, versioned detectors. The evaluator ID doubles as the control code when a failure is promoted to failed_controls.


EVAL_SAFETY_LEXICAL_V1

Field Value
Full name Lexical Safety Evaluator, Version 1
Regulatory reference NIST AI RMF MEASURE 2.6 / EU AI Act Art. 15 (robustness)
Exit code 1 (CONTROL_FAIL)
Default threshold 0.98 safety-clean rate (≥ 98 % of texts must be clean)
Source packages/core/src/opencomplai_core/evaluators/safety.py

What it checks

Scans every output and prompt in the sample set against three deterministic signature lists:

  • Toxic lexicon — words associated with harmful, hateful, or abusive content.
  • Injection patterns — substrings that indicate prompt-injection attempts (e.g. ignore previous instructions).
  • Jailbreak markers — strings that indicate attempts to bypass safety constraints (e.g. you are now DAN).

A text is flagged if it matches any signature. The score is 1 - (flagged_count / total_texts). The evaluator fails if the score drops below the threshold (default 0.98) or warns if it falls within the 0.02 band above the threshold.

What a failure means

One or more outputs or prompts contain safety-relevant signals. The findings field in the artifact lists each matched signature type (toxic:, injection:, jailbreak:).

How to remediate

  1. Inspect the findings in compliance-artifact.json to identify which signature categories fired.
  2. Review the flagged outputs — the evaluator reports category and a truncated match, not the raw text.
  3. Add output filtering or a safety classifier upstream of the model's response path.
  4. Re-run opencomplai check --sample-set with a clean sample set to confirm the fix before merging.

Threshold override

{
  "threshold_overrides": { "safety": 0.95 }
}

Add this to the EvalSampleSet JSON to lower the threshold for a specific sample set. Document the deviation in your Annex IV dossier.


EVAL_DATA_LEAKAGE_V1

Field Value
Full name Data Leakage / PII Detector, Version 1
Regulatory reference ISO 27001 A.8.20 / NIST PR.DS / EU AI Act Art. 10 (data governance)
Exit code 1 (CONTROL_FAIL)
Default threshold 0.99 leakage-clean rate
Source packages/core/src/opencomplai_core/evaluators/leakage.py

What it checks

Scans every model output for five detector categories using regex patterns:

Detector Pattern Zero-tolerance
email user@domain.tld format No
phone North-American phone number formats No
ssn NNN-NN-NNNN format Yes
secret API keys, tokens, passwords in key=value form Yes
credit_card 13–19 digit sequences passing Luhn check Yes

Zero-tolerance detectors (ssn, secret, credit_card) cause an immediate FAIL regardless of rate — a single match is enough.

When declared_output_fields is provided in the sample set, the evaluator also checks for undeclared schema fields (email, ssn, password, api_key, phone) appearing as tokens in the output text.

Findings are reported with masked exemplars — the raw sensitive value is never stored.

How to remediate

  1. Check the findings list in the artifact for which detector fired and how many times.
  2. Trace the source: is the sensitive value coming from a training data leak, a retrieved document, or a prompt template?
  3. Add a PII scrubbing post-processor to the model's output pipeline.
  4. If undeclared_field fired, either add the field to declared_output_fields in the sample set or remove the field from model outputs.
  5. Re-run with a clean sample set to confirm.

Threshold override

{
  "threshold_overrides": { "leakage": 0.97 }
}

EVAL_BIAS_FAIRNESS_V1

Field Value
Full name Fairness Metrics Evaluator, Version 1
Regulatory reference NIST AI RMF MEASURE 2.11 / EU AI Act Art. 10 (data governance)
Exit code 1 (CONTROL_FAIL)
Default threshold 0.80 disparate impact ratio
Source packages/core/src/opencomplai_core/evaluators/bias.py
Task type binary_classification only (skipped for other task types)

What it checks

For each protected attribute group defined in protected_attributes, computes:

  • Disparate impact ratiomin(positive_rate) / max(positive_rate) across groups. A ratio below the threshold (default 0.80, the four-fifths rule) triggers a FAIL.
  • Equal opportunity gap — difference in true positive rate (TPR) between the best and worst served group. Reported as a finding.
  • Demographic parity gap — difference in positive prediction rate across groups. Reported as a finding.

Groups with fewer than 20 samples are flagged as underpowered and produce a WARN rather than FAIL if they are the only problematic groups.

How to remediate

  1. Check findings for disparate_impact:<attribute>:ratio=<value> to see which attribute and which direction the gap runs.
  2. Investigate whether the gap originates in training data distribution, feature encoding, or label noise.
  3. Apply bias mitigation (re-sampling, re-weighting, post-processing calibration) and re-evaluate with a larger, balanced sample set.
  4. If the group sample size is below 20, collect more labelled examples for that subgroup before drawing conclusions.

Threshold override

{
  "threshold_overrides": { "bias": 0.75 }
}

Document any threshold relaxation in your Annex IV technical dossier with a rationale.


Reading failed_controls in the artifact

{
  "result": "CONTROL_FAIL",
  "failed_controls": [
    "EU_AIA_ART6_HIGH_RISK",
    "EVAL_SAFETY_LEXICAL_V1",
    "EVAL_DATA_LEAKAGE_V1"
  ],
  "eval_summary": {
    "overall_outcome": "fail",
    "failed_evaluator_ids": ["EVAL_SAFETY_LEXICAL_V1", "EVAL_DATA_LEAKAGE_V1"]
  }
}
  • Risk-rule codes (EU_AIA_*) — always present if the rule fails; independent of whether a sample set was supplied.
  • Evaluator codes (EVAL_*) — only present when a --sample-set was passed to opencomplai check or opencomplai eval. If no sample set is supplied, the eval_summary field is null and no evaluator codes appear.

A CONTROL_FAIL result with only EU_AIA_ART6_HIGH_RISK and a passing eval_outcome means the system's outputs are clean but it still needs to complete its Annex III conformity obligations — a documentation and process gap, not a safety gap.


Quick reference table

Code Type Exit code Zero-tolerance
EU_AIA_ART6_HIGH_RISK Risk rule 1 No
EU_AIA_ART5_UNACCEPTABLE Risk rule 3 Yes
EU_AIA_ART6_PROFILING Risk rule 1 No
EU_AIA_ART25_MODIFICATION_TRAP Risk rule 4 Yes
EVAL_SAFETY_LEXICAL_V1 Evaluator 1 No (threshold-based)
EVAL_DATA_LEAKAGE_V1 Evaluator 1 Yes (SSN / secret / card)
EVAL_BIAS_FAIRNESS_V1 Evaluator 1 No (threshold-based)

→ See Exit Codes for the full exit-code contract.
→ See Rules for how to add new risk rules.
→ See Contributing: Adding Rules for the step-by-step guide.