<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Iso-42001 on lo0 — Tech Blog</title><link>https://blog.lo0.es/en/tags/iso-42001/</link><description>Recent content in Iso-42001 on lo0 — Tech Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 08 Sep 2026 07:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/en/tags/iso-42001/index.xml" rel="self" type="application/rss+xml"/><item><title>Virtual keys, budgets and limits in LiteLLM: the layer that decides who gets the GPU, and the four things the documentation gets wrong</title><link>https://blog.lo0.es/en/posts/litellm-virtual-keys-budgets-limits/</link><pubDate>Tue, 08 Sep 2026 07:30:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/litellm-virtual-keys-budgets-limits/</guid><description>&lt;blockquote>
&lt;p>Third article in the operational track of the control layer. The &lt;a href="https://blog.lo0.es/en/posts/litellm-langfuse-operational-pair/">pair with Langfuse&lt;/a> covered observability, and &lt;a href="https://blog.lo0.es/en/posts/litellm-day-2-high-availability/">day 2 of the proxy&lt;/a> covered availability. Here it is governance: who can call, which model, how much and on what budget. The economic model behind those figures is in &lt;a href="https://blog.lo0.es/en/posts/finops-multi-tenancy-gpu-cluster-who-pays/">FinOps and multi-tenancy with LiteLLM&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>On a platform running on your own GPUs there is no provider invoice to put consumption in order. Capacity is fixed, known and shared, so someone has to impose the allocation, and that someone is the gateway.&lt;/p>
&lt;p>&lt;strong>The hierarchy has six levels&lt;/strong>: organisation, team, team member, internal user, key and end customer, plus the project and tag scopes. Each level&amp;rsquo;s budgets are evaluated &lt;strong>independently and all of them have to pass&lt;/strong>. They neither add up nor cancel each other out, with one exception.&lt;/p>
&lt;p>&lt;strong>The exception is in the code and it is the most important governance trap in the system.&lt;/strong> A key that belongs to a team suppresses the check of its owner&amp;rsquo;s personal budget, unless &lt;code>apply_user_budget_to_team_keys&lt;/code> is enabled. A user with a hundred-euro cap who works with their team&amp;rsquo;s key spends whatever the team allows.&lt;/p>
&lt;p>&lt;strong>Rotating a key preserves its spend.&lt;/strong> &lt;code>/key/regenerate&lt;/code> does an UPDATE on the same row changing the hash, so &lt;code>spend&lt;/code>, &lt;code>max_budget&lt;/code> and the budget window remain intact. It accepts a grace period, stored in a table of its own, and if the period&amp;rsquo;s format is wrong it is ignored without blocking anything.&lt;/p>
&lt;p>&lt;strong>The v3 limiter is already the default&lt;/strong> in 1.100.0, and you go back to the previous one with an environment variable. Its window is sliding, sixty seconds, anchored to the first request, and the counters are incremented with Lua scripts inside Redis using Redis&amp;rsquo;s own timestamp to close the race between replicas.&lt;/p>
&lt;p>And four points where the official documentation does not match the code, verified against tag v1.100.0: &lt;strong>an exhausted budget returns 429&lt;/strong>, not 400; &lt;strong>the audited actions are six&lt;/strong>, not three; &lt;code>/key/info&lt;/code> and &lt;code>/key/list&lt;/code> are &lt;strong>GET&lt;/strong>, not POST; and the v3 limiter carries a docstring saying it is not production-ready while it is the one loaded by default.&lt;/p>
&lt;h2 id="you-are-here-the-gateway-as-an-administrative-boundary">You are here: the gateway as an administrative boundary&lt;/h2>
&lt;p>Without this layer, an in-house inference platform has a single mode of operation: whoever knows the URL consumes. It works while there is one team. It stops working the day there are three, or the day someone connects an agent that fires twenty calls per interaction and wrecks everyone else&amp;rsquo;s time to first token.&lt;/p>
&lt;p>The two questions this layer answers are different and have to be kept apart. The &lt;strong>capacity&lt;/strong> one is instantaneous: how many requests and how many tokens per minute each consumer can push, so the fleet does not saturate and latency stays within the service agreement. The &lt;strong>cost&lt;/strong> one is cumulative: how much each consumer has spent this month against its budget. They are configured in the same place, applied at different moments and fail in different ways.&lt;/p>
&lt;h2 id="the-analogy-the-buildings-key-ring">The analogy: the building&amp;rsquo;s key ring&lt;/h2>
&lt;p>An office building hands out keys at three levels. The master opens everything and the building manager has it. The floor keys open a whole floor and each tenant company has one. And the office keys open one office.&lt;/p>
&lt;p>Three properties of that system are the ones that matter here. A key is replaced without changing the lock of the whole building, and the tenant keeps their parking space and their electricity meter: that is rotation preserving the spend. A lost key is cancelled from the central panel without collecting anything physical: that is blocking from the interface. And the record of who took out each key and when lives in a separate book, which is what you show an inspector: that is the audit table.&lt;/p>
&lt;p>The analogy breaks at one point, and that point is where this system&amp;rsquo;s governance flaw lives. In the building, having a floor key does not cancel the office&amp;rsquo;s consumption limit. In LiteLLM, it does.&lt;/p>
&lt;h2 id="the-hierarchy-and-the-line-that-breaks-it">The hierarchy, and the line that breaks it&lt;/h2>
&lt;p>The levels and their management endpoints:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Level&lt;/th>
&lt;th>Endpoints&lt;/th>
&lt;th>Budget&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Organisation&lt;/td>
&lt;td>&lt;code>/organization/new&lt;/code>, &lt;code>/organization/member_add&lt;/code>, …&lt;/td>
&lt;td>&lt;code>max_budget&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Team&lt;/td>
&lt;td>&lt;code>/team/new&lt;/code>, &lt;code>/team/member_add&lt;/code>, &lt;code>/team/block&lt;/code>, …&lt;/td>
&lt;td>&lt;code>max_budget&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Team member&lt;/td>
&lt;td>&lt;code>/team/member_add&lt;/code> with &lt;code>max_budget_in_team&lt;/code>&lt;/td>
&lt;td>Its own row in the budgets table&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Internal user&lt;/td>
&lt;td>&lt;code>/user/new&lt;/code>, &lt;code>/user/update&lt;/code>, …&lt;/td>
&lt;td>&lt;code>max_budget&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Key&lt;/td>
&lt;td>&lt;code>/key/generate&lt;/code>, &lt;code>/key/update&lt;/code>, …&lt;/td>
&lt;td>&lt;code>max_budget&lt;/code>, &lt;code>soft_budget&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>End customer&lt;/td>
&lt;td>&lt;code>/customer/new&lt;/code>, and the parallel &lt;code>/end_user/*&lt;/code> set&lt;/td>
&lt;td>&lt;code>max_budget&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The default behaviour is the right one for a multi-tenant platform: each scope carries its own counter and the check of each one is independent of the rest. A request passes if all of them pass.&lt;/p>
&lt;p>And then there is this condition, which lives in the authorisation checks:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">is_team_key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">team_object&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="kc">None&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">team_object&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">team_id&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="kc">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="n">is_team_key&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">general_settings&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;apply_user_budget_to_team_keys&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Translated: when the key belongs to a team, the check of the budget of the user who owns that key &lt;strong>returns without evaluating anything&lt;/strong>. The personal cap exists in the database, is visible in the interface, and is not applied.&lt;/p>
&lt;p>For a deployment where personal budgets are decorative, it makes no difference. For one where the per-person cap is the control that was shown to someone as a guarantee that a user cannot overrun the platform, it is a hole. The line that closes it is one:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">general_settings&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">apply_user_budget_to_team_keys&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="virtual-keys-the-complete-life-cycle">Virtual keys: the complete life cycle&lt;/h2>
&lt;p>The endpoints all exist and some of them are not where you expect:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Route&lt;/th>
&lt;th>Method&lt;/th>
&lt;th>What for&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>/key/generate&lt;/code>&lt;/td>
&lt;td>POST&lt;/td>
&lt;td>Create&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/key/update&lt;/code>&lt;/td>
&lt;td>POST&lt;/td>
&lt;td>Modify&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/key/info&lt;/code>&lt;/td>
&lt;td>&lt;strong>GET&lt;/strong>&lt;/td>
&lt;td>Query one&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/key/list&lt;/code>&lt;/td>
&lt;td>&lt;strong>GET&lt;/strong>&lt;/td>
&lt;td>List&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/key/delete&lt;/code>&lt;/td>
&lt;td>POST&lt;/td>
&lt;td>Delete&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/key/regenerate&lt;/code>&lt;/td>
&lt;td>POST&lt;/td>
&lt;td>Rotate&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/key/block&lt;/code>, &lt;code>/key/unblock&lt;/code>&lt;/td>
&lt;td>POST&lt;/td>
&lt;td>Suspend and reactivate&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/key/health&lt;/code>&lt;/td>
&lt;td>POST&lt;/td>
&lt;td>Check that key&amp;rsquo;s callbacks&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The two marked in bold are GET, and several examples in the documentation suggest otherwise. &lt;code>/key/health&lt;/code> is not what its name suggests either: it does not validate the key or its budget, it checks the logging callbacks associated with it.&lt;/p>
&lt;p>There are many creation parameters, and these are the ones that govern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST &lt;span class="s1">&amp;#39;https://gateway.interno/key/generate&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s1">&amp;#39;Authorization: Bearer sk-...&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;key_alias&amp;#34;: &amp;#34;equipo-datos-notebooks&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;team_id&amp;#34;: &amp;#34;t-datos&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;models&amp;#34;: [&amp;#34;llama-70b&amp;#34;, &amp;#34;qwen-30b&amp;#34;],
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;max_budget&amp;#34;: 250,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;budget_duration&amp;#34;: &amp;#34;30d&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;tpm_limit&amp;#34;: 400000,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;rpm_limit&amp;#34;: 600,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;max_parallel_requests&amp;#34;: 8,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;duration&amp;#34;: &amp;#34;90d&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;tags&amp;#34;: [&amp;#34;produccion&amp;#34;, &amp;#34;notebooks&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Alongside those there are controls that are rarely used and solve specific problems: &lt;code>model_max_budget&lt;/code> to set a per-model cap within the same key, &lt;code>model_tpm_limit&lt;/code> and &lt;code>model_rpm_limit&lt;/code> for the same thing with capacity, &lt;code>enforced_params&lt;/code> to require certain keys to always arrive with given fields, &lt;code>allowed_routes&lt;/code> so an application key cannot touch the management endpoints, and &lt;code>blocked&lt;/code> to be born suspended.&lt;/p>
&lt;h3 id="how-they-are-stored">How they are stored&lt;/h3>
&lt;p>A key&amp;rsquo;s hash is a single-pass hexadecimal SHA-256, with no salt and no derivation function:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">hashed_token&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sha256&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">token&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hexdigest&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The row lives in &lt;code>LiteLLM_VerificationToken&lt;/code>, with the hash as primary key, and it contains the accumulated spend, the limits, the expiry, the allowed models and the rest of the configuration.&lt;/p>
&lt;p>Two consequences to be clear about before an audit. The first is that this hash is not designed to resist a dictionary attack against the database, and the code itself acknowledges it in a comment about encryption key derivation, where it admits that a single-pass unsalted SHA-256 is not a derivation function and that moving to HKDF would be more defensible in an audit. The real mitigation is that virtual keys are generated with enough entropy, not the strength of the hash. The second is that &lt;code>LITELLM_SALT_KEY&lt;/code> &lt;strong>plays no part here&lt;/strong>: that variable encrypts the stored provider credentials, not the virtual keys.&lt;/p>
&lt;p>There is a trap around that variable that takes down a whole deployment. If it is not defined, it &lt;strong>falls back to the master key&lt;/strong>. Rotating &lt;code>LITELLM_MASTER_KEY&lt;/code> without having first set your own &lt;code>LITELLM_SALT_KEY&lt;/code> leaves every stored provider credential unreadable, and the failure does not block: it logs an error and returns null, so the symptom shows up as models that stop authenticating with no explanation. Setting &lt;code>LITELLM_SALT_KEY&lt;/code> on day one, and never touching it, is one of the things that saves the most grief.&lt;/p>
&lt;h3 id="rotation">Rotation&lt;/h3>
&lt;p>&lt;code>/key/regenerate&lt;/code> does not create a new key and delete the old one. It updates the same row changing the hash, so &lt;strong>the accumulated spend, the maximum budget and the reset window are preserved&lt;/strong>. For a monthly chargeback this is exactly what you want: rotating mid-month does not zero the counter.&lt;/p>
&lt;p>It also accepts a grace period, so the old key remains valid while consumers update:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST &lt;span class="s1">&amp;#39;https://gateway.interno/key/sk-vieja/regenerate&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s1">&amp;#39;Authorization: Bearer sk-...&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s1">&amp;#39;{&amp;#34;grace_period&amp;#34;: &amp;#34;24h&amp;#34;}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The old hash is stored in a separate table with its revocation date. Without that parameter, revocation is immediate, and the default value can be set with &lt;code>LITELLM_KEY_ROTATION_GRACE_PERIOD&lt;/code>.&lt;/p>
&lt;p>A detail with teeth: if the period&amp;rsquo;s format is wrong, the system logs a warning and &lt;strong>continues with no grace period&lt;/strong>. The rotation completes, the old key dies on the spot, and all that is left is a log line. In an automated rotation procedure, that combination of &amp;ldquo;carry on&amp;rdquo; and &amp;ldquo;warn in the log&amp;rdquo; is what produces the outage at three in the morning.&lt;/p>
&lt;h2 id="what-exactly-happens-when-a-budget-runs-out">What exactly happens when a budget runs out&lt;/h2>
&lt;p>The code raises &lt;code>BudgetExceededError&lt;/code> with &lt;strong>status 429&lt;/strong>. The documentation says 400 in one place, and there the code wins. Its being a 429 has a practical implication: OpenAI clients retry automatically on a 429, so an exhausted budget turns into a retry storm against a gateway that is going to keep rejecting. Internal clients should distinguish the reason, which travels in the message.&lt;/p>
&lt;p>The messages are templates and state the scope, the spend and the cap:&lt;/p>
&lt;pre tabindex="0">&lt;code>Budget has been exceeded! Key=&amp;lt;clave&amp;gt; Current cost: &amp;lt;gasto&amp;gt;, Max budget: &amp;lt;tope&amp;gt;
Budget has been exceeded! Team=&amp;lt;equipo&amp;gt; Current cost: &amp;lt;gasto&amp;gt;, Max budget: &amp;lt;tope&amp;gt;
ExceededBudget: User=&amp;lt;usuario&amp;gt; over budget. Spend=&amp;lt;gasto&amp;gt;, Budget=&amp;lt;tope&amp;gt;
ExceededBudget: End User=&amp;lt;cliente&amp;gt; over budget. Spend=&amp;lt;gasto&amp;gt;, Budget=&amp;lt;tope&amp;gt;
Budget has been exceeded! Organization=&amp;lt;org&amp;gt; ...
Budget has been exceeded! Tag=&amp;lt;etiqueta&amp;gt; ...
&lt;/code>&lt;/pre>&lt;p>Two clarifications about the comparison. It is &lt;code>spend &amp;gt;= cap&lt;/code>, with the equals sign included, so landing exactly on the cap already blocks. And the soft budget, &lt;code>soft_budget&lt;/code>, &lt;strong>blocks nothing&lt;/strong>: it only writes a log line when it is crossed. It serves to warn, not to contain, and building an alert on top of it is the right way to use it.&lt;/p>
&lt;p>The rest of the rejections, with their codes:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Situation&lt;/th>
&lt;th>Code&lt;/th>
&lt;th>Behaviour&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Budget exhausted&lt;/td>
&lt;td>429&lt;/td>
&lt;td>Message with scope, spend and cap&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Expired key&lt;/td>
&lt;td>401&lt;/td>
&lt;td>It also deletes the cache entry, so the expiry takes effect across the whole fleet without waiting for the TTL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Model not allowed&lt;/td>
&lt;td>403&lt;/td>
&lt;td>Different error type depending on the scope: key, team, user, organisation or project&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Blocked key&lt;/td>
&lt;td>Generic exception&lt;/td>
&lt;td>&lt;code>Key is blocked. Update via /key/unblock if you're an admin.&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The last row is an inconsistency in the project worth knowing about: blocking raises an exception with no explicit type or code, while expiry and model access do carry them. Any alert that discriminates by error type will not see blocks the way it sees the rest.&lt;/p>
&lt;p>A useful note about allowed models: the check accepts both the alias and the underlying model, so a key authorised for &lt;code>llama-70b&lt;/code> can call it by its alias or by its real name with no additional configuration.&lt;/p>
&lt;h2 id="capacity-limits-the-v3-limiter">Capacity limits: the v3 limiter&lt;/h2>
&lt;p>This is the most significant silent change of the year in this layer. In 1.100.0, the limiter loaded by default is the third version. Going back to the previous one has to be asked for explicitly:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">LEGACY_MULTI_INSTANCE_RATE_LIMITING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>There is no flag to turn it on, only to turn it off. And it carries a contradiction worth knowing before trusting it: the file itself still opens with a comment saying it is under development and not production-ready, while it is the one running. The design is avowedly inspired by Envoy&amp;rsquo;s.&lt;/p>
&lt;p>&lt;strong>The window is sliding and lasts sixty seconds&lt;/strong>, configurable with &lt;code>LITELLM_RATE_LIMIT_WINDOW_SIZE&lt;/code>. It is not an exact rolling log nor a clock-aligned window: it anchors to the first request and resets once the window size has elapsed from that moment. For one-minute limits, the difference from a calendar window shows up at the edges and rarely matters.&lt;/p>
&lt;p>What does matter is Redis. The counters are incremented with Lua scripts executed inside Redis, using Redis&amp;rsquo;s own timestamp and not the pod&amp;rsquo;s, precisely so window resets are deterministic across replicas and to close the race between checking and counting. Without Redis, &lt;strong>each pod counts on its own and the effective limit is multiplied by the number of pods&lt;/strong>. A limit of 600 requests per minute with five replicas is a limit of 3,000.&lt;/p>
&lt;p>There is an inherent imprecision in the token limits that Redis does not solve. The number of output tokens is not known until the response finishes, so the limiter counts with an estimate before the call and reconciles afterwards. The possible excess is, per in-flight request, the difference between the estimate and the real figure. With high concurrency and long responses, that allows the cap to be exceeded within a window. To protect the fleet, the concurrent request limit (&lt;code>max_parallel_requests&lt;/code>) is a more direct instrument than tokens per minute.&lt;/p>
&lt;h3 id="what-the-client-sees">What the client sees&lt;/h3>
&lt;p>When limited, a 429 with the message giving the scope, the current limit, what is left and when it resets. And three headers: &lt;code>retry-after&lt;/code> with the window size, that is &lt;code>60&lt;/code> by default, plus &lt;code>rate_limit_type&lt;/code> and &lt;code>reset_at&lt;/code>.&lt;/p>
&lt;p>On the success path, the informational headers use a nested format of their own:&lt;/p>
&lt;pre tabindex="0">&lt;code>x-ratelimit-api_key-remaining-requests
x-ratelimit-api_key-limit-tokens
x-ratelimit-team-remaining-requests
&lt;/code>&lt;/pre>&lt;p>&lt;strong>They are not the standard names&lt;/strong> &lt;code>x-ratelimit-limit-requests&lt;/code> that OpenAI and compatibles emit, so a client expecting the usual format will find nothing. There is also an open issue about these headers being lost on streaming responses, which is most of an assistant&amp;rsquo;s traffic.&lt;/p>
&lt;h2 id="identity-beyond-the-static-key">Identity: beyond the static key&lt;/h2>
&lt;p>Handing out keys by hand works with three teams and stops working with thirty. The two routes for connecting the gateway to corporate identity:&lt;/p>
&lt;p>&lt;strong>JWT.&lt;/strong> It is enabled with &lt;code>enable_jwt_auth&lt;/code> and configured with the &lt;code>litellm_jwtauth&lt;/code> block, which maps token fields to LiteLLM entities: the team comes from &lt;code>team_id_jwt_field&lt;/code>, the user from &lt;code>user_id_jwt_field&lt;/code>, the organisation from &lt;code>org_id_jwt_field&lt;/code>. It supports dot notation for nested claims, automatic creation of users and teams with &lt;code>user_id_upsert&lt;/code> and &lt;code>team_id_upsert&lt;/code>, role-based access control with &lt;code>enforce_rbac&lt;/code>, per-team model restriction with &lt;code>enforce_team_based_model_access&lt;/code>, and several issuers at once. The issuer&amp;rsquo;s public key is cached with a TTL of 600 seconds by default.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">general_settings&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">enable_jwt_auth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">litellm_jwtauth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">team_id_jwt_field&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;groups&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">user_id_jwt_field&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;sub&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">user_email_jwt_field&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;email&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">enforce_rbac&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">enforce_team_based_model_access&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">team_id_upsert&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>OIDC for the admin interface.&lt;/strong> With Keycloak you use the generic provider, and the variables are &lt;code>PROXY_BASE_URL&lt;/code>, &lt;code>GENERIC_CLIENT_ID&lt;/code>, &lt;code>GENERIC_CLIENT_SECRET&lt;/code>, &lt;code>GENERIC_AUTHORIZATION_ENDPOINT&lt;/code>, &lt;code>GENERIC_TOKEN_ENDPOINT&lt;/code>, &lt;code>GENERIC_USERINFO_ENDPOINT&lt;/code>, plus a set of attributes to map the identifier, the email, the name and the role, and &lt;code>GENERIC_ROLE_MAPPINGS_*&lt;/code> to translate Keycloak groups into LiteLLM roles. Login is rate-limited and sessions have a TTL of their own.&lt;/p>
&lt;p>For automatic provisioning there is SCIM in the enterprise version, with base &lt;code>/scim/v2&lt;/code>, and deprovisioning a user blocks their keys and takes them out of the authentication cache. That part is not in the open tree, so it cannot be verified against the code.&lt;/p>
&lt;p>This fits with the identity work already covered in &lt;a href="https://blog.lo0.es/en/posts/hardening-secrets-sovereign-llm-stack-defence-in-depth/">hardening and secrets of the sovereign stack&lt;/a> and in the article on &lt;a href="https://blog.lo0.es/en/posts/mcp-grows-up-authentication-keycloak/">MCP authentication with Keycloak&lt;/a>, which uses the same issuer.&lt;/p>
&lt;h2 id="audit-what-gets-recorded">Audit: what gets recorded&lt;/h2>
&lt;p>The table is &lt;code>LiteLLM_AuditLog&lt;/code> and its columns are what you would expect from a change log:&lt;/p>
&lt;pre tabindex="0">&lt;code>id, updated_at, changed_by, changed_by_api_key,
action, table_name, object_id, before_value, updated_values
&lt;/code>&lt;/pre>&lt;p>It stores the previous value and the new one, and attributes the change to an actor and to the key it was made with.&lt;/p>
&lt;p>Three clarifications the documentation does not capture well.&lt;/p>
&lt;p>&lt;strong>The actions are six, in the past tense&lt;/strong>: &lt;code>created&lt;/code>, &lt;code>updated&lt;/code>, &lt;code>deleted&lt;/code>, &lt;code>blocked&lt;/code>, &lt;code>unblocked&lt;/code> and &lt;code>rotated&lt;/code>. The documentation mentions three. That blocking, unblocking and rotation are actions in their own right is exactly what is needed to reconstruct a credential&amp;rsquo;s life cycle for an auditor.&lt;/p>
&lt;p>&lt;strong>The scope is wider than advertised.&lt;/strong> Besides teams, users, keys and models, changes to the proxy configuration and to the SSO configuration are audited. A change of identity issuer is recorded.&lt;/p>
&lt;p>&lt;strong>The default depends on the licence.&lt;/strong> The resolution order is &lt;code>litellm_settings.store_audit_logs&lt;/code>, then the variable &lt;code>LITELLM_STORE_AUDIT_LOGS&lt;/code>, and if neither is set, it stays &lt;strong>enabled in enterprise and disabled in the open version&lt;/strong>. An OSS deployment that assumes there is an audit trail does not have one:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">litellm_settings&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">store_audit_logs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Two more pieces for a serious chain of evidence. The actor attribution can be passed with the &lt;code>LiteLLM-Changed-By&lt;/code> header, and its use is restricted by the key&amp;rsquo;s or the team&amp;rsquo;s configuration, so any caller cannot forge it. And the events can be shipped out with &lt;code>audit_log_callbacks&lt;/code> and its S3 parameters, which is what allows depositing them in an immutable store with object lock.&lt;/p>
&lt;p>That last part is what turns the record into evidence. The Postgres table is mutable by anyone with database access, and as of September 2026 it has no indexes, so querying it by date range over a long history will not be comfortable either.&lt;/p>
&lt;h2 id="what-this-demonstrates-to-an-auditor-and-what-it-does-not">What this demonstrates to an auditor, and what it does not&lt;/h2>
&lt;p>This is the part that decides whether the setup is good enough for a regulated customer. With everything above configured, the platform sustains without difficulty:&lt;/p>
&lt;p>&lt;strong>Access control via corporate identity&lt;/strong>, with onboarding and offboarding in the identity provider and not in the gateway, and with the role determining which models are reachable. &lt;strong>Segregation between tenants&lt;/strong>, with independent counters per organisation, team and person. &lt;strong>Traceability of administrative changes&lt;/strong>, with actor, time, previous value and new value, exportable to an immutable store. And &lt;strong>demonstrable consumption limits&lt;/strong>, with the evidence of the rejection in the spend log.&lt;/p>
&lt;p>What it does not cover, and has to be solved elsewhere:&lt;/p>
&lt;p>&lt;strong>The record of the interactions&lt;/strong> is not this. The audit table records configuration changes, not model calls. The calls are in the spend log and in the traces, and traces are best-effort, which is the discussion in the &lt;a href="https://blog.lo0.es/en/posts/litellm-langfuse-operational-pair/">first article in the series&lt;/a>.&lt;/p>
&lt;p>&lt;strong>The integrity of the record&lt;/strong> is not something Postgres provides. Without export to immutable storage, the evidence is only as strong as the database permissions.&lt;/p>
&lt;p>&lt;strong>The content of the prompts&lt;/strong> is a separate problem, with its own personal-data treatment and its own decision about whether it is stored, masked or not logged at all.&lt;/p>
&lt;p>And a warning about the control that tends to be shown first: while &lt;code>apply_user_budget_to_team_keys&lt;/code> is not enabled, the per-person cap is not being applied to team keys. Showing that field in the interface as proof of a control that is not executed is the kind of finding a competent auditor discovers. The complete control mapping is in &lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">ENS, ISO 42001 and the EU AI Act&lt;/a>.&lt;/p>
&lt;h2 id="checklist">Checklist&lt;/h2>
&lt;ol>
&lt;li>&lt;code>apply_user_budget_to_team_keys: true&lt;/code> if personal budgets have to be enforced.&lt;/li>
&lt;li>&lt;code>LITELLM_SALT_KEY&lt;/code> set on day one, different from the master key and never rotated lightly.&lt;/li>
&lt;li>&lt;code>store_audit_logs: true&lt;/code> explicitly, without trusting the default.&lt;/li>
&lt;li>&lt;code>audit_log_callbacks&lt;/code> towards an immutable store if an audit has to be sustained.&lt;/li>
&lt;li>Redis mandatory if there is more than one replica, or the limits get multiplied by the number of pods.&lt;/li>
&lt;li>&lt;code>max_parallel_requests&lt;/code> per key, on top of the per-minute limits, to protect the fleet from a runaway agent.&lt;/li>
&lt;li>&lt;code>allowed_routes&lt;/code> on application keys, so they cannot reach the management endpoints.&lt;/li>
&lt;li>&lt;code>soft_budget&lt;/code> with an alert on top, understanding that it does not block.&lt;/li>
&lt;li>Rotation with a verified &lt;code>grace_period&lt;/code>, because an invalid format revokes on the spot.&lt;/li>
&lt;li>JWT against Keycloak as soon as there are more than a handful of teams, with &lt;code>enforce_rbac&lt;/code> and &lt;code>enforce_team_based_model_access&lt;/code>.&lt;/li>
&lt;/ol>
&lt;h2 id="traps-and-things-that-are-not-what-they-look-like">Traps and things that are not what they look like&lt;/h2>
&lt;p>&lt;strong>A user&amp;rsquo;s cap is not enforced.&lt;/strong> They are using a team key and &lt;code>apply_user_budget_to_team_keys&lt;/code> is missing.&lt;/p>
&lt;p>&lt;strong>Clients retry in a loop against an exhausted budget.&lt;/strong> The code is 429 and the OpenAI libraries retry 429s automatically.&lt;/p>
&lt;p>&lt;strong>The soft budget has stopped nothing.&lt;/strong> It does not block, it only logs.&lt;/p>
&lt;p>&lt;strong>The per-minute limits are enforced at double or triple.&lt;/strong> There is no Redis, and each replica keeps its own count.&lt;/p>
&lt;p>&lt;strong>The client does not see the limit headers.&lt;/strong> The names are nested and proprietary, and in streaming there is an open issue where they get lost.&lt;/p>
&lt;p>&lt;strong>There is no audit log.&lt;/strong> It is an OSS deployment and the default there is disabled.&lt;/p>
&lt;p>&lt;strong>The models stop authenticating after rotating the master key.&lt;/strong> There was no fixed &lt;code>LITELLM_SALT_KEY&lt;/code>, and the encrypted provider credentials can no longer be decrypted.&lt;/p>
&lt;p>&lt;strong>The rotation cut the service on the spot.&lt;/strong> The &lt;code>grace_period&lt;/code> carried a format the system did not understand and it carried on without it.&lt;/p>
&lt;p>&lt;strong>Blocking a key does not fire the alert.&lt;/strong> It is raised as a generic exception, without the type that expiry and model access do carry.&lt;/p>
&lt;h2 id="closing">Closing&lt;/h2>
&lt;p>The keys and budgets layer is the one that turns a shared URL into a platform with tenants. It is well solved in LiteLLM and has more depth than the documentation suggests, with per-model budgets inside a key, multiple budget windows, per-tag limits and rotation that preserves the history.&lt;/p>
&lt;p>Out of the whole article, two things take the attention. The &lt;code>apply_user_budget_to_team_keys&lt;/code> line, because it is the difference between having a control and believing you have one. And setting &lt;code>LITELLM_SALT_KEY&lt;/code>, because its default turns a routine rotation of the master key into an outage that is hard to diagnose. Both are one line of configuration and both are discovered late.&lt;/p>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/humans-agents-same-gateway-priority-traffic-separation/">Humans and agents on the same gateway&lt;/a> — what happens to these limits when the caller is an agentic loop, and why &lt;code>max_parallel_requests&lt;/code> is only applied on the key.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/litellm-langfuse-operational-pair/">LiteLLM and Langfuse: the operational pair&lt;/a> — where the traces of all this end up, and why the audit record cannot lean on them.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/litellm-day-2-high-availability/">LiteLLM on day 2: high availability&lt;/a> — the Redis taken as given here, and the Postgres arithmetic that sustains the spend table.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/finops-multi-tenancy-gpu-cluster-who-pays/">FinOps and GPU multi-tenancy with LiteLLM&lt;/a> — where the figures that go into &lt;code>max_budget&lt;/code> come from, and the difference between showback and chargeback.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/gpu-hour-to-cost-per-token-on-prem-vs-cloud/">From GPU-hour to cost per token and per request&lt;/a> — the conversion that gives meaning to a budget in euros on your own GPU.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">Technical controls: ENS, ISO 42001 and the EU AI Act&lt;/a> — the complete mapping, of which this article covers the access control and administrative traceability part.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/hardening-secrets-sovereign-llm-stack-defence-in-depth/">Hardening and secrets of the sovereign stack&lt;/a> — the management of &lt;code>LITELLM_SALT_KEY&lt;/code> and of the rest of the deployment&amp;rsquo;s secrets.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mcp-grows-up-authentication-keycloak/">When MCP grows: authentication with Keycloak&lt;/a> — the same identity issuer, applied to the platform&amp;rsquo;s other front door.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/keycloak-identity-plane-ai-platform/">Keycloak in an AI platform&lt;/a> — the alternative to these keys, and why a long-lived key decouples identity from the provider.&lt;/li>
&lt;/ul>
&lt;h2 id="sources">Sources&lt;/h2>
&lt;ul>
&lt;li>LiteLLM, &lt;em>Virtual Keys&lt;/em> (parámetros de creación, ciclo de vida, rotación): &lt;a href="https://docs.litellm.ai/docs/proxy/virtual_keys">https://docs.litellm.ai/docs/proxy/virtual_keys&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;em>Budgets, Rate Limits&lt;/em> (jerarquía, presupuestos por nivel, clientes finales): &lt;a href="https://docs.litellm.ai/docs/proxy/users">https://docs.litellm.ai/docs/proxy/users&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;em>JWT Token Auth&lt;/em> (bloque &lt;code>litellm_jwtauth&lt;/code> y todos sus campos): &lt;a href="https://docs.litellm.ai/docs/proxy/token_auth">https://docs.litellm.ai/docs/proxy/token_auth&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;em>Audit Logs&lt;/em> y administración múltiple (la cabecera &lt;code>LiteLLM-Changed-By&lt;/code>): &lt;a href="https://docs.litellm.ai/docs/proxy/multiple_admins">https://docs.litellm.ai/docs/proxy/multiple_admins&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;em>SCIM&lt;/em> (aprovisionamiento automático, versión enterprise): &lt;a href="https://docs.litellm.ai/docs/tutorials/scim_litellm">https://docs.litellm.ai/docs/tutorials/scim_litellm&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;code>litellm/proxy/auth/auth_checks.py&lt;/code> en la etiqueta v1.100.0 (la condición de &lt;code>apply_user_budget_to_team_keys&lt;/code> y los mensajes de presupuesto agotado): &lt;a href="https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/auth/auth_checks.py">https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/auth/auth_checks.py&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;code>litellm/proxy/management_endpoints/key_management_endpoints.py&lt;/code> en v1.100.0 (rutas, rotación sobre la misma fila, periodo de gracia): &lt;a href="https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/management_endpoints/key_management_endpoints.py">https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/management_endpoints/key_management_endpoints.py&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;code>litellm/proxy/hooks/parallel_request_limiter_v3.py&lt;/code> y &lt;code>litellm/proxy/hooks/__init__.py&lt;/code> en v1.100.0 (el limitador v3 como valor por defecto, la ventana, los scripts Lua): &lt;a href="https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/hooks/parallel_request_limiter_v3.py">https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/hooks/parallel_request_limiter_v3.py&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;code>litellm/exceptions.py&lt;/code> en v1.100.0 (&lt;code>BudgetExceededError&lt;/code> con código 429): &lt;a href="https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/exceptions.py">https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/exceptions.py&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;code>litellm/proxy/common_utils/encrypt_decrypt_utils.py&lt;/code> en v1.100.0 (&lt;code>LITELLM_SALT_KEY&lt;/code> cayendo en la clave maestra, y el comentario sobre la derivación de claves): &lt;a href="https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/common_utils/encrypt_decrypt_utils.py">https://github.com/BerriAI/litellm/blob/v1.100.0/litellm/proxy/common_utils/encrypt_decrypt_utils.py&lt;/a>.&lt;/li>
&lt;li>LiteLLM, &lt;code>schema.prisma&lt;/code> en v1.100.0 (&lt;code>LiteLLM_VerificationToken&lt;/code>, &lt;code>LiteLLM_AuditLog&lt;/code>, la tabla de claves deprecadas): &lt;a href="https://github.com/BerriAI/litellm/blob/v1.100.0/schema.prisma">https://github.com/BerriAI/litellm/blob/v1.100.0/schema.prisma&lt;/a>.&lt;/li>
&lt;li>LiteLLM, issue #27748 — cabeceras &lt;code>x-ratelimit-*&lt;/code> perdidas en respuestas en streaming con el limitador v3: &lt;a href="https://github.com/BerriAI/litellm/issues/27748">https://github.com/BerriAI/litellm/issues/27748&lt;/a>.&lt;/li>
&lt;/ul></description></item><item><title>Technical controls: the ENS × ISO 42001 × EU AI Act cross-mapping over the on-premise LLM architecture</title><link>https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/</link><pubDate>Mon, 01 Jun 2026 06:30:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/</guid><description>&lt;blockquote>
&lt;p>Third post in the blog&amp;rsquo;s AI governance trilogy. The first, &lt;a href="https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/">ISO/IEC 42001&lt;/a>, broke down the certifiable management system. The second, &lt;a href="https://blog.lo0.es/en/posts/eu-ai-act-technical-dossier-on-premise-llm-architecture/">EU AI Act&lt;/a>, broke down the directly applicable legal regulation. This one covers the third framework that appears when the client is a Spanish public administration or an essential-services entity: the ENS (Esquema Nacional de Seguridad, Spain&amp;rsquo;s national security framework, Royal Decree 311/2022). The editorial challenge: triple compliance is not the arithmetic sum of three jobs; it is one single set of technical evidence labelled for three lenses. This post takes apart how that evidence is built, measure by ENS measure.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Royal Decree 311/2022 updated the Spanish Esquema Nacional de Seguridad (ENS), aligning it with NIS2 and with the modern cyber-threat landscape. It applies mandatorily to the entire Spanish public sector (central, regional and local administration, universities, autonomous bodies) and to suppliers that provide IT services to them. The framework defines 74 security measures organised into three blocks (organisational framework &lt;code>org&lt;/code>, operational framework &lt;code>op&lt;/code>, protection measures &lt;code>mp&lt;/code>), three application categories (Basic / Medium / High) according to the assessment of five dimensions (Confidentiality, Integrity, Traceability, Authenticity, Availability), and an Annex II with the measure × category matrix that dictates what is required at each level. This post maps the technical measures relevant to LLM systems (those of the &lt;code>op&lt;/code> block: planning, access control, operation, external services, continuity, monitoring; and those of the &lt;code>mp&lt;/code> block: communications, applications, information, services) against Annex A of ISO/IEC 42001 and the operational articles of the EU AI Act (Arts. 9 to 15, 17, 72 and 73), and shows that the overlap is massive: a single technical artefact from the blog&amp;rsquo;s OSS stack, the OTel spans of &lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">tracing&lt;/a>, the datasets versioned with &lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">DVC&lt;/a>, the &lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a> scanners, the &lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">guardrail&lt;/a> decisions, the incidents of the &lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">retrain&lt;/a> loop, simultaneously satisfies ENS measures, 42001 controls and AI Act articles, provided it is labelled with the correct codes from the moment it is captured. The editorial thesis: the difference between a system that passes all three audits and one that suffers three separate certifications is not budget, it is disciplined labelling and a common vocabulary. The post builds the master table of triple compliance, walks through the case of the multi-tenant chatbot for a High-category public administration as a live checklist, and closes with the five traps of triple compliance.&lt;/p>
&lt;h2 id="the-analogy-the-triple-inspection-of-a-critical-building">The analogy: the triple inspection of a critical building&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 380" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Triple inspection of a critical building — ENS + ISO 42001 + EU AI Act">
&lt;style>
.t-build{fill:#7aafff;stroke:#444;stroke-width:1.4;rx:8}
.t-ens{fill:#ffd76b;stroke:#444;stroke-width:1.4;rx:8}
.t-42001{fill:#a8e6a3;stroke:#444;stroke-width:1.4;rx:8}
.t-aia{fill:#ff8a4c;stroke:#444;stroke-width:1.4;rx:8}
.t-evi{fill:#c8b8ff;stroke:#444;stroke-width:1.4;rx:8}
.tl{font:600 13px sans-serif;fill:#222}
.ts{font:400 11px sans-serif;fill:#555}
.tn{font:italic 11px sans-serif;fill:#555}
.tar{stroke:#666;stroke-width:1.6;fill:none;marker-end:url(#mt3)}
.tcb{stroke:#7a5;stroke-width:1.4;fill:none;stroke-dasharray:5 3}
&lt;/style>
&lt;defs>&lt;marker id="mt3" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#666"/>&lt;/marker>&lt;/defs>
&lt;rect x="280" y="20" width="260" height="80" class="t-build"/>
&lt;text x="410" y="44" text-anchor="middle" class="tl">On-premise AI system&lt;/text>
&lt;text x="410" y="62" text-anchor="middle" class="ts">LLM platform with pipeline, guardrails,&lt;/text>
&lt;text x="410" y="76" text-anchor="middle" class="ts">tracing, retrain, curated RAG, evals&lt;/text>
&lt;text x="410" y="92" text-anchor="middle" class="ts">(the critical building)&lt;/text>
&lt;rect x="20" y="160" width="220" height="80" class="t-ens"/>
&lt;text x="130" y="184" text-anchor="middle" class="tl">ENS inspector&lt;/text>
&lt;text x="130" y="202" text-anchor="middle" class="ts">RD 311/2022 · CCN-CERT&lt;/text>
&lt;text x="130" y="218" text-anchor="middle" class="ts">74 measures in 3 blocks&lt;/text>
&lt;text x="130" y="232" text-anchor="middle" class="ts">Basic/Medium/High categories&lt;/text>
&lt;rect x="300" y="160" width="220" height="80" class="t-42001"/>
&lt;text x="410" y="184" text-anchor="middle" class="tl">ISO/IEC 42001 inspector&lt;/text>
&lt;text x="410" y="202" text-anchor="middle" class="ts">7 clauses + 38 Annex A controls&lt;/text>
&lt;text x="410" y="218" text-anchor="middle" class="ts">Certification body&lt;/text>
&lt;text x="410" y="232" text-anchor="middle" class="ts">3-year cycle + annual surveillance&lt;/text>
&lt;rect x="580" y="160" width="220" height="80" class="t-aia"/>
&lt;text x="690" y="184" text-anchor="middle" class="tl">EU AI Act inspector&lt;/text>
&lt;text x="690" y="202" text-anchor="middle" class="ts">Reg. 2024/1689 — high risk&lt;/text>
&lt;text x="690" y="218" text-anchor="middle" class="ts">National surveillance authority&lt;/text>
&lt;text x="690" y="232" text-anchor="middle" class="ts">Annex IV dossier + CE marking&lt;/text>
&lt;path class="tar" d="M340,100 L150,158"/>
&lt;path class="tar" d="M410,100 L410,158"/>
&lt;path class="tar" d="M480,100 L670,158"/>
&lt;rect x="160" y="280" width="500" height="80" class="t-evi"/>
&lt;text x="410" y="304" text-anchor="middle" class="tl">One single set of technical evidence labelled for three lenses&lt;/text>
&lt;text x="410" y="322" text-anchor="middle" class="ts">OTel `gen_ai.*` spans + DVC + Vault Anonymize + Langfuse + retrain incidents&lt;/text>
&lt;text x="410" y="338" text-anchor="middle" class="ts">→ tag with ENS code (op.exp.8) + 42001 code (A.8.2) + AI Act article (Art. 12) in metadata&lt;/text>
&lt;path class="tcb" d="M130,240 L300,280"/>
&lt;path class="tcb" d="M410,240 L410,280"/>
&lt;path class="tcb" d="M690,240 L520,280"/>
&lt;text x="410" y="375" text-anchor="middle" class="tn">The building is one. The inspectors are three. Evidence is labelled so each of them finds their part in the same drawer.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>A critical building, say the control centre of a regional electricity grid, a reference hospital, or a 112 emergency response centre, goes through three different inspections of the same physical elements:&lt;/p>
&lt;ul>
&lt;li>The regional inspection reviews the planning permit, local fire regulations and accessibility under regional legislation.&lt;/li>
&lt;li>The European inspection reviews CE marking of equipment and conformity with EU directives on energy efficiency.&lt;/li>
&lt;li>The ISO quality inspection reviews processes and maintenance under a management standard.&lt;/li>
&lt;/ul>
&lt;p>All three inspectors look at the same fire detector hanging from the ceiling. The regional one wants to see the installation certificate with the installer company&amp;rsquo;s number; the European one wants to see the CE mark stamped on the casing; the ISO one wants to see the monthly maintenance record with signatures. There is only one detector. The evidence each inspector needs is different. If the building management team kept one folder per inspector, the installation certificate, the photo of the CE mark and the maintenance sheet would live in three places, and on audit day inconsistencies between the three folders would surface. The professional way to operate: one single file per asset, with tags pointing at the three sets of legislation.&lt;/p>
&lt;p>The on-premise LLM system is that critical building. The OTel spans from &lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">tracing&lt;/a> are the fire detector: a single technical piece that satisfies ENS measure op.exp.8 (activity logging), 42001 control A.8.2 (information to interested parties), and EU AI Act article 12 (record-keeping) provided the spans carry the correct metadata: &lt;code>traceparent&lt;/code> propagated, &lt;code>gen_ai.*&lt;/code> semantic conventions, WORM retention, PII redacted by LLM Guard Vault. Without consistent labelling from capture onwards, audit day produces three folders that do not add up.&lt;/p>
&lt;p>The analogy matters because it bounds an architectural decision: labelling evidence is not a compliance topic, it is a technical design topic. It is decided when the OTel Collector is set up, when the Vault schema is designed, when the format of retrain incidents is agreed. Postpone it, and the debt compounds.&lt;/p>
&lt;h2 id="ens-in-15-seconds">ENS in 15 seconds&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Regulatory framework&lt;/strong>: Royal Decree 311/2022, of 3 May, in force since 5 May 2022. It replaces RD 3/2010. It implements the update of the Esquema with NIS2, the NCS (Estrategia Nacional de Ciberseguridad, Spain&amp;rsquo;s national cybersecurity strategy) and the post-2020 reality.&lt;/li>
&lt;li>&lt;strong>Mandatory scope&lt;/strong>: the Spanish public sector (central, regional and local administration, universities, autonomous bodies), public-sector entities with their own legal personality, and private suppliers that provide IT services to them (a very important clause in consultancy: if your client is the Junta de Andalucía, the Comunidad de Madrid or Bilbao City Council, you fall under ENS by contractual extension).&lt;/li>
&lt;li>&lt;strong>Operational applicability in 2026&lt;/strong>: any AI project financed with NextGenerationEU European funds, plus any project with public data, plus any integration with electronic administrative systems.&lt;/li>
&lt;li>&lt;strong>Categorisation&lt;/strong>: three categories, Basic / Medium / High, according to the assessment of the five dimensions (C, I, T, A, D). The category dictates which measures are required and at what depth.&lt;/li>
&lt;li>&lt;strong>Certification&lt;/strong>: for Medium and High categories, a formal audit by an accredited body. For Basic category, self-assessment. Certification cycle is biennial.&lt;/li>
&lt;li>&lt;strong>Authority&lt;/strong>: the Centro Criptológico Nacional (CCN-CERT, Spain&amp;rsquo;s national cryptologic centre), part of the CNI intelligence agency. It maintains the ens.ccn.cni.es portal with the STIC guides (800 series).&lt;/li>
&lt;li>&lt;strong>Total number of measures&lt;/strong>: 74, organised into three blocks, plus Annex II with the measure × category matrix that defines what applies at each level.&lt;/li>
&lt;/ul>
&lt;h2 id="the-five-security-dimensions-and-their-ai-mapping">The five security dimensions and their AI mapping&lt;/h2>
&lt;p>To classify the system as Basic / Medium / High, the ENS requires each dimension to be rated on a scale (not applicable / low / medium / high). The final category is the highest of the five. For LLM systems, the typical rating:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Dimension&lt;/th>
&lt;th>Meaning&lt;/th>
&lt;th>Typical LLM rating&lt;/th>
&lt;th>Reason&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>C&lt;/strong> Confidentiality&lt;/td>
&lt;td>Information protected from disclosure&lt;/td>
&lt;td>Medium-High&lt;/td>
&lt;td>PII in prompts, secrets in context, intellectual property in the RAG corpus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>I&lt;/strong> Integrity&lt;/td>
&lt;td>Information protected from modification&lt;/td>
&lt;td>Medium-High&lt;/td>
&lt;td>An altered RAG corpus produces false answers; a manipulated model produces directed bias&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>T&lt;/strong> Traceability&lt;/td>
&lt;td>Actions attributable to users&lt;/td>
&lt;td>High&lt;/td>
&lt;td>Audit: who asked what, when, what were they answered, which dataset trained the model?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>A&lt;/strong> Authenticity&lt;/td>
&lt;td>Identity of users and origin of information&lt;/td>
&lt;td>Medium&lt;/td>
&lt;td>Robust authentication plus identification of chunks by source&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>D&lt;/strong> Availability&lt;/td>
&lt;td>Service available when needed&lt;/td>
&lt;td>Medium&lt;/td>
&lt;td>Typical SLA, known recovery time&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Typical result&lt;/strong>: Medium category for internal LLM systems with no sensitive data, High if they handle PII or regulated sectoral data (health, tax, judicial). The category triggers different controls.&lt;/p>
&lt;h2 id="the-three-blocks-of-measures">The three blocks of measures&lt;/h2>
&lt;p>&lt;strong>Organisational framework (&lt;code>org&lt;/code>)&lt;/strong>, 4 measures that always apply, transversal:&lt;/p>
&lt;ul>
&lt;li>&lt;code>org.1&lt;/code> Security policy&lt;/li>
&lt;li>&lt;code>org.2&lt;/code> Security regulations&lt;/li>
&lt;li>&lt;code>org.3&lt;/code> Security procedures&lt;/li>
&lt;li>&lt;code>org.4&lt;/code> Authorisation process&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Operational framework (&lt;code>op&lt;/code>)&lt;/strong>, 31 measures in 6 subgroups, these are how it is operated:&lt;/p>
&lt;ul>
&lt;li>&lt;code>op.pl&lt;/code> Planning (5)&lt;/li>
&lt;li>&lt;code>op.acc&lt;/code> Access control (6)&lt;/li>
&lt;li>&lt;code>op.exp&lt;/code> Operation (10)&lt;/li>
&lt;li>&lt;code>op.ext&lt;/code> External services (4)&lt;/li>
&lt;li>&lt;code>op.cont&lt;/code> Service continuity (4)&lt;/li>
&lt;li>&lt;code>op.mon&lt;/code> System monitoring (2)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Protection measures (&lt;code>mp&lt;/code>)&lt;/strong>, 39 measures in 7 subgroups, these are what is protected:&lt;/p>
&lt;ul>
&lt;li>&lt;code>mp.if&lt;/code> Facility protection (7)&lt;/li>
&lt;li>&lt;code>mp.per&lt;/code> Personnel management (4)&lt;/li>
&lt;li>&lt;code>mp.eq&lt;/code> Equipment protection (4)&lt;/li>
&lt;li>&lt;code>mp.com&lt;/code> Communications protection (4)&lt;/li>
&lt;li>&lt;code>mp.si&lt;/code> Information media protection (5)&lt;/li>
&lt;li>&lt;code>mp.sw&lt;/code> Application protection (2)&lt;/li>
&lt;li>&lt;code>mp.info&lt;/code> Information protection (6)&lt;/li>
&lt;li>&lt;code>mp.s&lt;/code> Service protection (4)&lt;/li>
&lt;/ul>
&lt;p>Of those 74, roughly 25 matter operationally for LLM systems. The rest are either transversal (policies, personnel management, physical facilities) or specific to other layers (telephony, physical media in the literal sense). The rest of this post drops down to the 25 relevant ones.&lt;/p>
&lt;h2 id="technical-mapping-key-ens-measures--42001-controls--eu-ai-act-articles">Technical mapping: key ENS measures × 42001 controls × EU AI Act articles&lt;/h2>
&lt;p>What follows, by ENS subgroup, are the measures relevant to LLM with their cross-mapping. The Technical evidence from the blog column points to the operational artefact that materialises the measure.&lt;/p>
&lt;h3 id="operational-framework--planning-oppl">Operational framework — planning (&lt;code>op.pl&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>op.pl.1&lt;/code> Risk analysis&lt;/td>
&lt;td>Formal periodic analysis, MAGERIT or OCTAVE methodology&lt;/td>
&lt;td>A.5.4 (alignment with AI risk treatment)&lt;/td>
&lt;td>&lt;strong>Art. 9&lt;/strong> Risk management&lt;/td>
&lt;td>Risk document linked to the &lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">LLMOps pipeline&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">evals&lt;/a> metrics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.pl.2&lt;/code> Security architecture&lt;/td>
&lt;td>Architecture documentation, layer segregation&lt;/td>
&lt;td>A.4.2 documented info&lt;/td>
&lt;td>Art. 15 (technical robustness)&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Seven stack layers&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">seven deployment phases&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.pl.3&lt;/code> Acquisition&lt;/td>
&lt;td>Acquisition criteria that include security&lt;/td>
&lt;td>A.10.3 suppliers&lt;/td>
&lt;td>Art. 53 (GPAI obligations)&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">OSS vs hyperscalers&lt;/a> lock-in analysis + copyright analysis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.pl.4&lt;/code> Sizing&lt;/td>
&lt;td>Capacity to support the expected load&lt;/td>
&lt;td>A.4.5 system resources&lt;/td>
&lt;td>Art. 15 (consistent performance)&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/five-maturity-levels-platform-under-llm/">Five maturity levels&lt;/a> + GPU capacity study&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.pl.5&lt;/code> Certified components&lt;/td>
&lt;td>Preference for certified components&lt;/td>
&lt;td>A.10.5 third parties&lt;/td>
&lt;td>Art. 53 + Art. 15&lt;/td>
&lt;td>OSS inventory with licence analysis + supply chain audit (cosign + SLSA)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="operational-framework--access-control-opacc">Operational framework — access control (&lt;code>op.acc&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>op.acc.1&lt;/code> Identification&lt;/td>
&lt;td>Unique identification of users and processes&lt;/td>
&lt;td>A.3.2 roles&lt;/td>
&lt;td>Art. 14 (human oversight)&lt;/td>
&lt;td>Keycloak / OIDC + JWT with unique &lt;code>sub&lt;/code> + &lt;code>user_id_hashed&lt;/code> in OTel spans&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.acc.2&lt;/code> Access requirements&lt;/td>
&lt;td>Need to know, authorisation&lt;/td>
&lt;td>A.9.4 intended use&lt;/td>
&lt;td>Art. 14 + Art. 26 (deployer)&lt;/td>
&lt;td>Per-tenant allowlist in the AI Gateway + RBAC over adapters&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.acc.3&lt;/code> Segregation of duties&lt;/td>
&lt;td>No incompatible accumulation&lt;/td>
&lt;td>A.3.2 + A.3.3&lt;/td>
&lt;td>Art. 17 (QMS)&lt;/td>
&lt;td>Separate roles: AI lead / data steward / SRE / DPO&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.acc.5&lt;/code> Authentication&lt;/td>
&lt;td>Proportionate mechanism, MFA at High&lt;/td>
&lt;td>A.4.4 tooling&lt;/td>
&lt;td>Art. 14&lt;/td>
&lt;td>Keycloak + WebAuthn + mandatory MFA for High category&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.acc.6&lt;/code> Local access&lt;/td>
&lt;td>Protection against physical access&lt;/td>
&lt;td>mp.if + A.4.5&lt;/td>
&lt;td>Art. 15 (cybersec)&lt;/td>
&lt;td>Cluster in a datacenter with physical control (strictly outside the blog&amp;rsquo;s scope)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.acc.7&lt;/code> Remote access&lt;/td>
&lt;td>VPN, encryption, endpoint control&lt;/td>
&lt;td>A.4.5 + mp.com&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>WireGuard / Defguard + mTLS for administrative access to the cluster&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="operational-framework--operation-opexp">Operational framework — operation (&lt;code>op.exp&lt;/code>)&lt;/h3>
&lt;p>This is the densest subgroup and the one that overlaps most with the LLM architecture.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>op.exp.1&lt;/code> Asset inventory&lt;/td>
&lt;td>CMDB with all system components&lt;/td>
&lt;td>A.4 resources&lt;/td>
&lt;td>Art. 49 (EU DB registration)&lt;/td>
&lt;td>Inventory of models, adapters and datasets in a CMDB + Helm tags + OpenLineage lineage&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.exp.2&lt;/code> Security configuration&lt;/td>
&lt;td>Documented hardened configuration&lt;/td>
&lt;td>mp.eq + A.4&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>vLLM, KServe and Cilium configurations documented in GitOps + CIS Benchmarks for K8s&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.exp.3&lt;/code> Configuration management&lt;/td>
&lt;td>Traceable and authorised changes&lt;/td>
&lt;td>A.6.2 + A.4.2&lt;/td>
&lt;td>Art. 9 + Art. 15&lt;/td>
&lt;td>GitOps with Argo CD / Flux + mandatory PR review + immutable tags&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.exp.5&lt;/code> Change management&lt;/td>
&lt;td>Changes planned, authorised, recorded&lt;/td>
&lt;td>A.6.2.6 + clause 8&lt;/td>
&lt;td>Art. 9 (lifecycle) + Art. 72 (post-market)&lt;/td>
&lt;td>CI/CD pipeline from the &lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">LLMOps post&lt;/a> + change advisory board&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.exp.6&lt;/code> Protection against malicious code&lt;/td>
&lt;td>Antivirus, EDR, malware control&lt;/td>
&lt;td>mp.eq&lt;/td>
&lt;td>Art. 15 (cybersec)&lt;/td>
&lt;td>Image scanning (Trivy / Grype) + container runtime security (Falco / Tetragon)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.exp.7&lt;/code> Incident management&lt;/td>
&lt;td>Detection → response → recovery procedure&lt;/td>
&lt;td>A.3.3 + clause 10&lt;/td>
&lt;td>&lt;strong>Art. 73&lt;/strong> (serious incident reporting)&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Incident-driven retrain&lt;/a> + CCN-CERT channel + notification template&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;code>op.exp.8&lt;/code>&lt;/strong> &lt;strong>Activity logging&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Auditable logs, minimum 2-year retention at High category&lt;/strong>&lt;/td>
&lt;td>&lt;strong>A.8.2&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 12 + Art. 19&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">OTel GenAI tracing&lt;/a> + Tempo / Jaeger + Loki&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.exp.9&lt;/code> Incident management records&lt;/td>
&lt;td>Incident log with root cause and corrective action&lt;/td>
&lt;td>clause 10&lt;/td>
&lt;td>Art. 73&lt;/td>
&lt;td>Ticketing system + structured &lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">retrain incident events&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;code>op.exp.10&lt;/code>&lt;/strong> &lt;strong>Record protection&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Immutable logs, cryptographic integrity, guaranteed retention&lt;/strong>&lt;/td>
&lt;td>&lt;strong>A.8.2 + A.4.2&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 12&lt;/strong>&lt;/td>
&lt;td>&lt;strong>WORM storage (Ceph + immutable bucket) + log signing (sigstore) + 24-36 month retention&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.exp.11&lt;/code> Cryptographic keys&lt;/td>
&lt;td>Key lifecycle management, HSM at High category&lt;/td>
&lt;td>mp.info.4&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>HashiCorp Vault / SOPS + HSM (Yubico, AWS KMS on-prem) for High category&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="operational-framework--external-services-opext">Operational framework — external services (&lt;code>op.ext&lt;/code>)&lt;/h3>
&lt;p>Critical when the system integrates GPAI (Llama, Mistral) hosted elsewhere, or when the deployer is a third party.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>op.ext.1&lt;/code> Contracting external services&lt;/td>
&lt;td>Contract with security clauses, SLA, right to audit&lt;/td>
&lt;td>A.10.3 suppliers&lt;/td>
&lt;td>Art. 25 + Art. 53&lt;/td>
&lt;td>Contract with ENS clauses + annual audit review + Cloud Act analysis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.ext.2&lt;/code> Alternative means&lt;/td>
&lt;td>Plan B if the supplier goes down&lt;/td>
&lt;td>A.4.5 + clause 6&lt;/td>
&lt;td>Art. 15 (resilience)&lt;/td>
&lt;td>Multi-cluster with failover + qualified alternative GPAI (Llama→Mistral→Qwen)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.ext.3&lt;/code> Supply chain protection&lt;/td>
&lt;td>Assessment of suppliers and sub-suppliers&lt;/td>
&lt;td>A.10 + clause 6&lt;/td>
&lt;td>Art. 53 + NIS2 supply chain&lt;/td>
&lt;td>SBOM + cosign + SLSA + continuous vulnerability scanning&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.ext.4&lt;/code> System interconnection&lt;/td>
&lt;td>Interconnection agreements, secure gateways&lt;/td>
&lt;td>mp.com + A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>API Gateway with mTLS + JWT signing + rate limiting + WAF&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="operational-framework--continuity-opcont">Operational framework — continuity (&lt;code>op.cont&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>op.cont.1&lt;/code> Impact analysis&lt;/td>
&lt;td>BIA per system&lt;/td>
&lt;td>A.5.5 (impacts on individuals)&lt;/td>
&lt;td>Art. 9 (risk management)&lt;/td>
&lt;td>Documented BIA with RPO / RTO per system&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.cont.2&lt;/code> Continuity plan&lt;/td>
&lt;td>Documented DRP, RTO/RPO&lt;/td>
&lt;td>clause 6 + A.4&lt;/td>
&lt;td>Art. 15 (resilience)&lt;/td>
&lt;td>DRP + Velero K8s backups + DVC datasets in a secondary bucket&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.cont.3&lt;/code> Periodic testing&lt;/td>
&lt;td>Drills at a defined frequency (annual at High category)&lt;/td>
&lt;td>clause 9 (evaluation)&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Annual game-day with a simulated disaster + recovery stopwatches&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.cont.4&lt;/code> Alternative means&lt;/td>
&lt;td>Capacity to continue with degraded means&lt;/td>
&lt;td>clause 6 + A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Secondary cluster in a different datacenter + reserved GPU pool + replicated datasets&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="operational-framework--monitoring-opmon">Operational framework — monitoring (&lt;code>op.mon&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>&lt;code>op.mon.1&lt;/code>&lt;/strong> &lt;strong>Intrusion detection&lt;/strong>&lt;/td>
&lt;td>&lt;strong>IDS/IPS over network and applications&lt;/strong>&lt;/td>
&lt;td>&lt;strong>A.9.2 use&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 15 (cybersec)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails as a semantic WAF&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard PromptInjection&lt;/a> + Tetragon eBPF runtime&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;code>op.mon.2&lt;/code>&lt;/strong> &lt;strong>Metrics system&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Measurable operational metrics, auditable dashboard&lt;/strong>&lt;/td>
&lt;td>&lt;strong>clause 9 (performance evaluation)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 72 (post-market monitoring)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Prometheus + VictoriaMetrics + Grafana + &lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">Langfuse&lt;/a> dashboards&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>op.mon.3&lt;/code> Surveillance (High category)&lt;/td>
&lt;td>24×7 monitoring with alerting&lt;/td>
&lt;td>clause 9 + clause 10&lt;/td>
&lt;td>Art. 72 + Art. 73&lt;/td>
&lt;td>SOC with SIEM alerts (Wazuh, OpenSearch, Vector + custom) + on-call rotation&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="protection-measures--communications-mpcom">Protection measures — communications (&lt;code>mp.com&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>mp.com.1&lt;/code> Secure perimeter&lt;/td>
&lt;td>Firewall, segmentation, DMZ&lt;/td>
&lt;td>A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Cilium NetworkPolicy + Calico + ingress controllers with WAF (mod_security)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.com.2&lt;/code> Confidentiality protection&lt;/td>
&lt;td>Encryption in transit (TLS 1.2+ mandatory, 1.3 recommended)&lt;/td>
&lt;td>A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>TLS 1.3 mandatory + cert-manager + Let&amp;rsquo;s Encrypt or an internal CA&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.com.3&lt;/code> Integrity and authenticity protection&lt;/td>
&lt;td>Encryption + origin authentication&lt;/td>
&lt;td>A.4.5 + A.4.4&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Intra-cluster mTLS + JWT signing at the gateway + checksums on artifacts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.com.4&lt;/code> Flow separation&lt;/td>
&lt;td>Segmentation of mgmt vs production vs external traffic&lt;/td>
&lt;td>A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Cilium policies + network namespaces + east-west / north-south segregation&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="protection-measures--applications-mpsw">Protection measures — applications (&lt;code>mp.sw&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>mp.sw.1&lt;/code> Application development&lt;/td>
&lt;td>Secure SDLC, code review, SAST/SCA&lt;/td>
&lt;td>A.6.2.3 responsible design&lt;/td>
&lt;td>Art. 9 + Art. 15&lt;/td>
&lt;td>Forgejo CI with SAST (Semgrep, CodeQL) + SCA (Trivy, Grype) + mandatory PR review&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.sw.2&lt;/code> Acceptance and go-live&lt;/td>
&lt;td>Acceptance tests, eval gates before production&lt;/td>
&lt;td>A.6.2.5 V&amp;amp;V&lt;/td>
&lt;td>Art. 9 + Art. 15&lt;/td>
&lt;td>Eval gates from the &lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">evals post&lt;/a> + canary deploy + pre-go-live metrics&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="protection-measures--information-mpinfo">Protection measures — information (&lt;code>mp.info&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>&lt;code>mp.info.1&lt;/code>&lt;/strong> &lt;strong>Personal data&lt;/strong>&lt;/td>
&lt;td>&lt;strong>GDPR compliance + technical and organisational measures&lt;/strong>&lt;/td>
&lt;td>&lt;strong>A.5.5 + A.7.6&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 10&lt;/strong> + Art. 26&lt;/td>
&lt;td>&lt;strong>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard Vault&lt;/a> + Presidio + minimisation in &lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation&lt;/a>&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.info.2&lt;/code> Information classification&lt;/td>
&lt;td>Labelling by level (public / internal / confidential / restricted)&lt;/td>
&lt;td>A.7.2 data&lt;/td>
&lt;td>Art. 10&lt;/td>
&lt;td>Schema contracts from &lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">data versioning&lt;/a> with a &lt;code>classification&lt;/code> field&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.info.3&lt;/code> Encryption&lt;/td>
&lt;td>At-rest minimum at Medium category, High category with HSM&lt;/td>
&lt;td>A.4.5 + mp.eq&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>LUKS / dm-crypt on disks + encryption in the Ceph bucket + keys in Vault&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.info.4&lt;/code> Electronic signature&lt;/td>
&lt;td>Documents signed with a valid certificate (Medium category and above)&lt;/td>
&lt;td>A.8.2&lt;/td>
&lt;td>Art. 12&lt;/td>
&lt;td>Log signing with sigstore + signing of published models with cosign&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.info.5&lt;/code> Timestamps&lt;/td>
&lt;td>Qualified timestamp for temporal integrity (High category)&lt;/td>
&lt;td>A.8.2&lt;/td>
&lt;td>Art. 12&lt;/td>
&lt;td>Timestamping with a qualified TSA + RFC 3161 on critical events&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.info.6&lt;/code> Document cleaning&lt;/td>
&lt;td>Removal of unauthorised metadata, anonymisation&lt;/td>
&lt;td>A.7.6 + A.5.5&lt;/td>
&lt;td>Art. 10&lt;/td>
&lt;td>LLM Guard Anonymize (input) + Sensitive (output) + Vault with TTL&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="protection-measures--services-mps">Protection measures — services (&lt;code>mp.s&lt;/code>)&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>ENS measure&lt;/th>
&lt;th>Requirement&lt;/th>
&lt;th>42001 control&lt;/th>
&lt;th>AI Act article&lt;/th>
&lt;th>Technical evidence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>mp.s.1&lt;/code> Email&lt;/td>
&lt;td>Anti-spam, anti-malware, optional encryption&lt;/td>
&lt;td>A.4.5&lt;/td>
&lt;td>—&lt;/td>
&lt;td>Outside the direct LLM scope&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.s.2&lt;/code> Protection of web services and applications&lt;/td>
&lt;td>WAF, hardening, vulnerability management&lt;/td>
&lt;td>A.9.2 + mp.com&lt;/td>
&lt;td>Art. 15 (cybersec)&lt;/td>
&lt;td>AI Gateway (LiteLLM / Envoy AI / Kong AI) with policies + ModSecurity + Cloudflare-like&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>mp.s.3&lt;/code> Protection against denial of service&lt;/td>
&lt;td>Rate limiting, anti-DDoS, capacity planning&lt;/td>
&lt;td>A.4.5 + A.9.2&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Rate limiting at the gateway + token quotas + circuit breakers&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>&lt;code>mp.s.4&lt;/code>&lt;/strong> &lt;strong>Protection against external threats (High category)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Advanced monitoring, threat intel&lt;/strong>&lt;/td>
&lt;td>&lt;strong>A.9.2 + clause 9&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 15 + Art. 72&lt;/strong>&lt;/td>
&lt;td>&lt;strong>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails, 4 lines&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">advanced LLM Guard scanners&lt;/a> + threat intel feed (CCN-CERT MISP)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="master-table-of-triple-compliance--the-25-relevant-controls-consolidated">Master table of triple compliance — the 25 relevant controls consolidated&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 460" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Triple compliance table ENS × 42001 × EU AI Act">
&lt;style>
.c-hdr{fill:#7aafff;stroke:#444;stroke-width:1.4;rx:8}
.c-ens{fill:#ffd76b;stroke:#444;stroke-width:1.4;rx:6}
.c-42001{fill:#a8e6a3;stroke:#444;stroke-width:1.4;rx:6}
.c-aia{fill:#ff8a4c;stroke:#444;stroke-width:1.4;rx:6}
.c-evi{fill:#c8b8ff;stroke:#444;stroke-width:1.4;rx:6}
.cl{font:600 11px sans-serif;fill:#222}
.cs{font:400 10px sans-serif;fill:#444}
.cn{font:italic 10px sans-serif;fill:#555}
&lt;/style>
&lt;rect x="20" y="20" width="780" height="40" class="c-hdr"/>
&lt;text x="410" y="42" text-anchor="middle" class="cl">Master table of triple compliance — ENS (yellow) · 42001 (green) · EU AI Act (orange) · Technical evidence (violet)&lt;/text>
&lt;text x="410" y="55" text-anchor="middle" class="cs">one row per technical capability — each cell gives the code of the framework it satisfies&lt;/text>
&lt;rect x="20" y="80" width="100" height="40" class="c-ens"/>&lt;text x="70" y="100" text-anchor="middle" class="cl">op.exp.8&lt;/text>&lt;text x="70" y="113" text-anchor="middle" class="cs">+ op.exp.10&lt;/text>
&lt;rect x="125" y="80" width="100" height="40" class="c-42001"/>&lt;text x="175" y="100" text-anchor="middle" class="cl">A.8.2&lt;/text>&lt;text x="175" y="113" text-anchor="middle" class="cs">A.4.2 (documentation)&lt;/text>
&lt;rect x="230" y="80" width="100" height="40" class="c-aia"/>&lt;text x="280" y="100" text-anchor="middle" class="cl">Art. 12 + Art. 19&lt;/text>&lt;text x="280" y="113" text-anchor="middle" class="cs">record-keeping&lt;/text>
&lt;rect x="335" y="80" width="465" height="40" class="c-evi"/>&lt;text x="567" y="100" text-anchor="middle" class="cl">OTel `gen_ai.*` spans + Tempo + WORM Ceph + 24-36m retention + sigstore&lt;/text>&lt;text x="567" y="113" text-anchor="middle" class="cs">trace_id propagated + prompt_id + dataset_hash + adapter_version + PII redacted&lt;/text>
&lt;rect x="20" y="125" width="100" height="40" class="c-ens"/>&lt;text x="70" y="145" text-anchor="middle" class="cl">op.mon.1&lt;/text>&lt;text x="70" y="158" text-anchor="middle" class="cs">+ mp.s.4&lt;/text>
&lt;rect x="125" y="125" width="100" height="40" class="c-42001"/>&lt;text x="175" y="145" text-anchor="middle" class="cl">A.9.2&lt;/text>&lt;text x="175" y="158" text-anchor="middle" class="cs">responsible use&lt;/text>
&lt;rect x="230" y="125" width="100" height="40" class="c-aia"/>&lt;text x="280" y="145" text-anchor="middle" class="cl">Art. 15&lt;/text>&lt;text x="280" y="158" text-anchor="middle" class="cs">cybersec + robustness&lt;/text>
&lt;rect x="335" y="125" width="465" height="40" class="c-evi"/>&lt;text x="567" y="145" text-anchor="middle" class="cl">Guardrails, 4 lines + LLM Guard PromptInjection + Tetragon eBPF + Llama Guard 4&lt;/text>&lt;text x="567" y="158" text-anchor="middle" class="cs">jailbreak + indirect injection + tool abuse + PII leakage in output detection&lt;/text>
&lt;rect x="20" y="170" width="100" height="40" class="c-ens"/>&lt;text x="70" y="190" text-anchor="middle" class="cl">op.mon.2&lt;/text>&lt;text x="70" y="203" text-anchor="middle" class="cs">+ op.mon.3&lt;/text>
&lt;rect x="125" y="170" width="100" height="40" class="c-42001"/>&lt;text x="175" y="190" text-anchor="middle" class="cl">clause 9&lt;/text>&lt;text x="175" y="203" text-anchor="middle" class="cs">performance eval&lt;/text>
&lt;rect x="230" y="170" width="100" height="40" class="c-aia"/>&lt;text x="280" y="190" text-anchor="middle" class="cl">Art. 72&lt;/text>&lt;text x="280" y="203" text-anchor="middle" class="cs">post-market monitoring&lt;/text>
&lt;rect x="335" y="170" width="465" height="40" class="c-evi"/>&lt;text x="567" y="190" text-anchor="middle" class="cl">Prometheus + VictoriaMetrics + Grafana + Langfuse dashboards + continuous evals&lt;/text>&lt;text x="567" y="203" text-anchor="middle" class="cs">F1 per guardrail category + RAG faithfulness + statistical drift + 24×7 cadence&lt;/text>
&lt;rect x="20" y="215" width="100" height="40" class="c-ens"/>&lt;text x="70" y="235" text-anchor="middle" class="cl">op.exp.7&lt;/text>&lt;text x="70" y="248" text-anchor="middle" class="cs">+ op.exp.9&lt;/text>
&lt;rect x="125" y="215" width="100" height="40" class="c-42001"/>&lt;text x="175" y="235" text-anchor="middle" class="cl">clause 10&lt;/text>&lt;text x="175" y="248" text-anchor="middle" class="cs">A.3.3 reporting&lt;/text>
&lt;rect x="230" y="215" width="100" height="40" class="c-aia"/>&lt;text x="280" y="235" text-anchor="middle" class="cl">Art. 73&lt;/text>&lt;text x="280" y="248" text-anchor="middle" class="cs">serious incidents&lt;/text>
&lt;rect x="335" y="215" width="465" height="40" class="c-evi"/>&lt;text x="567" y="235" text-anchor="middle" class="cl">Structured incident events + closed retrain loop + CCN-CERT notification&lt;/text>&lt;text x="567" y="248" text-anchor="middle" class="cs">15/10/2-day deadline + incident template + root cause + effectiveness check&lt;/text>
&lt;rect x="20" y="260" width="100" height="40" class="c-ens"/>&lt;text x="70" y="280" text-anchor="middle" class="cl">mp.info.1&lt;/text>&lt;text x="70" y="293" text-anchor="middle" class="cs">+ mp.info.6&lt;/text>
&lt;rect x="125" y="260" width="100" height="40" class="c-42001"/>&lt;text x="175" y="280" text-anchor="middle" class="cl">A.7.6&lt;/text>&lt;text x="175" y="293" text-anchor="middle" class="cs">data preparation&lt;/text>
&lt;rect x="230" y="260" width="100" height="40" class="c-aia"/>&lt;text x="280" y="280" text-anchor="middle" class="cl">Art. 10&lt;/text>&lt;text x="280" y="293" text-anchor="middle" class="cs">data governance&lt;/text>
&lt;rect x="335" y="260" width="465" height="40" class="c-evi"/>&lt;text x="567" y="280" text-anchor="middle" class="cl">LLM Guard Anonymize Vault + Presidio + RAG corpus curation, 5 layers&lt;/text>&lt;text x="567" y="293" text-anchor="middle" class="cs">runtime redaction + anti-contamination + chunk→trace lineage + measured PII F1&lt;/text>
&lt;rect x="20" y="305" width="100" height="40" class="c-ens"/>&lt;text x="70" y="325" text-anchor="middle" class="cl">op.pl.1&lt;/text>&lt;text x="70" y="338" text-anchor="middle" class="cs">risk analysis&lt;/text>
&lt;rect x="125" y="305" width="100" height="40" class="c-42001"/>&lt;text x="175" y="325" text-anchor="middle" class="cl">A.5.2-5.6&lt;/text>&lt;text x="175" y="338" text-anchor="middle" class="cs">impact assessment&lt;/text>
&lt;rect x="230" y="305" width="100" height="40" class="c-aia"/>&lt;text x="280" y="325" text-anchor="middle" class="cl">Art. 9&lt;/text>&lt;text x="280" y="338" text-anchor="middle" class="cs">risk management&lt;/text>
&lt;rect x="335" y="305" width="465" height="40" class="c-evi"/>&lt;text x="567" y="325" text-anchor="middle" class="cl">MAGERIT/OCTAVE risk doc + FRIA (if a public deployer applies) + fairness evals&lt;/text>&lt;text x="567" y="338" text-anchor="middle" class="cs">one methodology, three languages — the matrix is exported with three labels&lt;/text>
&lt;rect x="20" y="350" width="100" height="40" class="c-ens"/>&lt;text x="70" y="370" text-anchor="middle" class="cl">op.ext.1&lt;/text>&lt;text x="70" y="383" text-anchor="middle" class="cs">+ op.ext.3&lt;/text>
&lt;rect x="125" y="350" width="100" height="40" class="c-42001"/>&lt;text x="175" y="370" text-anchor="middle" class="cl">A.10.3&lt;/text>&lt;text x="175" y="383" text-anchor="middle" class="cs">suppliers&lt;/text>
&lt;rect x="230" y="350" width="100" height="40" class="c-aia"/>&lt;text x="280" y="370" text-anchor="middle" class="cl">Art. 53&lt;/text>&lt;text x="280" y="383" text-anchor="middle" class="cs">GPAI + NIS2 supply chain&lt;/text>
&lt;rect x="335" y="350" width="465" height="40" class="c-evi"/>&lt;text x="567" y="370" text-anchor="middle" class="cl">OSS vs hyperscalers lock-in analysis + SBOM + cosign + SLSA + Cloud Act analysis&lt;/text>&lt;text x="567" y="383" text-anchor="middle" class="cs">supplier register with licence + jurisdiction + plan B + annual audit&lt;/text>
&lt;rect x="20" y="395" width="100" height="40" class="c-ens"/>&lt;text x="70" y="415" text-anchor="middle" class="cl">mp.sw.1&lt;/text>&lt;text x="70" y="428" text-anchor="middle" class="cs">+ mp.sw.2&lt;/text>
&lt;rect x="125" y="395" width="100" height="40" class="c-42001"/>&lt;text x="175" y="415" text-anchor="middle" class="cl">A.6.2.3-2.5&lt;/text>&lt;text x="175" y="428" text-anchor="middle" class="cs">SDLC + V&amp;amp;V&lt;/text>
&lt;rect x="230" y="395" width="100" height="40" class="c-aia"/>&lt;text x="280" y="415" text-anchor="middle" class="cl">Arts. 9 + 15&lt;/text>&lt;text x="280" y="428" text-anchor="middle" class="cs">development + accuracy&lt;/text>
&lt;rect x="335" y="395" width="465" height="40" class="c-evi"/>&lt;text x="567" y="415" text-anchor="middle" class="cl">Forgejo CI + Semgrep SAST + Trivy SCA + eval gates + canary + pre-go-live metrics&lt;/text>&lt;text x="567" y="428" text-anchor="middle" class="cs">one CI/CD pipeline with triple labelling of the evidence artefact&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The key reading of the table: one row per technical capability. The organisation does not build three solutions for &amp;ldquo;activity log&amp;rdquo; (ENS) + &amp;ldquo;information to interested parties&amp;rdquo; (42001) + &amp;ldquo;record-keeping&amp;rdquo; (AI Act). It builds one single piece of OTel tracing with the correct metadata and presents it labelled for whichever inspector is asking.&lt;/p>
&lt;p>The labelling typically materialises in three mechanisms:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Tags in the CI/CD pipelines&lt;/strong>: every artefact produced carries tags &lt;code>ens:op.exp.8&lt;/code>, &lt;code>iso42001:A.8.2&lt;/code>, &lt;code>aia:art.12&lt;/code> in its Helm / Argo CD metadata.&lt;/li>
&lt;li>&lt;strong>Semantic OTel attributes&lt;/strong>: &lt;code>gen_ai.compliance.ens = &amp;quot;op.exp.8&amp;quot;&lt;/code>, &lt;code>gen_ai.compliance.iso42001 = &amp;quot;A.8.2&amp;quot;&lt;/code> as custom attributes on the relevant spans (not standard yet, but useful internally).&lt;/li>
&lt;li>&lt;strong>A mapping table in the wiki&lt;/strong>: a living document of ENS measure → 42001 control → AI Act article → technical runbook + owner + last verification. This is the artefact the auditor consults.&lt;/li>
&lt;/ol>
&lt;h2 id="applied-case-multi-tenant-chatbot-for-public-administration">Applied case: multi-tenant chatbot for public administration&lt;/h2>
&lt;p>A variant of the &lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">multi-tenant chatbot from the forensic post&lt;/a>, where the client is now a Spanish regional government offering citizen assistance on administrative procedures. The three lenses:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>ENS&lt;/strong>: applies mandatorily, being public sector plus a service to citizens. Category High (citizens&amp;rsquo; PII plus a critical service).&lt;/li>
&lt;li>&lt;strong>ISO 42001&lt;/strong>: the regional government requires certification from the supplier as a contractual condition.&lt;/li>
&lt;li>&lt;strong>EU AI Act&lt;/strong>: if the chatbot informs about procedures but decides nothing on the citizen&amp;rsquo;s behalf, it is limited risk (Art. 50 transparency). If it automates decisions (admission to a programme, refusal of a benefit), it is high risk.&lt;/li>
&lt;/ul>
&lt;p>We assume high risk for the most demanding walkthrough.&lt;/p>
&lt;h3 id="the-chatbots-25-key-technical-capabilities-consolidated">The chatbot&amp;rsquo;s 25 key technical capabilities consolidated&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Technical capability&lt;/th>
&lt;th>ENS&lt;/th>
&lt;th>42001&lt;/th>
&lt;th>AI Act&lt;/th>
&lt;th>Status&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Robust citizen authentication&lt;/td>
&lt;td>&lt;code>op.acc.5&lt;/code> (MFA High category)&lt;/td>
&lt;td>A.4.4&lt;/td>
&lt;td>Art. 14&lt;/td>
&lt;td>Cl@ve + digital certificate + WebAuthn&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Unique tenant + user identification&lt;/td>
&lt;td>&lt;code>op.acc.1&lt;/code>&lt;/td>
&lt;td>A.3.2&lt;/td>
&lt;td>Art. 14 + 26&lt;/td>
&lt;td>JWT with &lt;code>tenant_id&lt;/code> + &lt;code>user_id_hashed&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Per-tenant allowlist&lt;/td>
&lt;td>&lt;code>op.acc.2&lt;/code>&lt;/td>
&lt;td>A.9.4&lt;/td>
&lt;td>Art. 14&lt;/td>
&lt;td>LiteLLM Proxy with policies + Envoy filter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Encryption in transit, mTLS&lt;/td>
&lt;td>&lt;code>mp.com.2-3&lt;/code>&lt;/td>
&lt;td>A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>TLS 1.3 + cert-manager + intra-mesh mTLS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Encryption at rest + HSM keys&lt;/td>
&lt;td>&lt;code>mp.info.3&lt;/code> + &lt;code>op.exp.11&lt;/code>&lt;/td>
&lt;td>A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>LUKS + Vault + Yubikey or nCipher HSM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PII anonymisation input/output&lt;/td>
&lt;td>&lt;code>mp.info.1 + .6&lt;/code>&lt;/td>
&lt;td>A.7.6&lt;/td>
&lt;td>Art. 10&lt;/td>
&lt;td>LLM Guard Vault + Presidio + Llama Guard 4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Traceable logging + WORM&lt;/td>
&lt;td>&lt;strong>&lt;code>op.exp.8 + .10&lt;/code>&lt;/strong>&lt;/td>
&lt;td>&lt;strong>A.8.2&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Arts. 12 + 19&lt;/strong>&lt;/td>
&lt;td>OTel + Tempo + Loki + Ceph WORM 36 months&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Log signing + timestamps&lt;/td>
&lt;td>&lt;code>mp.info.4 + .5&lt;/code>&lt;/td>
&lt;td>A.8.2&lt;/td>
&lt;td>Art. 12&lt;/td>
&lt;td>sigstore + qualified TSA (FNMT)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Runtime threat detection&lt;/td>
&lt;td>&lt;strong>&lt;code>op.mon.1 + mp.s.4&lt;/code>&lt;/strong>&lt;/td>
&lt;td>&lt;strong>A.9.2&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 15&lt;/strong>&lt;/td>
&lt;td>Guardrails, 4 lines + Tetragon + Falco&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Operational metrics dashboard&lt;/td>
&lt;td>&lt;strong>&lt;code>op.mon.2&lt;/code>&lt;/strong>&lt;/td>
&lt;td>&lt;strong>clause 9&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 72&lt;/strong>&lt;/td>
&lt;td>Prometheus + Grafana + Langfuse&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>24×7 SOC surveillance&lt;/td>
&lt;td>&lt;code>op.mon.3&lt;/code> (High category)&lt;/td>
&lt;td>clause 9&lt;/td>
&lt;td>Art. 72&lt;/td>
&lt;td>SOC with SIEM + on-call rotation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Incident management with notification&lt;/td>
&lt;td>&lt;strong>&lt;code>op.exp.7 + .9&lt;/code>&lt;/strong>&lt;/td>
&lt;td>&lt;strong>clause 10&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Art. 73&lt;/strong>&lt;/td>
&lt;td>Incident-driven retrain + CCN-CERT channel&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CI/CD pipeline with eval gates&lt;/td>
&lt;td>&lt;code>mp.sw.1 + .2&lt;/code>&lt;/td>
&lt;td>A.6.2.3-5&lt;/td>
&lt;td>Arts. 9 + 15&lt;/td>
&lt;td>Forgejo CI + Semgrep + Trivy + DeepEval gates&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Backups + DRP&lt;/td>
&lt;td>&lt;code>op.cont.1-4&lt;/code>&lt;/td>
&lt;td>clause 6 + A.4&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Velero + DVC datasets in a secondary bucket + annual game-day&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Systematic risk analysis&lt;/td>
&lt;td>&lt;code>op.pl.1&lt;/code>&lt;/td>
&lt;td>A.5 + cl.6&lt;/td>
&lt;td>Art. 9&lt;/td>
&lt;td>MAGERIT + FRIA + ISO/IEC 23894 impact assessment&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Documented secure architecture&lt;/td>
&lt;td>&lt;code>op.pl.2&lt;/code>&lt;/td>
&lt;td>A.4.2&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Seven layers&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">seven phases&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Supplier management&lt;/td>
&lt;td>&lt;code>op.ext.1 + .3&lt;/code>&lt;/td>
&lt;td>A.10.3&lt;/td>
&lt;td>Art. 53&lt;/td>
&lt;td>Contracts with ENS clauses + SBOM + Cloud Act analysis per GPAI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Certified components&lt;/td>
&lt;td>&lt;code>op.pl.5&lt;/code>&lt;/td>
&lt;td>A.10.5&lt;/td>
&lt;td>Art. 53&lt;/td>
&lt;td>Inventory with licence + supply chain audit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Configuration hardening&lt;/td>
&lt;td>&lt;code>op.exp.2 + .3&lt;/code>&lt;/td>
&lt;td>A.4 + A.6&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>CIS Benchmarks for K8s + GitOps + immutable tags&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Protection against malicious code&lt;/td>
&lt;td>&lt;code>op.exp.6&lt;/code>&lt;/td>
&lt;td>mp.eq&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Image scanning + runtime security&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Asset inventory&lt;/td>
&lt;td>&lt;code>op.exp.1&lt;/code>&lt;/td>
&lt;td>A.4&lt;/td>
&lt;td>Art. 49&lt;/td>
&lt;td>CMDB + Helm tags + OpenLineage&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Network segmentation&lt;/td>
&lt;td>&lt;code>mp.com.4&lt;/code>&lt;/td>
&lt;td>A.4.5&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>Cilium NetworkPolicy + namespaces&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Rate limiting + anti-DoS&lt;/td>
&lt;td>&lt;code>mp.s.3&lt;/code>&lt;/td>
&lt;td>A.4 + A.9&lt;/td>
&lt;td>Art. 15&lt;/td>
&lt;td>LiteLLM rate limit + token quotas&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Information classification&lt;/td>
&lt;td>&lt;code>mp.info.2&lt;/code>&lt;/td>
&lt;td>A.7.2&lt;/td>
&lt;td>Art. 10&lt;/td>
&lt;td>Schema contracts with a &lt;code>classification&lt;/code> field&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Transparency towards the user&lt;/td>
&lt;td>—&lt;/td>
&lt;td>A.9.4&lt;/td>
&lt;td>&lt;strong>Art. 50&lt;/strong>&lt;/td>
&lt;td>UI banner + disclaimer in responses&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Result&lt;/strong>: the 25 technical capabilities are common to all three frameworks. Only two require evidence for a single framework in isolation: &lt;code>mp.info.4-5&lt;/code> (qualified signature and timestamp, ENS-specific, not required so literally by 42001 or the AI Act) and &lt;code>Art. 50&lt;/code> (transparency banner, AI Act-specific). The rest are the same technical piece with three labels. A well-organised team certifies all three in series with only marginal extra work between the second and the third.&lt;/p>
&lt;h2 id="the-five-traps-of-triple-compliance">The five traps of triple compliance&lt;/h2>
&lt;p>&lt;strong>Trap 1 — Measuring the same thing three times.&lt;/strong> Inexperienced teams create three separate dashboards (one for ENS, another for 42001, another for the AI Act) with the same metrics duplicated. The result: three sources of truth that diverge, three audit teams with different figures, three corrections to resolve one and the same deviation. The rule: one metric, three labels.&lt;/p>
&lt;p>&lt;strong>Trap 2 — Losing the control that covers only one framework.&lt;/strong> &lt;code>mp.info.4&lt;/code> (electronic signature) is ENS-specific and gets forgotten while the team is focused on 42001 + AI Act. On ENS audit day, the gap surfaces. Solution: the master table keeps every control visible, orphans included.&lt;/p>
&lt;p>&lt;strong>Trap 3 — Bias towards the most recent framework.&lt;/strong> The team spends 80% of the effort on the AI Act because it is the newest, and forgets the rigour of the ENS, which has been in force for 14 years. The ENS measures are technically more prescriptive than the AI Act (which is legally stricter but leaves implementation freedom). Moving up a level to ENS High category introduces specific requirements (HSM, qualified timestamps, 24×7 surveillance) that the AI Act does not spell out. The ENS deserves respect for its technical detail, not for its legal stature.&lt;/p>
&lt;p>&lt;strong>Trap 4 — Mixing ENS Medium and High categories.&lt;/strong> The Annex II matrix of RD 311/2022 dictates which measures are required and at what depth per category. Moving from Medium to High changes 15-20 controls, which is not marginal. The category is decided at the start of the project and documented; changing it halfway forces a complete re-audit.&lt;/p>
&lt;p>&lt;strong>Trap 5 — Audit fatigue inside the technical team.&lt;/strong> Three audits a year (biennial ENS + annual 42001 surveillance + ad-hoc AI Act by the authority) exhausts the team if they are not planned and if evidence is not reused. The professional approach: one single quarterly internal audit cycle with rotating scope, producing evidence consumable by all three external auditors. The difference between 30 days a year and 90 days a year lost to audits is the discipline of single evidence plus disciplined labelling.&lt;/p>
&lt;h2 id="what-we-have-not-covered-upcoming-posts">What we have not covered (upcoming posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>The CCN-CERT STIC series&lt;/strong> applicable to AI systems: STIC 800-159 (web service operation), STIC 800-105 (cryptography), STIC 800-150 (cloud environments). Each adds technical detail on how to materialise the ENS measures.&lt;/li>
&lt;li>&lt;strong>The GDPR as a fourth lens&lt;/strong>: privacy and personal data protection. It overlaps with &lt;code>mp.info.1&lt;/code> and with A.7.6 of 42001 plus Art. 10 of the AI Act. Material for an analogous pass over LOPDGDD + GDPR + AEPD against the three frameworks seen here.&lt;/li>
&lt;li>&lt;strong>Concrete templates&lt;/strong> of technical evidence with minimum fields: a log entry with every attribute required by the three lenses, an incident report with every field demanded by the three frameworks, a unified ENS / AI Act / 42001 declaration of conformity.&lt;/li>
&lt;li>&lt;strong>The NextGenerationEU funds case&lt;/strong>: specific compliance requirements for AI projects financed with European funds, where the AI Act + ENS are contractually mandatory.&lt;/li>
&lt;li>&lt;strong>42001 + ENS High category combined with DORA&lt;/strong> (Digital Operational Resilience Act, Reg. 2022/2554) for Spanish financial entities deploying AI.&lt;/li>
&lt;/ul>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>RD 311/2022&lt;/strong> — &lt;em>por el que se regula el Esquema Nacional de Seguridad&lt;/em>. &lt;a href="https://www.boe.es/buscar/act.php?id=BOE-A-2022-7191">https://www.boe.es/buscar/act.php?id=BOE-A-2022-7191&lt;/a>.&lt;/li>
&lt;li>&lt;strong>CCN-CERT — Portal ENS&lt;/strong>: &lt;a href="https://ens.ccn.cni.es/">https://ens.ccn.cni.es/&lt;/a>. Guías STIC Series 800.&lt;/li>
&lt;li>&lt;strong>CCN-STIC 803&lt;/strong> — &lt;em>Valoración de los sistemas y de la información&lt;/em>. Metodología para asignar categoría ENS.&lt;/li>
&lt;li>&lt;strong>CCN-STIC 804&lt;/strong> — &lt;em>Esquema Nacional de Seguridad. Guía de implantación&lt;/em>.&lt;/li>
&lt;li>&lt;strong>CCN-STIC 824&lt;/strong> — &lt;em>Informe del estado de seguridad&lt;/em>. Plantilla para auditoría ENS.&lt;/li>
&lt;li>&lt;strong>MAGERIT v3&lt;/strong> — Metodología de Análisis y Gestión de Riesgos del Ministerio de Asuntos Económicos. Insumo de &lt;code>op.pl.1&lt;/code>.&lt;/li>
&lt;li>&lt;strong>ISO/IEC 42001:2023&lt;/strong> — Sistema de gestión IA. Norma certificable que solapa con ENS.&lt;/li>
&lt;li>&lt;strong>Regulation (EU) 2024/1689 (EU AI Act)&lt;/strong> — texto consolidado.&lt;/li>
&lt;li>&lt;strong>NIS2 (Dir. 2022/2555)&lt;/strong> — directiva de ciberseguridad que el ENS implementa parcialmente en su versión 2022.&lt;/li>
&lt;/ul>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/hardening-secrets-sovereign-llm-stack-defence-in-depth/">Hardening and secrets in the sovereign LLM stack: defence in depth&lt;/a> — the technical implementation of many of these controls: network, secrets, supply chain.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/">ISO/IEC 42001: the operations manual for the AI system&lt;/a> — the first post of the governance trilogy, the certifiable management system.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/eu-ai-act-technical-dossier-on-premise-llm-architecture/">EU AI Act: the technical dossier, article by article&lt;/a> — the second post, the directly applicable EU legal regulation.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">The six-stage LLMOps pipeline&lt;/a> — the reference operational architecture that supports all three frameworks.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">LLM tracing with OpenTelemetry GenAI&lt;/a> — the canonical piece that materialises &lt;code>op.exp.8 + .10&lt;/code> ENS + A.8.2 ISO 42001 + Arts. 12 + 19 AI Act simultaneously.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a> — the piece that materialises &lt;code>op.mon.1 + mp.s.4&lt;/code> ENS + A.9.2 ISO 42001 + Art. 15 AI Act.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard: the sworn translator with a book of equivalences&lt;/a> — the piece that materialises &lt;code>mp.info.1 + .6&lt;/code> ENS + A.7.6 ISO 42001 + Art. 10 AI Act.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning with DVC and lakeFS&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation&lt;/a> — the pieces that materialise &lt;code>mp.info.1-2&lt;/code> ENS + A.7 ISO 42001 + Art. 10 AI Act.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Retrain: closing the feedback → dataset → adapter loop&lt;/a> — the piece that materialises &lt;code>op.exp.7 + .9&lt;/code> ENS + clause 10 ISO 42001 + Art. 73 AI Act.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals: the layer after tracing&lt;/a> — the piece that materialises &lt;code>mp.sw.2&lt;/code> ENS + A.6.2.5 ISO 42001 + Art. 15 AI Act.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Seven layers of the stack&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">seven deployment phases&lt;/a> — the direct material for &lt;code>op.pl.2&lt;/code> architecture.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">The parallel catalogue: OSS vs hyperscalers&lt;/a> — input for &lt;code>op.ext.1 + .3&lt;/code> supplier analysis + Art. 53 GPAI.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">The OSS catalogue for LLMOps&lt;/a> — inventory of components with licences for &lt;code>op.exp.1&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">Anatomy of an LLM request in production&lt;/a> — the forensic case walked through with the triple lens in this post.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/incident-response-runbooks-llm-inference-kafka-keep/">Incident response runbooks for LLMs with Keep + Kafka&lt;/a> — the concrete piece that materialises &lt;code>op.exp.7-10&lt;/code> ENS + A.8.2 ISO 42001 + Art. 73 EU AI Act simultaneously: declarative Keep workflows + WORM Kafka &lt;code>audit.actions&lt;/code> + NIS2 deadlines of 24h/72h/1 month.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/isolating-ai-agents-workstation-to-cluster/">Isolating AI agents: from the workstation to the cluster&lt;/a> and its &lt;a href="https://blog.lo0.es/en/posts/runbook-caging-ai-agent-bubblewrap-tetragon/">operational runbook&lt;/a> — runtime isolation (bubblewrap on the client, Tetragon in the cluster) as a materialisation of &lt;code>op.mon&lt;/code> (monitoring) and &lt;code>op.exp&lt;/code> (activity logging): Tetragon&amp;rsquo;s eBPF events are technical evidence of what each agent executed and of every blocked access attempt.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/model-chain-of-trust-signature-provenance-aibom-why-you-trust-those-bytes/">Model chain of trust (3/4): signing, provenance and AIBOM&lt;/a> — the technical evidence of model provenance (signature, attestations and AIBOM) that feeds the technical documentation of Art. 11 + Annex IV of the AI Act and the traceability controls of ISO 42001.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/model-chain-of-trust-who-serves-the-model-which-machine-you-trust/">Model chain of trust (4/4): workload identity and isolation&lt;/a> — SPIFFE/SPIRE and confidential computing as a materialisation of &lt;code>op.acc&lt;/code> and &lt;code>mp.com&lt;/code> in the ENS and of Art. 15 on robustness and cybersecurity.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/litellm-virtual-keys-budgets-limits/">Virtual keys, budgets and limits in LiteLLM&lt;/a> — the concrete implementation of access control and administrative traceability at the gateway, with what it demonstrates to an auditor and what it does not.&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>ISO/IEC 42001: the operations manual for the AI system — how the AIMS fits over the on-premise LLM platform described in this blog</title><link>https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/</link><pubDate>Mon, 01 Jun 2026 06:00:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/</guid><description>&lt;blockquote>
&lt;p>This post closes an asymmetry the blog had been accumulating: we have described in detail the technical platform (&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">seven stack layers&lt;/a>, &lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">seven deployment phases&lt;/a>, &lt;a href="https://blog.lo0.es/en/posts/five-maturity-levels-platform-under-llm/">five maturity levels&lt;/a>), the operational pipeline (&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">six LLMOps stages&lt;/a>), the data pieces (&lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">corpus curation&lt;/a>, &lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">versioning&lt;/a>), the eval / safety pieces (&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">evals&lt;/a>, &lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">guardrails&lt;/a>, &lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a>) and the observe pieces (&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">OTel GenAI tracing&lt;/a>). What had not appeared is the governance layer a regulated client asks for on top of all that. ISO/IEC 42001 is that layer.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>ISO/IEC 42001:2023 is the first certifiable international standard that defines how an AI system is managed. It is not a technical standard (it does not say &amp;ldquo;use this inference engine&amp;rdquo; or &amp;ldquo;this safety threshold&amp;rdquo;): it is a management standard, a cousin of ISO 27001 and ISO 9001. From both it inherits the Annex SL structure, seven mandatory clauses running through context, leadership, planning, support, operation, performance evaluation and improvement, and it adds an Annex A with 38 AI-specific controls in 9 sections: policies, internal organisation, resources, impact assessment, lifecycle, data, information to interested parties, use, third parties. The thesis of this post is that the technical architecture described in this blog directly covers between 60% and 80% of the A controls with no extra work. The LLMOps pipeline materialises A.6, versioning and curation materialise A.7, guardrails and evals materialise A.9, OTel tracing materialises A.8. The rest is governance discipline that does not appear in the code (a written AI policy, impact assessments per system, a stakeholder register, role decisions between provider/producer/customer, mandatory documentation), and that is precisely what separates a real certification from performative compliance. The post maps the correspondence control by control, cross-references it with the EU AI Act (seven articles directly aligned with 42001: 9, 10, 11, 12, 13, 14, 17), with NIS2 (asset register, incident notification, supply chain) and with ENS (Esquema Nacional de Seguridad, Spain&amp;rsquo;s national security framework, RD 311/2022, Basic/Medium/High categories), lists the seven mandatory minimum documents an auditor asks for, presents the blog&amp;rsquo;s multi-tenant chatbot as a live 42001 checklist, and closes with the five usual traps (confusing 42001 with EU AI Act compliance, over-documenting without measuring, ignoring A.5 until the audit, assuming 27001 covers the AI part, thinking certification is a one-off project rather than a living system).&lt;/p>
&lt;h2 id="the-analogy-the-aircraft-operations-manual">The analogy: the aircraft operations manual&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 360" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="ISO 42001 as an aircraft operations manual audited by EASA">
&lt;style>
.i-air{fill:#7aafff;stroke:#444;stroke-width:1.4;rx:8}
.i-man{fill:#ffd76b;stroke:#444;stroke-width:1.4;rx:8}
.i-aud{fill:#a8e6a3;stroke:#444;stroke-width:1.4;rx:8}
.i-ops{fill:#ff8a4c;stroke:#444;stroke-width:1.4;rx:8}
.il{font:600 13px sans-serif;fill:#222}
.is{font:400 11px sans-serif;fill:#555}
.in{font:italic 11px sans-serif;fill:#555}
.iar{stroke:#666;stroke-width:1.6;fill:none;marker-end:url(#mi1)}
&lt;/style>
&lt;defs>&lt;marker id="mi1" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#666"/>&lt;/marker>&lt;/defs>
&lt;rect x="20" y="20" width="160" height="60" class="i-air"/>
&lt;text x="100" y="44" text-anchor="middle" class="il">AI system&lt;/text>
&lt;text x="100" y="62" text-anchor="middle" class="is">on-premise LLM platform&lt;/text>
&lt;text x="100" y="76" text-anchor="middle" class="is">(the aircraft)&lt;/text>
&lt;rect x="220" y="20" width="180" height="60" class="i-ops"/>
&lt;text x="310" y="40" text-anchor="middle" class="il">Technical operations&lt;/text>
&lt;text x="310" y="58" text-anchor="middle" class="is">LLMOps pipeline + guardrails +&lt;/text>
&lt;text x="310" y="72" text-anchor="middle" class="is">tracing + retrain (the flights)&lt;/text>
&lt;rect x="440" y="20" width="180" height="60" class="i-man"/>
&lt;text x="530" y="40" text-anchor="middle" class="il">Operations manual&lt;/text>
&lt;text x="530" y="58" text-anchor="middle" class="is">policies + impact assessment +&lt;/text>
&lt;text x="530" y="72" text-anchor="middle" class="is">roles + lineage (ISO 42001)&lt;/text>
&lt;rect x="660" y="20" width="140" height="60" class="i-aud"/>
&lt;text x="730" y="44" text-anchor="middle" class="il">Auditor&lt;/text>
&lt;text x="730" y="62" text-anchor="middle" class="is">certification body&lt;/text>
&lt;text x="730" y="76" text-anchor="middle" class="is">(EASA / Aenor / BSI)&lt;/text>
&lt;path class="iar" d="M180,50 L220,50"/>
&lt;path class="iar" d="M400,50 L440,50"/>
&lt;path class="iar" d="M620,50 L660,50"/>
&lt;rect x="20" y="130" width="780" height="80" class="i-man"/>
&lt;text x="410" y="152" text-anchor="middle" class="il">The 7 Annex SL clauses — the manual's mandatory table of contents&lt;/text>
&lt;text x="410" y="172" text-anchor="middle" class="is">4 Context · 5 Leadership · 6 Planning · 7 Support · 8 Operation · 9 Evaluation · 10 Improvement&lt;/text>
&lt;text x="410" y="190" text-anchor="middle" class="is">Inherited from Annex SL — the same skeleton as ISO 27001 and 9001, which allows management systems to be integrated&lt;/text>
&lt;rect x="20" y="230" width="780" height="80" class="i-aud"/>
&lt;text x="410" y="252" text-anchor="middle" class="il">The 38 Annex A controls — the manual's AI-specific procedures&lt;/text>
&lt;text x="410" y="272" text-anchor="middle" class="is">A.2 Policies · A.3 Org · A.4 Resources · A.5 Impact · A.6 Lifecycle · A.7 Data · A.8 Info to parties · A.9 Use · A.10 Third parties&lt;/text>
&lt;text x="410" y="290" text-anchor="middle" class="is">What separates 42001 from 27001/9001: every control is born from an AI-specific risk (bias, opacity, drift, data supply)&lt;/text>
&lt;text x="410" y="340" text-anchor="middle" class="in">The aircraft flies with its pilots; the manual is audited by the authority. If the manual is incomplete, the aircraft does not certify however well it flies.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>A modern aircraft, an A350, a Boeing 787, a drone certified for urban delivery, does not fly because it has good engines. It flies because the organisation that operates it has an Operations Manual approved by the aviation authority (EASA in Europe, the FAA in the US, AESA in Spain as a delegated body). The manual does not contain the engine blueprints, which the manufacturer certifies; it contains the procedures: who is captain on each flight, which checklist is run before each take-off, which periodic inspections happen at 100, 500 and 2,000 flight hours, which external suppliers are authorised to touch which components, what is documented after each incident, what to do when a new alert appears on the panel. The authority does not sit in on every flight: it reads the manual, randomly audits the traceability of past flights against the manual, and if everything adds up, it keeps the certification in place.&lt;/p>
&lt;p>An AI system in production, the multi-tenant chatbot from the &lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">forensic post&lt;/a>, a copilot for lawyers, a credit scoring system, is exactly the same. It flies because the model is good, the LLMOps pipeline is well built, the guardrails catch the bad cases. But it certifies because the organisation operating it has an AIMS (AI Management System) described in an auditable manual. ISO/IEC 42001 is that manual: its mandatory table of contents (Annex SL, seven clauses) and its catalogue of AI-specific controls (Annex A, 38 controls). The auditor does not sit next to the MLOps engineer: they read the AI policy, review the impact assessments of the most recently deployed systems, check that incident retrain is documented, verify third-party contracts, audit a sample of Langfuse traces cross-checked against &lt;code>dataset_hash&lt;/code> and &lt;code>prompt_id&lt;/code>. And if everything adds up, they certify.&lt;/p>
&lt;p>The analogy matters because it frames the right question: 42001 does not certify the model or the code. It certifies the way of operating the complete system. A team can have the best OSS stack in the world and fail the audit because it has no written AI policy and no documented decision about which role (provider vs producer vs customer) it occupies towards its clients. And the reverse: a team with a modest model but with operations-manual discipline can certify without acrobatics.&lt;/p>
&lt;h2 id="isoiec-42001-in-15-seconds">ISO/IEC 42001 in 15 seconds&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Publication&lt;/strong>: December 2023, ISO/IEC JTC 1/SC 42 (the ISO/IEC subcommittee for AI).&lt;/li>
&lt;li>&lt;strong>Status in 2026&lt;/strong>: an active standard, certifiable by accredited bodies (BSI, AENOR, TÜV, Bureau Veritas, A-LIGN, Schellman). Not yet formally recognised as a harmonised standard under the EU AI Act, but it provides the management base to lean on.&lt;/li>
&lt;li>&lt;strong>Compatibility&lt;/strong>: it shares the Annex SL structure with ISO 9001 (quality), 27001 (information security), 27701 (privacy), 22301 (continuity), 20000-1 (IT services). Organisations with integrated management systems (IMS) add it with 20-40% of the effort it would take to implement from scratch.&lt;/li>
&lt;li>&lt;strong>Applicability&lt;/strong>: any organisation that develops, provides, deploys or uses AI systems. It is not limited to developers: a company that consumes a hosted LLM and integrates it into its own product is within scope.&lt;/li>
&lt;li>&lt;strong>Certification&lt;/strong>: a 3-year cycle with an initial audit (Stage 1: documentation review + Stage 2: on-site audit) and annual surveillance audits. Typical cost: 15,000-60,000 € for the initial one depending on size; 6,000-20,000 € per annual surveillance.&lt;/li>
&lt;/ul>
&lt;p>What 42001 does not do:&lt;/p>
&lt;ul>
&lt;li>It does not say which models to use or which thresholds to apply.&lt;/li>
&lt;li>It does not certify the individual model (that is done by specific evaluations such as a NIST AI RMF profile or EU AI Act technical documentation).&lt;/li>
&lt;li>It does not replace the EU AI Act or the GDPR: it is complementary. Implementing it well makes legal compliance easier but does not guarantee it.&lt;/li>
&lt;li>It is not a technical standard for explainability or robustness (those are ISO/IEC 25059, 24029, 23894 and others in the SC 42 family).&lt;/li>
&lt;/ul>
&lt;h2 id="distinction-from-neighbouring-frameworks">Distinction from neighbouring frameworks&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Framework&lt;/th>
&lt;th>Nature&lt;/th>
&lt;th>Scope&lt;/th>
&lt;th>Certifiable&lt;/th>
&lt;th>Overlap with 42001&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 42001:2023&lt;/strong>&lt;/td>
&lt;td>Management standard&lt;/td>
&lt;td>AIMS for any AI system&lt;/td>
&lt;td>Yes&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>EU AI Act&lt;/strong> (Reg. 2024/1689)&lt;/td>
&lt;td>Binding legal regulation&lt;/td>
&lt;td>AI systems in the EU, risk-categorised&lt;/td>
&lt;td>No (it is law)&lt;/td>
&lt;td>Arts 9, 10, 11, 12, 13, 14, 17&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NIS2&lt;/strong> (Dir. 2022/2555)&lt;/td>
&lt;td>Cybersecurity directive&lt;/td>
&lt;td>Essential/important entities&lt;/td>
&lt;td>Via the national scheme&lt;/td>
&lt;td>Asset register, incident, supply chain&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ENS&lt;/strong> (RD 311/2022)&lt;/td>
&lt;td>Spanish security regulation&lt;/td>
&lt;td>Public sector and its suppliers&lt;/td>
&lt;td>Yes (B/M/A categories)&lt;/td>
&lt;td>Traceability, incident management&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 27001&lt;/strong>&lt;/td>
&lt;td>Management standard&lt;/td>
&lt;td>Information security&lt;/td>
&lt;td>Yes&lt;/td>
&lt;td>Annex SL structure + Annex A overlap&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 27701&lt;/strong>&lt;/td>
&lt;td>Management standard&lt;/td>
&lt;td>Privacy (extends 27001)&lt;/td>
&lt;td>Yes&lt;/td>
&lt;td>PII in training data&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NIST AI RMF 1.0&lt;/strong>&lt;/td>
&lt;td>Voluntary framework&lt;/td>
&lt;td>AI risk management&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Conceptually aligned, not identical&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 23894&lt;/strong>&lt;/td>
&lt;td>Technical standard&lt;/td>
&lt;td>AI risk management&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Input to A.5 (impact assessment)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 5259&lt;/strong>&lt;/td>
&lt;td>Family&lt;/td>
&lt;td>Data quality for AI&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Input to A.7 (data)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Three distinctions that matter operationally&lt;/strong> and are a recurring source of confusion with clients:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ISO 42001 ≠ EU AI Act compliance&lt;/strong>. Holding the 42001 certification makes it easier to demonstrate articles 9-17 of the European Regulation, but the Regulation requires things 42001 does not cover directly (CE marking of high-risk systems, registration in the European database, declaration of conformity, specific post-market monitoring). Implementing 42001 first and then filling the AI Act gaps is the standard route.&lt;/li>
&lt;li>&lt;strong>ISO 27001 is not enough&lt;/strong>. 27001 covers confidentiality, integrity and availability of information. The AI side is missing: bias, opacity, model drift, training corpus quality, human evaluation, impact on affected persons. 42001 is a complement, not a substitute. Organisations that already have 27001 in place have an advantage because they share half the documentation.&lt;/li>
&lt;li>&lt;strong>NIS2 ≠ AI safety&lt;/strong>. NIS2 requires registering critical assets, notifying incidents within 24 h, and managing the digital supply chain. AI systems can be within NIS2 scope if they form part of the critical asset (an LLM serving customer support in a financial entity is), but NIS2 does not audit model quality. 42001 does.&lt;/li>
&lt;/ol>
&lt;h2 id="the-seven-clauses-annex-sl-the-mandatory-table-of-contents">The seven clauses (Annex SL): the mandatory table of contents&lt;/h2>
&lt;p>The seven clauses, from clause 4 to clause 10, are common to all modern management standards (Annex SL, also called the &amp;ldquo;High Level Structure&amp;rdquo;). That means an organisation with ISO 9001 or 27001 already in place recognises the structure. Clauses 1-3 are introductory (scope, normative references, terms).&lt;/p>
&lt;h3 id="clause-4--context-of-the-organisation">Clause 4 — Context of the organisation&lt;/h3>
&lt;p>Identify the external context (applicable regulation, customer expectations, social risks) and the internal context (strategy, culture, capabilities). Identify the interested parties and their expectations: customers, regulators, affected persons, employees, suppliers. Define the scope of the AIMS: which AI systems are in and which are out.&lt;/p>
&lt;p>The usual gap: organisations that say &amp;ldquo;all our AI systems are in scope&amp;rdquo; without having enumerated them. The auditor asks for the list. Without a list, there is no scope.&lt;/p>
&lt;h3 id="clause-5--leadership">Clause 5 — Leadership&lt;/h3>
&lt;p>Top management must approve and publish an AI policy, assign roles and responsibilities (typically AI lead, AI risk owner, data officer), and demonstrate commitment through resources, communication and oversight. The policy is an auditable document and must be made available to staff and interested parties.&lt;/p>
&lt;p>The usual gap: a generic AI policy copied off the internet, with no measurables and no concrete objectives. The auditor asks how compliance with it is measured. Without metrics, the policy is theatre.&lt;/p>
&lt;h3 id="clause-6--planning">Clause 6 — Planning&lt;/h3>
&lt;p>Identify risks and opportunities of the AIMS (not of the individual model). Define measurable AI objectives, with deadlines and owners. Plan changes to the AIMS.&lt;/p>
&lt;p>The usual gap: confusing AIMS risks (what happens if we do not document correctly?) with model risks (what happens if the model is biased?). The first belongs here; the second goes to A.5.&lt;/p>
&lt;h3 id="clause-7--support">Clause 7 — Support&lt;/h3>
&lt;p>&lt;strong>Resources&lt;/strong>: human, technical, financial, infrastructure. Competence of personnel (documented training). Awareness of the policy among personnel. Internal and external communication. Documented information (the backbone of the management system: policy, procedures, records, evidence).&lt;/p>
&lt;p>The usual gap: documentation scattered across Confluence/Notion/Drive with no version control and no recorded approvals. The auditor asks about the last change: who approved it? when? on what grounds?&lt;/p>
&lt;h3 id="clause-8--operation">Clause 8 — Operation&lt;/h3>
&lt;p>The most operational clause. It requires:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Operational planning and control&lt;/strong>: how the AI system&amp;rsquo;s lifecycle is managed day to day. → Covered in the blog by the &lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">six-stage LLMOps pipeline&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Impact assessment&lt;/strong> (linked to A.5).&lt;/li>
&lt;li>&lt;strong>AI system lifecycle management&lt;/strong> (linked to A.6).&lt;/li>
&lt;li>&lt;strong>Data for AI systems&lt;/strong> (linked to A.7).&lt;/li>
&lt;/ul>
&lt;p>This is the clause that materialises in controls A.5, A.6 and A.7. On its own it adds no new requirements: it links to Annex A.&lt;/p>
&lt;h3 id="clause-9--performance-evaluation">Clause 9 — Performance evaluation&lt;/h3>
&lt;p>&lt;strong>Monitoring, measurement, analysis, evaluation&lt;/strong>. Internal audits (planned, with criteria, scope, frequency, recorded results). Management review (typically quarterly or half-yearly, with a mandatory agenda: inputs, evidence, decisions, actions).&lt;/p>
&lt;p>The usual gap: there is OTel tracing + Langfuse + Grafana and plenty of data, but there is no formal management review agenda with documented minutes. The auditor asks for the minutes. Without minutes, there is no review.&lt;/p>
&lt;h3 id="clause-10--improvement">Clause 10 — Improvement&lt;/h3>
&lt;p>&lt;strong>Nonconformity and corrective action&lt;/strong>: when something fails, it is recorded, root cause is analysed, a correction is agreed, effectiveness is verified. Continual improvement: the system evolves deliberately.&lt;/p>
&lt;p>The usual gap: Jira tickets with technical post-mortems but no formal &amp;ldquo;ISO nonconformity&amp;rdquo; record closed out with an effectiveness check. They are two distinct artefacts, even if they can be integrated.&lt;/p>
&lt;h2 id="the-38-annex-a-controls-the-ai-specific-catalogue">The 38 Annex A controls: the AI-specific catalogue&lt;/h2>
&lt;p>Unlike Annex SL (which is common), Annex A is 42001&amp;rsquo;s AI-specific signature. The 38 controls are organised into 9 sections (A.2 to A.10; A.1 is the introduction) covering the AI-specific risks: opacity, bias, drift, corpus quality, impact on affected persons, third-party dependency. Each control has an objective (what it aims to achieve) and implementation guidance in Annex B.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Section&lt;/th>
&lt;th>Focus&lt;/th>
&lt;th># controls&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>A.2&lt;/td>
&lt;td>AI-related policies&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.3&lt;/td>
&lt;td>Internal organisation&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.4&lt;/td>
&lt;td>Resources for AI systems&lt;/td>
&lt;td>6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.5&lt;/td>
&lt;td>Impact assessment&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.6&lt;/td>
&lt;td>AI system lifecycle&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.7&lt;/td>
&lt;td>Data for AI systems&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.8&lt;/td>
&lt;td>Information for interested parties&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.9&lt;/td>
&lt;td>Use of AI systems&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.10&lt;/td>
&lt;td>Third parties and customer relationships&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total&lt;/strong>&lt;/td>
&lt;td>—&lt;/td>
&lt;td>&lt;strong>38&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>What follows is the section-by-section mapping of the controls onto material we have already covered in the blog. The editorial intent is to show which gaps remain once the technical architecture is in place, so that the road to certification does not start from zero.&lt;/p>
&lt;h2 id="cross-mapping-38-controls--blog-posts">Cross-mapping: 38 controls ↔ blog posts&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 540" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Mapping of ISO 42001 Annex A controls onto the blog's on-premise LLM architecture">
&lt;style>
.m-cov{fill:#a8e6a3;stroke:#444;stroke-width:1.4;rx:6}
.m-par{fill:#ffd76b;stroke:#444;stroke-width:1.4;rx:6}
.m-gap{fill:#f4b8b8;stroke:#444;stroke-width:1.4;rx:6}
.m-hdr{fill:#7aafff;stroke:#444;stroke-width:1.4;rx:8}
.ml{font:600 12px sans-serif;fill:#222}
.ms{font:400 10px sans-serif;fill:#444}
.mn{font:italic 10px sans-serif;fill:#555}
&lt;/style>
&lt;rect x="20" y="20" width="780" height="40" class="m-hdr"/>
&lt;text x="410" y="42" text-anchor="middle" class="ml">ISO 42001 Annex A mapped onto the blog's on-premise LLM architecture&lt;/text>
&lt;text x="410" y="55" text-anchor="middle" class="ms">green = covered by code/architecture · yellow = partial · red = governance gap&lt;/text>
&lt;rect x="20" y="80" width="780" height="50" class="m-par"/>
&lt;text x="50" y="100" class="ml">A.2 Policies (2)&lt;/text>
&lt;text x="50" y="116" class="ms">A.2.2 AI policy · A.2.3 Alignment with existing policies&lt;/text>
&lt;text x="500" y="100" class="ml">Status: PARTIAL&lt;/text>
&lt;text x="500" y="116" class="ms">The blog's editorial discipline teaches the angle; a formal written policy per organisation is missing.&lt;/text>
&lt;rect x="20" y="140" width="780" height="50" class="m-gap"/>
&lt;text x="50" y="160" class="ml">A.3 Internal organisation (3)&lt;/text>
&lt;text x="50" y="176" class="ms">A.3.2 Roles and responsibilities · A.3.3 Incident reporting · A.3.4 Stakeholders&lt;/text>
&lt;text x="500" y="160" class="ml">Status: GAP&lt;/text>
&lt;text x="500" y="176" class="ms">Not technical. Requires an organisational decision: AI lead, risk owner, AI committee.&lt;/text>
&lt;rect x="20" y="200" width="780" height="50" class="m-cov"/>
&lt;text x="50" y="220" class="ml">A.4 Resources (6)&lt;/text>
&lt;text x="50" y="236" class="ms">Data, tooling, system, human, financial resources + documentation&lt;/text>
&lt;text x="500" y="220" class="ml">Status: COVERED&lt;/text>
&lt;text x="500" y="236" class="ms">Seven deployment phases + five maturity levels + seven layers + OSS catalogue.&lt;/text>
&lt;rect x="20" y="250" width="780" height="50" class="m-par"/>
&lt;text x="50" y="270" class="ml">A.5 Impact assessment (5)&lt;/text>
&lt;text x="50" y="286" class="ms">AI impact process · documentation · alignment with risks · individuals · society&lt;/text>
&lt;text x="500" y="270" class="ml">Status: PARTIAL&lt;/text>
&lt;text x="500" y="286" class="ms">ISO/IEC 23894 gives the method; a formal per-system impact assessment procedure is missing.&lt;/text>
&lt;rect x="20" y="300" width="780" height="50" class="m-cov"/>
&lt;text x="50" y="320" class="ml">A.6 Lifecycle (4)&lt;/text>
&lt;text x="50" y="336" class="ms">Objectives · design · verification and validation · operation and monitoring · documentation&lt;/text>
&lt;text x="500" y="320" class="ml">Status: COVERED&lt;/text>
&lt;text x="500" y="336" class="ms">Six-stage pipeline + request anatomy + continuous fine-tuning + retrain.&lt;/text>
&lt;rect x="20" y="350" width="780" height="50" class="m-cov"/>
&lt;text x="50" y="370" class="ml">A.7 Data (5)&lt;/text>
&lt;text x="50" y="386" class="ms">Quality · acquisition · provenance · preparation · privacy&lt;/text>
&lt;text x="500" y="370" class="ml">Status: COVERED&lt;/text>
&lt;text x="500" y="386" class="ms">Data versioning + RAG corpus curation + Presidio + LLM Guard Vault.&lt;/text>
&lt;rect x="20" y="400" width="780" height="50" class="m-cov"/>
&lt;text x="50" y="420" class="ml">A.8 Information to parties (4)&lt;/text>
&lt;text x="50" y="436" class="ms">System documentation · information on use · incident communication · external reporting&lt;/text>
&lt;text x="500" y="420" class="ml">Status: COVERED&lt;/text>
&lt;text x="500" y="436" class="ms">OTel GenAI tracing + Langfuse + chunk→trace lineage + guardrail spans.&lt;/text>
&lt;rect x="20" y="450" width="780" height="40" class="m-cov"/>
&lt;text x="50" y="470" class="ml">A.9 Use (3)&lt;/text>
&lt;text x="50" y="484" class="ms">Responsible use processes · use objectives · intended use&lt;/text>
&lt;text x="500" y="470" class="ml">Status: COVERED&lt;/text>
&lt;text x="500" y="484" class="ms">Guardrails + evals + LLM Guard + incident-driven retrain.&lt;/text>
&lt;rect x="20" y="500" width="780" height="40" class="m-cov"/>
&lt;text x="50" y="520" class="ml">A.10 Third parties (4)&lt;/text>
&lt;text x="50" y="534" class="ms">Allocation of responsibilities · supplier · customer · third-party&lt;/text>
&lt;text x="500" y="520" class="ml">Status: COVERED&lt;/text>
&lt;text x="500" y="534" class="ms">OSS vs hyperscalers + OSS catalogue + sovereignty + lock-in analysis.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h3 id="a2--ai-policies-2-controls-partial">A.2 — AI policies (2 controls): PARTIAL&lt;/h3>
&lt;ul>
&lt;li>A.2.2 AI policy: the organisation must have a documented AI policy, approved by management, reviewed periodically, communicated and available. It covers principles, scope and commitments.&lt;/li>
&lt;li>A.2.3 Alignment with other policies: the AI policy is not an orphan, it aligns with existing security, privacy, quality and ethics policies.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Gap&lt;/strong>: this is not a code matter. The AI policy is a document that the organisation&amp;rsquo;s management approves and signs. The blog teaches a neutral, technical editorial stance (no hype, sovereignty, OSS by default under ENS/NIS2), but that is not any specific organisation&amp;rsquo;s AI policy. Each client has to draft and sign their own.&lt;/p>
&lt;p>&lt;strong>Minimum template&lt;/strong>: 1-2 pages with: principles (transparency, human oversight, fairness, accountability, sustainability), scope (which systems), measurable commitments (annual review, impact assessment before deployment, team training), governance (who approves what).&lt;/p>
&lt;h3 id="a3--internal-organisation-3-controls-gap">A.3 — Internal organisation (3 controls): GAP&lt;/h3>
&lt;ul>
&lt;li>A.3.2 AI roles and responsibilities: roles defined, non-overlapping, communicated. Typically: AI lead, AI risk owner, data steward, AI ethics officer (which may be a single person in small organisations).&lt;/li>
&lt;li>A.3.3 Reporting of AI incidents/concerns: a channel for anyone (internal or external) to report a problem with an AI system, with documented follow-up.&lt;/li>
&lt;li>A.3.4 Identification of stakeholders: a maintained list of stakeholders (customers, affected persons, regulators, partners) and their expectations.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Gap&lt;/strong>: also not technical. An organisational decision. The usual way to cover it is to appoint an AI lead (which may be the CIO, the CTO or a new role depending on size), reuse the security reporting channel (typically already in place because of 27001) by extending it to AI, and maintain a live stakeholder register.&lt;/p>
&lt;h3 id="a4--resources-6-controls-covered">A.4 — Resources (6 controls): COVERED&lt;/h3>
&lt;ul>
&lt;li>A.4.2 Documented information: documentation of the AIMS.&lt;/li>
&lt;li>A.4.3 Data resources: identification and management of the data available for training, evaluation and operation.&lt;/li>
&lt;li>A.4.4 Tooling resources: development, validation and monitoring tools.&lt;/li>
&lt;li>A.4.5 System resources: hardware, infrastructure, compute.&lt;/li>
&lt;li>A.4.6 Human resources: competent personnel.&lt;/li>
&lt;li>A.4.7 Financial resources: budget.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Covered by the blog&lt;/strong> in the three architectural posts:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Anatomy of the stack: seven layers&lt;/a>: A.4.5 system resources, A.4.4 tooling.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">Seven deployment phases&lt;/a>: A.4.5 + A.4.7 (budget implicitly).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/five-maturity-levels-platform-under-llm/">Five maturity levels&lt;/a>: A.4.5 + A.4.6 (team maturity).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">OSS tooling catalogue&lt;/a>: A.4.4 tooling.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning with DVC and lakeFS&lt;/a>: A.4.3 data resources.&lt;/li>
&lt;/ul>
&lt;h3 id="a5--impact-assessment-5-controls-partial">A.5 — Impact assessment (5 controls): PARTIAL&lt;/h3>
&lt;ul>
&lt;li>A.5.2 AI impact assessment process: a documented impact assessment procedure.&lt;/li>
&lt;li>A.5.3 Documentation of AI impact assessments: records of the assessments carried out.&lt;/li>
&lt;li>A.5.4 Alignment with AI risk treatment: the impact assessment&amp;rsquo;s decisions feed risk treatment.&lt;/li>
&lt;li>A.5.5 Impacts on individuals: specific dimensions covering affected persons (rights, discrimination, privacy).&lt;/li>
&lt;li>A.5.6 Societal impacts: dimensions covering society (information, social rights).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Partial&lt;/strong>: the method exists in the ISO/IEC SC 42 family. ISO/IEC 23894:2023 is the technical standard for AI risk management and NIST AI RMF 1.0 is the freely usable American equivalent. But the organisation has to write its procedure and run it per system before deployment. It is not code, it is discipline.&lt;/p>
&lt;p>&lt;strong>Minimum template&lt;/strong> for the impact assessment (3-5 pages per system):&lt;/p>
&lt;ol>
&lt;li>Description of the system (what it does, who it serves, underlying model and stack).&lt;/li>
&lt;li>Stakeholders identified.&lt;/li>
&lt;li>Potential impacts (intended and unintended) on people, groups and society.&lt;/li>
&lt;li>Fairness and robustness metrics applied, with thresholds and results.&lt;/li>
&lt;li>Mitigations applied (guardrails, evals, human oversight, rate limiting).&lt;/li>
&lt;li>Accepted residual risks, with signed justification.&lt;/li>
&lt;li>Review cadence (typically annual, or on substantial change).&lt;/li>
&lt;/ol>
&lt;h3 id="a6--ai-system-lifecycle-4-controls-covered">A.6 — AI system lifecycle (4 controls): COVERED&lt;/h3>
&lt;ul>
&lt;li>A.6.2.2 Objectives for responsible development of AI: responsible development objectives defined per system.&lt;/li>
&lt;li>A.6.2.3 Processes for responsible AI design and development: design and development procedures.&lt;/li>
&lt;li>A.6.2.4 AI system requirements and specifications: formal specification of the system.&lt;/li>
&lt;li>A.6.2.5 Verification and validation: V&amp;amp;V before and during operation.&lt;/li>
&lt;li>A.6.2.6 Deployment: deployment procedures.&lt;/li>
&lt;li>A.6.2.7 Operation and monitoring: continuous operation and monitoring.&lt;/li>
&lt;li>A.6.2.8 Documentation: lifecycle documentation.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Covered by the blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">The six-stage LLMOps pipeline&lt;/a>: the complete master map of the lifecycle.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">Anatomy of an LLM request&lt;/a>: the forensic version of how it runs in production.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/continuous-fine-tuning-production-real-traffic-deployed-adapter/">Continuous fine-tuning in production&lt;/a>: the A.6.2.3 + A.6.2.5 + A.6.2.6 + A.6.2.7 discipline in real operation.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals: the layer after tracing&lt;/a>: A.6.2.5 verification and validation.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Retrain&lt;/a>: A.6.2.7 operation + continuous iteration.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/modern-alignment-dpo-kto-orpo-simpo/">Modern alignment: DPO, KTO, ORPO, SimPO&lt;/a>: A.6.2.3 responsible design.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/mlops-for-llms-landscape-2026/">MLOps landscape 2026&lt;/a>: the tooling landscape.&lt;/li>
&lt;/ul>
&lt;h3 id="a7--data-for-ai-systems-5-controls-covered">A.7 — Data for AI systems (5 controls): COVERED&lt;/h3>
&lt;ul>
&lt;li>A.7.2 Data for development and enhancement of AI: data management policy and procedures for development and improvement.&lt;/li>
&lt;li>A.7.3 Acquisition of data: acquisition procedures (origin, authorisation, quality).&lt;/li>
&lt;li>A.7.4 Quality of data for AI systems: measurable quality criteria.&lt;/li>
&lt;li>A.7.5 Data provenance: data lineage.&lt;/li>
&lt;li>A.7.6 Data preparation: preparation procedures (chunking, anonymisation, labelling).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Covered by the blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation: the active librarian&lt;/a>: A.7.4 + A.7.5 + A.7.6 in detail (five layers: schema, dedup, PII, anti-contamination, lineage).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning: DVC and lakeFS&lt;/a>: A.7.2 + A.7.5 (the four data artefacts versioned with lineage).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/reranker-hybrid-retrieval-five-chunks-llm-reads/">Reranker and hybrid retrieval&lt;/a>: A.7.6 preparation + filtering.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a>: A.7.6 runtime anonymisation with Vault.&lt;/li>
&lt;/ul>
&lt;h3 id="a8--information-for-interested-parties-4-controls-covered">A.8 — Information for interested parties (4 controls): COVERED&lt;/h3>
&lt;ul>
&lt;li>A.8.2 System documentation and information for users: technical documentation available.&lt;/li>
&lt;li>A.8.3 External reporting: the capacity to report to authorities where applicable.&lt;/li>
&lt;li>A.8.4 Communication of incidents to users: notification to users when there is an incident.&lt;/li>
&lt;li>A.8.5 Information for interested parties: information for other stakeholders.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Covered by the blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">LLM tracing with OpenTelemetry GenAI&lt;/a>: A.8.2 per-request traceability, A.8.3 the capacity to extract forensic reporting.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/prompt-versioning-contract-five-word-change/">Prompt versioning with Langfuse and MLflow&lt;/a>: A.8.2 documented versioning.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a>: A.8.4, &lt;code>gen_ai.guardrail.*&lt;/code> spans as the basis for incident notification.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a>: A.8.4 incident events for retrain.&lt;/li>
&lt;/ul>
&lt;h3 id="a9--use-of-ai-systems-3-controls-covered">A.9 — Use of AI systems (3 controls): COVERED&lt;/h3>
&lt;ul>
&lt;li>A.9.2 Processes for responsible use of AI: responsible use procedures.&lt;/li>
&lt;li>A.9.3 Objectives for responsible use of AI: objectives.&lt;/li>
&lt;li>A.9.4 Intended use of AI systems: documentation of the intended use.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Covered by the blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a>: A.9.2 + A.9.3 (the four lines of defence).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a>: A.9.2 operational detail.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals: the layer after tracing&lt;/a>: A.9.3 measurement of objectives.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Retrain&lt;/a>: A.9.2 closed loop.&lt;/li>
&lt;/ul>
&lt;h3 id="a10--third-parties-and-customer-relationships-4-controls-covered">A.10 — Third parties and customer relationships (4 controls): COVERED&lt;/h3>
&lt;ul>
&lt;li>A.10.2 Allocation of responsibilities: distribution of responsibilities between AI roles.&lt;/li>
&lt;li>A.10.3 Suppliers: procedures for AI suppliers.&lt;/li>
&lt;li>A.10.4 Customers: procedures towards customers.&lt;/li>
&lt;li>A.10.5 Third parties: procedures for third parties.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Covered by the blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">The parallel catalogue: OSS vs hyperscalers&lt;/a>: A.10.3 supplier assessment with lock-in and contractual sovereignty analysis.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">The OSS catalogue for LLMOps&lt;/a>: A.10.5 third-party inventory (OSS components with licences and governance).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">Anatomy of an LLM request&lt;/a>: A.10.2 + A.10.4 in the multi-tenant case.&lt;/li>
&lt;/ul>
&lt;h2 id="the-roles-defined-by-the-standard">The roles defined by the standard&lt;/h2>
&lt;p>ISO/IEC 22989:2022 (AI vocabulary, complementary to 42001) defines six roles. Each organisation has to decide which ones it occupies and document it:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Role&lt;/th>
&lt;th>Definition&lt;/th>
&lt;th>Main responsibility&lt;/th>
&lt;th>Example&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>AI provider&lt;/strong>&lt;/td>
&lt;td>Organisation that provides the AI system to others&lt;/td>
&lt;td>Makes the system available&lt;/td>
&lt;td>OpenAI provides GPT-5 via API&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI producer&lt;/strong>&lt;/td>
&lt;td>Organisation that develops the AI system&lt;/td>
&lt;td>Design, development, validation&lt;/td>
&lt;td>Meta produces Llama 4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI customer&lt;/strong>&lt;/td>
&lt;td>Organisation that acquires the AI system&lt;/td>
&lt;td>Selection, integration, oversight&lt;/td>
&lt;td>A consultancy integrating an LLM into its own product&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI partner&lt;/strong>&lt;/td>
&lt;td>Organisation collaborating with another AI role&lt;/td>
&lt;td>Shared&lt;/td>
&lt;td>A GPU hardware manufacturer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI subject&lt;/strong>&lt;/td>
&lt;td>Person or group affected by the system&lt;/td>
&lt;td>Recipient of the impact&lt;/td>
&lt;td>The chatbot&amp;rsquo;s end user&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Relevant authority&lt;/strong>&lt;/td>
&lt;td>Regulator with jurisdiction&lt;/td>
&lt;td>External oversight&lt;/td>
&lt;td>AEPD, CNMC, EU AI Act authorities&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>An organisation can occupy several roles at once, which changes the applicable controls. A common pattern in consultancy is: producer + customer + provider towards the end client. The A.10 responsibilities are modulated by the roles.&lt;/p>
&lt;p>&lt;strong>Example role mapping&lt;/strong> for the multi-tenant chatbot from the forensic post:&lt;/p>
&lt;ul>
&lt;li>Base model manufacturer (Llama 4): AI producer of the base model.&lt;/li>
&lt;li>OSS stack operator (the consultancy): AI producer of the LoRA adapter + AI provider of the chatbot to its clients + AI customer of Meta&amp;rsquo;s base model.&lt;/li>
&lt;li>End client (the insurer): AI customer of the chatbot + AI provider of the customer support service.&lt;/li>
&lt;li>The policyholder: AI subject.&lt;/li>
&lt;li>AEPD + EU AI Act authority: relevant authority.&lt;/li>
&lt;/ul>
&lt;p>Each box in the table generates different obligations. The consultancy, being producer of the adapter, must document A.6 (lifecycle) and A.7 (data) for the adapter. Being provider of the chatbot, it must document A.10.4 (customers). Being customer of the base model, it must document A.10.3 (suppliers) and validate that Meta does its part.&lt;/p>
&lt;h2 id="impact-levels-and-proportionality">Impact levels and proportionality&lt;/h2>
&lt;p>42001 does not demand the same rigour of every system. Clause 6.1.2 and control A.5 introduce impact as a modulator. The standard does not define strict categories (unlike the EU AI Act, which does define &amp;ldquo;prohibited / high risk / limited risk / minimal&amp;rdquo;), but it recommends using levels according to severity and probability.&lt;/p>
&lt;p>Industry practice in 2026 aligns the 42001 levels with the EU AI Act categories:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>42001 level&lt;/th>
&lt;th>EU AI Act&lt;/th>
&lt;th>Examples&lt;/th>
&lt;th>Control depth&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>High&lt;/strong>&lt;/td>
&lt;td>High risk (Annex III)&lt;/td>
&lt;td>Credit scoring, HR, health, critical infrastructure&lt;/td>
&lt;td>Exhaustive impact assessment, mandatory human oversight, continuous monitoring, adversarial evals, detailed logging, half-yearly management review&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Medium&lt;/strong>&lt;/td>
&lt;td>Limited risk&lt;/td>
&lt;td>Customer service chatbots that do not automate decisions, productivity assistants&lt;/td>
&lt;td>Standard impact assessment, complete guardrails, annual review&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Low&lt;/strong>&lt;/td>
&lt;td>Minimal risk&lt;/td>
&lt;td>Spam filters, non-personalised content recommendations&lt;/td>
&lt;td>Lightweight impact assessment, basic controls&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>This proportionality is operationally key: implementing 42001 at maximum rigour for a low-risk system is waste; relaxing it on a high-risk one is non-compliance.&lt;/p>
&lt;h2 id="the-seven-minimum-aims-documents">The seven minimum AIMS documents&lt;/h2>
&lt;p>An auditor at Stage 1 (documentation review) asks for between seven and ten documents. The seven essentials:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>AI policy&lt;/strong> (clause 5.2 + A.2.2). 1-2 pages. Approved by management, dated, versioned.&lt;/li>
&lt;li>&lt;strong>AIMS scope&lt;/strong> (clause 4.3). List of AI systems in scope, inclusion criteria.&lt;/li>
&lt;li>&lt;strong>Stakeholder register&lt;/strong> (clause 4.2 + A.3.4). A maintained list with expectations.&lt;/li>
&lt;li>&lt;strong>AIMS risk register&lt;/strong> (clause 6.1). Risks of the management system, not of each model.&lt;/li>
&lt;li>&lt;strong>Impact assessment procedure&lt;/strong> (A.5.2) + records of assessments carried out (A.5.3). The procedure plus one or more assessments done.&lt;/li>
&lt;li>&lt;strong>AI lifecycle procedure&lt;/strong> (A.6.2), which can literally read &amp;ldquo;see the six-stage LLMOps pipeline&amp;rdquo; with references to technical runbooks.&lt;/li>
&lt;li>&lt;strong>Data management procedure&lt;/strong> (A.7.2), covering acquisition, quality, provenance, preparation, anonymisation.&lt;/li>
&lt;/ol>
&lt;p>Common additional documents:&lt;/p>
&lt;ol start="8">
&lt;li>&lt;strong>Responsible use policy&lt;/strong> (A.9.2) with permitted and non-permitted use types.&lt;/li>
&lt;li>&lt;strong>AI third-party management procedure&lt;/strong> (A.10.3, A.10.5) with assessment criteria for AI suppliers.&lt;/li>
&lt;li>Internal audit plan + management review agenda (clauses 9.2 + 9.3).&lt;/li>
&lt;/ol>
&lt;p>For an organisation with a mature &lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">OSS stack&lt;/a>, documents 6 and 7 are references to technical artefacts that already exist (pipeline runbooks, DVC configurations, the PII policy in LLM Guard). The real documentary effort sits in documents 1, 2, 3, 4 and 5.&lt;/p>
&lt;h2 id="applied-case-the-blogs-multi-tenant-chatbot--42001-checklist">Applied case: the blog&amp;rsquo;s multi-tenant chatbot → 42001 checklist&lt;/h2>
&lt;p>We take the system described in the &lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">forensic post&lt;/a>, a multi-tenant customer support chatbot for insurers on an on-premise OSS stack, and walk it as a 42001 auditor would.&lt;/p>
&lt;p>&lt;strong>Clause 4 — Context&lt;/strong>. The AIMS scope includes the chatbot and excludes the internal HR system (a different AI). Stakeholders identified: client insurers, affected policyholders, the AEPD, the EU AI Act authority (once it enters into force on 2 Aug 2026), the supplier Meta (base model), the hardware supplier NVIDIA. → Documented.&lt;/p>
&lt;p>&lt;strong>Clause 5 — Leadership&lt;/strong>. AI policy signed by the CEO, in force. Roles assigned: AI lead (CTO), AI risk owner (CISO), data steward (Head of Data), quarterly AI ethics committee. → Documented.&lt;/p>
&lt;p>&lt;strong>Clause 6 — Planning&lt;/strong>. AIMS risk register: incomplete documentation, team churn, dependency on a single GPU supplier, EU AI Act regulatory change. AIMS objectives for 2026: 42001 certification before Q4, EU AI Act high-risk compliance before 2 Aug. → Documented.&lt;/p>
&lt;p>&lt;strong>Clause 7 — Support&lt;/strong>. Resources: a &lt;a href="https://blog.lo0.es/en/posts/disaggregated-serving-prefill-decode-specialised-pods/">4×H100 SXM&lt;/a> cluster + the &lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">seven stack layers&lt;/a>. Competence: 2 MLE + 2 SRE + 1 part-time AI ethics, all with documented training. Communication: AI policy on the intranet + handbook. → Documented.&lt;/p>
&lt;p>&lt;strong>Clause 8 — Operation&lt;/strong>. Operating procedures = the &lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">six-stage LLMOps pipeline&lt;/a>. Impact assessment run before deployment + annual review + review on substantial change (defined as: base model change, major adapter change, expansion to a new tenant). → Documented.&lt;/p>
&lt;p>&lt;strong>Clause 9 — Evaluation&lt;/strong>. Monitoring: &lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">Langfuse + Tempo + VictoriaMetrics + Grafana&lt;/a>. Mandatory dashboard metrics: F1 per guardrail category over real traffic, statistical drift, RAG faithfulness, refusal rate. Quarterly internal audit with written criteria. Half-yearly management review with signed minutes. → Documented.&lt;/p>
&lt;p>&lt;strong>Clause 10 — Improvement&lt;/strong>. Incident-driven retrain tickets mapped as nonconformities when severity ≥ HIGH. Documented root cause analysis. Effectiveness verified at the next eval gate. → Documented.&lt;/p>
&lt;p>&lt;strong>Annex A — By section&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>A.2 (Policies): AI policy + responsible use policy. → Documented.&lt;/li>
&lt;li>A.3 (Organisation): roles assigned, reporting channel, stakeholder register. → Documented.&lt;/li>
&lt;li>A.4 (Resources): &lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">seven deployment phases&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">OSS catalogue&lt;/a> + training plan + annual budget. → Documented.&lt;/li>
&lt;li>A.5 (Impact): procedure + per-system assessments + fairness metrics applied. → Documented.&lt;/li>
&lt;li>A.6 (Lifecycle): &lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">LLMOps pipeline&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/continuous-fine-tuning-production-real-traffic-deployed-adapter/">continuous fine-tuning&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">retrain&lt;/a>. → Documented.&lt;/li>
&lt;li>A.7 (Data): &lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">data versioning&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard Vault&lt;/a> + Presidio. → Documented.&lt;/li>
&lt;li>A.8 (Information to parties): &lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">OTel tracing&lt;/a> + Langfuse + &lt;code>gen_ai.guardrail.*&lt;/code> spans + notification to tenants within SLA. → Documented.&lt;/li>
&lt;li>A.9 (Use): &lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">guardrails&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">evals&lt;/a> + responsible use policy. → Documented.&lt;/li>
&lt;li>A.10 (Third parties): &lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">OSS vs hyperscalers&lt;/a> with lock-in analysis + Meta contract for the base model + contracts with tenants. → Documented.&lt;/li>
&lt;/ul>
&lt;p>Result of the walkthrough: certifiable. The typical gaps (A.2.2 written policy, A.3 roles, A.5 impact assessment procedure) are covered as formal documents. The operational clauses (8, 9, 10) lean on the blog&amp;rsquo;s technical architecture. The distance between &amp;ldquo;having the architecture&amp;rdquo; and &amp;ldquo;having certification&amp;rdquo; is measured in documentary discipline, not in code.&lt;/p>
&lt;h2 id="cross-mapping-with-the-eu-ai-act-nis2-and-ens">Cross-mapping with the EU AI Act, NIS2 and ENS&lt;/h2>
&lt;h3 id="eu-ai-act-reg-20241689--seven-directly-aligned-articles">EU AI Act (Reg. 2024/1689) — seven directly aligned articles&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>EU AI Act article&lt;/th>
&lt;th>Topic&lt;/th>
&lt;th>Aligned 42001 control&lt;/th>
&lt;th>Applies to&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Art. 9&lt;/td>
&lt;td>Risk management system&lt;/td>
&lt;td>A.5 + clause 6&lt;/td>
&lt;td>High-risk systems&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 10&lt;/td>
&lt;td>Data and data governance&lt;/td>
&lt;td>A.7 (all)&lt;/td>
&lt;td>High-risk systems&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 11&lt;/td>
&lt;td>Technical documentation&lt;/td>
&lt;td>A.6 + A.4.2&lt;/td>
&lt;td>High-risk systems&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 12&lt;/td>
&lt;td>Record-keeping (logs)&lt;/td>
&lt;td>A.8.2 + OTel tracing&lt;/td>
&lt;td>High-risk systems&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 13&lt;/td>
&lt;td>Transparency to deployers&lt;/td>
&lt;td>A.8.5 + A.10.4&lt;/td>
&lt;td>High-risk systems&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 14&lt;/td>
&lt;td>Human oversight&lt;/td>
&lt;td>A.9.2 + documented oversight&lt;/td>
&lt;td>High-risk systems&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 17&lt;/td>
&lt;td>Quality management system&lt;/td>
&lt;td>Clauses 4-10&lt;/td>
&lt;td>High-risk providers&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The main obligations for high-risk systems enter into application on 2 August 2026. Implementing 42001 now builds the management base that deadline demands.&lt;/p>
&lt;p>What is missing for EU AI Act compliance that 42001 does not cover:&lt;/p>
&lt;ul>
&lt;li>CE conformity of high-risk systems (declaration of conformity, marking, registration in the EU database).&lt;/li>
&lt;li>The specific post-market monitoring required by Art. 72.&lt;/li>
&lt;li>Serious incident reporting to authorities within legal deadlines (not only to users).&lt;/li>
&lt;li>Transparency obligations towards users for limited-risk systems (Art. 50): chatbots, deepfakes, generated content.&lt;/li>
&lt;li>The Art. 5 prohibitions (social scoring, manipulation, real-time biometrics with exceptions).&lt;/li>
&lt;/ul>
&lt;h3 id="nis2-dir-20222555--three-pillars-with-overlap">NIS2 (Dir. 2022/2555) — three pillars with overlap&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Asset register&lt;/strong> (Art. 21.2.f): AI systems within NIS2 scope must be in the asset inventory. → Overlaps with A.4 + clause 4.3 (scope).&lt;/li>
&lt;li>&lt;strong>Incident notification&lt;/strong> (Art. 23): significant incidents are notified within 24 h (initial alert) + 72 h (detailed report). → Overlaps with A.3.3 (reporting) + clause 10 (improvement).&lt;/li>
&lt;li>&lt;strong>Supply chain security&lt;/strong> (Art. 21.2.d): security assessment of the digital supply chain. → Overlaps with A.10.3 (suppliers).&lt;/li>
&lt;/ul>
&lt;p>For essential NIS2 entities that also use AI systems, 42001 covers the AI-specific part that NIS2 requires by inference but does not spell out.&lt;/p>
&lt;h3 id="ens-rd-3112022">ENS (RD 311/2022)&lt;/h3>
&lt;p>The Spanish Esquema Nacional de Seguridad already expressly addresses AI in its Annex II (ENS controls). The Basic/Medium/High categories align with the 42001 impact levels. The ENS controls on traceability (op.exp.8), activity logging (op.exp.10) and incident management (op.exp.7) are covered by the same technical artefacts as A.8 and A.5 of 42001. An organisation certified at ENS High category with AI systems is a reasonable effort away from adding 42001.&lt;/p>
&lt;h2 id="the-five-usual-certification-traps">The five usual certification traps&lt;/h2>
&lt;p>&lt;strong>Trap 1 — Confusing 42001 with EU AI Act compliance.&lt;/strong> Passing the 42001 audit does not imply conformity with the European Regulation. They are distinct universes with a 60-70% overlap. The trap surfaces when the client asks for CE marking of the high-risk system and the organisation produces only the 42001 certificate.&lt;/p>
&lt;p>&lt;strong>Trap 2 — Over-documenting.&lt;/strong> Two-hundred-page manuals with procedures copied from templates, with no measurables and no evidence of application. The auditor asks for the last execution of the procedure; with no records, the procedures are ornament. The practical rule: prefer short documents referencing live technical artefacts to long self-contained ones.&lt;/p>
&lt;p>&lt;strong>Trap 3 — Under-measuring.&lt;/strong> Defining AIMS objectives with no operational metrics. &amp;ldquo;Improve model quality&amp;rdquo; is a null objective; &amp;ldquo;F1 per guardrail category ≥ 0.85 over real traffic, measured weekly, reviewed quarterly in the management review&amp;rdquo; is an auditable objective. The blog has insisted on this in every post on &lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">evals&lt;/a>, &lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">guardrails&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">retrain&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Trap 4 — Ignoring A.5 until audit day.&lt;/strong> The impact assessment is the most underrated control and the first one the auditor asks for. Without per-system assessments carried out before deployment, there is no way to demonstrate A.5. The trap surfaces when there is no longer time to produce credible retrospective assessments.&lt;/p>
&lt;p>&lt;strong>Trap 5 — Assuming 27001 covers the AI part.&lt;/strong> Organisations that already have 27001 sometimes think &amp;ldquo;we have half of it done&amp;rdquo;. That is true for Annex SL (structure) and for A.5/A.6/A.7 of 27001 (not of 42001) as far as infosec goes. It is false for A.5 of 42001 (impact assessment), A.7 of 42001 (AI-specific data quality), A.9 (responsible use) and A.10.4 (AI customers). You have to add, not assume.&lt;/p>
&lt;h2 id="what-we-have-not-covered-upcoming-posts">What we have not covered (upcoming posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Concrete templates&lt;/strong> of the seven mandatory documents, with drafting examples and metrics. Material for a post along the lines of &amp;ldquo;The AIMS manual in 7 documents&amp;rdquo; with a reference frame.&lt;/li>
&lt;li>&lt;strong>Detailed article-by-article mapping to the EU AI Act&lt;/strong> with the checklist of technical evidence derivable from the blog&amp;rsquo;s OSS stack. Especially Arts 11 (technical documentation), 14 (human oversight) and 72 (post-market monitoring).&lt;/li>
&lt;li>&lt;strong>The combined ENS High category + 42001 case&lt;/strong>: which ENS controls are covered by which AIMS artefacts, avoiding duplication.&lt;/li>
&lt;li>&lt;strong>NIST AI RMF 1.0 vs 42001 comparison&lt;/strong>: many international clients ask for both. How the same artefacts are recycled to satisfy the two frameworks.&lt;/li>
&lt;li>&lt;strong>42001 for LLM agents and MCP&lt;/strong>: the new dimensions that emerge when the AI system is agentic (excessive agency, tool use, graduated autonomy). The &lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">guardrails&lt;/a> post introduced line 3 (tool GR); 42001 has open gaps in this terrain and SC 42 is working on addenda.&lt;/li>
&lt;/ul>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>ISO/IEC 42001:2023&lt;/strong> — &lt;em>Information technology — Artificial intelligence — Management system&lt;/em>. ISO. &lt;a href="https://www.iso.org/standard/81230.html">https://www.iso.org/standard/81230.html&lt;/a>.&lt;/li>
&lt;li>&lt;strong>ISO/IEC 22989:2022&lt;/strong> — &lt;em>Information technology — Artificial intelligence — Artificial intelligence concepts and terminology&lt;/em>. Define los roles AI provider/producer/customer/partner/subject.&lt;/li>
&lt;li>&lt;strong>ISO/IEC 23894:2023&lt;/strong> — &lt;em>Information technology — Artificial intelligence — Guidance on risk management&lt;/em>. Insumo de A.5.&lt;/li>
&lt;li>&lt;strong>ISO/IEC 38507:2022&lt;/strong> — &lt;em>Governance implications of the use of AI by organizations&lt;/em>. Complemento de gobierno.&lt;/li>
&lt;li>&lt;strong>ISO/IEC 5259&lt;/strong> — &lt;em>Data quality for analytics and machine learning&lt;/em> (familia). Insumo de A.7.&lt;/li>
&lt;li>&lt;strong>EU AI Act (Regulation 2024/1689)&lt;/strong> — texto consolidado en EUR-Lex. Entrada en vigor de obligaciones de alto riesgo: 2 ago 2026.&lt;/li>
&lt;li>&lt;strong>NIS2 (Directive 2022/2555)&lt;/strong> — texto consolidado en EUR-Lex.&lt;/li>
&lt;li>&lt;strong>ENS — Real Decreto 311/2022&lt;/strong> — Esquema Nacional de Seguridad, BOE-A-2022-7191.&lt;/li>
&lt;li>&lt;strong>NIST AI RMF 1.0&lt;/strong> (2023) — &lt;a href="https://www.nist.gov/itl/ai-risk-management-framework">https://www.nist.gov/itl/ai-risk-management-framework&lt;/a>.&lt;/li>
&lt;li>&lt;strong>EUR-Lex EU AI Act consolidated text&lt;/strong> — &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/1689">https://eur-lex.europa.eu/eli/reg/2024/1689&lt;/a>.&lt;/li>
&lt;li>A-LIGN / BSI / Schellman — blogs sobre experiencia de auditoría 42001 con casos reales 2024-2025.&lt;/li>
&lt;/ul>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/hardening-secrets-sovereign-llm-stack-defence-in-depth/">Hardening and secrets in the sovereign LLM stack: defence in depth&lt;/a> — the operational security controls that hold up the AIMS.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">The six-stage LLMOps pipeline&lt;/a> — the operating procedure that materialises A.6 lifecycle with no extra work.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">Anatomy of an LLM request in production&lt;/a> — the forensic case walked through as a 42001 checklist in the &amp;ldquo;applied case&amp;rdquo; section of this post.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Seven layers of the on-premise LLM inference stack&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">seven deployment phases&lt;/a> — direct material for A.4 resources.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/five-maturity-levels-platform-under-llm/">Five maturity levels of the platform&lt;/a> — how to justify the proportionality of the controls against the existing maturity level.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning with DVC and lakeFS&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation&lt;/a> — A.7 data covered in detail.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">LLM tracing with OpenTelemetry GenAI&lt;/a> — A.8 information to interested parties through standardised traceability.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a> — A.9 responsible use.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals: the layer after tracing&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/llm-as-judge-exam-marker-not-oracle/">LLM-as-judge&lt;/a> — A.6.2.5 verification and validation.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Retrain: closing the feedback → dataset → adapter loop&lt;/a> — clause 10 continual improvement + the incident-driven loop that feeds formal nonconformities.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">The parallel catalogue: OSS vs hyperscalers&lt;/a> — A.10.3 supplier assessment with a structural analysis of lock-in and contractual sovereignty; a direct input to the AI supplier register.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">The OSS catalogue for LLMOps&lt;/a> — A.10.5 inventory of OSS third parties with documented licence, governance and maturity.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/mlops-for-llms-landscape-2026/">LLM-specific MLOps in 2026: the landscape&lt;/a> — the operational context in which the AIMS runs and is audited.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/eu-ai-act-technical-dossier-on-premise-llm-architecture/">EU AI Act: the technical dossier, article by article&lt;/a> — the sister post on Regulation (EU) 2024/1689; it moves from the management system down to the directly applicable legal obligations, with deadlines, penalties and a control-to-article mapping.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">Technical controls: the cross-mapping of ENS × ISO 42001 × EU AI Act&lt;/a> — the third post of the governance trilogy; it goes down to the detail of the 25 technical controls common to the three frameworks, with the master table of triple compliance and the labelling of evidence.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/incident-response-runbooks-llm-inference-kafka-keep/">Incident response runbooks for LLMs with Keep + Kafka&lt;/a> — the operational materialisation of clause 10 (continual improvement) and the WORM trace A.8.2 demands: every incident opens a nonconformity, triggers a postmortem, updates the runbook and is recorded in the Kafka &lt;code>audit.actions&lt;/code> topic.&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>EU AI Act: the technical dossier, article by article, over the blog's on-premise LLM architecture</title><link>https://blog.lo0.es/en/posts/eu-ai-act-technical-dossier-on-premise-llm-architecture/</link><pubDate>Mon, 01 Jun 2026 05:30:00 +0200</pubDate><guid>https://blog.lo0.es/en/posts/eu-ai-act-technical-dossier-on-premise-llm-architecture/</guid><description>&lt;blockquote>
&lt;p>Sister post to the &lt;a href="https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/">mapping onto ISO/IEC 42001&lt;/a>. That one broke down the AI management system, the certifiable standard. This one breaks down the binding legal regulation that applies without any certification: the EU AI Act is direct law in all 27 Member States, with no transposition and with explicit penalties of up to 35 million euros or 7% of worldwide turnover. The main obligations for high-risk systems enter into force on 2 August 2026; each article applies from its own date, not from the date the organisation gets certified.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Regulation (EU) 2024/1689 (the EU AI Act, &amp;ldquo;Reglamento Europeo de Inteligencia Artificial&amp;rdquo;), published in the Official Journal on 12 July 2024, sets obligations by risk tier (prohibited, high, limited, minimal) and by role (provider, deployer, importer, distributor, authorised representative). The obligations for high-risk systems (Annex III: biometrics, critical infrastructure, education, employment, essential public and private services, law enforcement, migration, justice, democratic processes) enter into force on 2 August 2026 and are the category that applies to most LLM projects in a medium-to-large enterprise. This post maps, article by article, the obligations relevant to a high-risk LLM system deployed on-premise: each article states its requirement, identifies which blog post already describes the technical piece that materialises it, and closes with an auditable checklist that a provider hands to a national supervisory authority. The Annex IV technical dossier is reconstructed by pointing its nine mandatory sections at the corresponding technical runbooks. Also covered: the Art. 6 classification and how to decide whether a system falls in as high risk, the Art. 5 prohibitions (what is excluded by construction), the GPAI obligations of Art. 53 that affect anyone building on base models (Llama, Mistral, DeepSeek, Qwen) rather than their own, the full timetable of application dates (5 Aug 2024 entry into force, 2 Feb 2025 prohibitions, 2 Aug 2025 GPAI, 2 Aug 2026 high risk Annex III, 2 Aug 2027 high risk Annex I and systemic GPAI), the Art. 99 penalty table (up to 35 M€ or 7% of worldwide turnover for Art. 5 violations, 15 M€ or 3% for high risk, 7.5 M€ or 1% for incorrect information) and the five frequent compliance traps. The editorial thesis: the technical architecture described in this blog directly covers between 70% and 85% of the Regulation&amp;rsquo;s technical requirements; the rest is documentary and procedural discipline (FRIA, CE marking, signed declaration of conformity, EU database registration, incident reporting within legal deadlines) built on top of technical artefacts that already exist but running on its own circuit.&lt;/p>
&lt;h2 id="the-analogy-the-type-approval-dossier-for-a-new-vehicle">The analogy: the type-approval dossier for a new vehicle&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 360" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="EU AI Act as a vehicle type-approval dossier">
&lt;style>
.h-veh{fill:#7aafff;stroke:#444;stroke-width:1.4;rx:8}
.h-doss{fill:#ffd76b;stroke:#444;stroke-width:1.4;rx:8}
.h-auth{fill:#a8e6a3;stroke:#444;stroke-width:1.4;rx:8}
.h-mkt{fill:#ff8a4c;stroke:#444;stroke-width:1.4;rx:8}
.hl{font:600 13px sans-serif;fill:#222}
.hs{font:400 11px sans-serif;fill:#555}
.hn{font:italic 11px sans-serif;fill:#555}
.hr{stroke:#666;stroke-width:1.6;fill:none;marker-end:url(#mh1)}
&lt;/style>
&lt;defs>&lt;marker id="mh1" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="#666"/>&lt;/marker>&lt;/defs>
&lt;rect x="20" y="20" width="160" height="60" class="h-veh"/>
&lt;text x="100" y="40" text-anchor="middle" class="hl">High-risk AI system&lt;/text>
&lt;text x="100" y="58" text-anchor="middle" class="hs">scoring, biometrics, HR,&lt;/text>
&lt;text x="100" y="72" text-anchor="middle" class="hs">health, justice (the new car)&lt;/text>
&lt;rect x="220" y="20" width="180" height="60" class="h-doss"/>
&lt;text x="310" y="40" text-anchor="middle" class="hl">Annex IV dossier&lt;/text>
&lt;text x="310" y="58" text-anchor="middle" class="hs">technical documentation +&lt;/text>
&lt;text x="310" y="72" text-anchor="middle" class="hs">QMS + FRIA (the WVTA file)&lt;/text>
&lt;rect x="440" y="20" width="160" height="60" class="h-auth"/>
&lt;text x="520" y="40" text-anchor="middle" class="hl">Conformity Assessment&lt;/text>
&lt;text x="520" y="58" text-anchor="middle" class="hs">notified body or self-assess.&lt;/text>
&lt;text x="520" y="72" text-anchor="middle" class="hs">(type approval)&lt;/text>
&lt;rect x="640" y="20" width="160" height="60" class="h-mkt"/>
&lt;text x="720" y="40" text-anchor="middle" class="hl">CE marking + EU DB&lt;/text>
&lt;text x="720" y="58" text-anchor="middle" class="hs">declaration of conformity&lt;/text>
&lt;text x="720" y="72" text-anchor="middle" class="hs">(E mark, type approval)&lt;/text>
&lt;path class="hr" d="M180,50 L220,50"/>
&lt;path class="hr" d="M400,50 L440,50"/>
&lt;path class="hr" d="M600,50 L640,50"/>
&lt;rect x="20" y="130" width="780" height="80" class="h-doss"/>
&lt;text x="410" y="152" text-anchor="middle" class="hl">The 9 sections of the Annex IV dossier (what the file has to contain)&lt;/text>
&lt;text x="410" y="172" text-anchor="middle" class="hs">1 General description · 2 Design and development · 3 Capabilities and limitations · 4 Data · 5 Monitoring · 6 QMS plan · 7 FRIA&lt;/text>
&lt;text x="410" y="190" text-anchor="middle" class="hs">8 Log records · 9 Declaration of conformity — all signed by the provider, available to authorities for 10 years&lt;/text>
&lt;rect x="20" y="230" width="780" height="80" class="h-mkt"/>
&lt;text x="410" y="252" text-anchor="middle" class="hl">Post-market monitoring (Art. 72) + Serious incident reporting (Art. 73)&lt;/text>
&lt;text x="410" y="272" text-anchor="middle" class="hs">The vehicle is tracked after sale: servicing, recalls for defects, records of serious accidents&lt;/text>
&lt;text x="410" y="290" text-anchor="middle" class="hs">Legal deadlines: 15 days (general), 10 days (death), 2 days (critical infra or widespread infringement)&lt;/text>
&lt;text x="410" y="340" text-anchor="middle" class="hn">The vehicle leaves the factory with a dossier; it gets the E mark; it travels with a service book; serious accidents are reported to the ministry.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>A vehicle manufacturer cannot sell a new car in the EU without passing WVTA (Whole Vehicle Type Approval). The process is public and standardised: the manufacturer prepares a technical dossier with dozens of chapters (brakes, emissions, active and passive safety, lighting, noise, weight, dimensions, recyclable materials, driver assistance devices), submits it to a type-approval authority or a notified technical service, which audits the file and, if everything adds up, issues the type approval. The manufacturer then stamps the E mark (E1 Germany, E9 Spain, and so on) and the CE/UNECE plate on every vehicle of that type produced in series. Each vehicle also carries a service book with mandatory inspections, and serious accidents or systemic defects are reported to the competent ministry, which can order recalls.&lt;/p>
&lt;p>The EU AI Act adapts exactly this industrial model to high-risk AI software. The provider prepares the Annex IV dossier (nine mandatory sections) with the full technical documentation of the system, runs a conformity assessment (self-assessment for most Annex III cases, notified body for the more sensitive Annex I ones), signs the EU declaration of conformity, registers the system in the European database, and applies the CE marking to the system when it is placed on the market. From there on it must keep a live post-market monitoring system and report serious incidents to the market surveillance authorities of each Member State within legal deadlines ranging from 2 to 15 days depending on severity. Failing to comply, penalties reach 35 million euros or 7% of worldwide turnover depending on which article was breached.&lt;/p>
&lt;p>The analogy matters because it bounds expectations: this is not a one-off compliance job, nor a badge you buy. It is an industrial type-approval process, with cadences, evidence, signatures and criminal liability. And most of the technical evidence the dossier asks for already exists in any serious system described in this blog: data lineage, OTel tracing, continuous evals, guardrails, incident-driven retrain, a responsible-use policy. What is missing is assembling it in the correct legal format.&lt;/p>
&lt;h2 id="how-it-fits-with-iso-42001-nis2-and-ens">How it fits with ISO 42001, NIS2 and ENS&lt;/h2>
&lt;p>Before dropping into the articles, a reminder of the editorial position from the &lt;a href="https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/">post on ISO 42001&lt;/a>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Piece&lt;/th>
&lt;th>Nature&lt;/th>
&lt;th>Who operates it&lt;/th>
&lt;th>Coverage&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>EU AI Act&lt;/strong>&lt;/td>
&lt;td>Direct EU law&lt;/td>
&lt;td>Provider + deployer + national surveillance authorities&lt;/td>
&lt;td>AI systems on the EU market, segmented by risk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 42001&lt;/strong>&lt;/td>
&lt;td>Certifiable management standard&lt;/td>
&lt;td>Organisation + certification body&lt;/td>
&lt;td>AIMS, organisational governance&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NIS2&lt;/strong>&lt;/td>
&lt;td>Transposed cyber directive&lt;/td>
&lt;td>Essential/important entities&lt;/td>
&lt;td>Asset register, incident notification, supply chain&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ENS&lt;/strong> (Esquema Nacional de Seguridad, Spain&amp;rsquo;s national security framework, RD 311/2022)&lt;/td>
&lt;td>Spanish security regulation&lt;/td>
&lt;td>Public sector + its suppliers&lt;/td>
&lt;td>Categories B/M/A, certifiable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Implementing 42001 makes it easier to demonstrate articles 9-17 of the EU AI Act, but it is not equivalent to legal compliance. The table of legal obligations and the chain of criminal liability come from the Regulation, not from the standard. An organisation certified against 42001 that deploys a high-risk system without CE marking, without registration in the EU database, without a signed declaration of conformity and without a documented FRIA breaches the Regulation even with the certificate on the wall.&lt;/p>
&lt;h2 id="the-four-risk-categories-and-the-art-6-classification">The four risk categories and the Art. 6 classification&lt;/h2>
&lt;p>The Regulation classifies systems into four risk tiers. The choice of category belongs to the provider and must be documented in the dossier, with technical and legal justification.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Category&lt;/th>
&lt;th>Article&lt;/th>
&lt;th>Examples&lt;/th>
&lt;th>Consequence&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Prohibited&lt;/strong>&lt;/td>
&lt;td>Art. 5&lt;/td>
&lt;td>Social scoring, manipulation, real-time biometrics with exceptions, indiscriminate facial scraping&lt;/td>
&lt;td>Cannot operate in the EU under any circumstances&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>High risk&lt;/strong>&lt;/td>
&lt;td>Art. 6 + Annex I + Annex III&lt;/td>
&lt;td>Credit scoring, HR, education, critical infrastructure, non-real-time biometrics, justice, migration, health&lt;/td>
&lt;td>Complies with Arts. 9-17, Annex IV dossier, CE marking, EU DB registration&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Limited risk&lt;/strong>&lt;/td>
&lt;td>Art. 50&lt;/td>
&lt;td>Chatbots with humans as users, deepfakes, synthetic content&lt;/td>
&lt;td>Transparency obligations towards the user&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Minimal risk&lt;/strong>&lt;/td>
&lt;td>Everything else&lt;/td>
&lt;td>Spam filters, video game NPCs, content suggestions&lt;/td>
&lt;td>No specific obligations; a voluntary code of conduct is recommended&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The Art. 6 test for deciding whether a system is high risk:&lt;/p>
&lt;ol>
&lt;li>Is it in Annex I? (products regulated by the listed harmonisation legislation: machinery, lifts, toys, medical devices, and so on). If the AI system is a safety component of an Annex I product, it is high risk.&lt;/li>
&lt;li>Is it in Annex III? (eight areas: biometrics, critical infrastructure, education, employment, essential public/private services, law enforcement, migration/asylum, justice/democratic processes). If the system falls in any of those areas it is high risk, except if the Art. 6.3 exception is invoked (systems performing a narrow procedural task, improving the result of a previous human activity, detecting decision patterns without influencing the final decision, preparatory tasks).&lt;/li>
&lt;/ol>
&lt;p>The Art. 6.3 exception requires formal documentation justifying why it does not apply. In other words, even falling outside is not free: you have to demonstrate why.&lt;/p>
&lt;p>For the typical LLM systems covered in this blog:&lt;/p>
&lt;ul>
&lt;li>Customer support chatbot for banking, insurance or healthcare: probably high risk if it automates contractual decisions about the customer, limited risk if it only informs.&lt;/li>
&lt;li>Internal HR assistant (CV screening): high risk (Annex III, employment area).&lt;/li>
&lt;li>Medical assistant (diagnostic support): high risk (Annex III, healthcare services area).&lt;/li>
&lt;li>Fraud detection system: high risk (Annex III, financial services area if it affects access to credit).&lt;/li>
&lt;li>Code copilot for developers: minimal risk (does not affect third parties&amp;rsquo; fundamental rights).&lt;/li>
&lt;li>Internal LLM as a service with no productive use: minimal risk.&lt;/li>
&lt;/ul>
&lt;p>The category decision is not an opinion: it is documented and justified in the dossier.&lt;/p>
&lt;h2 id="timetable-of-application">Timetable of application&lt;/h2>
&lt;p>The obligations arrive in stages. The dates are inflexible:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Date&lt;/th>
&lt;th>Applies&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>1 Aug 2024&lt;/strong>&lt;/td>
&lt;td>The Regulation enters into force&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 Feb 2025&lt;/strong>&lt;/td>
&lt;td>Art. 5 prohibitions + Art. 4 AI literacy obligations&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 Aug 2025&lt;/strong>&lt;/td>
&lt;td>GPAI obligations (Art. 53) + governance + general penalties + designated national authorities&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 Aug 2026&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Main high-risk obligations for Annex III + Art. 50 transparency to users&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 Aug 2027&lt;/strong>&lt;/td>
&lt;td>High risk under Annex I (components of regulated products) + GPAI with systemic risk&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>2 August 2026 is the date that matters to most enterprise LLM projects. We are in June 2026: less than two months to go.&lt;/p>
&lt;h2 id="article-by-article-mapping">Article-by-article mapping&lt;/h2>
&lt;p>The sections below follow the structure of the Regulation. For each article the requirement is stated, the blog&amp;rsquo;s technical artefact that covers it is identified, and it closes with an auditable checklist.&lt;/p>
&lt;h3 id="art-5--prohibited-practices-in-force-since-2-feb-2025">Art. 5 — Prohibited practices (in force since 2 Feb 2025)&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> It prohibits placing on the market, putting into service or using AI systems that:&lt;/p>
&lt;ul>
&lt;li>Manipulate behaviour through subliminal or deceptive techniques that distort decision-making.&lt;/li>
&lt;li>Exploit vulnerabilities related to age, disability or socio-economic situation.&lt;/li>
&lt;li>Implement social scoring by public authorities.&lt;/li>
&lt;li>Perform individual predictive policing based on profiling.&lt;/li>
&lt;li>Perform indiscriminate facial scraping to build facial recognition databases.&lt;/li>
&lt;li>Infer emotions in workplaces or education, except for medical or safety reasons.&lt;/li>
&lt;li>Perform biometric categorisation inferring sensitive attributes (race, political opinion, sexual orientation, and so on).&lt;/li>
&lt;li>Real-time remote biometric identification in public spaces by law enforcement, with strict exceptions (terrorism, kidnapping, missing persons) subject to prior judicial authorisation.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> No piece of the blog facilitates these practices; the OSS catalogue described is oriented towards legitimate tasks. But the provider must explicitly document why the system does not fall under these prohibitions. It cannot be assumed.&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Prohibition analysis documented per system, with a written statement of non-applicability.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> If the system uses facial biometrics or emotion analysis: specific legal analysis with a formal opinion.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Annual legal review, or on any change of functionality.&lt;/li>
&lt;/ul>
&lt;h3 id="art-6--classification-of-high-risk-systems">Art. 6 — Classification of high-risk systems&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> Determine whether the system is high risk by being in Annex I (safety component of a regulated product) or Annex III (8 areas). If it is in Annex III, assess the Art. 6.3 exception where applicable.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> The &lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">forensic post&lt;/a> and the &lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">six-stage pipeline&lt;/a> describe systems that are typically high risk (multi-tenant chatbot affecting service decisions in a regulated sector).&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Art. 6 analysis signed by the organisation&amp;rsquo;s legal officer.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> If Art. 6.3 is invoked: formal documentation of the exception.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Re-assessment if the functionality changes (for example, the assistant moves from informing to deciding).&lt;/li>
&lt;/ul>
&lt;h3 id="art-9--risk-management-system">Art. 9 — Risk management system&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> An iterative system, planned and executed across the whole lifecycle. Identify foreseeable risks, estimate risks under normal use and foreseeable misuse, evaluate emerging risks in post-market monitoring, adopt mitigation measures, communicate residual risks. Effectiveness testing is done under realistic conditions.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">The six-stage LLMOps pipeline&lt;/a>, the iterative lifecycle.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals: the layer after tracing&lt;/a>, testing under realistic conditions with golden sets.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a>, operational mitigation measures.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Retrain: closing the loop&lt;/a>, management of emerging risks via incident-driven retrain.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Risk management document per system, with identification, mitigation, and accepted residual risks signed off.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Periodic review procedure (at least annual, or on substantial change).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Link to the documented improvement loop.&lt;/li>
&lt;/ul>
&lt;h3 id="art-10--data-and-data-governance">Art. 10 — Data and data governance&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> Training, validation and testing datasets that are relevant, representative, as free of errors and as complete as possible, taking into account the characteristics of the intended purpose. Document:&lt;/p>
&lt;ul>
&lt;li>Data collection and selection.&lt;/li>
&lt;li>Processing and annotation.&lt;/li>
&lt;li>Biases identified as likely to affect fundamental rights or cause discrimination; measures to prevent them.&lt;/li>
&lt;li>Identification of data gaps and how they are addressed.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning with DVC and lakeFS&lt;/a>, the four data artefacts plus end-to-end lineage.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation: the active librarian&lt;/a>, five layers: schema, dedup, PII, anti-contamination, lineage.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard: Vault and Anonymize&lt;/a>, runtime anonymisation with restitution.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Data governance document per dataset (training / RAG corpus / golden eval / enriched retrain).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Bias analysis by protected category with metrics (parity ratio, equalized odds, calibration).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> PII / anonymisation / pseudonymisation procedure with measured F1.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Justification of representativeness for the intended context.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Verifiable chunk→trace lineage.&lt;/li>
&lt;/ul>
&lt;h3 id="art-11--annex-iv--technical-documentation">Art. 11 + Annex IV — Technical documentation&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> A technical dossier with the nine Annex IV sections, drawn up before the system is placed on the market, maintained during operation, and available to authorities for ten years after the last operation. The nine sections:&lt;/p>
&lt;ol>
&lt;li>General description of the system: name, version, purpose, integrator, intended hardware, instructions for use.&lt;/li>
&lt;li>Detailed description of design and development: architecture, base models, training methods, design decisions with justification.&lt;/li>
&lt;li>Information on monitoring, functioning and control: capabilities, limitations, expected accuracy, behaviour under normal use and foreseeable misuse.&lt;/li>
&lt;li>Information on data: datasets used, sources, preparation methods, biases addressed.&lt;/li>
&lt;li>Description of the monitoring system and metrics: traces, logs, dashboards.&lt;/li>
&lt;li>Description of the QMS and the Art. 17 procedures.&lt;/li>
&lt;li>FRIA where applicable (Fundamental Rights Impact Assessment, Art. 27).&lt;/li>
&lt;li>Automatically generated logs that the system stores (Art. 12).&lt;/li>
&lt;li>EU declaration of conformity under Art. 47, included.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> It serves as a direct input for each section:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Annex IV section&lt;/th>
&lt;th>Technical input from the blog&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1. General description&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/anatomy-on-premise-llm-inference-stack-seven-layers/">Anatomy of the stack: 7 layers&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/greenfield-deployment-phases-on-premise-llm-platform/">seven deployment phases&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2. Design and development&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">Six-stage LLMOps pipeline&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/continuous-fine-tuning-production-real-traffic-deployed-adapter/">continuous fine-tuning&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/modern-alignment-dpo-kto-orpo-simpo/">modern alignment&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3. Capabilities and limitations&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/llm-as-judge-exam-marker-not-oracle/">LLM-as-judge&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4. Data&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5. Monitoring&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">LLM tracing with OTel GenAI&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/prompt-versioning-contract-five-word-change/">prompt versioning&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6. QMS&lt;/td>
&lt;td>Procedures derived from &lt;a href="https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/">ISO 42001&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7. FRIA&lt;/td>
&lt;td>Gap, see Art. 27 below&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8. Logs&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">OTel tracing&lt;/a> + retention and policies&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9. Declaration of conformity&lt;/td>
&lt;td>Documentary gap, see Art. 47 below&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Annex IV dossier complete, versioned, dated, signed.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 10-year retained access guaranteed (immutable / WORM storage).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Update procedure on substantial change.&lt;/li>
&lt;/ul>
&lt;h3 id="art-12--art-19--record-keeping-logs">Art. 12 + Art. 19 — Record-keeping (logs)&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> A high-risk system must be technically capable of generating automatic logs during its operation. Those logs must allow:&lt;/p>
&lt;ul>
&lt;li>Tracing how the system behaved over time.&lt;/li>
&lt;li>Facilitating post-market monitoring (Art. 72).&lt;/li>
&lt;li>Enabling investigation of serious incidents (Art. 73).&lt;/li>
&lt;li>Supporting audits.&lt;/li>
&lt;/ul>
&lt;p>The provider must retain the logs for at least six months (or longer if national laws or the QMS require it). For remote biometric identification systems there are additional specific requirements.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">LLM tracing with OpenTelemetry GenAI&lt;/a>, the canonical substrate. Every request emits a span with &lt;code>trace_id&lt;/code>, &lt;code>gen_ai.*&lt;/code> attributes, costs, latencies and guardrail decisions.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/prompt-versioning-contract-five-word-change/">Prompt versioning&lt;/a>: &lt;code>prompt_id&lt;/code> + &lt;code>version&lt;/code> travel as attributes.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a>: &lt;code>gen_ai.guardrail.*&lt;/code> attributes record every decision.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard&lt;/a>: spans per scanner with &lt;code>risk_score&lt;/code> and &lt;code>action&lt;/code>.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning&lt;/a>: &lt;code>dataset_hash&lt;/code> and &lt;code>model_version&lt;/code> propagated.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> OTel + backend (Tempo, Jaeger) running in production.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Minimum 6-month retention (24-36 months suggested for financial regulation).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> WORM / immutable storage.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> PII in logs redacted (via LLM Guard Vault or equivalent). Logs are not exempt from the GDPR.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Forensic query procedure with audited permissions.&lt;/li>
&lt;/ul>
&lt;h3 id="art-13--transparency-to-deployers">Art. 13 — Transparency to deployers&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> The provider gives the deployer instructions for use that are clear, complete and accessible, in comprehensible language, covering:&lt;/p>
&lt;ul>
&lt;li>The provider&amp;rsquo;s identity.&lt;/li>
&lt;li>Characteristics, capabilities, limitations (accuracy by category, technical specifications).&lt;/li>
&lt;li>Foreseen changes to the system and its metrics.&lt;/li>
&lt;li>Human oversight measures (Art. 14).&lt;/li>
&lt;li>Expected computational resources and hardware.&lt;/li>
&lt;li>When it applies, the expected lifetime of the system and of its maintenance.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">The OSS catalogue for LLMOps&lt;/a>, which components and with what function.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">OSS vs hyperscalers&lt;/a>, lock-in analysis and documented dependencies.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">Anatomy of an LLM request&lt;/a>, capabilities and limitations at forensic level.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> User manual in non-technical language for the deployer, plus a detailed technical manual.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Accuracy metrics by category with thresholds.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Change procedure with prior notification.&lt;/li>
&lt;/ul>
&lt;h3 id="art-14--human-oversight">Art. 14 — Human oversight&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> The system is designed to allow effective human oversight throughout the period of use, with interfaces and procedures that make it possible to:&lt;/p>
&lt;ul>
&lt;li>Understand capabilities and limitations.&lt;/li>
&lt;li>Detect malfunctions (automation bias awareness).&lt;/li>
&lt;li>Decide not to use the system&amp;rsquo;s output, to override it, to reverse it.&lt;/li>
&lt;li>For remote biometric identification: human verification before acting, by at least two people.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety&lt;/a>, line 3 (Tool GR) with human-in-the-loop for destructive actions.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals&lt;/a>, metrics on a human-accessible dashboard.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">OTel tracing&lt;/a>, Langfuse with auditable human sessions.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Oversight interface documented with use cases.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Override / abort capability with no technical restrictions.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Documented training for oversight personnel.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Metrics of the effectiveness of the oversight (override rate, false-negative rate of the oversight itself).&lt;/li>
&lt;/ul>
&lt;h3 id="art-15--accuracy-robustness-and-cybersecurity">Art. 15 — Accuracy, robustness and cybersecurity&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> High-risk systems are designed and developed to reach an appropriate level of accuracy, robustness and cybersecurity, and to perform consistently throughout their lifecycle. The relevant accuracy metrics are declared in the instructions for use. Resilience against:&lt;/p>
&lt;ul>
&lt;li>Errors, faults and inconsistencies within the environment of use.&lt;/li>
&lt;li>Feedback bias during operation (feedback loops).&lt;/li>
&lt;li>Attacks that try to exploit the system&amp;rsquo;s vulnerabilities (data poisoning, model poisoning, model evasion, confidentiality attacks).&lt;/li>
&lt;li>Technical and organisational measures to detect, respond to and resolve vulnerabilities.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/quantization-llm-inference-fp8-int4-gguf/">Quantisation fundamentals&lt;/a>, accuracy vs efficiency with reported metrics.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/continuous-batching-orca-vllm-chunked-prefill-goodput/">Continuous batching&lt;/a> + &lt;a href="https://blog.lo0.es/en/posts/kv-cache-working-memory-llm-inference/">KV cache&lt;/a>, operational robustness.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails: line 1 input + line 2 retrieval&lt;/a>, defence against prompt injection and data poisoning via RAG.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard: PromptGuard 2 + injection scanners&lt;/a>, direct adversarial mitigation.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals: jailbreak resistance + adversarial&lt;/a>, robustness metrics evaluated in CI.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Declared accuracy metrics: F1 by category, accuracy, calibration, RAG faithfulness, hallucination rate.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Robustness plan against adversarial inputs (Garak suite / Promptfoo redteam / PyRIT run periodically).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Cybersecurity plan: vulnerability management, patching of the stack (vLLM, its deps, CUDA), secrets rotation.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Analysis of potential feedback loops with drift monitoring.&lt;/li>
&lt;/ul>
&lt;h3 id="art-17--quality-management-system-qms">Art. 17 — Quality management system (QMS)&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> The provider has a written, systematic and proportionate QMS covering (without being limited to):&lt;/p>
&lt;ul>
&lt;li>Regulatory compliance strategy.&lt;/li>
&lt;li>Design, verification and quality control of the system.&lt;/li>
&lt;li>Testing and validation procedures.&lt;/li>
&lt;li>Data management.&lt;/li>
&lt;li>The risk management system (Art. 9).&lt;/li>
&lt;li>Post-market monitoring (Art. 72).&lt;/li>
&lt;li>Incident reporting (Art. 73).&lt;/li>
&lt;li>Communication with authorities, deployers and other stakeholders.&lt;/li>
&lt;li>Records: documentation, log maintenance.&lt;/li>
&lt;li>Resource management.&lt;/li>
&lt;li>Accountability: management responsibilities.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> The QMS is not code, but it leans on code.&lt;/p>
&lt;ul>
&lt;li>ISO/IEC 42001 implemented (previous post) covers practically the whole content of Art. 17.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">Six-stage LLMOps pipeline&lt;/a> as the reference operating procedure.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> QMS manual written, dated, signed, versioned.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Annual internal audit plan with criteria and records.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Management review agenda with signed minutes.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> If 42001 is implemented: documented QMS-42001 mapping.&lt;/li>
&lt;/ul>
&lt;h3 id="art-26--deployer-obligations">Art. 26 — Deployer obligations&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> Whoever deploys the system (uses it under their own authority, not necessarily the developer) has obligations of their own:&lt;/p>
&lt;ul>
&lt;li>Use the system in accordance with the instructions (Art. 13).&lt;/li>
&lt;li>Assign competent, trained human oversight (Art. 14).&lt;/li>
&lt;li>Ensure the input data under their control is appropriate.&lt;/li>
&lt;li>Monitor operation and notify the provider on detecting problems or serious incidents.&lt;/li>
&lt;li>Keep the logs under their control for at least 6 months.&lt;/li>
&lt;li>Inform the affected persons when the system is used on them to make decisions (and, in an employment context, also consult their representatives).&lt;/li>
&lt;li>For some Annex III cases: complete a FRIA (Art. 27).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> In the case of the &lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">multi-tenant chatbot&lt;/a>, the deployer is the client insurer. It must:&lt;/p>
&lt;ul>
&lt;li>Accept the provider&amp;rsquo;s instructions (the consultancy&amp;rsquo;s) and sign the terms.&lt;/li>
&lt;li>Configure human oversight on its side.&lt;/li>
&lt;li>Notify the provider when it detects drift or a serious complaint.&lt;/li>
&lt;li>Keep its own logs in addition to the provider&amp;rsquo;s.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist (for the deployer).&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Contract with the provider covering SLAs, responsibilities, exit plan.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Training programme for oversight personnel.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Incident notification procedure towards the provider.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Policy for informing affected persons (in the employment context, notification to representatives).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> FRIA where applicable.&lt;/li>
&lt;/ul>
&lt;h3 id="art-27--fundamental-rights-impact-assessment-fria">Art. 27 — Fundamental Rights Impact Assessment (FRIA)&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> Applicable to deployers that are public bodies or private entities providing public services, or that use systems to assess credit score or life insurance. Before first use, the deployer carries out a FRIA documenting:&lt;/p>
&lt;ul>
&lt;li>A description of the intended use.&lt;/li>
&lt;li>Period and frequency of use.&lt;/li>
&lt;li>Categories of affected persons.&lt;/li>
&lt;li>Specific risks of harm identified.&lt;/li>
&lt;li>Human oversight measures.&lt;/li>
&lt;li>Mitigation measures should the risks materialise.&lt;/li>
&lt;/ul>
&lt;p>The FRIA is notified to the market surveillance authority. Substantial changes force an update.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> The FRIA is a governance document, not a technical artefact. The blog does not cover it directly. But the technical input is:&lt;/p>
&lt;ul>
&lt;li>The impact analyses from the &lt;a href="https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/">ISO 42001 post, section A.5&lt;/a> are the natural starting point.&lt;/li>
&lt;li>The metrics from the &lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">evals post&lt;/a> on fairness by category and groundedness feed the risk section of the FRIA.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> FRIA procedure documented, aligned with the AIIA in ISO 42005 (published as a complement).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> FRIA carried out per system before first use.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Notification to the market surveillance authority.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Periodic review, plus on substantial change.&lt;/li>
&lt;/ul>
&lt;h3 id="art-47--eu-declaration-of-conformity">Art. 47 — EU declaration of conformity&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> The provider draws up a written declaration of conformity per high-risk system, stating:&lt;/p>
&lt;ul>
&lt;li>Identification of the system and the provider.&lt;/li>
&lt;li>A statement that it complies with Arts. 8-15 + Art. 17.&lt;/li>
&lt;li>Reference to the harmonised standards and common specifications applied.&lt;/li>
&lt;li>Where applicable, the notified body and the certificate.&lt;/li>
&lt;li>Place and date, signature and name of the authorised signatory.&lt;/li>
&lt;/ul>
&lt;p>It must be available to authorities for ten years. It is kept up to date.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> A pure legal document. Template in Annex V.&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Declaration of conformity signed by an authorised person before market placement.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Languages: at least the official EU language of the market where the system is placed.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Re-signing procedure on substantial change.&lt;/li>
&lt;/ul>
&lt;h3 id="art-48--ce-marking">Art. 48 — CE marking&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> A high-risk system carries the CE marking visibly, legibly and indelibly. For digital systems with no physical part, the marking is included in the documentation or the interface. If a notified body was involved, its number follows.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> CE marking on a software system typically materialises in:&lt;/p>
&lt;ul>
&lt;li>The product information or &amp;ldquo;About&amp;rdquo; page.&lt;/li>
&lt;li>The official product documentation delivered to the deployer.&lt;/li>
&lt;li>Metadata of the exposed API (custom HTTP header, OpenAPI info).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> CE marking visible in the product interface or official documentation.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Notified body number attached where applicable.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Update procedure on substantial change.&lt;/li>
&lt;/ul>
&lt;h3 id="art-49--registration-in-the-european-database">Art. 49 — Registration in the European database&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> Before placing on the market or putting into service a high-risk Annex III system (except area 2, critical infrastructure), the provider registers it in the EU database of high-risk AI systems managed by the Commission. Deployers that are public authorities also register their use. Most registration data is public (transparency towards the public).&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> A pure administrative procedure. No technical part beyond having the dossier ready.&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Registration completed before first productive use.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Update on substantial change.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Portal access maintained (credentials, contact).&lt;/li>
&lt;/ul>
&lt;h3 id="art-50--transparency-to-end-users">Art. 50 — Transparency to end users&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> Applies to limited risk systems (and, complementarily, to some high-risk ones too):&lt;/p>
&lt;ul>
&lt;li>Chatbots and AI assistants: the person interacting must know they are talking to an AI, unless it is obvious from the context.&lt;/li>
&lt;li>Generated synthetic content (text, audio, image, video): marked as AI-generated in the output, in a machine-readable format.&lt;/li>
&lt;li>Deepfakes: explicitly declare that the content is artificially generated or manipulated.&lt;/li>
&lt;li>Emotion detectors or biometric categorisation: inform the affected persons.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> Technical materialisation:&lt;/p>
&lt;ul>
&lt;li>A UI banner in the chatbot saying &amp;ldquo;You are talking to an AI assistant&amp;rdquo;.&lt;/li>
&lt;li>A disclaimer on every exportable response (PDF, email): &amp;ldquo;Generated by AI&amp;rdquo;.&lt;/li>
&lt;li>Watermarking of the output (perplexity-based, model-fingerprint), optional but useful for deepfakes.&lt;/li>
&lt;li>For generated audio, image or video, standard C2PA metadata.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Mandatory UI banner.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Disclaimer on exportable outputs.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> If it generates visual content: C2PA marking or equivalent.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedure for use of the system on a person without their knowledge (for example, automated CV screening).&lt;/li>
&lt;/ul>
&lt;h3 id="art-53--obligations-of-gpai-providers-in-force-since-2-aug-2025">Art. 53 — Obligations of GPAI providers (in force since 2 Aug 2025)&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> Providers of GPAI (general-purpose models trained with vast compute, typically foundational: Llama 4, Mistral, DeepSeek, Qwen, Gemma) must:&lt;/p>
&lt;ul>
&lt;li>Maintain technical documentation of the model, accessible to the AI Office and national authorities.&lt;/li>
&lt;li>Make information available to downstream providers that will integrate it.&lt;/li>
&lt;li>Comply with EU copyright (Art. 4 of Directive 2019/790): an opt-out mechanism for rightsholders.&lt;/li>
&lt;li>Publish a summary of the training content (Annex XI, copyright summary).&lt;/li>
&lt;/ul>
&lt;p>If the model has systemic risk (10^25 FLOPs threshold, or designated by the Commission), additional obligations apply (Art. 55): model evaluation, adversarial testing, incident reporting, cybersecurity.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> For an organisation that uses GPAI models (Llama 4, Mistral) and does not train them from scratch:&lt;/p>
&lt;ul>
&lt;li>It is not a GPAI provider; it is a downstream provider integrating GPAI into its system.&lt;/li>
&lt;li>It must hold the GPAI technical documentation (Llama paper, Mistral docs) and reference it in its own Annex IV documentation.&lt;/li>
&lt;li>Analysis of the specific GPAI licence (Llama Community License, Apache 2.0, and so on).&lt;/li>
&lt;li>The &lt;a href="https://blog.lo0.es/en/posts/modern-alignment-dpo-kto-orpo-simpo/">post on modern alignment&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/continuous-fine-tuning-production-real-traffic-deployed-adapter/">continuous fine-tuning&lt;/a> describe how a LoRA adapter on top of the GPAI does not turn the downstream party into a GPAI provider, as long as it does not train a new model from scratch.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist (downstream provider).&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Inventory of GPAI models used, with version, source, licence, referenced documentation.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> EU copyright compliance analysis (Art. 4 of Dir. 2019/790).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Mapping of responsibilities between the upstream GPAI provider and us as downstream.&lt;/li>
&lt;/ul>
&lt;h3 id="art-72--post-market-monitoring">Art. 72 — Post-market monitoring&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> A documented post-market monitoring system proportionate to the risk, collecting data on performance throughout the lifecycle, including interaction with other AI systems. It allows the provider to:&lt;/p>
&lt;ul>
&lt;li>Assess continuous compliance with Arts. 8-15.&lt;/li>
&lt;li>Adopt the necessary corrective measures.&lt;/li>
&lt;li>Detect trends in real use (drift, abuse).&lt;/li>
&lt;/ul>
&lt;p>The monitoring plan is part of Annex IV and is maintained throughout the system&amp;rsquo;s life. The Commission publishes a template in 2026.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">OTel tracing + Langfuse&lt;/a>, the base.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Continuous evals&lt;/a>, operational metrics as online gates.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-as-judge-exam-marker-not-oracle/">LLM-as-judge&lt;/a>, judges over production sampling to detect degradation.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Incident-driven retrain&lt;/a>, the closed improvement loop.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Post-market monitoring plan documented per system.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Operational metrics defined with thresholds and periodic review.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Corrective action procedure on alert.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Integration with Art. 73 (when an alert equals a serious incident).&lt;/li>
&lt;/ul>
&lt;h3 id="art-73--serious-incident-reporting">Art. 73 — Serious incident reporting&lt;/h3>
&lt;p>&lt;strong>What it requires.&lt;/strong> The definition of a serious incident (Art. 3(49)):&lt;/p>
&lt;ul>
&lt;li>Death or serious harm to health.&lt;/li>
&lt;li>Serious disruption of critical infrastructure.&lt;/li>
&lt;li>Infringement of legal obligations intended to protect fundamental rights.&lt;/li>
&lt;li>Serious damage to property or the environment.&lt;/li>
&lt;/ul>
&lt;p>The provider reports to the market surveillance authority of the Member State where the incident occurred. &lt;strong>Deadlines&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type of incident&lt;/th>
&lt;th>Maximum deadline from becoming aware&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>General&lt;/td>
&lt;td>15 days&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Death&lt;/td>
&lt;td>10 days&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Critical infra affected, or widespread infringement&lt;/td>
&lt;td>2 days&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The first report may be preliminary; the complete one follows later. Internal investigation is mandatory, as is cooperation with the authorities. Corrective action is proportionate.&lt;/p>
&lt;p>&lt;strong>The blog&amp;rsquo;s stack.&lt;/strong> The technical flow:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">OTel tracing&lt;/a> provides the traceability for forensic investigation.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety&lt;/a> emits the canonical incident_event (category, severity, trace_id).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Incident-driven retrain&lt;/a> materialises the corrective action.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Incident reporting procedure documented with deadlines and templates.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Designated person (typically DPO + AI Risk Owner) with responsibility and training.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Annual dry-run of the procedure (drill).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Technical integration between the guardrails / tracing layer and the notification channel.&lt;/li>
&lt;/ul>
&lt;h2 id="the-assembled-annex-iv-dossier-svg-of-the-complete-file">The assembled Annex IV dossier: SVG of the complete file&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 480" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Annex IV dossier assembled over the blog's OSS stack">
&lt;style>
.x-sect{fill:#ffd76b;stroke:#444;stroke-width:1.4;rx:6}
.x-blog{fill:#a8e6a3;stroke:#444;stroke-width:1.4;rx:6}
.x-hdr{fill:#7aafff;stroke:#444;stroke-width:1.4;rx:8}
.x-out{fill:#ff8a4c;stroke:#444;stroke-width:1.4;rx:6}
.x-gap{fill:#f4b8b8;stroke:#444;stroke-width:1.4;rx:6}
.xl{font:600 12px sans-serif;fill:#222}
.xs{font:400 10px sans-serif;fill:#444}
.xn{font:italic 10px sans-serif;fill:#555}
&lt;/style>
&lt;rect x="20" y="20" width="780" height="40" class="x-hdr"/>
&lt;text x="410" y="42" text-anchor="middle" class="xl">Annex IV dossier (Art. 11) — nine mandatory sections + derived outputs&lt;/text>
&lt;text x="410" y="55" text-anchor="middle" class="xs">yellow = Annex IV section · green = blog artefact covering it · red = documentary gap&lt;/text>
&lt;rect x="20" y="80" width="200" height="40" class="x-sect"/>
&lt;text x="120" y="100" text-anchor="middle" class="xl">1. General description&lt;/text>
&lt;text x="120" y="114" text-anchor="middle" class="xs">purpose, version, hardware, deployer&lt;/text>
&lt;rect x="240" y="80" width="560" height="40" class="x-blog"/>
&lt;text x="520" y="100" text-anchor="middle" class="xl">Seven stack layers + seven deployment phases + request anatomy + OSS catalogue&lt;/text>
&lt;text x="520" y="114" text-anchor="middle" class="xs">complete technical description accessible to the authority&lt;/text>
&lt;rect x="20" y="130" width="200" height="40" class="x-sect"/>
&lt;text x="120" y="150" text-anchor="middle" class="xl">2. Design and development&lt;/text>
&lt;text x="120" y="164" text-anchor="middle" class="xs">architecture, base models, methods&lt;/text>
&lt;rect x="240" y="130" width="560" height="40" class="x-blog"/>
&lt;text x="520" y="150" text-anchor="middle" class="xl">Six-stage LLMOps pipeline + Continuous fine-tuning + Alignment + Multi-LoRA + Quantisation&lt;/text>
&lt;text x="520" y="164" text-anchor="middle" class="xs">architecture decisions with technical justification&lt;/text>
&lt;rect x="20" y="180" width="200" height="40" class="x-sect"/>
&lt;text x="120" y="200" text-anchor="middle" class="xl">3. Capabilities and limitations&lt;/text>
&lt;text x="120" y="214" text-anchor="middle" class="xs">accuracy, expected behaviour&lt;/text>
&lt;rect x="240" y="180" width="560" height="40" class="x-blog"/>
&lt;text x="520" y="200" text-anchor="middle" class="xl">Evals with golden sets + LLM-as-judge + F1 by category + groundedness + faithfulness&lt;/text>
&lt;text x="520" y="214" text-anchor="middle" class="xs">metrics declared and measured in CI&lt;/text>
&lt;rect x="20" y="230" width="200" height="40" class="x-sect"/>
&lt;text x="120" y="250" text-anchor="middle" class="xl">4. Data&lt;/text>
&lt;text x="120" y="264" text-anchor="middle" class="xs">datasets, sources, preparation, bias&lt;/text>
&lt;rect x="240" y="230" width="560" height="40" class="x-blog"/>
&lt;text x="520" y="250" text-anchor="middle" class="xl">Data versioning DVC + lakeFS + RAG corpus curation + Presidio + LLM Guard Vault&lt;/text>
&lt;text x="520" y="264" text-anchor="middle" class="xs">four versioned data artefacts with end-to-end lineage&lt;/text>
&lt;rect x="20" y="280" width="200" height="40" class="x-sect"/>
&lt;text x="120" y="300" text-anchor="middle" class="xl">5. Monitoring&lt;/text>
&lt;text x="120" y="314" text-anchor="middle" class="xs">metrics, traces, dashboards&lt;/text>
&lt;rect x="240" y="280" width="560" height="40" class="x-blog"/>
&lt;text x="520" y="300" text-anchor="middle" class="xl">OTel GenAI tracing + Langfuse + Prompt versioning + gen_ai.guardrail.* spans&lt;/text>
&lt;text x="520" y="314" text-anchor="middle" class="xs">per-request traceability with retention &amp;gt;= 6 months (WORM)&lt;/text>
&lt;rect x="20" y="330" width="200" height="40" class="x-sect"/>
&lt;text x="120" y="350" text-anchor="middle" class="xl">6. QMS (Art. 17)&lt;/text>
&lt;text x="120" y="364" text-anchor="middle" class="xs">quality management system procedures&lt;/text>
&lt;rect x="240" y="330" width="560" height="40" class="x-blog"/>
&lt;text x="520" y="350" text-anchor="middle" class="xl">ISO/IEC 42001 implemented (clauses 4-10) + LLMOps pipeline procedures&lt;/text>
&lt;text x="520" y="364" text-anchor="middle" class="xs">signed QMS manual + internal audit plan + management minutes&lt;/text>
&lt;rect x="20" y="380" width="200" height="40" class="x-gap"/>
&lt;text x="120" y="400" text-anchor="middle" class="xl">7. FRIA (Art. 27)&lt;/text>
&lt;text x="120" y="414" text-anchor="middle" class="xs">if public deployer / scoring applies&lt;/text>
&lt;rect x="240" y="380" width="560" height="40" class="x-gap"/>
&lt;text x="520" y="400" text-anchor="middle" class="xl">Dedicated FRIA procedure (input: A.5 ISO 42001 + fairness eval metrics)&lt;/text>
&lt;text x="520" y="414" text-anchor="middle" class="xs">governance document, not technical — it has to be written expressly&lt;/text>
&lt;rect x="20" y="430" width="200" height="40" class="x-sect"/>
&lt;text x="120" y="450" text-anchor="middle" class="xl">8. Logs (Art. 12)&lt;/text>
&lt;text x="120" y="464" text-anchor="middle" class="xs">automatic logs + retention&lt;/text>
&lt;rect x="240" y="430" width="560" height="40" class="x-blog"/>
&lt;text x="520" y="450" text-anchor="middle" class="xl">OTel tracing + Tempo / Jaeger + WORM storage + PII redaction policy&lt;/text>
&lt;text x="520" y="464" text-anchor="middle" class="xs">6+ month retention, WORM, PII redacted by LLM Guard Vault&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>The diagram shows the blog&amp;rsquo;s editorial asymmetry: seven of the nine Annex IV sections are covered directly by the technical stack. Only the FRIA (section 7) and the signed declaration of conformity (section 9, not shown in the SVG because it is a one-page document) are documentary gaps needing express administrative work. The main compliance effort is assembling and signing, not building from scratch.&lt;/p>
&lt;h2 id="applied-case-the-multi-tenant-chatbot-assessed-against-the-ai-act">Applied case: the multi-tenant chatbot assessed against the AI Act&lt;/h2>
&lt;p>We take the system from the &lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">forensic post&lt;/a>, a multi-tenant customer support chatbot for insurers, and walk through it as the provider of the system.&lt;/p>
&lt;p>Art. 6 classification: the chatbot helps customers understand products, check status and open tickets. It does not automate contractual decisions (it does not approve claims, it does not calculate premiums). Does it fall into Annex III area 8 (essential private services)? That depends on the use. If the insurer uses it only for informational support, it is limited risk (Art. 50 applies). If it uses it to assess claim declarations, it is high risk. Documenting the analysis is mandatory.&lt;/p>
&lt;p>We assume high risk for the complete walkthrough:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Art. 5 prohibitions&lt;/strong>: written statement of non-applicability. ✓&lt;/li>
&lt;li>&lt;strong>Art. 9 risk management&lt;/strong>: per-system document with identified risks (hallucination, dialect bias, PII leakage, jailbreak), applied mitigations (RAG over a curated corpus, guardrails with 4 lines, LLM Guard Vault, continuous evals) and signed accepted residuals. ✓ (input: pipeline + guardrails + evals).&lt;/li>
&lt;li>&lt;strong>Art. 10 data governance&lt;/strong>: governance of the four datasets (training adapter, insurer RAG corpus, golden eval, enriched retrain) with biases analysed, PII anonymised, lineage in place. ✓ (input: data-versioning + rag-corpus-curation + LLM Guard).&lt;/li>
&lt;li>&lt;strong>Art. 11 + Annex IV&lt;/strong>: dossier with 9 sections drafted, signed, accessible for 10 years in a WORM bucket. ✓ (7 sections from the blog, 2 new).&lt;/li>
&lt;li>&lt;strong>Art. 12 + Art. 19 logs&lt;/strong>: OTel + Tempo + Langfuse with 24-month retention, PII redacted by Vault. ✓&lt;/li>
&lt;li>&lt;strong>Art. 13 transparency to deployers&lt;/strong>: user manual for the insurer plus a technical manual. ✓ (input: OSS catalogue + request anatomy).&lt;/li>
&lt;li>&lt;strong>Art. 14 human oversight&lt;/strong>: Langfuse + Grafana dashboard, human escalation protocol for critical cases, training for the insurer&amp;rsquo;s staff. ✓&lt;/li>
&lt;li>&lt;strong>Art. 15 accuracy, robustness, cybersecurity&lt;/strong>: F1 by category declared, Promptfoo redteam adversarial suite run monthly, stack cybersecurity plan (vLLM patching, secrets rotation). ✓&lt;/li>
&lt;li>&lt;strong>Art. 17 QMS&lt;/strong>: ISO 42001 implemented and certified. ✓&lt;/li>
&lt;li>&lt;strong>Art. 26 deployer&lt;/strong>: the contract with the insurer includes the deployer&amp;rsquo;s obligations. ✓&lt;/li>
&lt;li>&lt;strong>Art. 27 FRIA&lt;/strong>: the insurer carries out a FRIA before first use (it is a private essential-service entity). ✓ (deployer&amp;rsquo;s responsibility, the provider assists).&lt;/li>
&lt;li>&lt;strong>Art. 47 declaration of conformity&lt;/strong>: signed by the consultancy&amp;rsquo;s CTO before market placement. ✓&lt;/li>
&lt;li>&lt;strong>Art. 48 CE marking&lt;/strong>: visible in the chatbot interface and in the official documentation. ✓&lt;/li>
&lt;li>&lt;strong>Art. 49 EU DB registration&lt;/strong>: completed before first productive use. ✓&lt;/li>
&lt;li>&lt;strong>Art. 50 transparency to users&lt;/strong>: UI banner &amp;ldquo;You are talking to an AI assistant&amp;rdquo;, disclaimer on exportable responses. ✓&lt;/li>
&lt;li>&lt;strong>Art. 53 GPAI&lt;/strong>: Llama 4 documentation (the base model) referenced, plus EU copyright analysis and responsibility mapping. ✓&lt;/li>
&lt;li>&lt;strong>Art. 72 post-market monitoring&lt;/strong>: documented plan, OTel + continuous evals + retrain already running. ✓&lt;/li>
&lt;li>&lt;strong>Art. 73 incident reporting&lt;/strong>: procedure, designated owner, annual dry-run. ✓&lt;/li>
&lt;/ul>
&lt;p>Result: certifiable and deployable on the EU market on 2 August 2026. The key gaps (FRIA, CE marking, EU DB registration, declaration of conformity) are documentary work over technical artefacts that already exist, not new technical projects.&lt;/p>
&lt;h2 id="penalties-art-99">Penalties (Art. 99)&lt;/h2>
&lt;p>The penalty table is proportional to worldwide turnover or to an absolute cap, whichever is higher:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Violation&lt;/th>
&lt;th>Penalty cap&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Art. 5 (prohibited practices)&lt;/td>
&lt;td>Up to 35 M€ or 7% of annual worldwide turnover&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Other obligations (Arts. 8-22, 26-50, 72-73, and so on)&lt;/td>
&lt;td>Up to 15 M€ or 3% of annual worldwide turnover&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Incorrect or misleading information to authorities&lt;/td>
&lt;td>Up to 7.5 M€ or 1% of annual worldwide turnover&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For SMEs and startups the caps are the lower of the two figures (not the higher). The proportionality mitigation exists but requires formal demonstration.&lt;/p>
&lt;p>In addition, national authorities can order:&lt;/p>
&lt;ul>
&lt;li>Immediate suspension of the system on the market.&lt;/li>
&lt;li>A mandatory recall.&lt;/li>
&lt;li>Mandatory public communication of the penalty.&lt;/li>
&lt;/ul>
&lt;h2 id="the-five-frequent-compliance-traps">The five frequent compliance traps&lt;/h2>
&lt;p>&lt;strong>Trap 1 — Assuming the GPAI model used already covers the obligations.&lt;/strong> The downstream provider remains responsible for the integrated system: neither Meta nor Mistral nor DeepSeek takes on the obligations of whoever builds on their models. The trap surfaces when the authority asks for the dossier and the team points at the Llama model card as if that were enough.&lt;/p>
&lt;p>&lt;strong>Trap 2 — Confusing ISO 42001 with EU AI Act conformity.&lt;/strong> Holding a 42001 certificate &lt;strong>does not imply&lt;/strong> conformity: certification is not a FRIA, not CE marking, not EU database registration, not a signed declaration of conformity. Standardisation is progressing, but until ISO 42001 is published as a harmonised standard (it was not at the end of 2025), there is no presumption of conformity. The table of legal obligations runs on its own circuit.&lt;/p>
&lt;p>&lt;strong>Trap 3 — Forgetting incident reporting within the legal deadline.&lt;/strong> Fifteen days sounds long until an incident lands in the middle of the summer holidays. Two days for critical infrastructure is not negotiable. Without a documented procedure and an annual drill, the deadline is missed in silence. A penalty for misleading information (1% of worldwide turnover) follows if the incomplete reporting is discovered.&lt;/p>
&lt;p>&lt;strong>Trap 4 — Underestimating the deployer.&lt;/strong> The AI Act assigns obligations to both the provider and the &lt;strong>deployer&lt;/strong>. A company that &lt;strong>uses&lt;/strong> a hosted LLM integrated into its service (without developing it) is still a deployer with obligations of its own (Art. 26): human oversight, FRIA where applicable, notification to affected persons. The trap surfaces when the deployer assumes that &amp;ldquo;responsibility lies with the model provider&amp;rdquo;. It does not, not entirely.&lt;/p>
&lt;p>&lt;strong>Trap 5 — Leaving the FRIA until last.&lt;/strong> The FRIA (Art. 27) requires a fundamental rights impact analysis with qualitative dimensions (discrimination, privacy, social rights). It is not an afternoon&amp;rsquo;s document. It is carried out before first use, not after a problem is detected. Public deployers and private essential-service providers who leave it for &amp;ldquo;whenever they ask&amp;rdquo; take 4-8 weeks to produce a credible one, time they typically do not have when the inspection arrives.&lt;/p>
&lt;h2 id="what-we-have-not-covered-upcoming-posts">What we have not covered (upcoming posts)&lt;/h2>
&lt;ul>
&lt;li>Concrete templates for each document: EU declaration of conformity (Annex V), full Annex IV dossier section by section, FRIA, post-market monitoring plan, initial serious incident report. Material for a post along the lines of &amp;ldquo;The EU AI Act compliance folder in 12 templates&amp;rdquo;.&lt;/li>
&lt;li>Voluntary codes of practice published by the Commission under Art. 56, useful for limited-risk systems that want to demonstrate good behaviour without a legal obligation.&lt;/li>
&lt;li>Comparative analysis of notified bodies for systems requiring third-party conformity assessment (mainly Annex I).&lt;/li>
&lt;li>How compliance changes for LLM agents, systems with graduated autonomy, tool calling and the capacity to act. SC 42 and the AI Office are working on specific guidance.&lt;/li>
&lt;li>The complete map of national authorities designated under Art. 70, plus the sectoral authorities that retain jurisdiction (AEPD for privacy, CNMV for financial services, Banco de España for banking, AESA for aviation).&lt;/li>
&lt;/ul>
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>Regulation (EU) 2024/1689 (EU AI Act) — Texto consolidado en EUR-Lex: &lt;a href="https://eur-lex.europa.eu/eli/reg/2024/1689">https://eur-lex.europa.eu/eli/reg/2024/1689&lt;/a>. Diario Oficial L 1689/12.7.2024.&lt;/li>
&lt;li>EU AI Act Explorer (AI Act Service Desk, Comisión Europea): &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act-explorer">https://ai-act-service-desk.ec.europa.eu/en/ai-act-explorer&lt;/a>.&lt;/li>
&lt;li>AI Act Text portal (artificialintelligenceact.eu): artículos individuales con anotaciones.&lt;/li>
&lt;li>Anexo IV — Technical documentation: estructura de los nueve apartados obligatorios.&lt;/li>
&lt;li>Anexo V — EU declaration of conformity: plantilla obligatoria.&lt;/li>
&lt;li>Anexo III — High-risk AI systems: las ocho áreas que clasifican un sistema como alto riesgo.&lt;/li>
&lt;li>Anexo XI — Copyright training summary template: para GPAI providers.&lt;/li>
&lt;li>NIST AI RMF 1.0 (2023) — &lt;a href="https://www.nist.gov/itl/ai-risk-management-framework">https://www.nist.gov/itl/ai-risk-management-framework&lt;/a>.&lt;/li>
&lt;li>ISO/IEC 42001:2023 — sistema de gestión, complemento facilitador.&lt;/li>
&lt;li>ISO/IEC 42005 — Impact assessment AI (publicada 2025 como guía técnica para FRIA).&lt;/li>
&lt;li>Draft Commission guidance on serious incident reporting (2025) — borrador en consulta para Art. 73.&lt;/li>
&lt;/ul>
&lt;h2 id="see-also">See also&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/hardening-secrets-sovereign-llm-stack-defence-in-depth/">Hardening and secrets in the sovereign LLM stack: defence in depth&lt;/a> — the technical hardening measures that back the dossier.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/iso-42001-aims-on-premise-llm-platform/">ISO/IEC 42001: the operations manual for the AI system&lt;/a> — the sister post on the management system that makes Arts. 9, 10, 11 and 17 of the Regulation easier to demonstrate.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/six-stage-llmops-pipeline-architecture-and-deep-dive/">The six-stage LLMOps pipeline&lt;/a> — the lifecycle that operationally materialises Arts. 9 (risk management) and 17 (QMS).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/anatomy-llm-request-production-tour-six-stages/">Anatomy of an LLM request in production&lt;/a> — the forensic case used as a compliance checklist in this post.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/data-versioning-llmops-dvc-lakefs-reproducible-golden-dataset/">Data versioning with DVC and lakeFS&lt;/a> and &lt;a href="https://blog.lo0.es/en/posts/rag-corpus-curation-active-librarian/">RAG corpus curation&lt;/a> — Art. 10 data governance.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-tracing-opentelemetry-genai/">LLM tracing with OpenTelemetry GenAI&lt;/a> — Arts. 12 + 19 (record-keeping) with canonical OTel.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-guardrails-safety-four-lines-of-defence/">Guardrails and safety in LLMs&lt;/a> — Arts. 14 (human oversight) and 15 (cybersecurity/robustness).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/llm-guard-anatomy-scanners-langfuse-vllm-litellm/">LLM Guard: the sworn translator with a book of equivalences&lt;/a> — Art. 10 + Art. 12 with PII redacted on the runtime path.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/evals-llm-layer-after-tracing/">Evals: the layer after tracing&lt;/a> — Art. 15 (accuracy) and Art. 72 (post-market monitoring).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/retrain-closing-the-loop-feedback-dataset-adapter/">Retrain: closing the feedback → dataset → adapter loop&lt;/a> — Art. 72 continuous improvement + Art. 73 corrective action after an incident.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/parallel-catalogue-llmops-stages-open-source-hyperscalers/">The parallel catalogue: OSS vs hyperscalers&lt;/a> — Art. 53 (GPAI obligations) and analysis of integrated GPAI providers.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/oss-catalogue-llmops-six-stages-tool-by-tool/">The OSS catalogue for LLMOps&lt;/a> — Art. 13 (transparency to deployers) with a complete component inventory.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/modern-alignment-dpo-kto-orpo-simpo/">Modern alignment: DPO, KTO, ORPO and SimPO&lt;/a> — responsible adapter design (Art. 9 mitigation + Art. 15 robustness).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/technical-controls-ens-iso-42001-eu-ai-act-cross-mapping/">Technical controls: the cross-mapping of ENS × ISO 42001 × EU AI Act&lt;/a> — the technical zoom into the overlap of the three frameworks. A single tracing piece, a single guardrails piece and a single versioning piece materialise the technical requirements of ENS + 42001 + AI Act simultaneously when labelled with a common vocabulary.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blog.lo0.es/en/posts/incident-response-runbooks-llm-inference-kafka-keep/">Incident response runbooks for LLMs with Keep + Kafka&lt;/a> — the operationalisation of Art. 73 (reporting of serious incidents) with 2/10/15-day deadlines by severity, Keep YAML workflows and the WORM Kafka topic &lt;code>audit.actions&lt;/code> as evidence for the competent authority.&lt;/p>
&lt;/li>
&lt;/ul></description></item></channel></rss>