EU AI Act Finance Showcase
v2.2.0 — One command runs a live SME credit decision through all 23 requirements from Nannini et al. (2026) using
ollama/phi4:latest(fully local, no API key needed) and produces three HMAC-signed audit artefacts. Lár ships 20 compliance primitives — all open-source.
python examples/compliance/22_eu_ai_act_finance_showcase.py
Source: examples/compliance/22_eu_ai_act_finance_showcase.py
Any model supported by LiteLLM works. To switch models, set BACKBONE_MODEL:
# Local (default)
python examples/compliance/22_eu_ai_act_finance_showcase.py
# Cloud
BACKBONE_MODEL=gpt-4o python examples/compliance/22_eu_ai_act_finance_showcase.py
BACKBONE_MODEL=gemini/gemini-1.5-pro python examples/compliance/22_eu_ai_act_finance_showcase.py
What It Validates (v2.2.0 — 23 Requirements)
The showcase runs a high-risk credit application (Annex III, point 5(b) — creditworthiness assessment) through every compliance primitive in sequence, then verifies the three output artefacts against their regulatory obligations.
Original 12 steps (v2.1.x)
| # | Primitive | Article / Standard | Validated |
|---|---|---|---|
| S0–S2 | DOMAIN_PRESETS + conformity_id |
Art. 3(1), Art. 53, Annex III | Classification record in config |
| S3 | ComplianceManifestGenerator + AuthorityLedger + AuditLogger |
prEN 18286 / Art. 17 (QMS) | Three Annex IV artifact inputs produced |
| S4 | PolicyRegistry + RiskScorerNode |
Art. 9 + Art. 14 — risk management | computed_oversight_level written to state |
| S5 | PIIRedactionEngine + BiasFilterNode |
prEN 18284/18283 / Art. 10 | SSN + Name stripped; bias scan on LLM output |
| S6 | AuditLogger + HumanJuryNode + AuthorityLedger |
Art. 12–14 — trustworthiness | HMAC trace + structural HITL + Fourth Tier record |
| S7 | CredentialVault |
prEN 18282 / Art. 15(4) | JIT NHI provisioning — agent holds no standing credentials |
| S8 | Secure-by-design architecture | CRA Annex I | Credential minimisation + HMAC signing |
| S9 | ComplianceManifestGenerator |
Step 9 — adjacent legislation | DORA, MiFID II, GDPR auto-detected from domain |
| S10 | Manifest + Ledger + Causal Trace | Annex IV | Three Annex IV documentation inputs signed |
| S11 | RuntimeStateVersioner |
Art. 3(23) | Drift report against conformity baseline |
v2.2.0 gap-closure (rows A–L)
| # | Primitive | Article / Standard | Validated |
|---|---|---|---|
| A | FundamentalRightsImpactNode |
Art. 9 FRIA — 6 EU Charter dimensions | fria_passed = True after LLM output scan |
| B | BehavioralEnvelopeMonitor |
Art. 9 PMM — output variance | Confidence score checked against baseline envelope |
| C | AuditLogger.verify_step_integrity() |
Art. 12 — per-step integrity | State diff recomputed; MISMATCH → tamper alert |
| D | AuditLogger.log_plan_switch() |
Art. 12 — causal chain depth | Branch-switch events in trace |
| E | DeployerTransparencyNode |
Art. 13 — instructions for use | Structured disclosure → state["deployer_instructions"] |
| F | HumanJuryNode(automation_boundary=…) |
Art. 14 — automation boundary | Per-decision-type policy (always_human / auto_if_low_risk) |
| G | SupplierAgreementRegistry |
Art. 25(4) — written agreements | assert_agreement(tool_name) before every external call |
| H | DynamicToolDiscoveryMonitor |
Art. 3(23) — post-conformity tool addition | Flags tools added since baseline |
| I | MultiAgentBoundaryNode |
Art. 3 — sub-agent boundaries | INTERNAL vs EXTERNAL_MARKET declaration per sub-agent |
| J | IncidentReporterNode (executor hook) |
Art. 73–74 — incident reporting | Auto-fires on unhandled exceptions; 24h/72h deadlines in record |
| K | SessionMemoryNode |
GDPR Art. 17 — right to erasure | Per-subject compartment; erase mode deletes on request |
| L | CredentialVault.get_with_trust() |
Art. 15(4) — trust-based privilege | Sensitive credentials blocked until trust_level="HIGH" |
Execution Trace
The showcase runs the FINANCE backbone against a €500,000 SME loan application. Every step is yielded by the GraphExecutor generator — the exact path an auditor reconstructs from the log.
| Step | Node | Outcome | State Changes |
|---|---|---|---|
| 0 | FunctionalNode (CredentialVault) |
✅ success | + jit_token_present = True |
| 1 | LLMNode (credit risk analysis) |
✅ success | + ai_output (170 tokens) |
| 2 | FunctionalNode (JSON parse) |
✅ success | + recommendation, model_confidence, risk_level |
| 3 | RiskScorerNode |
✅ success | + computed_oversight_level |
| 4 | HumanJuryNode (Risk Officer gate) |
✅ success | + jury_decision = "approve" |
| 5 | FunctionalNode (LethalTrifecta + Transparency) |
✅ success | + _trifecta_check, ~ drift_report |
| 6 | SyntheticMarkerNode |
✅ success | + final_output (AI-disclaimed) |
The Three Output Artefacts
Every run writes three HMAC-SHA256 signed files to enterprise_audit/. These are the inputs to a conformity assessment body review.
Artefact 1 — Article 12 Causal Trace (run_<uuid>.json)
The exact JSON an auditor receives for Step 1:
{
"step": 1,
"node": "LLMNode",
"prompt": "You are a credit risk analyst. Assess the following loan/credit application.\nApplication: Credit application from business client. Requested limit: €500,000...\n\nReply with ONLY a single JSON object: risk_level (LOW/MEDIUM/HIGH/CRITICAL), recommendation (max 2 sentences), confidence (float 0.0-1.0). No prose.",
"state_diff": {
"added": {
"ai_output": "{\"risk_level\": \"CRITICAL\", \"recommendation\": \"Do not approve the loan due to high D/E ratio and missed payments.\", \"confidence\": 0.95}"
},
"removed": {},
"updated": {}
},
"run_metadata": {
"prompt_tokens": 100,
"output_tokens": 70,
"total_tokens": 170,
"model": "ollama/phi4:latest"
},
"outcome": "success"
}
The log contains every variable change, every rendered prompt, every token cost — no guesswork. PII (name, ssn, account_number) is stripped before signing.
Artefact 2 — Article 14 Authority Ledger (authority_ledger.json)
The Fourth Tier oversight record — who approved, in what role, with what rationale:
{
"stakeholder_id": "[email protected]",
"stakeholder_role": "Risk Officer",
"decision": "approve",
"rationale": "Reviewed FINANCE case. AI recommendation verified against policy.",
"timestamp": "2026-05-08T16:29:00Z"
}
This is the evidentiary chain the paper's footnote 18 requires: action proposal → risk assessment → human determination → execution outcome.
Artefact 3 — Step 9 Action Inventory (compliance_manifest.json)
The ComplianceManifestGenerator statically traverses the full graph before execution and produces an exhaustive inventory:
External Actions : 2
Third-Party Actions : 2 ← Art. 50 disclosure triggered
Unvaulted Tools : 0 ← All tools JIT-credentialed
Risk flags surfaced:
[HIGH] AdaptiveNode detected — Art. 3(23) substantial modification candidate
[MEDIUM] Third-party affecting actions present — Art. 50 disclosure required
The full log is HMAC-SHA256 signed — tamper-evident:
Signature: 55931245a2c8117f1c1dc4f6b4499b866f272d99bd9273cd01d313e435a658a5
Nannini et al. (2026) — 12-Step Coverage Map
The paper (Section 8.1) defines a 12-step conformity assessment sequence. Here is Lár's implementation status for each:
| Step | Paper Requirement | Lár Primitive | Type |
|---|---|---|---|
| 0 | Scope: Art. 3(1) AI system definition | Domain config + classification doc | Docs |
| 1 | GPAI layer: Art. 53 documentation chain | Model-agnostic (LiteLLM) + config | Docs |
| 2 | Classify: Annex III / high-risk determination | DOMAIN_PRESETS + conformity_id |
Docs |
| 3 | QMS: prEN 18286 lifecycle management | Manifest + Ledger + Causal Trace | Artefacts |
| 4 | Risk management: prEN 18228 / Art. 9 | PolicyRegistry + RiskScorerNode |
Runtime |
| 5 | Data governance: prEN 18284 + prEN 18283 | PIIRedactionEngine + BiasFilterNode |
Runtime |
| 6 | Trustworthiness: Art. 12–14 | AuditLogger + HumanJuryNode + AuthorityLedger |
Runtime |
| 7 | Cybersecurity: prEN 18282 / Art. 15(4) | CredentialVault (JIT NHI) |
Runtime |
| 8 | CRA applicability | Secure-by-design architecture | Docs |
| 9 | Adjacent legislation inventory | ComplianceManifestGenerator |
Runtime |
| 10 | Conformity assessment artefacts | Manifest + Ledger + Trace → Annex IV | Artefacts |
| 11 | Post-market monitoring + drift | RuntimeStateVersioner |
Runtime |
Running Other Domains
The same backbone covers every regulated vertical:
from lar.enterprise.backbone import build_and_run
result = build_and_run(case=my_case, domain="HEALTHCARE") # MDR + EU AI Act + FDA 21 CFR 11
result = build_and_run(case=my_case, domain="PHARMA") # ICH GCP + EMA + FDA 21 CFR 11
result = build_and_run(case=my_case, domain="HR") # Equality Act + EU AI Act + GDPR
result = build_and_run(case=my_case, domain="LEGAL") # DSA + UPL + EU AI Act